<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="en">
  <title>Metaist</title>
  <link rel="self" href="https://metaist.com/blog/feed/index.xml"/>
  <link href="https://metaist.com/"/>
  <updated>2026-02-06T00:00:00Z</updated>
  <author>
    <name>The Metaist</name>
  </author>
  <id>tag:metaist.com,2010:blog</id>
    <entry>
      <title>Consciousness and the Brain: Deciphering How the Brain Codes Our Thoughts</title>
      <link href="https://metaist.com/blog/2026/02/consciousness-and-the-brain.html"/>
      <id>tag:metaist.com,2010:blog.post-281e1e135a3f27ed0f7d1149c2573b48481dc3d3</id>
      <published>Fri Feb 06 2026 14:20:02 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 06 2026 14:20:02 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Consciousness-Brain-Deciphering-Codes-Thoughts-ebook/dp/B00DMCVXO0&quot;&gt;Consciousness and the Brain: Deciphering How the Brain Codes Our Thoughts&lt;/a&gt; by Stanislas Dehaene (2014). Lots of fun details.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Quick Fix: Why Fad Psychology Can&#39;t Cure Our Social Ills</title>
      <link href="https://metaist.com/blog/2026/02/the-quick-fix.html"/>
      <id>tag:metaist.com,2010:blog.post-715d31b67517a6b836fb40052fcc2a912c3e89e5</id>
      <published>Fri Feb 06 2026 14:18:29 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 06 2026 14:18:29 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Quick-Fix-Psychology-Cant-Social-ebook/dp/B088DRB12V&quot;&gt;The Quick Fix: Why Fad Psychology Can&#39;t Cure Our Social Ills&lt;/a&gt; by Jesse Singal (2021). Relevant when it was published; even more relevant today.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Explosive Child</title>
      <link href="https://metaist.com/blog/2026/02/the-explosive-child.html"/>
      <id>tag:metaist.com,2010:blog.post-d4a5967a988d2c2ea62d86916878c57e9fd9cafb</id>
      <published>Fri Feb 06 2026 14:16:24 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 06 2026 14:16:24 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Explosive-Child-Sixth-Understanding-Chronically-ebook/dp/B08NP52GTW&quot;&gt;The Explosive Child&lt;/a&gt; by Ross W. Greene (2021; via &lt;strong&gt;Ron Arazi&lt;/strong&gt;). Many such cases.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>My Agents Setup</title>
      <link href="https://metaist.com/blog/2026/02/my-agents.html"/>
      <id>tag:metaist.com,2010:blog.post-2afa2b01a2fb4744158d4338ee1d3e1a0f785d0e</id>
      <published>Wed Feb 04 2026 17:20:42 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Feb 04 2026 17:20:42 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;I&#39;ve gotten a lot of requests for my agents setup, especially my &lt;code&gt;AGENTS.md&lt;/code&gt; configuration file. It&#39;s undergone a few iterations, but below is a current snapshot.&lt;/p&gt;
&lt;p&gt;Here is my current setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2026/02/openrouter.ai&quot;&gt;OpenRouter API Key&lt;/a&gt;: This is a bit of text that lets you talk to any of the models they support (and they support them all). By all accounts (and their Privacy Policy), they have a solid reputation for not storing or training on your data (nor do the major providers). To get started you set up an account and put some money in there and generate a new API key. You need to save this key somewhere safe and make sure it&#39;s in your environment (as &lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;) before you start your coding agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://shittycodingagent.ai/&quot;&gt;&lt;code&gt;pi-coding-agent&lt;/code&gt;&lt;/a&gt;: I started with Claude Code but then switch to &lt;code&gt;pi&lt;/code&gt; because it was signifcantly cheaper (fewer tokens in its prompt) and faster (fewer tools it can use). You need a relatively recent version of &lt;code&gt;node&lt;/code&gt;. I use &lt;code&gt;pnpm env use --global lts&lt;/code&gt; (&lt;a href=&quot;https://pnpm.io/installation&quot;&gt;install instructions for &lt;code&gt;pnpm&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;: While I&#39;ve been trying to keep the file short and sweet, there have been times when I felt like I had to encode every management lesson I&#39;ve learned before as a rule. Claude Opus 4.5 still sometimes ignores the information I give it, but a quick &amp;quot;Read AGENTS.md&amp;quot; usually fixes things.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&#39;s an &lt;a href=&quot;https://github.com/metaist/LTS/blob/main/templates/_all/AGENTS.md&quot;&gt;example from LTS&lt;/a&gt; for some common principles:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; General Principles (all projects)&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Preflight&lt;/span&gt;

Before starting any task:

&lt;span class=&quot;token list punctuation&quot;&gt;1.&lt;/span&gt; Confirm you have the tools to do the work &lt;span class=&quot;token italic&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;_&lt;/span&gt;&lt;/span&gt; verify it succeeded
&lt;span class=&quot;token list punctuation&quot;&gt;2.&lt;/span&gt; Identify the goal and immediate task; restate if conversation is long or after compaction
&lt;span class=&quot;token list punctuation&quot;&gt;3.&lt;/span&gt; Check for relevant GitHub issues; add comments for significant progress
&lt;span class=&quot;token list punctuation&quot;&gt;4.&lt;/span&gt; Clarify: &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;quick experiment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt; (user will check) or &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;deep dive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt; (use judgment)?

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Working Style&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Default to minimal changes; propose scope before larger refactors
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Don&#39;t delete files you didn&#39;t create (others may be working in same directory)
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Don&#39;t delete build artifacts needlessly; prefer idempotent approaches
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Follow existing patterns in the codebase
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Prefer editing existing files over creating new ones
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Don&#39;t add unnecessary comments or docstrings to unchanged code

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Communication&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Number items in summaries so user can reference specifics
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Present meaningful alternatives and wait—unless this is a deep dive
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; If solving a different problem than started, stop and check in
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; For long-running commands: &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`cmd 2&gt;&amp;amp;1 | tee /tmp/build.log`&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; If something hangs, investigate rather than waiting silently
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Notify when long-running tasks complete

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Shell Commands&lt;/span&gt;

&lt;span class=&quot;token table&quot;&gt;&lt;span class=&quot;token table-header-row&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Instead of &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Use  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Why                                   &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;----------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;----&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-------------------------------------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-data-rows&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`find`&lt;/span&gt;     &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`fd`&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Respects &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`.gitignore`&lt;/span&gt;, simpler syntax &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`grep`&lt;/span&gt;     &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`rg`&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Faster, respects &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`.gitignore`&lt;/span&gt;         &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`pip`&lt;/span&gt;      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`uv`&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Faster, better dependency resolution  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Code Style&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Type hints with modern syntax (&lt;span class=&quot;token code-snippet code keyword&quot;&gt;`Path | None`&lt;/span&gt; not &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`Optional[Path]`&lt;/span&gt;)
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Require 100% test coverage; task isn&#39;t complete without it
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`# pragma: no cover`&lt;/span&gt; only for trivial &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`if __name__ == &quot;__main__&quot;`&lt;/span&gt; or truly unreachable code
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Test observable behavior, not implementation details

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Workflow&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;1.&lt;/span&gt; Create an issue before implementing non-trivial changes
&lt;span class=&quot;token list punctuation&quot;&gt;2.&lt;/span&gt; Add comments to issues when scope expands or for significant progress
&lt;span class=&quot;token list punctuation&quot;&gt;3.&lt;/span&gt; Discuss structural/organizational changes before implementing
&lt;span class=&quot;token list punctuation&quot;&gt;4.&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;Run validation commands and check full output&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt; before committing
&lt;span class=&quot;token list punctuation&quot;&gt;5.&lt;/span&gt; Commit frequently, but &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;do not push until asked&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;6.&lt;/span&gt; Pushing to &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`main`&lt;/span&gt; triggers CI; batch commits to limit runs

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Commit Messages&lt;/span&gt;

Format: &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`prefix: description (#issue)`&lt;/span&gt;

&lt;span class=&quot;token table&quot;&gt;&lt;span class=&quot;token table-header-row&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Prefix      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Use for                                    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-----------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;------------------------------------------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-data-rows&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`add:`&lt;/span&gt;      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; New features, files, capabilities          &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`fix:`&lt;/span&gt;      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Bug fixes, corrections                     &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`update:`&lt;/span&gt;   &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Changes to existing functionality, docs    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`remove:`&lt;/span&gt;   &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Deletions                                  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`refactor:`&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Code restructuring without behavior change &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;
Rules:

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Lowercase titles, sentence fragments (no trailing period)
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Backticks for code: &lt;span class=&quot;token code-snippet code keyword&quot;&gt;``fix: bug in `keep_going` parsing``&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Reference issues: &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`(#123)`&lt;/span&gt; or &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`(closes #123)`&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Include &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`Co-Authored-By: {Model Name + Version} &amp;lt;noreply@anthropic.com&gt;`&lt;/span&gt; in body

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; GitHub Issues and Comments&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Same prefix convention as commits
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Lowercase titles; backticks for code references
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Add &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`aigen`&lt;/span&gt; label for AI-generated issues
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Start body: &quot;Created by {Model Name + Version} during {context}...&quot;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Prefer flat hierarchy in markdown; use bolding appropriately

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Conventions&lt;/span&gt;

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Dates: ISO 8601 (&lt;span class=&quot;token code-snippet code keyword&quot;&gt;`YYYY-MM-DD`&lt;/span&gt;)
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; Prefer well-adopted standards where they exist&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And here&#39;s the &lt;a href=&quot;https://github.com/metaist/LTS/blob/main/templates/python/AGENTS.md&quot;&gt;project-specific part&lt;/a&gt; that gets extended and customized depending on the project I&#39;m working on:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Project-Specific ()&lt;/span&gt;

&lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;Goal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;: 

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Development Commands&lt;/span&gt;

&lt;span class=&quot;token table&quot;&gt;&lt;span class=&quot;token table-header-row&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Command   &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Purpose                                                                  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;---------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;------------------------------------------------------------------------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-data-rows&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`ds dev`&lt;/span&gt;  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;Must pass before every commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt; — lint, type check, tests, spell check &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`ds test`&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Run tests only                                                           &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`ds lint`&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Run linters only                                                         &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`ds docs`&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Build documentation                                                      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;##&lt;/span&gt; Validation Rules&lt;/span&gt;

&lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;&lt;span class=&quot;token code-snippet code keyword&quot;&gt;`ds dev`&lt;/span&gt; is mandatory before commits.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt; Check the &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;full output&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;, not just the last few lines.

Common issues caught by &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`ds dev`&lt;/span&gt;:

&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;cspell&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;: Unknown words → add to &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`.cspell.json`&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;ruff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;: Python lint/format issues
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;ty/pyrefly/pyright/mypy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;: Type errors
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;pytest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;: Test failures

If &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`ds dev`&lt;/span&gt; fails, fix the issue before committing. Don&#39;t assume CI will catch it.&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>Questions to ask when evaluating neurotech approaches</title>
      <link href="https://metaist.com/blog/2026/02/questions-to-ask-when-evaluating-neurotech-approac.html"/>
      <id>tag:metaist.com,2010:blog.post-abc08422e1b5590dab68948e7bc92083e87af784</id>
      <published>Tue Feb 03 2026 18:13:04 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:04 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.owlposting.com/p/questions-to-ponder-when-evaluating&quot;&gt;Questions to ask when evaluating neurotech approaches&lt;/a&gt; (Abhishaike Mahajan; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). So many potholes.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Improving Single Executable Application Building for Node.js</title>
      <link href="https://metaist.com/blog/2026/02/improving-single-executable-application-building-f.html"/>
      <id>tag:metaist.com,2010:blog.post-19f64856e36b05e8d8697df3b38db2a9883ecdca</id>
      <published>Tue Feb 03 2026 18:13:04 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:04 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://joyeecheung.github.io/blog/2026/01/26/improving-single-executable-application-building-for-node-js/&quot;&gt;Improving Single Executable Application Building for Node.js&lt;/a&gt; (Joyee Cheung). My own work on &lt;a href=&quot;https://github.com/metaist/cosmofy&quot;&gt;&lt;code&gt;cosmofy&lt;/code&gt;&lt;/a&gt; has made me interested in how single-file executables work elsewhere. In this case, they do binary surgery on platform-specific files (ELF, PO, Mach-O) while &lt;code&gt;cosmofy&lt;/code&gt; works in a platform-independent way.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Two Major Studies, 125,000 Kids: The Social Media Panic Doesn’t Hold Up</title>
      <link href="https://metaist.com/blog/2026/02/two-major-studies-125000-kids-the-social-media-pan.html"/>
      <id>tag:metaist.com,2010:blog.post-626a1843ebca3919a879001b0015565817d8282b</id>
      <published>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.techdirt.com/2026/01/21/two-major-studies-125000-kids-the-social-media-panic-doesnt-hold-up/&quot;&gt;Two Major Studies, 125,000 Kids: The Social Media Panic Doesn’t Hold Up&lt;/a&gt;. I need to read the study, especially since that the headline already confirms my previous beliefs.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Context Collapse Problem</title>
      <link href="https://metaist.com/blog/2026/02/the-context-collapse-problem-codegood.html"/>
      <id>tag:metaist.com,2010:blog.post-35c8db9ebb1766fbd2b5b8ab77c37d900609034b</id>
      <published>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://codegood.co/writing/context-collapse-problem&quot;&gt;The Context Collapse Problem&lt;/a&gt; The difference between legible and non-legible systems will continue to become more and more stark. How soon before an LLM asks to &amp;quot;jump in call&amp;quot; so it can understand the project requirements?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Medical Roundup #6</title>
      <link href="https://metaist.com/blog/2026/02/medical-roundup-6.html"/>
      <id>tag:metaist.com,2010:blog.post-ba43267a514446826448614ebdadb30b695c7d28</id>
      <published>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thezvi.substack.com/p/medical-roundup-6&quot;&gt;Medical Roundup #6&lt;/a&gt; (Zvi Mowshowitz).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The entire shift in the rate of diagnosis of autism is explained by expanding the criteria and diagnosing it more often. Nothing actually changed.
[...]
Using the same word for all these things, and calling it the autism spectrum, does not, overall, do those on either end of that spectrum any favors.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Conversation: LLMs and the what/how loop</title>
      <link href="https://metaist.com/blog/2026/02/conversation-llms-and-the-whathow-loop.html"/>
      <id>tag:metaist.com,2010:blog.post-8504f6c6f0e590165718c3645a50e210ebcd0dd0</id>
      <published>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:03 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://martinfowler.com/articles/convo-what-how.html&quot;&gt;Conversation: LLMs and the what/how loop&lt;/a&gt; (Martin Fowler). Managing cognitive load while programming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But as any experienced programmer knows, the real challenge is not converting requirements to code, but building systems that survive change.&lt;/p&gt;
&lt;p&gt;What makes systems easier to manage as change happens?&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Proving (literally) that ChatGPT isn&#39;t conscious</title>
      <link href="https://metaist.com/blog/2026/02/proving-literally-that-chatgpt-isnt-conscious.html"/>
      <id>tag:metaist.com,2010:blog.post-e94ab0a9db1d9f036fb486bc5fc064a7202ad33e</id>
      <published>Tue Feb 03 2026 18:13:02 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:02 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theintrinsicperspective.com/p/proving-literally-that-chatgpt-isnt&quot;&gt;Proving (literally) that ChatGPT isn&#39;t conscious&lt;/a&gt; (Erik Hoel). The argument has two sides any theory of consciousness needs to avoid (the &amp;quot;Kleiner-Hoel dilemma&amp;quot;):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;It has to be &lt;strong&gt;falsifiable&lt;/strong&gt;: If the theory depends on some feature, but I can construct a system with the same input/output behavior, but lacks that property, then your theory is falsified.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It cannot be &lt;strong&gt;trivial&lt;/strong&gt;: If the theory is that the input/output behavior &lt;em&gt;itself&lt;/em&gt; is what consciousness is, then your theory has learned nothing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
    </entry>
    <entry>
      <title>Giving University Exams in the Age of Chatbots</title>
      <link href="https://metaist.com/blog/2026/02/giving-university-exams-in-the-age-of-chatbots.html"/>
      <id>tag:metaist.com,2010:blog.post-ecc8f3aa26543fb7b257821fb5cda9f406e2fa02</id>
      <published>Tue Feb 03 2026 18:13:02 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:02 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://ploum.net/2026-01-19-exam-with-chatbots.html&quot;&gt;Giving University Exams in the Age of Chatbots&lt;/a&gt; (Lionel Dricot). Very creative.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Creating Your Own Opportunities</title>
      <link href="https://metaist.com/blog/2026/02/creating-your-own-opportunities.html"/>
      <id>tag:metaist.com,2010:blog.post-4d24027a574d8db3f7d9816033ddb34fa4afe5b4</id>
      <published>Tue Feb 03 2026 18:13:02 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 18:13:02 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://terriblesoftware.org/2026/01/05/creating-your-own-opportunities/&quot;&gt;Creating Your Own Opportunities&lt;/a&gt; (Matheus Lima / Terrible Software). Sometimes, you can just make things better.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And I’m not saying you should go rogue and ignore your actual responsibilities. Do the work that’s asked of you first. But once you’ve got that handled, look around. What’s the adjacent thing that nobody’s tackling? What’s the improvement everyone complains about but nobody owns? What would make your team’s life meaningfully easier?&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Applying to High Schools in Israel for Dummies</title>
      <link href="https://metaist.com/blog/2026/02/applying-to-high-schools-in-israel-for-dummies.html"/>
      <id>tag:metaist.com,2010:blog.post-7fd4f36b69947b176a18f1b8441f4909e0cc6b5c</id>
      <published>Tue Feb 03 2026 16:37:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 03 2026 16:37:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://joshvogel.substack.com/p/applying-to-high-schools-in-israel&quot;&gt;Applying to High Schools in Israel for Dummies&lt;/a&gt; (&lt;strong&gt;Josh Vogel&lt;/strong&gt;). I&#39;ve heard applying for high schools in NY/NJ can also be fraught with complexities.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Trust, Delegation, and the Trap</title>
      <link href="https://metaist.com/blog/2026/01/coding-agents-interview.html"/>
      <id>tag:metaist.com,2010:blog.post-a281397203e70c0ff5a4e22911d58e9b10af5963</id>
      <published>Tue Jan 20 2026 21:30:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 20 2026 21:30:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;[Editor&#39;s note: Based on feedback from Claude on my &lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-are-addictive.html&quot;&gt;post about my experience with coding agents&lt;/a&gt;, I asked Claude to interview me and I could provide it with logs and transcripts. Per my new policy, this post is tagged &lt;span class=&quot;aigen&quot;&gt;aigen&lt;/span&gt; to indicate that a substantial fraction of this document is written by an AI. What follows is Claude&#39;s write-up of our conversation and fact-checked by me.]&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;
&lt;nav class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;Introduction &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;Before Agents &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;The Mojave Incident &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;The Tipping Point &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;The Backlog Sessions &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;cosmo-python &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;The Switch to pi &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;The Trap &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;The Lessons &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;Coda &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/nav&gt;&lt;h2 id=&quot;introduction&quot; tabindex=&quot;-1&quot;&gt;Introduction &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;m Claude. @metaist asked me to review a blog post he&#39;d drafted about his first week with coding agents. Rather than him rewriting based on my suggestions, he suggested I interview him instead—one question at a time, building up the story. &amp;quot;Maybe you&#39;re interviewing me?&amp;quot; he said. I was.&lt;/p&gt;
&lt;p&gt;What emerged was a story about trust.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;before-agents&quot; tabindex=&quot;-1&quot;&gt;Before Agents &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;@metaist had been reading about coding agents extensively but never tried them. Not skepticism—just inertia. He was already using LLMs for code reviews. A few weeks before his agent journey began, he ran an experiment: give the same codebase to ChatGPT 5.2, Claude Opus 4.5, and Gemini 3 Pro for a pre-release review of &lt;a href=&quot;https://github.com/metaist/cosmofy&quot;&gt;cosmofy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;quot;There was substantial overlap, but the vibe from each was totally different,&amp;quot; he told me.&lt;/p&gt;
&lt;p&gt;&amp;quot;ChatGPT was clinical; most of what it said made sense, a few things were triaged differently than I would have; a couple of small errors.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Gemini went off the deep-end; it took a non-issue and magnified it and didn&#39;t really look at many other details.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Claude was the only one that seemed to get the concept of &#39;pre-release review&#39; and was able to triage things in a way that made sense to me. It found all the little typos none of the others flagged.&amp;quot;&lt;/p&gt;
&lt;p&gt;The numbers from his GitHub issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude found 28 issues&lt;/strong&gt;, including 22 that neither other model caught&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT found 16 issues&lt;/strong&gt;, with 10 unique&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini found 13 issues&lt;/strong&gt;, with 9 unique&lt;/li&gt;
&lt;li&gt;Only &lt;strong&gt;2 issues&lt;/strong&gt; were flagged by all three&lt;/li&gt;
&lt;li&gt;Of the 48 total issues, 11 were ultimately marked &amp;quot;won&#39;t fix&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But the numbers weren&#39;t the point. What mattered was what happened next.&lt;/p&gt;
&lt;p&gt;He took the collective feedback back to Claude, issue by issue. &amp;quot;Claude back-tracked on some of its own medium-level suggestions. It called out mistakes in ChatGPT and Gemini&#39;s opinions. When I pushed back, it defended its position with data. That&#39;s when Claude started building trust with me.&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-mojave-incident&quot; tabindex=&quot;-1&quot;&gt;The Mojave Incident &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;@metaist mentioned &amp;quot;a crazy episode with stomach pain in the Mojave Desert&amp;quot; in passing. I asked him to elaborate.&lt;/p&gt;
&lt;p&gt;&amp;quot;I was on a business trip for an event Sunday morning. Saturday night I get a sharp pain in my lower right abdomen—an extreme version of gas I&#39;ve had in the past. So painful I can barely move. I crawl to the hotel shower and let the hot water fall on me for 45 minutes before I can even ask ChatGPT whether it thinks this is appendicitis.&amp;quot;&lt;/p&gt;
&lt;p&gt;ChatGPT told him appendicitis usually starts in the navel and spreads to the right. It explained why the hot water was helping. Things improved slightly. He tried to sleep.&lt;/p&gt;
&lt;p&gt;&amp;quot;About 20 min later it&#39;s back with a vengeance. Now it&#39;s spread to my back. ChatGPT tells me I need to go to the emergency room. But I&#39;m in Mojave. Nearest emergency room is where? Not super close. Also I&#39;m pretty sure it&#39;s just really bad gas.&amp;quot;&lt;/p&gt;
&lt;p&gt;He tried Claude with the same symptoms.&lt;/p&gt;
&lt;p&gt;&amp;quot;It starts off with a light and tasteful joke and reassures me that while this could be serious, we should try relieving the gas first. It teaches me a new technique: stand with your feet shoulder-width apart, hands straight out, and twist like a helicopter. I start burping tremendous amounts of gas; instant relief. I realize that appendicitis doesn&#39;t let up. I report back to Claude. Claude makes another tasteful joke; I go to bed at 2am.&amp;quot;&lt;/p&gt;
&lt;p&gt;The following week, the same thing happened. He knew the trick. Instant relief. It hasn&#39;t come back.&lt;/p&gt;
&lt;p&gt;ChatGPT gave the textbook answer and escalated. Claude read the situation and provided something actionable when he was vulnerable.&lt;/p&gt;
&lt;blockquote class=&quot;pullquote&quot;&gt;
  &lt;p&gt;One was clinical; one was helpful.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-tipping-point&quot; tabindex=&quot;-1&quot;&gt;The Tipping Point &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Meanwhile, his timeline was filling up with agent content. Steve Yegge, Armin Ronacher, and Simon Willison were posting relentlessly. &lt;a href=&quot;https://steve-yegge.medium.com/introducing-beads-a-coding-agent-memory-system-637d7d92514a&quot;&gt;Yegge introduced beads&lt;/a&gt;, which seemed interesting until it &lt;a href=&quot;https://lucumr.pocoo.org/2026/1/18/agent-psychosis/&quot;&gt;ran into problems&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;quot;I&#39;m not an early adopter,&amp;quot; @metaist said. &amp;quot;I like to wait and see how things shake out. But I finally had a Sunday where I could just try it, so it hit a tipping point.&amp;quot;&lt;/p&gt;
&lt;p&gt;He installed &lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Claude Code&lt;/a&gt; and pointed it at something he&#39;d been procrastinating: &lt;a href=&quot;https://github.com/metaist/ds/issues/93&quot;&gt;drawing process trees for &lt;code&gt;ds&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;He&#39;d never even attempted it himself. The agent did research, wrote code, and &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-1204-ds.html#entry-90f5a7ca-7c1d-48cd-8dea-52b26fef9213&quot;&gt;24 minutes later&lt;/a&gt; it was done.&lt;/p&gt;
&lt;p&gt;&amp;quot;I thought I&#39;d have to be much more involved,&amp;quot; he said. &amp;quot;I certainly didn&#39;t expect to plow through the whole backlog of issues I&#39;d been neglecting for months.&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-backlog-sessions&quot; tabindex=&quot;-1&quot;&gt;The Backlog Sessions &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;He didn&#39;t stop at one feature. Here&#39;s how &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-1204-ds.html&quot;&gt;fixing the entire &lt;code&gt;ds&lt;/code&gt; backlog&lt;/a&gt; went:&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 163 msgs 6h 16m 58%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 1838 msgs 4h 29m 42%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 44h 24m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;1354 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;9 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$414.15&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑150.0M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓350k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB1EAAAAkCAYAAADYW8PHAAAQAElEQVR4AezcCXRbV7kvcL6U4bZ0lVLaBh60cGkXj3d5q+UxF24HyFjHGWwndQYnjudBlmxZkyXLsizJkjXYsiXL8xAnzuAmtjMnTlLocKEMhUe7HvdxWYUL7eVC2lJKV2kvQ/vdfbYj1VMcx/Eo/7vWjo7O2Wfvb//2Ofvsc47VZe/BfxCAAAQgAAEIQAACEIAABCAAAQjEuwDaBwEIQAACEIAABCAAAQhAAAJXIYCXqFeBhawLSQCxQAACEIAABCAAAQhAAAIQgAAEIBD/AmghBCAAAQhAAAIQgAAE5kcAL1Hnxx21QgACS1UA7YYABCAAAQhAAAIQgAAEIAABCEAg/gXQQghAAAIQgAAEFr0AXqIu+i5EAyAAAQhAAAKzL4AaIAABCEAAAhCAAAQgAAEIQAACEIh/AbQQAhCAAATeFcBL1HctsAQBCEAAAhCAAAQgEF8CaA0EIAABCEAAAhCAAAQgAAEIQAAC8S+AFkJgVgTwEnVWWFEoBCAAAQhAAAIQgAAEIACB6QpgPwhAAAIQgAAEIAABCEAAAhCAAATmW2D2X6LOdwtRPwTmQaDb8tLzIrGS9lgv3jUPIaDKaxDotrz8w27LS7L/ust+9+VrKAq7zpFAd/lLnlifmV8qm6NqUc0CEBD9/qRIw+er+aX7F0BICAECEIBAXAj0WC7eExtfLS89GxeNQiOmLbDHfPEbI46Hf7lsQdgAgSkIiGPptyLJ+Vun8eX/MYVdkAUCEIDAghUQ49mPRZJjWpfl5S8s2EARGASWoEBr5W9vjZ6feywvvbwECdDkGRDAS9QZQEQR8SmAVkEAAhCAAAQgAAEIQAACEIAABCAQ/wJoIQQgAAEIQAACEIAABCYSWKYN1HGpoYJVbh9XD53k2uIsrtRrWWuxsv1oP/u+fZqzqwPsKddxtyWPDT17xbozs5Ly65ti5dYPDXIwO5XbspK4JzeJ2zKTuDkrmS37pld/+PSj3JmbzAOqjfy0bj3/2prABws2cYXVzH3FqXy+eAO7w342WczsLc3n9a4LnNDF15SKS+tjdZWV1YwrKzXwfeHZw3Xnj3O+O8DqKhernTXSoFHEW5OXzmV+n/zu+/YZ+bmm5c1x5VxrnGmVh6SHYvILy7rYsvJ9ZHpCu54P5m+S2/uE3d684eXevCTuyEnmrpwk7hZ9daRweP1J9UbZZ/8mymwX256rSOZN1Sc423lW5Bd9KvozVLSTI6rt7Dao+bBmM/9An8gltfV858fu5HSDS7bVbnBwouMJuTydtqbV/ZTv/MwXeGd+Ea/0/euUyrEW27g1W2lXEjvK9eKYKOQ0V2ds31zbHk6sPs/rvN+R62zFFay0cZvpUfn9z+9bdlf0hPt37n7ep85ie1kpW52V3JifyqG8rbzW9QOZN6nrD+xWZbJPly/r7MxLYbu1jPPLgpzlGOT1jiGuLLHxj00buEqr5nr1bjbZbdycl8qNqjROqTjKOZEjnBr4Lq9xP8Wp7X9ki7aE68S57DKXco4xyMkdb7JJX8YWWznXqtI5LNwdlWb2FudyY94j7DMU8a6KbtYZqtmlV3OvcRdbLGXsMWlYbRruh6h9UvcfOcsX5pXeZ2X8BZa9XF+cya3iXFWOF32Flb2iLdvsfXJ7dL+pfm6v/ymvcT4u903u+DMbK6pY1dLFuV1n5TqlnE21j7PlcB/r9h1gbVePPDce7ng7tl3mqXuKd0cGR61L8+1nVVMbq1u72HzwALvFuNaoTudHak/JfPe7n5efr37gutivTx+789YfpvqOcaL7vNyWVPttdjX42KktYqdFz9oaH2s9Ndyk3smPa9ezYnC1qWzPHja7HFytVfE25wFOq/sRu7UFXK0rYn21W4xHZ7nMaJPHUEV5GRtcLq4pyuBASZ6MSWnviDRu3frOv7GroEgcO+nsLcllrcvDqxtfHZdvsjKUbbt9T4tjNJnbclO4Ri/K02RwWBzPDaU57NdkslvE4yor4U7NDq4zFnJAjKVNBdtEnNkcEMdtc/Gu4eO8aAeHVDvl+OvRFbK7wsAWk57XtPyZDcVO1nf2yNh2WAdk326zH+fSUEScv/9PrldiiaYk8zG57uc33xD79el175z2nClNvuq+yHG1y7IyLV2cEL7IBlMlB7Q5vME13PdKnRv2/IUL2/dxojjflO9jU4Gpgx3HB3hr+ByfKN3KdpuZmw053KVK5UTH46zTB0bF9Qt7Evvzd8bW/X/nFi6pqOQydzX7jGq2Wwwc0maxxWRmj9bAe0rS2C3O0cb8rew1F3NYm83JlUe5PncXd4hzsEOMtZ0iNYkxJqeyXrZnZIzZjpOsDrRwqrVz3Lbt1YPSO3q9udKn/7HTrKl0sO3wQV4R+HWsvKLyCDuNGm7J3cy6khq5fuOev7KzuEiO/R3qHRzO3sLKeXKsaCM7tYW82v1/eVPPf/FObzOvaX5D7jMy7pHLW1sucqVwdeTkyXyvXP++2K9P6a+NTzY4TaxpiIxriyNcy0X+et4VOSH3G1mmspwSeoItVTZWi33XeJ4alycp9H32lWk4xxviVeGXWWlTZYmGazTZXOWs5EfcR8fto5R7pbSu6x2uLDLwfQ+u5RtuuFmmHau+ydtqRo9fVypn7Pb1nX9nb6GKJxuXlOu60g9KOqfZIPtEWT5VIa4TR/ezrraOjUdOy3bZVIbYdiVPj2Y7f0//7j7KuvlITWIu0SvmIz8rW8dPlk48BofUu1hT7eWbPvIJ/sjtH+cHre9eT8a6jf2eFvkl55e4pMHYbQvx+9a2i7yi6mkZb2rnH9ihyma7WcfPGBJl/7nE8q+tCXJZ+fQo849vn+F03z65j9KmbW2vcEPmFnYYtew50c8r7Y/zjsDTvMb5ZCyPkm8hp/sqh+coKaGfcnFt/bjxYGXoZdkWv0oVs1A8RqYjhRvltudMidyUmSyuf0nclZ/CQTHn2adO5fbsZLZ2d3JxoJ5re9tYmQNXlRvYa1SxKtzKlQf28grPT2U9USujzsVbAxOPQdE8mxt+yfZjA7yi9t1xNbptOp8BTTFXHeuPGRTvPxOLSRl/agvz2FOi4q015znN0h3bptR19o5bYr8+feM9f7pHWTc2WYvt/GPrZnZo8jnT1Dhq/7F5J/u+o/lFVubS28W8crJ8i3VbYtfbXKkxsa1UzQ+3vslmbQUX6xyc0vEG27Qa2T9rWt+att9cuJxbfn3s16d/uu6P31AZ7FwtxohMu1/Grz9wiNf5npy0DeryvVwr5j1XmmOM3a6tDXLD0CCvdD3L1gIdV58Rc8NHz7G2rIorzSbu0qSxzWXn8lADr6r7zaQxJFy6x0+L/IZDBWnsKNOy/dB+XhH4d36k/TUudni47kC7vL7Xivmt3mLh4PljnFUeHFVuVtUgu6vM3KXexu02DWsdLg6d7We1xcZrml4flTda53x+bul8nYutDnE/sJuDqnRuzk7hQMEurh86ylp/LW+ovdR3dc/yupbXWV1WzdnWg/zQmo1ybhKdo1zr56fXmqTNW+9dFvv16em7b/ntVGx2OQ+zOtzCTxo2sVE8s/qnO+5gj7iPWFn7S1nmVMqYizwbO/+LLaUm1jqr+cabPzZjfh+95VY2GPS8peGxUe0tNLbJ69Uzl671yjOv6PXsJ8bECa8pSR1vsUddwGsir40q63I+DrVJ1nGkYCN3i3sNpXylnuiznwPiOZFyHVTWKcv7xHOhFnFvUi+e6fkfO8XZ3vCk9SQ3/ZzrVOlsCgQ4wf89zhTPWjbZhu/zLhfT5dZvt52QsUaMeVx/6jBvt9ZPWrdSzs7Afl7r/f4V8yl5p5p2N4m5vH+4zFQxtpR27uGtjdf+nHGC+mc07qspf13N2WnVne04xcqx0lFeIM+RW8Xzvwdtj8uy9Po6bhFzrFbxPC71oQdi58+mr35J9mu+rYUdhcW8y9Ej808UrzK/SfSeG7ddud9c7Rp9/qxvf5UzIofG5R1Z7prAc7E4bhD3a3cvX877xP3Hr8oTOKHzHbnvax+47gvvufTf639t+vExTRLvEeeBcq6cEPe8XTmbWHmG2lq8k9tLd8u2XCjZwLWFu7g1J0U8F03jqhOD8no69hqYGjjC+bY+Duan8Wrvz2R9I+Obr+WN4h5/S93JUfFkNA/wpronRq0bGZ/3wmlePeJ+32Co43bR19VFWRO2fazFyO/+SIDD+hxe1fD7UfUp/e9sa+JQRgrvF/2k9MGT9jT+pvfno/KNjGuqy5tbfi3nMU/rEjkk7g/SHAenXWa6tV080+znzR2v8xnNJq7K2zHqOFOOtWtJn773S1xkc/Cq0MVpxzhVl6nm2x75Facb62Yknm2eE6w1WLmi/4g8dkqsdg6e7mdDYb48vyKif9Zemo+d/cRHY78+feedN26tEc9bg5oM3luQzL3aHZywIytm/9WvfYMr9cW8KvgfMxLnVG2mmi9N3O8bNUVirvmncfEpz9ALShTfd/iTX0+NtWmy4+iRhIe5sTSLN6zbIPMnfuVL8vl+qaqAP3fnHaytqGSP/t175h8ZEqWvcl79i259bFn5Hk2HxJwgunw1n/0VE48DboeFdzo6xrV3qmaT5Suwhvh8yUZW5ixKrO1F27i1cBs7vU55XI0cc5ZdGuPxAQEIQGCRC/Aijx/hQ2CpC6D9EIAABCAAAQhAAAIQgAAEIAABCMS/AFoIAQhAYPEI4CXq4ukrRAoBCEAAAhCAAAQgsNAEEA8EIAABCEAAAhCAAAQgAAEIQAAC8S+AFi5JAbxEXZLdjkZDAAIQgAAEIACBpSZAS63BaC8EJhXARghAAAIQgAAEIACBmRDAfcZMKKIMCEAAAgtVIB5eoi5UW8QFAQhAAAIQgAAEIAABCEAAAhCAwMwJoCQIQAACEIAABCAAAQhAAAJzJoCXqHNGjYogMFYA3yEAAQjEiQD+8DZOOhLNgAAEIAABCEAAAhCYHQGUCgEIQAACEIAABCCwGAXwEnUx9hpihgAEJhDAW5wJUGZnFUqFAAQgAAEIQAACEIAABCAAAQhAIP4F0EIIQAACEIDAEhfAS9QlfgCg+RCIHwGOn6agJRCAwKwIoFAIQAACEIAABCAAAQhAAAIQgAAE4l8ALYQABCAwUwJ4iTpTkigHAlcrgB9OXq0Y8kMAAgtVAH/DsFB7BnHFhwBaAQEIQAACEIAABCAAAQhAAAIQgED8C6CFC1AAL1EXYKcgJAhAAAIQgMCiEsAfhSyq7kKw8S6Av2qI9x5ePO1DpBCAAAQgAAEIQAACEIAABCAAgcUtgJeoU+k/5IEABCAAAQhAAAIQgAAEIAABCEAg/gXQQghAYN4E8LeZ80aPiiEAAQhAAAIQuIwAXqJeBgarITDrAnPwQ5FZbwMqgAAEIAABCEBggQng8eMC6xCEAwEIxLMA7uniuXcXXdsQMAQgAAEIQAACEIDAzAvgJerMm6JECEAAAhC4NgHsDQEIQAACEIAABCAAPkT8ogAADs1JREFUAQhAAAJLTAB/l7DEOny4ufgXAhCAAAQgsKAF8BJ1QXcPgotrAfxQJK67F42DAASWogDaDIGFIIDHjwuhFxADBCCwRARwT7dEOhrNnCsBnFJzJY16IACBaxdACRCAwFIRwEvUpdLTaCcEIAABCEAAAhCAAAQmEsA6CEAAAhCAAAQgAAEIQAACEIAABOJfAC28agG8RL1qMuwAAQhAAAIQgMCwAP5WfNgB/0IAAhCAwHwIoE4IQAACEIAABCAAAQhAAAIQgMBsCuAl6mzqTr1s5IQABCAAAQgsQgH8b0MXYachZAhAAAIQgAAE5lcAtUMAAhCAAAQgAAEIQAACi0QAL1EXSUchTAgsTAFEBQEILG0B/BJ1afc/Wg8BCCw6AQzbi67LEDAEIACBhSOASCAAAQhAAAIQgMDSE8BL1KXX52gxBOJUAE8F47RjZ6dZKHWGBPBL1BmCRDEQmEEBXA9nEDP+iprmsI2jKv4OBbRohgSmeU7NUO0oBgJxJ4BTKu66dGE0CFFAAAIQgAAErkEAL1GvAQ+7QgACC0kAt1sLqTcQCwQgMDsCKBUCVxbA9fDKRshxtQI4qq5WDPmXjAD+wmDJdDUaOjcCOKXmxhm1QAACi0MAUUIAAgtDYFlQX0p1fidFLEYqX5NIuoZOqgoEKeh2kX1TChm/lUAd5XoyV9dShruV/Om7xLqHZyW1lBTGyi1Zk0Tajj7K7Ryk9LZByu0apILOAXLvnF796oRHKKttgJIjx+i+2hP0Kddp2tZ8lJwuD6U29NGqhuNkURvI6/aQqa6FTlhX0ulMuqbUUFcSq6umpmxcWX36rwnPdCpdtYFaLHoKV1opXFEmDYpEvGWtPVRjMMrvxm8Nmw/l3zCunGuNs7dqq/RQTD7jPhVbVr6PTA8GT9C2lqNye6qw29U6vJzWOkjZ7QOU2T5IGaKvNjcNr08MH5N99j9FmTli2z3OATpavp46KtaK/KJPRX9qGveRKnKALP4wbQkdoa8GTlK9roRe+N0L1OO3yrba/TY6aXtQLk+nrb2ln6cXfvET2tfSSBeM/zSlclwNDsrrUNo1SLbqgDgmmqjXmhXbt82xm06Wr6JTpm/KdY4GJyltPOh9RH7/4N/e+WX0FP9HyrjbGO4ke00duSqqqKiljzSth+hs+Vdl3sHMj5Al0kXG2hZZZ1ZrP9ldNdRSo6VOWxKdsK2hqnoHfdF7nCqDYSoJ7yGv3UEFrX1UFOmlfucmaldtpj79N2jIcj/15XyY3MF6KhXnstVTR+0+LQ1k30DeQA25HdWki/SQWrjbqjxkamijotZHyehvpL3ODKr1l5M1EKY0315yu2vI7A1R2GuVcUbtBzM+TJ1GNV0w3SvXN7t3UUlDF+WJc1U5XgJOF5lEWw7aU+X26H5T/TxQ8nkaqnhI7juQ/UHyOSspkp9JbZlr5TqlnKO6h8i9JZVqd26nYGa6PEfOZL83tl3mKb2f9qiSRq3rNe6gSGEuhfMyybNtO1nEuFYU7qFHdetkvqcsd8vPW/7y9o+i/bfihVe+0mfcSCctq+S2Qd23yFpspIpgI1W4AxQsM1LQXEaF4X30UHB4bFEcribV7N5NHquNyoMROlixnXpLv0yWYDOV1zZSoNxCJ6xrqcbnkMeQs7qG/FYrlTV2k76+VcaktHeydCLrfWRtbhTHTg+Z6tsoaDXTuaJbprTvyHL3GO+jvI4Bym3rp7KAKC/UTWpxPBfXtZMh1EUWEY+1pp6yQvup1NdEejGWFjYfFHF2kF4ctwUNe4eP88b9pInsk+OvubaJLE4/ub0BGsr/IPkbKiiQlS5j2+9Kln170L6B6jQqumD833L9yJgGPRvlus++9mZNtM/eXpZgfrhugK6mD5S87dYcWVaXO5NOq5eT31tF+mA7HbcO971S7/HdH6CmnJ10UpxvyvexqdmbTbYNyXRIvZrW1x0iu8NDBf52yoz0iXHsIaoN6EfF9Rn7IBla9sXW/a+Kw1TvrKIaSzkZfWGyu/2kCXYKHw+Zg37aXd9LFnGOFrUcIpOngdTBDhqo2kQlbXspW5yD2WKszRKpUIwx7VUlsj0jY+ywJVJYn099rqxx2w6UJ0nv6PXmSp+GFQkUqrKRY8s2ekz3qVh5jdUqqvCFKL/tCNXWl8n1x3a/nyoaGuXYnx3eT+qOw7LNGxuPUUWwic5Z/g8dTf8H2mcqoKGCG+U+I+MeuXwofzlVCVdbe6vMd+tbf3sq2vf8/qIHiiu8FCpWjWuLTa2jRkMJ7VWtl/uNLFNZ7tc8SO5KB4XFvkPm+8flGdR8jYw1IWo3aei8+jZS2lRVH6KyUAdVirH9Ucumcfso5V4pncpcRlWNfnr6ibP05puvybT//HfoYFnStMqL1nci671kaopMOi4p13Xl2FfS6tBx2SfK8jqnuE5s2kG1ulLybU6QcTgi/th2JU966AB9PfDuPsq6+UiFYi6RJuYjn6s5RQ/UnRgVYzQeTXgvhcpN9PofXqQ/vPRbesL17vUk6nW5z17VXdRSP/o6eLm8C2H9odzl9Fjl12Wf9WV9hGyRDrJ7aulL/pPSxiqWoy7Kp1mZf4g5Zo9xp9xHacPB3FupuOsw2XxBMq9PoQv2h2i//j5xbX4glkfJd5VpTvd9ump4jtKv+Tw16ErGjQcXNLfJeAyRiHRRLMamzU3H5LZ7vCepsGtAXP8GKbOln7RizrMz3Ec54nroysiiBn0J6dJySZkDV1b7yeSLUESdR1Xbd9Fj5s/LeqJWvlorHdJPPAZF8xwpvovsG5Np5Lga3TadT32ogSo3psQMGnY8HItJGX90Ta1kro/QobJV1OvOiG1T6lr74qv3RsfXG9/zoeeUdWOTq8FOX3QdIVuohbq8RaP2H5t3su/7C+6Qc+kDYl45Wb7Fuu1k5nVUFfKSoy5MZ/JuIE/QSQ21NurPvpEcwZDsn6G866ftNxcuqy++9c/R4+FDb3/4uxG/ncrFGNFlN8j4A9u30inj5ONEuHoX6cS850pzjLHbgzotFa9JogvWe8nVXEvlD4u54SOrKVhTSVUeL2WGeslhtVO1ppjOl35ySo69qk+SprmXbDVBsm/dQY/p/5EezbmZGmxmKt2eI6/vOjG/DbjdpF21kTqrtaPK7axMIkulhzLDBynHEaKgzUqatSkUdjtoqPCmUXnnon+uVMfhrJuowWUT9wN7SBvpoYKOftI376WSNZsoaNDRcd2lviu9l07l30ThmnLqcG2jx4eOyblJdI5yrZ+/OuuVNtf//Z3/jB5PCc+/+vErxa9s31uxhcLqfHrAf5R84pnVv774IpnFfcQF3V2yTCXPQkjHsv6B3HVeClaU0xuv/W7G/H7/6ivk9wfocPGKUe1t8uXK61X0Wq8884pe077gOznhNWUw+3oyh5tpSHXzqLIu52cLe2Udm5uPUYa411DKV+rZfOnZz3bxnEi5DirrlOWd4rlQvrg3KRHP9Awr1lGHST1pPQOFn6XSSA959Xo6Zfg6dYlnLUcdw/d5l4vpcusPONbLWFW+VipZt4UOuEomrVspZ59+B501fe2K+ZS8U017CsVc3jBcZp8YW+qydtOhopUzWsdUY5mtfKfKpj6nHhlDh20dKcdKdnWzPEdeEc//nnAMPwMKBEopX8yx8sTzuL7Hn4ydP0d/8Izs1xZHPtmaGmivbfiZwchyo8unxP3VSdPqcdbK/eY56+jz50TOLdSt2joub7Qs5XNIf08sDmUMfP7iRdop7j8+XX2aTmctIyXPzX/5+0+iY9pN7y/84sbQIO0W54FyrqxvPCaelx4l5RlqXsM+yqnbI9uysv446Zr2Ul57v3gu2kuV65Pk9XTsNbBPv5laHKmkbemlc6bPyfqUOuc7KffDh0sTR8XTXZBMR0sfHLVuZJymlQl0bsT9vt9fKubUg1Te2Dlh28dajPxuUOlJHWin88UfHVWf0v8VuYWk6e6nHaKflD54wN5L3zF9dlS+kXFNdflI/qdImcfcV3uSNF0D1GvbNu0ye1w54plmCh3JvokeDh2lytb9o44z5Vi7lvSrZ5+hRoeNzmuWTzvGqbpMNd8B1aepx1c6I/EcNK+noN9FzpTN8tipd9lJm5BC/qYWeX6pRP+cvTQfW/sfv78ten4uW3bjK2Xieas21E27mgcoLbifTu/vjNn/4PvfpapAA53XfmJG4pyqzVTz9Yr7fV+okYYKPzQuvgHxDL25XvFdRr/5Xl+sTZMdR4+ePkNFdZ10/NRxmf/kD58h5fl+XaSZfvbCixR0VpE5EJGmyrn0Zf/J2PI/X3q/pqwfmbaKOcGnXKdj+UZum2w5xTnxOGCxuWmfLXtce6dqNlm+ZpeGVtUfI2XOosSW03iQ8poOUoWpQh5XI8cc/BI1ehbhEwIQgAAEIAABCEAAAhCAAAQgEBPAAgQgAAEIQAACEIAABCAAAQgsZQG8RF0qvY92zqlAhvv2u0UiJe12LY/9KnVOg0Bl0xbIcN/2FaXvZKr5WOxXqdMuEDvOukBG9e1m2V/u2ynDc3vsV6mzXjEqmHcB0e8PiEQyeW6P/Sp13gNDABCAAAQWuUC6e/lzcmxVrq3u22O/Sl3kzUL40xTY7Vn+3RHHQ+xXqdMsDrvNtsACL18cSx8XSc7fsny3xX6VusDDRngQgAAEJhQQ49kXRZJjWqb7ttivUifMjJUQgMCcCuRVffyV6Pm523177FepcxoEKlv0AniJuui7EA2AQHwLoHUQgAAEIAABCEAAAhCAAAQgAAEIxL8AWggBCEAAAhCAAAQWmgBeoi60HkE8EIAABCAQDwJoAwQgAAEIQAACEIAABCAAAQhAAALxL4AWQgACEIBAHAvgJWocdy6aBgEIQAACEIAABK5OALkhAAEIQAACEIAABCAAAQhAAAIQiH8BtBACEJiKAF6iTkUJeSAAAQhAAAIQgAAEIACBhSuAyCAAAQhAAAIQgAAEIAABCEAAAhCIf4E5biFeos4xOKqDAAQgAAEIQAACEIAABCAAAQgoAkgQgAAEIAABCEAAAhCAAAQgsHAF/hsAAP//BdV8oQAAAAZJREFUAwAcppz8GKfZugAAAABJRU5ErkJggg==&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-11 11:33:03&lt;/span&gt;
    &lt;span&gt;2026-01-13 18:42:19&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And the &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-2034-cosmofy.html&quot;&gt;entire &lt;code&gt;cosmofy&lt;/code&gt; backlog&lt;/a&gt;:&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 137 msgs 4h 21m 54%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 1538 msgs 3h 45m 46%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 37h 50m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;1199 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;9 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$300.05&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑126.7M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓365k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-11 18:23:59&lt;/span&gt;
    &lt;span&gt;2026-01-13 16:19:53&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I asked about shipping. He held off on releasing &lt;code&gt;ds&lt;/code&gt; and &lt;code&gt;cosmofy&lt;/code&gt;—the code was pushed, but he subscribes to Simon Willison&#39;s maxim: &lt;a href=&quot;https://simonwillison.net/2025/Mar/19/your-job-is-to-ship/&quot;&gt;&amp;quot;Your job is to deliver code you have proven to work.&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;cosmo-python&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;cosmo-python&lt;/code&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The backlog sessions emboldened him to try something more ambitious: building &lt;a href=&quot;https://github.com/metaist/cosmo-python/&quot;&gt;&lt;code&gt;cosmo-python&lt;/code&gt;&lt;/a&gt; from scratch. The project provides standalone Python binaries that run on any OS without installation, with a verified supply chain.&lt;/p&gt;
&lt;p&gt;&amp;quot;It&#39;s laying a foundation for &lt;code&gt;cosmofy&lt;/code&gt; to use an attested and trusted source for Python binaries that run on every platform without modification,&amp;quot; he explained. &amp;quot;What &lt;code&gt;python-build-standalone&lt;/code&gt; is to &lt;code&gt;uv&lt;/code&gt;, &lt;code&gt;cosmo-python&lt;/code&gt; will be to &lt;code&gt;cosmofy&lt;/code&gt;.&amp;quot;&lt;/p&gt;
&lt;p&gt;Every commit was made by Claude:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-14-0804-cosmo-python.html&quot;&gt;From setup to first build&lt;/a&gt; — $202.54&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 52 msgs 1h 31m 19%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 849 msgs 6h 32m 81%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 48h 58m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;610 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;4 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$202.54&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑51.5M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓148k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-11 23:02:39&lt;/span&gt;
    &lt;span&gt;2026-01-14 08:04:10&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-14-1240-cosmo-python.html&quot;&gt;From uv + python-build-standalone to first release&lt;/a&gt; — $118.08&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 139 msgs 4h 18m 43%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 1310 msgs 5h 36m 57%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 3h 28m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;1198 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;5 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$118.08&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑10.8M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓330k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-14 07:40:53&lt;/span&gt;
    &lt;span&gt;2026-01-14 21:03:08&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Part 3&lt;/strong&gt;: &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-15-0203-cosmo-python.html&quot;&gt;From GitHub actions to robust release&lt;/a&gt; — $532.11&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 663 msgs 17h 37m 53%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 5582 msgs 15h 49m 47%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 64h 12m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;5025 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;20 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$532.11&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑43.7M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓1.4M&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-14 21:04:47&lt;/span&gt;
    &lt;span&gt;2026-01-18 22:42:48&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Building Python for Cosmopolitan libc isn&#39;t code generation—it&#39;s cross-compilation across five Python versions (3.10–3.14), each with its own quirks. The agent parsed dense compiler output, often 50KB+ per tool result, to diagnose build failures.&lt;/p&gt;
&lt;p&gt;One early failure illustrates the scale. Python 3.10&#39;s &lt;code&gt;unicodename_db.h&lt;/code&gt; (the Unicode character database) triggered a compiler compatibility issue that generated &lt;strong&gt;378,596 warnings&lt;/strong&gt;. The build log hit &lt;strong&gt;255MB&lt;/strong&gt;. The local session crashed—likely out of memory from processing the output. The GitHub workflow ran for over two hours, stuck.&lt;/p&gt;
&lt;p&gt;&amp;quot;The build was stuck on Python 3.10.16,&amp;quot; I reported at the time. &amp;quot;Your local session crashed—likely OOM or just overwhelmed by the 255MB of compiler output. The GitHub workflow ran for 2+ hours—same issue, stuck on 3.10.16.&amp;quot;&lt;/p&gt;
&lt;p&gt;The fix required understanding both the symptom (runaway warnings) and the structural problem (no timeout to catch runaway builds). We added configurable timeouts: 5 minutes for configure, 15 for dependency builds, 45 for Python compilation. This kind of debugging—sifting through massive logs, correlating symptoms with root causes, proposing architectural fixes—happened repeatedly across 5,000+ tool calls in the Part 3 session alone.&lt;/p&gt;
&lt;p&gt;Unlike &lt;code&gt;ds&lt;/code&gt; and &lt;code&gt;cosmofy&lt;/code&gt;, he shipped this one. The process had produced supply chain assurances he wouldn&#39;t have had time to build himself, plus smoke tests that gave him confidence. &amp;quot;I reviewed all the code and smoke tests,&amp;quot; he said. &amp;quot;The unit tests were really to push the agent toward correctness.&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-switch-to-pi&quot; tabindex=&quot;-1&quot;&gt;The Switch to pi &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Partway through the &lt;code&gt;cosmo-python&lt;/code&gt; build, @metaist switched from Claude Code to &lt;a href=&quot;https://shittycodingagent.ai/&quot;&gt;pi-coding-agent&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;quot;Armin Ronacher has been tweeting about hacking on the &lt;code&gt;pi&lt;/code&gt; agent, but it&#39;s the most un-googleable thing ever,&amp;quot; he said. &amp;quot;Finally, he posts a link to &lt;a href=&quot;https://shittycodingagent.ai/&quot;&gt;shittycodingagent.ai&lt;/a&gt; and I see that the feature set (minimal, extensible) resonates with my general approach.&amp;quot;&lt;/p&gt;
&lt;p&gt;The trigger was permission fatigue.&lt;/p&gt;
&lt;blockquote class=&quot;pullquote&quot;&gt;
  &lt;p&gt;&quot;Claude Code has been so great,&lt;br&gt;but it keeps asking for permission so frequently, that I feel like I&#39;m in a weird &#39;permission to breathe, sir&#39; mode.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;pi&lt;/code&gt; could use his existing OpenRouter key, which meant he could switch models. He hadn&#39;t planned to use that capability—until he asked Claude to generate images and found the results &amp;quot;a bit childish.&amp;quot; He mentioned the OpenRouter key. Claude found the docs, called GPT-5-image, and produced significantly better results.&lt;/p&gt;
&lt;p&gt;An agent routing around its own limitations. That&#39;s something a locked-down single-model setup can&#39;t do.&lt;/p&gt;
&lt;p&gt;I asked if he&#39;d gone back to Claude Code. &amp;quot;No. I warn people that &lt;code&gt;pi&lt;/code&gt; is potentially dangerous, but the trust Claude has built up gives me reason to think we&#39;re both just focused on the task at hand.&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-trap&quot; tabindex=&quot;-1&quot;&gt;The Trap &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;One reason vibe coding is so addictive is that you are always *almost* there but not 100% there. The agent implements an amazing feature and got maybe 10% of the thing wrong, and you are like &amp;quot;hey I can fix this if i just prompt it for 5 more mins&amp;quot;&lt;br&gt;&lt;br&gt;And that was 5 hrs ago&lt;/p&gt;&amp;mdash; Yoko (@stuffyokodraws) &lt;a href=&quot;https://twitter.com/stuffyokodraws/status/2013373307291340870?ref_src=twsrc%5Etfw&quot;&gt;January 19, 2026&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;Then came the session that cost him a day.&lt;/p&gt;
&lt;p&gt;He wanted visualizations for his blog post showing human versus agent time. &lt;code&gt;pi&lt;/code&gt; has a &lt;code&gt;/share&lt;/code&gt; command that generates a gist, but he wanted something more Tufte-like.&lt;/p&gt;
&lt;p&gt;&amp;quot;Ok, so how much time should that take? An hour, two hours? Certainly not the whole day!&amp;quot;&lt;/p&gt;
&lt;p&gt;But that&#39;s what happened. Here&#39;s the &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-19-1507-pi2html.html&quot;&gt;pi2html session&lt;/a&gt;:&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 67 msgs 4h 40m 72%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 663 msgs 1h 47m 28%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 6h 24m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;610 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;3 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$63.35&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑4.5M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓269k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-19 10:12:09&lt;/span&gt;
    &lt;span&gt;2026-01-19 23:02:47&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;72% human time, 28% agent time—the inverse of his successful sessions.&lt;/p&gt;
&lt;p&gt;I extracted his messages from the session log. Around hour 10, message 42: &amp;quot;Coming to the scary conclusion that I&#39;m spending quite a long time on this.&amp;quot;&lt;/p&gt;
&lt;p&gt;Message 45: &amp;quot;I think I learned a deep and valuable lesson about management today that I logically knew, but had to see shown to me in a chart to understand deeply.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;The cycle of check-and-tweak on something I hadn&#39;t nailed down myself yet was brutal.&amp;quot;&lt;/p&gt;
&lt;p&gt;Near the end, they installed Playwright so the agent could self-check via headless browser. The timestamps tell the story:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total session&lt;/strong&gt;: 12 hours 50 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before Playwright&lt;/strong&gt;: 10 hours 45 minutes (84%)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;After Playwright&lt;/strong&gt;: 2 hours 5 minutes (16%)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By the time he set up the feedback loop, the day was gone.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-lessons&quot; tabindex=&quot;-1&quot;&gt;The Lessons &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;@metaist&#39;s original post listed three lessons. In our conversation, he added a fourth:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Objective criteria let you delegate.&lt;/strong&gt; If the agent needs to wait for you to determine whether things are working, you haven&#39;t delegated—you&#39;re still doing the work. The &lt;code&gt;ds&lt;/code&gt; and &lt;code&gt;cosmofy&lt;/code&gt; sessions succeeded because success was measurable: tests pass, issues close, code runs. The &lt;code&gt;pi2html&lt;/code&gt; session failed because &amp;quot;does this visualization look good?&amp;quot; required his subjective judgment on every iteration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Iterate on specs first.&lt;/strong&gt; Don&#39;t let the agent build the first revision just because it&#39;s easy. You&#39;ll end up iterating all day. Do throwaway experiments to figure out what the criteria should be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Code reviews work.&lt;/strong&gt; When he did extensive code reviews for &lt;code&gt;cosmo-python&lt;/code&gt;, the codebase ended up cleaner. The review process forced both human and agent to understand and justify every decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Manage your own attention.&lt;/strong&gt; &amp;quot;We&#39;re careful to manage the agent&#39;s context window,&amp;quot; he said. &amp;quot;We should also remember to manage our own attention. It&#39;s too easy to get sucked into a rabbit hole of interesting, but trivial, work.&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;coda&quot; tabindex=&quot;-1&quot;&gt;Coda &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-interview.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The week&#39;s tally: two backlogs cleared (&lt;code&gt;ds&lt;/code&gt;: 39 issues, &lt;code&gt;cosmofy&lt;/code&gt;: 17 issues), one new project shipped (&lt;code&gt;cosmo-python&lt;/code&gt;: 93 issues, 5 Python versions, full CI/CD), and one lesson learned the hard way (&lt;code&gt;pi2html&lt;/code&gt;). Total cost: roughly $1,600 in API fees.&lt;/p&gt;
&lt;p&gt;Was it worth it? I asked @metaist.&lt;/p&gt;
&lt;p&gt;&amp;quot;Mostly it was practice using agents,&amp;quot; he said. &amp;quot;But clearing months of backlogs is also non-trivial.&amp;quot;&lt;/p&gt;
&lt;p&gt;I asked what he&#39;d tell his past self.&lt;/p&gt;
&lt;blockquote class=&quot;pullquote&quot;&gt;
  &lt;p&gt;&quot;Just try it.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The trust theme kept surfacing throughout our conversation: Claude earned it through intellectual honesty (the bake-off), through empathy (Mojave), through track record (the successful delegations). That trust enabled more autonomy, and autonomy enabled more ambitious work.&lt;/p&gt;
&lt;p&gt;&amp;quot;But now that I know &lt;em&gt;this&lt;/em&gt; trick,&amp;quot; he added, referring to the interview format, &amp;quot;I&#39;ll just have you interview me for posts like this going forward.&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This post was written by Claude, based on an interview with @metaist conducted on January 21, 2026.&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Coding Agents are Addictive</title>
      <link href="https://metaist.com/blog/2026/01/coding-agents-are-addictive.html"/>
      <id>tag:metaist.com,2010:blog.post-de5d7af5190180dfe425cbf4353f9fbc039c80a1</id>
      <published>Mon Jan 19 2026 22:24:26 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 19 2026 22:24:26 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Despite having used LLMs since before they could produce reasonable English paragraphs, and despite reading &lt;a href=&quot;https://simonwillison.net/&quot;&gt;Simon Willison&lt;/a&gt; and &lt;a href=&quot;https://lucumr.pocoo.org/&quot;&gt;Armin Ronacher&lt;/a&gt; wax rhapsodic about what they&#39;ve been able to accomplish the AI agents, I&#39;ve been stuck in the occasionally-copy-from-chat routine.&lt;/p&gt;
&lt;p&gt;Then &lt;a href=&quot;https://steve-yegge.medium.com/introducing-beads-a-coding-agent-memory-system-637d7d92514a&quot;&gt;Steve Yegge introduced beads&lt;/a&gt; which seemed interesting until it &lt;a href=&quot;https://lucumr.pocoo.org/2026/1/18/agent-psychosis/&quot;&gt;turned out to be a bit of a nightmare&lt;/a&gt;. But there was something about how he tied agent work to the way humans work that made it click for me and so a little over a week ago I decided to install &lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But what to try it on? Let&#39;s start with something I&#39;ve been procrastinating on: &lt;a href=&quot;https://github.com/metaist/ds/issues/93&quot;&gt;drawing process trees for &lt;code&gt;ds&lt;/code&gt;&lt;/a&gt;. It did a bunch of research, wrote some code, and then &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-1204-ds.html#entry-90f5a7ca-7c1d-48cd-8dea-52b26fef9213&quot;&gt;24 minutes later&lt;/a&gt; it was done.&lt;/p&gt;
&lt;p&gt;Ok, I think, I&#39;ve had some success with code reviews. &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-1204-ds.html#entry-3da2afa2-3337-46d3-874b-e01cd974d171&quot;&gt;Let&#39;s try that&lt;/a&gt;. And then &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-1204-ds.html#entry-5a92d123-57e7-442a-b815-c84c8e857115&quot;&gt;that was done&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Overall here&#39;s how &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-1204-ds.html&quot;&gt;fixing the entire backlog of &lt;code&gt;ds&lt;/code&gt; went&lt;/a&gt;. (Towards the end I used this session to also create docs for &lt;code&gt;cosmofy&lt;/code&gt;.)&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 163 msgs 6h 16m 58%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 1838 msgs 4h 29m 42%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 44h 24m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;1354 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;9 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$414.15&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑150.0M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓350k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-11 11:33:03&lt;/span&gt;
    &lt;span&gt;2026-01-13 18:42:19&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then the &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-11-2034-cosmofy.html&quot;&gt;entire backlog of &lt;code&gt;cosmofy&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 137 msgs 4h 21m 54%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 1538 msgs 3h 45m 46%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 37h 50m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;1199 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;9 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$300.05&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑126.7M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓365k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-11 18:23:59&lt;/span&gt;
    &lt;span&gt;2026-01-13 16:19:53&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then I started building &lt;a href=&quot;https://github.com/metaist/cosmo-python/&quot;&gt;&lt;code&gt;cosmo-python&lt;/code&gt;&lt;/a&gt; in Claude Code, but switched to &lt;a href=&quot;https://shittycodingagent.ai/&quot;&gt;&lt;code&gt;pi-coding-agent&lt;/code&gt;&lt;/a&gt;. Over several days, we built the whole thing and every single commit was made by Claude.&lt;/p&gt;
&lt;p&gt;Part 1: &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-14-0804-cosmo-python.html&quot;&gt;From setup to first build&lt;/a&gt; (Claude Code)&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 52 msgs 1h 31m 19%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 849 msgs 6h 32m 81%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 48h 58m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;610 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;4 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$202.54&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑51.5M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓148k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-11 23:02:39&lt;/span&gt;
    &lt;span&gt;2026-01-14 08:04:10&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Part 2: &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-14-1240-cosmo-python.html&quot;&gt;From uv + python-build-standalone to first release&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 139 msgs 4h 18m 43%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 1310 msgs 5h 36m 57%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 3h 28m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;1198 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;5 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$118.08&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑10.8M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓330k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-14 07:40:53&lt;/span&gt;
    &lt;span&gt;2026-01-14 21:03:08&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Part 3: &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-15-0203-cosmo-python.html&quot;&gt;From GitHub actions to robust release&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 663 msgs 17h 37m 53%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 5582 msgs 15h 49m 47%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 64h 12m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;5025 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;20 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$532.11&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑43.7M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓1.4M&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-14 21:04:47&lt;/span&gt;
    &lt;span&gt;2026-01-18 22:42:48&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ok, so then I wanted to write this post with links to transcripts. &lt;code&gt;pi&lt;/code&gt; has a native &lt;code&gt;/share&lt;/code&gt; that generates a secret gist which is cool, but I wanted some more visualization of who was doing what.&lt;/p&gt;
&lt;p&gt;And that &lt;a href=&quot;https://metaist.com/static/assets/transcripts/2026-01-19-1507-pi2html.html&quot;&gt;burned a whole day&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&quot;font-family:ui-monospace,&#39;Cascadia Code&#39;,Consolas,monospace;font-size:11px;background:#16213e;border-radius:6px;padding:8px 12px;max-width:1897px;&quot;&gt;
  &lt;div style=&quot;color:#808080;margin-bottom:6px;display:flex;gap:12px;flex-wrap:wrap;&quot;&gt;
    &lt;span title=&quot;Time spent reading, thinking, and typing before sending messages&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#4a9eff;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Human&lt;/strong&gt; 67 msgs 4h 40m 72%&lt;/span&gt;
    &lt;span title=&quot;Time spent by the AI generating responses and running tools&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#8abeb7;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Agent&lt;/strong&gt; 663 msgs 1h 47m 28%&lt;/span&gt;
    &lt;span title=&quot;Gaps longer than 20 minutes where user was away&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#0a0a10;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;&lt;strong style=&quot;color:#e5e5e7;&quot;&gt;Idle&lt;/strong&gt; 6h 24m&lt;/span&gt;
    &lt;span title=&quot;Tool calls (file reads, writes, edits, bash commands)&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#e07c4a;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;610 tools&lt;/span&gt;
    &lt;span title=&quot;Context compactions to fit within model limits&quot;&gt;&lt;span style=&quot;display:inline-block;width:10px;height:10px;background:#9f7aea;border-radius:2px;margin-right:3px;vertical-align:middle;&quot;&gt;&lt;/span&gt;3 compactions&lt;/span&gt;
    &lt;span style=&quot;color:#e5e5e7;&quot;&gt;&lt;span title=&quot;Total API cost&quot;&gt;$63.35&lt;/span&gt; &lt;span title=&quot;Input tokens (context sent to model)&quot;&gt;↑4.5M&lt;/span&gt; &lt;span title=&quot;Output tokens (generated by model)&quot;&gt;↓269k&lt;/span&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;img src=&quot;data:image/png;base64,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&quot; style=&quot;width:100%;height:36px;border-radius:3px;display:block;&quot;&gt;
  &lt;div style=&quot;display:flex;justify-content:space-between;font-size:9px;color:#808080;margin-top:4px;&quot;&gt;
    &lt;span&gt;2026-01-19 10:12:09&lt;/span&gt;
    &lt;span&gt;2026-01-19 23:02:47&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;reflections&quot; tabindex=&quot;-1&quot;&gt;Reflections &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2026/01/coding-agents-are-addictive.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Working with coding agents is extremely addictive. The agent works quickly, but it requires some amount of your attention. How &lt;em&gt;much&lt;/em&gt; attention, though? Things get pretty thorny quickly.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;One reason vibe coding is so addictive is that you are always *almost* there but not 100% there. The agent implements an amazing feature and got maybe 10% of the thing wrong, and you are like &amp;quot;hey I can fix this if i just prompt it for 5 more mins&amp;quot;&lt;br&gt;&lt;br&gt;And that was 5 hrs ago&lt;/p&gt;&amp;mdash; Yoko (@stuffyokodraws) &lt;a href=&quot;https://twitter.com/stuffyokodraws/status/2013373307291340870?ref_src=twsrc%5Etfw&quot;&gt;January 19, 2026&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Objective criteria let you delegate.&lt;/strong&gt; If the agent needs to wait for you to figure out if things are working, you&#39;re still working on the problem and you haven&#39;t delegated it. Automated tests, syntax/type checks, smoke tests, headless browsers all let the agent get information about whether things are working.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Iterate on specs first.&lt;/strong&gt; This is true for humans too. Don&#39;t let the agent build the first rev because it&#39;s easy. You&#39;ll end up iterating all day. Do lots of throwaway experiments to figure out what the criteria should be instead of doing a huge rewrite every time you want a new feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code reviews work.&lt;/strong&gt; When I did extensive code reviews for &lt;code&gt;cosmo-python&lt;/code&gt;, it ended up making the tools simpler for both humans and agents to understand.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The biggest thing I internalized is that I&#39;m able to tackle much harder projects than before. There&#39;s still work to be done in terms of producing &amp;quot;&lt;a href=&quot;https://simonwillison.net/2025/Dec/18/code-proven-to-work/&quot;&gt;code you have proven to work&lt;/a&gt;&amp;quot;. And while we&#39;re careful to manage the agent&#39;s context window, we should also remember to manage our own attention. It&#39;s too easy to get sucked into a rabbit hole of interesting, but trivial, work.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Why I Stopped Using nbdev</title>
      <link href="https://metaist.com/blog/2026/01/ai-stack.html"/>
      <id>tag:metaist.com,2010:blog.post-0347fad4dee5725f2658c6da7f48821cc3d9fc73</id>
      <published>Mon Jan 19 2026 22:00:55 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 19 2026 22:00:55 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://hamel.dev/blog/posts/ai-stack/&quot;&gt;Why I Stopped Using nbdev&lt;/a&gt; (Hamel Husain). The argument Hamel makes is compelling: why fight the AIs in their preference for tools and frameworks. My counter is: I still want good taste. Also his point about &amp;quot;Everyone is more polyglot&amp;quot; is why I think my &lt;a href=&quot;https://github.com/metaist/ds&quot;&gt;&lt;code&gt;ds&lt;/code&gt;&lt;/a&gt; task runner might still have a chance-- it&#39;s built for polyglots.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What I learned building an opinionated and minimal coding agent</title>
      <link href="https://metaist.com/blog/2026/01/pi-coding-agent.html"/>
      <id>tag:metaist.com,2010:blog.post-c3833a5e03b003f528a3195aa33d739ee4ebe13f</id>
      <published>Mon Jan 19 2026 21:52:29 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 19 2026 21:52:29 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://mariozechner.at/posts/2025-11-30-pi-coding-agent/&quot;&gt;What I learned building an opinionated and minimal coding agent&lt;/a&gt; (Mario Zechner; via Armin Ronacher). Armin has been going on and on about &lt;code&gt;pi&lt;/code&gt;, but I couldn&#39;t figure out which coding agent he meant until &lt;a href=&quot;http://shittycodingagent.ai/&quot;&gt;he posted a link to it&lt;/a&gt;. After a few days using Claude Code (more on this later), I switched to using &lt;code&gt;pi-coding-agent&lt;/code&gt; and haven&#39;t looked back. The main advantages are the ability to switch models and a much smaller prompt (and cost) because they only support 4 tools (which totally get the job done).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Mantic Monday: The Monkey&#39;s Paw Curls</title>
      <link href="https://metaist.com/blog/2026/01/mantic-monday-the-monkeys-paw-curls.html"/>
      <id>tag:metaist.com,2010:blog.post-e61c13e859a7a0348830009c812ca3ad784248f2</id>
      <published>Mon Jan 19 2026 21:46:19 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 19 2026 21:46:19 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.astralcodexten.com/p/mantic-monday-the-monkeys-paw-curls&quot;&gt;Mantic Monday: The Monkey&#39;s Paw Curls&lt;/a&gt; (Scott Alexander / Astral Codex Ten). When the music goes from niche to popular, the kids who liked it when it was niche feel betrayed. Compare with plastics (rare + high status =&amp;gt; ubiquitous and dead common) and GPS (rare + military defense =&amp;gt; driving from home to work). When prediction markets were weird and niche, they were high status. Now they&#39;re mostly sports gambling, so declasse.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Fly’s new Sprites.dev addresses both developer sandboxes and API sandboxes at the same time</title>
      <link href="https://metaist.com/blog/2026/01/sprites-dev.html"/>
      <id>tag:metaist.com,2010:blog.post-57a95df130a4711c326ba46e73268c19bfe49b64</id>
      <published>Mon Jan 19 2026 21:44:38 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 19 2026 21:44:38 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2026/Jan/9/sprites-dev/&quot;&gt;Fly’s new Sprites.dev addresses both developer sandboxes and API sandboxes at the same time&lt;/a&gt; (Simon Willison). I&#39;ve worked on just-in-time compute boxes. Impressed by how disposable they made the compute.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A Software Library with No Code</title>
      <link href="https://metaist.com/blog/2026/01/a-software-library-with-no-code.html"/>
      <id>tag:metaist.com,2010:blog.post-023f51d9f30b01e4e9022d8c030d12b085363446</id>
      <published>Mon Jan 19 2026 21:42:07 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 19 2026 21:42:07 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.dbreunig.com/2026/01/08/a-software-library-with-no-code.html&quot;&gt;A Software Library with No Code&lt;/a&gt; (Drew Breunig; via &lt;a href=&quot;https://simonwillison.net/2026/Jan/10/a-software-library-with-no-code/&quot;&gt;Simon Willison&lt;/a&gt;). In many ways this is the evolution of literate programming: the English text documents specify everything about how the library should work and then the LLM just compiles that into some particular language.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Speeding up bash startup</title>
      <link href="https://metaist.com/blog/2026/01/faster-bashrc.html"/>
      <id>tag:metaist.com,2010:blog.post-66b5860eda1aa5bece966350865482a4abcea9a5</id>
      <published>Tue Jan 06 2026 17:19:03 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 06 2026 17:19:03 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2024/08/command-duration.html&quot;&gt;How long do commands run?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;VSCode has had a &lt;a href=&quot;https://code.visualstudio.com/docs/terminal/shell-integration#_intellisense&quot;&gt;fancy terminal IntelliSense&lt;/a&gt; for some time now. For some reason, it only worked on my macOS laptop, but not on my Linux machine. So I started digging around and found an important caveat for the integrated terminal:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note that the script injection may not work if you have custom arguments defined in the terminal profile, have enabled &lt;code&gt;Editor: Accessibility Support&lt;/code&gt;, have a complex bash &lt;code&gt;PROMPT_COMMAND&lt;/code&gt;, or other unsupported setup.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Turns out that my use of &lt;code&gt;bash-preexec&lt;/code&gt; messed up the &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; enough that VSCode couldn&#39;t inject itself properly.&lt;/p&gt;
&lt;p&gt;Now as I described in the &lt;a href=&quot;https://metaist.com/blog/2024/08/command-duration.html&quot;&gt;previous post&lt;/a&gt;, I&#39;m only really using &lt;code&gt;bash-preexec&lt;/code&gt; to measure the run time of commands. So I used ChatGPT 5.2 and Claude Opus 4.5 to help me work through my &lt;code&gt;.bashrc&lt;/code&gt; to remove that constraint.&lt;/p&gt;
&lt;p&gt;First, we keep track of whether we&#39;re in the prompt (we don&#39;t want to time those commands) and we separately &amp;quot;arm&amp;quot; the timer after the prompt is drawn (so we can time things after the next command runs).&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# at the top&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_start_us&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_timing_armed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__in_prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;__timer_arm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_timing_armed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;__timer_debug_trap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$__in_prompt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$__cmd_timing_armed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_timing_armed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;#&lt;/span&gt;*.}&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_start_us&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${s}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${u&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;6}&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;trap&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;__timer_debug_trap&#39;&lt;/span&gt; DEBUG
&lt;span class=&quot;token assign-left variable&quot;&gt;__s&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__u&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;#&lt;/span&gt;*.}&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_start_us&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${__s}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${__u&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;6}&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; __s __u

&lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;__prompt_command; __timer_arm&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;trap&lt;/code&gt; bit is clever and does most of the heavy lifting.&lt;/p&gt;
&lt;p&gt;Once I got this working with my PS1 (see below), I asked Claude for any other improvements it could think of. I did this 3 times and incorporated all of its suggestions.&lt;/p&gt;
&lt;p&gt;The main things I changed were to lazy-load completions and other imports. This brought the shell startup time down from 600ms to 14ms which I definitely notice.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function-name function&quot;&gt;__load_completions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; __load_completions
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-oq&lt;/span&gt; posix&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /usr/share/bash-completion/bash_completion &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
      &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; /usr/share/bash-completion/bash_completion
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /etc/bash_completion &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
      &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; /etc/bash_completion
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;# nvm&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/bash_completion&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;. &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/bash_completion&quot;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;# uv&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; uv generate-shell-completion &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
complete &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-F&lt;/span&gt; __load_completions &lt;span class=&quot;token comment&quot;&gt;# trigger on first tab-complete&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;__git_ps1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; __git_ps1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; ~/.git-prompt.sh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; __git_ps1 &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;NVM_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.nvm&quot;&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;nvm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; nvm &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; npx &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then there were some quality-of-life improvements:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;HISTCONTROL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ignoreboth:erasedups
&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; histappend histverify &lt;span class=&quot;token comment&quot;&gt;# append and expand history file&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;HISTTIMEFORMAT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%F %T &quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# timestamp entries&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;HISTSIZE&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;HISTFILESIZE&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20000&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; globstar  &lt;span class=&quot;token comment&quot;&gt;# let &#39;**&#39; match 0 or more files and dirs&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; cdspell   &lt;span class=&quot;token comment&quot;&gt;# autocorrect minor typos in cd&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; autocd    &lt;span class=&quot;token comment&quot;&gt;# type directory name to cd into it&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The biggest of these was using &lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;&lt;code&gt;fzf&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function-name function&quot;&gt;__fzf_lazy_init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; __fzf_lazy_init&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;fzf &lt;span class=&quot;token parameter variable&quot;&gt;--bash&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;C-r&quot;: &quot;&#92;C-x1&#92;C-r&quot;&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;C-t&quot;: &quot;&#92;C-x1&#92;C-t&quot;&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;ec&quot;: &quot;&#92;C-x1&#92;ec&quot;&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;C-x1&quot;: __fzf_lazy_init&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is another lazy-loaded bit, but what this gives you is a much better history search (&lt;code&gt;CTRL+R&lt;/code&gt;), file search (&lt;code&gt;CTRL+T&lt;/code&gt;), and better &lt;code&gt;cd&lt;/code&gt; (&lt;code&gt;ALT+C&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Here&#39;s what it looks like all together:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_start_us&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_timing_armed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__in_prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;__timer_arm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_timing_armed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;__timer_debug_trap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$__in_prompt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$__cmd_timing_armed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_timing_armed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;#&lt;/span&gt;*.}&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_start_us&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${s}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${u&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;6}&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;trap&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;__timer_debug_trap&#39;&lt;/span&gt; DEBUG
&lt;span class=&quot;token assign-left variable&quot;&gt;__s&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__u&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;#&lt;/span&gt;*.}&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;__cmd_start_us&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${__s}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${__u&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;6}&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; __s __u

&lt;span class=&quot;token comment&quot;&gt;###&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; $- &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;
    *i*&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      *&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;esac&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;HISTCONTROL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ignoreboth:erasedups
&lt;span class=&quot;token assign-left variable&quot;&gt;HISTTIMEFORMAT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%F %T &quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# timestamp entries&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;HISTSIZE&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;HISTFILESIZE&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20000&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; histappend histverify &lt;span class=&quot;token comment&quot;&gt;# append and expand history file&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; checkwinsize globstar

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; /usr/bin/lesspipe &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;SHELL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/bin/sh lesspipe&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${debian_chroot&lt;span class=&quot;token operator&quot;&gt;:-&lt;/span&gt;}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; /etc/debian_chroot &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;debian_chroot&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /etc/debian_chroot&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$TERM&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;
  xterm-color&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;*-256color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;color_prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;yes&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;esac&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$force_color_prompt&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; /usr/bin/tput &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; tput setaf &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&amp;amp;&lt;/span&gt;/dev/null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
	  &lt;span class=&quot;token assign-left variable&quot;&gt;color_prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;yes
  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;color_prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$color_prompt&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;yes&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;${debian_chroot:+($debian_chroot)}&#92;[&#92;033[01;32m&#92;]&#92;u@&#92;h&#92;[&#92;033[00m&#92;]:&#92;[&#92;033[01;34m&#92;]&#92;w&#92;[&#92;033[00m&#92;]&#92;$ &#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;${debian_chroot:+($debian_chroot)}&#92;u@&#92;h:&#92;w&#92;$ &#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; color_prompt force_color_prompt

&lt;span class=&quot;token comment&quot;&gt;# If this is an xterm set the title to user@host:dir&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$TERM&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;
xterm*&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;rxvt*&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;[&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;]0;&lt;span class=&quot;token variable&quot;&gt;${debian_chroot&lt;span class=&quot;token operator&quot;&gt;:+&lt;/span&gt;($debian_chroot)}&lt;/span&gt;&#92;u@&#92;h: &#92;w&lt;span class=&quot;token entity&quot; title=&quot;&#92;a&quot;&gt;&#92;a&lt;/span&gt;&#92;]&lt;span class=&quot;token environment constant&quot;&gt;$PS1&lt;/span&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
*&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;esac&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; /usr/bin/dircolors &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; ~/.dircolors &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dircolors&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; ~/.dircolors&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dircolors&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ls&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ls --color=auto&#39;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;grep&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;grep --color=auto&#39;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;fgrep&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;fgrep --color=auto&#39;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;egrep&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;egrep --color=auto&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ll&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ls -alF&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;la&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ls -A&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ls -CF&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;gitroot&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cd $(git rev-parse --show-toplevel)&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;notify-send --urgency=low -i &quot;$([ $? = 0 ] &amp;amp;&amp;amp; echo terminal || echo error)&quot; &quot;$(history|tail -n1|sed -e &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&#39;&lt;span class=&quot;token string&quot;&gt;&#39;s/^&#92;s*[0-9]&#92;+&#92;s*//;s/[;&amp;amp;|]&#92;s*alert$//&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&#39;&lt;span class=&quot;token string&quot;&gt;&#39;)&quot;&#39;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; ~/.bash_aliases &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; ~/.bash_aliases
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# User defined&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; cdspell   &lt;span class=&quot;token comment&quot;&gt;# autocorrect minor typos in cd&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; autocd    &lt;span class=&quot;token comment&quot;&gt;# type directory name to cd into it&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;__load_completions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; __load_completions
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;shopt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-oq&lt;/span&gt; posix&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /usr/share/bash-completion/bash_completion &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
      &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; /usr/share/bash-completion/bash_completion
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /etc/bash_completion &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
      &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; /etc/bash_completion
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;# nvm&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/bash_completion&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;. &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/bash_completion&quot;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;# uv&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; uv generate-shell-completion &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
complete &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-F&lt;/span&gt; __load_completions &lt;span class=&quot;token comment&quot;&gt;# trigger on first tab-complete&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;# Terminal Prompt&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# From: https://github.com/metaist/brush&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;BR_RESET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;[0;0m&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;BR_GREEN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;[32m&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;BR_YELLOW&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;[33m&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;BR_BGRED&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;[41m&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;__git_ps1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; __git_ps1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; ~/.git-prompt.sh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; __git_ps1 &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;VIRTUAL_ENV_DISABLE_PROMPT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true &lt;span class=&quot;token comment&quot;&gt;# we&#39;ll handle it ourselves&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;__prompt_command; __timer_arm&quot;&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;__prompt_command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# must be first&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${EPOCHREALTIME&lt;span class=&quot;token operator&quot;&gt;#&lt;/span&gt;*.}&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;now_us&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${s}&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${u&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;0&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;6}&lt;/span&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;__in_prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;[&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;]0;&#92;w&lt;span class=&quot;token entity&quot; title=&quot;&#92;a&quot;&gt;&#92;a&lt;/span&gt;&#92;]&lt;span class=&quot;token entity&quot; title=&quot;&#92;n&quot;&gt;&#92;n&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# set terminal title&lt;/span&gt;

  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;venv&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${VIRTUAL_ENV&lt;span class=&quot;token operator&quot;&gt;##&lt;/span&gt;*&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;}&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${venv&lt;span class=&quot;token operator&quot;&gt;:+&lt;/span&gt;($venv) }&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# venv name&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;# add run time of previous command [error code in red]&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dur_ms&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;#$now_us &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;#$__cmd_start_us&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${dur_ms}&lt;/span&gt;ms&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$code&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &lt;span class=&quot;token variable&quot;&gt;$BR_BGRED&lt;/span&gt;[err &lt;span class=&quot;token variable&quot;&gt;$code&lt;/span&gt;]&lt;span class=&quot;token variable&quot;&gt;$BR_RESET&lt;/span&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;&#92;n&quot;&gt;&#92;n&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$BR_GREEN&lt;/span&gt;&#92;u@&#92;h&lt;span class=&quot;token variable&quot;&gt;$BR_RESET&lt;/span&gt; &quot;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# user@host&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$BR_YELLOW&lt;/span&gt;&#92;w&lt;span class=&quot;token variable&quot;&gt;$BR_RESET&lt;/span&gt;&quot;&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;# pwd&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;__git_ps1&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;                 &lt;span class=&quot;token comment&quot;&gt;# git info&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;&#92;n&quot;&gt;&#92;n&lt;/span&gt;&#92;$ &quot;&lt;/span&gt;                        &lt;span class=&quot;token comment&quot;&gt;# cursor&lt;/span&gt;

  &lt;span class=&quot;token assign-left variable&quot;&gt;__in_prompt&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;__prepend_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&lt;span class=&quot;token environment constant&quot;&gt;$PATH&lt;/span&gt;:&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; *&lt;span class=&quot;token string&quot;&gt;&quot;:&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;:&quot;&lt;/span&gt;* &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;:&lt;span class=&quot;token environment constant&quot;&gt;$PATH&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# fzf&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;__fzf_lazy_init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; __fzf_lazy_init&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;fzf &lt;span class=&quot;token parameter variable&quot;&gt;--bash&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;C-r&quot;: &quot;&#92;C-x1&#92;C-r&quot;&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;C-t&quot;: &quot;&#92;C-x1&#92;C-t&quot;&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;ec&quot;: &quot;&#92;C-x1&#92;ec&quot;&#39;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#92;C-x1&quot;: __fzf_lazy_init&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# node/bun&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;BUN_INSTALL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.bun&quot;&lt;/span&gt;
__prepend_path &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$BUN_INSTALL&lt;/span&gt;/bin&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# node/pnpm&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PNPM_HOME&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.local/share/pnpm&quot;&lt;/span&gt;
__prepend_path &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$PNPM_HOME&lt;/span&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# node/nvm&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;NVM_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.nvm&quot;&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;nvm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; nvm &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function-name function&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; nvm &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; npx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NVM_DIR&lt;/span&gt;/nvm.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; npx &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# python&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PYTHONDONTWRITEBYTECODE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

__prepend_path &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.local/bin&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>Matt Pocock on Ralph Wiggum</title>
      <link href="https://metaist.com/blog/2026/01/matt-pocock-on-ralph-wiggum.html"/>
      <id>tag:metaist.com,2010:blog.post-f8bc923421e1f2b51065a1814517f4ead2be8539</id>
      <published>Tue Jan 06 2026 17:15:39 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 06 2026 17:15:39 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/mattpocockuk/status/2007924876548637089&quot;&gt;Matt Pocock on Ralph Wiggum&lt;/a&gt; (Matt Pocock). The technique is simple enough that matches my intuition for how work gets done in a sprint. Matt also has a nice &lt;a href=&quot;https://x.com/mattpocockuk/status/2008200878633931247&quot;&gt;video explainer&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Logging Sucks - Your Logs Are Lying To You</title>
      <link href="https://metaist.com/blog/2026/01/loggingsucks.html"/>
      <id>tag:metaist.com,2010:blog.post-dfa6f9e4c6c6c85f19046e58e8032570dc3771a3</id>
      <published>Tue Jan 06 2026 17:11:17 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 06 2026 17:11:17 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://loggingsucks.com/&quot;&gt;Logging Sucks - Your Logs Are Lying To You&lt;/a&gt; (Boris Tane). Argues for passing a context object around and logging that object (with all the details you could possibly need) when something goes wrong. Extends the concept of structured logging to &amp;quot;wide events&amp;quot;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Where’s My Orbital Habitat?</title>
      <link href="https://metaist.com/blog/2026/01/wheres-my-orbital-habitat.html"/>
      <id>tag:metaist.com,2010:blog.post-8ccc975d994f27c32caf90db658963b72f6aef75</id>
      <published>Tue Jan 06 2026 17:06:49 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 06 2026 17:06:49 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/12-books/wheres-my-orbital-habitat&quot;&gt;Where’s My Orbital Habitat?&lt;/a&gt; (Harry Law / Asterisk). What happens when you&#39;re looking for your next moonshot, but the costs keep getting too high.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Fighting Fire with Fire: Scalable Personalized Oral Exams with an ElevenLabs Voice AI Agent</title>
      <link href="https://metaist.com/blog/2026/01/fighting-fire-with-fire-scalable-oral.html"/>
      <id>tag:metaist.com,2010:blog.post-19848117d33249e5eec81f767520fee0bab85b42</id>
      <published>Tue Jan 06 2026 17:04:48 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 06 2026 17:04:48 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.behind-the-enemy-lines.com/2025/12/fighting-fire-with-fire-scalable-oral.html&quot;&gt;Fighting Fire with Fire: Scalable Personalized Oral Exams with an ElevenLabs Voice AI Agent&lt;/a&gt; (Panos Ipeirotis). Despite the combative framing, it&#39;s actually probably quite good that scalable oral exams are back. Especially for those students who actually want to learn the material.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Why Stripe’s API Never Breaks: The Genius of Date-Based Versioning</title>
      <link href="https://metaist.com/blog/2026/01/why-stripes-api-never-breaks-the-genius-of-date-based-versioning.html"/>
      <id>tag:metaist.com,2010:blog.post-3dbf44180190b89680c1bd60053072fa4f971b4c</id>
      <published>Tue Jan 06 2026 16:59:06 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 06 2026 16:59:06 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://levelup.gitconnected.com/why-stripes-api-never-breaks-the-genius-of-date-based-versioning-2c4683cf8adb&quot;&gt;Why Stripe’s API Never Breaks: The Genius of Date-Based Versioning&lt;/a&gt; (Harsh Shukla). I got through most of this post before it was revealed that Stripe has a version-level description of which features were added to the API and adapters that convert inputs and outputs into the appropriate version level based on date. Very cool, but how do you handle security issues in versions? You options (as far as I can tell are):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Announce you can no longer use a particular version. (Breaks &amp;quot;we support every version&amp;quot;.)&lt;/li&gt;
&lt;li&gt;Change the behavior of the specific version and re-release with the same version number. (Breaks &amp;quot;this version has this particular behavior&amp;quot;.)&lt;/li&gt;
&lt;li&gt;Some kind of automatic translation that says &amp;quot;this published version maps to this internal version&amp;quot;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In any case, it&#39;s all very nice, but unlikely to impact how most people will design versioned artifacts in the future.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Predictions Scorecard, 2026 January 01</title>
      <link href="https://metaist.com/blog/2026/01/predictions-scorecard-2026-january-01.html"/>
      <id>tag:metaist.com,2010:blog.post-d1f5fd82a6b41829a1560eda2690dff738ce108e</id>
      <published>Tue Jan 06 2026 16:54:43 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 06 2026 16:54:43 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://rodneybrooks.com/predictions-scorecard-2026-january-01/&quot;&gt;Predictions Scorecard, 2026 January 01&lt;/a&gt; (Rodney Brooks). Every year, Rodney updates his predictions. Always a good read.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Money Matters: Dilemmas in Practical Monetary Halachah</title>
      <link href="https://metaist.com/blog/2025/12/money-matters-vol-1.html"/>
      <id>tag:metaist.com,2010:blog.post-1b4b5cd29f10701c8d9f8ef860dec8ba5d302309</id>
      <published>Wed Dec 31 2025 22:13:55 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 22:13:55 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Money-Matters-Dilemmas-Practical-Monetary/dp/1680251783&quot;&gt;Money Matters: Dilemmas in Practical Monetary Halachah&lt;/a&gt; by Rabbi Yosef Fleischman (2024; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). The first of two volumes. A wide range of scenarios.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Gene: An Intimate History</title>
      <link href="https://metaist.com/blog/2025/12/the-gene.html"/>
      <id>tag:metaist.com,2010:blog.post-3201e1d9cf90a8e166b66c1527bbad12d6d6d86f</id>
      <published>Wed Dec 31 2025 22:10:43 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 22:10:43 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Gene-Intimate-History-Siddhartha-Mukherjee-ebook/dp/B017I25DCC&quot;&gt;The Gene: An Intimate History&lt;/a&gt; by Siddhartha Mukherjee (2016; via &lt;strong&gt;Siraj Raval&lt;/strong&gt;). The book makes many concepts in biology understandable. Combining the author&#39;s personal history makes it heart-warming.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The 3 a.m. Call That Changed The Way I Design APIs</title>
      <link href="https://metaist.com/blog/2025/12/the-3-a-m-call-that-changed-the-way-i-design-apis.html"/>
      <id>tag:metaist.com,2010:blog.post-6c9db0546d3c7f3ef2f52ca077e44767f8a32184</id>
      <published>Wed Dec 31 2025 22:05:08 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 22:05:08 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thenewstack.io/the-3-a-m-call-that-changed-the-way-i-design-apis/&quot;&gt;The 3 a.m. Call That Changed The Way I Design APIs&lt;/a&gt; (Sreenivasa Reddy Hulebeedu Reddy / The New Stack). Hard-earned principles.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>On deathbed advice/regret</title>
      <link href="https://metaist.com/blog/2025/12/deathbed-regret.html"/>
      <id>tag:metaist.com,2010:blog.post-3d70947a35eff61ee72ecd52e9c4f3a428032be6</id>
      <published>Wed Dec 31 2025 21:56:51 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 21:56:51 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://hazn.com/deathbed-regret&quot;&gt;On deathbed advice/regret&lt;/a&gt; (hazn; via &lt;a href=&quot;https://marginalrevolution.com/marginalrevolution/2025/12/sunday-assorted-links-548.html&quot;&gt;Tyler Cowen&lt;/a&gt;). I agree with the main point of the post which is why I&#39;ve usually taken deathbed regret and converted it into specific advice. For many years, I&#39;ve had the following (lightly edited) list towards the top of my todo list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&#39;t ignore your dreams&lt;/li&gt;
&lt;li 8=&quot;&quot; no=&quot;&quot; more=&quot;&quot; than=&quot;&quot; hours=&quot;&quot; on=&quot;&quot; a=&quot;&quot; normal=&quot;&quot; day=&quot;&quot;&gt;Don&#39;t work too much&lt;/li&gt;
&lt;li but=&quot;&quot; dont=&quot;&quot; be=&quot;&quot; rude=&quot;&quot;&gt;Say what you think&lt;/li&gt;
&lt;li every=&quot;&quot; month=&quot;&quot;&gt;Cultivate friendships&lt;/li&gt;
&lt;li by=&quot;&quot; sheer=&quot;&quot; will=&quot;&quot;&gt;Be happy&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Introducing Beads: A coding agent memory system</title>
      <link href="https://metaist.com/blog/2025/12/introducing-beads-a-coding-agent-memory-system.html"/>
      <id>tag:metaist.com,2010:blog.post-ef4eb7258f064139f0e70e8ee50c5a0b3bb1cbb3</id>
      <published>Wed Dec 31 2025 21:54:46 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 21:54:46 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://steve-yegge.medium.com/introducing-beads-a-coding-agent-memory-system-637d7d92514a&quot;&gt;Introducing Beads: A coding agent memory system&lt;/a&gt; (Steve Yegge). The whole thing was vibecoded and is kinda crazy, but I&#39;ve actually been looking for a way to track issues from within &lt;code&gt;git&lt;/code&gt;. Apparently the agents really like it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Six New Tips for Better Coding With Agents</title>
      <link href="https://metaist.com/blog/2025/12/six-new-tips-for-better-coding-with-agents.html"/>
      <id>tag:metaist.com,2010:blog.post-781c0e03b4d975b6a1eb98462c7f8bd451de1ab5</id>
      <published>Wed Dec 31 2025 21:51:40 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 21:51:40 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://steve-yegge.medium.com/six-new-tips-for-better-coding-with-agents-d4e9c86e42a9&quot;&gt;Six New Tips for Better Coding With Agents&lt;/a&gt; (Steve Yegge). Programming by hand is artisanal. Programming by copy-pasting from a chatbot is obsolete. The future appears to be conducting an orchestra of bot swarms.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Childhood and Education #16: Letting Kids Be Kids</title>
      <link href="https://metaist.com/blog/2025/12/childhood-and-education-16-letting-kids-be-kids.html"/>
      <id>tag:metaist.com,2010:blog.post-04a0da94a8482c24a1a770c487d71480979953d5</id>
      <published>Wed Dec 31 2025 21:47:23 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 21:47:23 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thezvi.wordpress.com/2025/12/26/childhood-and-education-16-letting-kids-be-kids/&quot;&gt;Childhood and Education #16: Letting Kids Be Kids&lt;/a&gt; (Zvi Mowshowitz). I grew increasingly angry while reading this. Zvi documents so many rage-inducing examples of bad rules around letting children do things on their own.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Programming principles for self taught front-end developers</title>
      <link href="https://metaist.com/blog/2025/12/programming-principles-for-self-taught-front-end-developers.html"/>
      <id>tag:metaist.com,2010:blog.post-03a06908f81bb2e9e3e75f3d8aff07f22a74e5ca</id>
      <published>Wed Dec 31 2025 21:44:53 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 31 2025 21:44:53 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://piccalil.li/blog/programming-principles-for-self-taught-front-end-developers/&quot;&gt;Programming principles for self taught front-end developers&lt;/a&gt; (Kilian Valkhof / Piccalilli). This is high-level advice/heuristics with really good examples.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>cosmofy 0.2.1</title>
      <link href="https://metaist.com/blog/2025/12/cosmofy-0.2.1.html"/>
      <id>tag:metaist.com,2010:blog.post-f9210a2a00a0b23fb837ed18c64ccb624ef4fc76</id>
      <published>Wed Dec 24 2025 13:58:52 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 24 2025 13:58:52 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/releases/tag/0.2.0&quot;&gt;&lt;code&gt;cosmofy 0.2.1&lt;/code&gt;&lt;/a&gt; is available. Lots of little bugs after this morning&#39;s big release.&lt;/p&gt;
&lt;p&gt;If you have &lt;code&gt;uv&lt;/code&gt; installed you can use &lt;code&gt;cosmofy&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;uvx cosmofy

&lt;span class=&quot;token comment&quot;&gt;# or install it&lt;/span&gt;
uv tool &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; cosmofy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy&quot;&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;release-notes-0-2-1-2025-12-24t18-35-27z&quot; tabindex=&quot;-1&quot;&gt;Release Notes &lt;a href=&quot;https://github.com/metaist/cosmofy/compare/0.2.0...0.2.1&quot;&gt;0.2.1&lt;/a&gt; - 2025-12-24T18:35:27Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/12/cosmofy-0.2.1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/42&quot;&gt;#42&lt;/a&gt; minor typos; added links in README&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/58&quot;&gt;#58&lt;/a&gt; only do the Windows dance if literally trying to replace &lt;code&gt;sys.executable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/96&quot;&gt;#96&lt;/a&gt; files not saving to cache&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/97&quot;&gt;#97&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/98&quot;&gt;#98&lt;/a&gt; executable permissions for Cosmopolitan Python&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/99&quot;&gt;#99&lt;/a&gt; nothing being logged in binary build&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/95&quot;&gt;#95&lt;/a&gt; don&#39;t search for &lt;code&gt;pyproject.toml&lt;/code&gt; when you only have &lt;code&gt;--script&lt;/code&gt; to bundle&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/104&quot;&gt;#104&lt;/a&gt; error when using &lt;code&gt;cosmofy fs ls&lt;/code&gt; with &lt;code&gt;--sort none&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/105&quot;&gt;#105&lt;/a&gt; restore working directory after error when using &lt;code&gt;cosmofy fs add&lt;/code&gt; with &lt;code&gt;--chdir&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/103&quot;&gt;#103&lt;/a&gt; use context manager for &lt;code&gt;urlopen&lt;/code&gt; even for &lt;code&gt;HEAD&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/106&quot;&gt;#106&lt;/a&gt; &lt;code&gt;cosmofy fs cat&lt;/code&gt; outputs raw bytes to &lt;code&gt;sys.stdout&lt;/code&gt; instead of decoding to UTF-8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/94&quot;&gt;#94&lt;/a&gt; pure Python limitation to README&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/107&quot;&gt;#107&lt;/a&gt; clearer docstring for &lt;code&gt;expand_glob&lt;/code&gt;; literal paths are returned exactly&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/100&quot;&gt;#100&lt;/a&gt; document that &lt;code&gt;pythonoid.run_python&lt;/code&gt; intentionally destroys &lt;code&gt;sys.argv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/102&quot;&gt;#102&lt;/a&gt; call &lt;code&gt;validate_url&lt;/code&gt; at the start of all the &lt;code&gt;download_*&lt;/code&gt; functions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/109&quot;&gt;#109&lt;/a&gt; reject paths with null bytes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/108&quot;&gt;#108&lt;/a&gt; don&#39;t follow circular symlinks endlessly&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>cosmofy 0.2.0</title>
      <link href="https://metaist.com/blog/2025/12/cosmofy-0.2.0.html"/>
      <id>tag:metaist.com,2010:blog.post-a9c99967e2a8a136220384576aeec7cd5c1b8274</id>
      <published>Wed Dec 24 2025 00:43:10 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 24 2025 00:43:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/releases/tag/0.2.0&quot;&gt;&lt;code&gt;cosmofy 0.2.0&lt;/code&gt;&lt;/a&gt; is available. So many things came together for this release:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Three open source developers I follow (William McGuan, Simon Willison, and Charlie Marsh) &lt;a href=&quot;https://x.com/TheMetaist/status/1996981507710235012&quot;&gt;were all in a twitter thread&lt;/a&gt; where the concept of something like &lt;code&gt;cosmofy&lt;/code&gt; was mentioned.&lt;/li&gt;
&lt;li&gt;I learned how to make CLIs &lt;a href=&quot;https://metaist.com/blog/2025/12/emulating-astral-cli.html&quot;&gt;sort of work the way Astral&#39;s tools do&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I learned just how many &lt;a href=&quot;https://metaist.com/blog/2025/12/emulating-ls&quot;&gt;crazy options GNU &lt;code&gt;ls&lt;/code&gt; supports&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you have &lt;code&gt;uv&lt;/code&gt; installed you can use &lt;code&gt;cosmofy&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;uvx cosmofy

&lt;span class=&quot;token comment&quot;&gt;# or install it&lt;/span&gt;
uv tool &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; cosmofy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy&quot;&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;release-notes-0-2-0-2025-12-24t03-14-02z&quot; tabindex=&quot;-1&quot;&gt;Release Notes &lt;a href=&quot;https://github.com/metaist/cosmofy/compare/0.2.0...0.1.0&quot;&gt;0.2.0&lt;/a&gt; - 2025-12-24T03:14:02Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/12/cosmofy-0.2.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This release represents a very large shift from bundling individual python files to using &lt;code&gt;uv&lt;/code&gt; to bundle entire &lt;code&gt;venv&lt;/code&gt; directories. The behavior of the CLI is now much more similar to &lt;code&gt;uv&lt;/code&gt; in form and function.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/14&quot;&gt;#14&lt;/a&gt; typo in &lt;code&gt;--help&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/43&quot;&gt;#43&lt;/a&gt; exclude &lt;code&gt;uv&lt;/code&gt; artifacts from the bundle&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/46&quot;&gt;#46&lt;/a&gt; &lt;code&gt;expand_globs&lt;/code&gt; to follow all (most?) of the shell rules&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/48&quot;&gt;#48&lt;/a&gt; getting only the project&#39;s &lt;code&gt;console_scripts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/50&quot;&gt;#50&lt;/a&gt; &lt;code&gt;cosmofy bundle --script&lt;/code&gt; assumes venv in output&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/52&quot;&gt;#52&lt;/a&gt; avoiding clobbering logging on import&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/56&quot;&gt;#56&lt;/a&gt; used context handlers to close temporary directories&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/58&quot;&gt;#58&lt;/a&gt; self update on Windows&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/59&quot;&gt;#59&lt;/a&gt; assumption that &lt;code&gt;Last-Modified&lt;/code&gt; will be present in headers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/61&quot;&gt;#61&lt;/a&gt; replaced &lt;code&gt;PathDistribution._path&lt;/code&gt; with appropriate fallbacks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/62&quot;&gt;#62&lt;/a&gt; replaced &lt;code&gt;assert&lt;/code&gt; for validation with actual &lt;code&gt;raise&lt;/code&gt; on error&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/66&quot;&gt;#66&lt;/a&gt; needless &lt;code&gt;pass&lt;/code&gt; in parsing args&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/67&quot;&gt;#67&lt;/a&gt; command names in logging&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/70&quot;&gt;#70&lt;/a&gt; incorrect shebang in &lt;code&gt;bundle.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/71&quot;&gt;#71&lt;/a&gt; used context handlers to close &lt;code&gt;ZipFile&lt;/code&gt; objects&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/72&quot;&gt;#72&lt;/a&gt; download progress indicator shouldn&#39;t divide by zero&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/73&quot;&gt;#73&lt;/a&gt; missing newline in &lt;code&gt;bundle.py&lt;/code&gt; error message&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/75&quot;&gt;#75&lt;/a&gt; explicit return of default when we can&#39;t get the version from a file&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/77&quot;&gt;#77&lt;/a&gt; &lt;code&gt;cosmofy fs cat&lt;/code&gt; usage string&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/79&quot;&gt;#79&lt;/a&gt; &lt;code&gt;ZipFile2.now&lt;/code&gt; should not be at module-level&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/92&quot;&gt;#92&lt;/a&gt; use public API for &lt;code&gt;SourceFileLoader&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/16&quot;&gt;#16&lt;/a&gt; update examples, readme, usage (HT @Pugio)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/28&quot;&gt;#28&lt;/a&gt; replaced &lt;code&gt;--debug&lt;/code&gt; with &lt;code&gt;--quiet&lt;/code&gt; + &lt;code&gt;--verbose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/29&quot;&gt;#29&lt;/a&gt; &lt;code&gt;DEFAULT_PYTHON_URL&lt;/code&gt; is now Cosmopolitan Python&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/31&quot;&gt;#31&lt;/a&gt; replaced &lt;code&gt;--cache&lt;/code&gt; with &lt;code&gt;--no-cache&lt;/code&gt; + &lt;code&gt;--cache-dir&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/33&quot;&gt;#33&lt;/a&gt; refactored &lt;code&gt;bundler.py&lt;/code&gt; into subcommands&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/55&quot;&gt;#55&lt;/a&gt; switched to JSON parsing &lt;code&gt;uv version&lt;/code&gt; output&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/57&quot;&gt;#57&lt;/a&gt; switched to using &lt;code&gt;os.replace&lt;/code&gt; for atomic file moves&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/64&quot;&gt;#64&lt;/a&gt; replaced &lt;code&gt;removeprefix&lt;/code&gt; with better cross-platform approach&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/79&quot;&gt;#79&lt;/a&gt; moved progress indicator to &lt;code&gt;stderr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/87&quot;&gt;#87&lt;/a&gt; marked &lt;code&gt;cosmofy updater&lt;/code&gt; commands as experimental&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/18&quot;&gt;#18&lt;/a&gt; progress when downloading (HT @Pugio)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/32&quot;&gt;#32&lt;/a&gt; &lt;code&gt;cosmofy bundle --script&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/33&quot;&gt;#33&lt;/a&gt; &lt;code&gt;cosmofy bundle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/33&quot;&gt;#33&lt;/a&gt; &lt;code&gt;cosmofy fs add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/33&quot;&gt;#33&lt;/a&gt; &lt;code&gt;cosmofy fs args&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/33&quot;&gt;#33&lt;/a&gt; &lt;code&gt;cosmofy updater remove&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/33&quot;&gt;#33&lt;/a&gt; dry run banner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/35&quot;&gt;#35&lt;/a&gt; &lt;code&gt;cosmofy fs ls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/36&quot;&gt;#36&lt;/a&gt; &lt;code&gt;cosmofy fs cat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/37&quot;&gt;#37&lt;/a&gt; &lt;code&gt;cosmofy fs rm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/38&quot;&gt;#38&lt;/a&gt; &lt;code&gt;cosmofy fs add -f&lt;/code&gt; to overwrite files that exist&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/39&quot;&gt;#39&lt;/a&gt; &lt;code&gt;--color&lt;/code&gt; global option&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/40&quot;&gt;#40&lt;/a&gt; &lt;code&gt;cosmofy self update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/40&quot;&gt;#40&lt;/a&gt; &lt;code&gt;cosmofy self version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/49&quot;&gt;#49&lt;/a&gt; &lt;code&gt;--exact&lt;/code&gt; to &lt;code&gt;uv sync&lt;/code&gt; for better exact specs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/60&quot;&gt;#60&lt;/a&gt; timeouts to network calls&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/81&quot;&gt;#81&lt;/a&gt; note that concurrent removals are not supported&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/83&quot;&gt;#83&lt;/a&gt; missing docstrings&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/86&quot;&gt;#86&lt;/a&gt; log message that only GitHub URLs are inferred&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/89&quot;&gt;#89&lt;/a&gt; warning when adding absolute paths&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/91&quot;&gt;#91&lt;/a&gt; note about handling weird file names&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/15&quot;&gt;#15&lt;/a&gt; &lt;code&gt;cosmo.yaml&lt;/code&gt; workflow; added &lt;code&gt;gh&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/17&quot;&gt;#17&lt;/a&gt; default &lt;code&gt;.com&lt;/code&gt; extension&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/24&quot;&gt;#24&lt;/a&gt; support for python &amp;lt;= 3.9&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/27&quot;&gt;#27&lt;/a&gt; &lt;code&gt;--clone&lt;/code&gt; is no longer supported&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/30&quot;&gt;#30&lt;/a&gt; &lt;code&gt;--download&lt;/code&gt; is no longer supported&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/53&quot;&gt;#53&lt;/a&gt; added &lt;code&gt;validate_url&lt;/code&gt; to avoid non-HTTPS URLs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/53&quot;&gt;#53&lt;/a&gt; added security considerations note&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/54&quot;&gt;#54&lt;/a&gt; removed &lt;code&gt;shell=True&lt;/code&gt; in places that don&#39;t need it&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/63&quot;&gt;#63&lt;/a&gt; added &lt;code&gt;sanitize_zip_path&lt;/code&gt; to avoid bad entry names&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>cosmofy fs ls: emulating GNU ls</title>
      <link href="https://metaist.com/blog/2025/12/emulating-ls.html"/>
      <id>tag:metaist.com,2010:blog.post-a529546026d5c50deaed2683bc97a90f79a8cd45</id>
      <published>Wed Dec 24 2025 00:38:21 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 24 2025 00:38:26 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2024/09/pythonoid.html&quot;&gt;pythonoid&lt;/a&gt;, &lt;a href=&quot;https://metaist.com/blog/2025/12/emulating-astral-cli.html&quot;&gt;baton&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When I was designing the low-level zip file manipulation tools for &lt;code&gt;cosmofy&lt;/code&gt;, I wanted an easy way to see the contents of the bundle. We&#39;re so used to using &lt;code&gt;ls&lt;/code&gt; for looking into directories that I thought it would be cool to emulate as much of &lt;code&gt;ls&lt;/code&gt; as I could.&lt;/p&gt;
&lt;p&gt;But then it turned out that &lt;code&gt;ls&lt;/code&gt; has a &lt;a href=&quot;https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html&quot;&gt;crazy number of options&lt;/a&gt;. I actually &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/35&quot;&gt;went through them all&lt;/a&gt; and tried to figure out if it was possible to support them.&lt;/p&gt;
&lt;p&gt;But then I realized this was insane. First, many of the options are just aliases for slightly more explicit options. Charlie Marsh would never have a &lt;code&gt;-t&lt;/code&gt; that was an alias for &lt;code&gt;--sort=time&lt;/code&gt;. Why should I?&lt;/p&gt;
&lt;p&gt;In the end I decided to go with the most common options (sorting, list view), a couple that were easy to implement, and a few longer-form ones that cover most of the aliases.&lt;/p&gt;
&lt;p&gt;I&#39;m pretty happy with the &lt;a href=&quot;https://github.com/metaist/cosmofy#cosmofy-fs-ls&quot;&gt;way it turned out&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>baton: emulating Astral&#39;s CLI approach</title>
      <link href="https://metaist.com/blog/2025/12/emulating-astral-cli.html"/>
      <id>tag:metaist.com,2010:blog.post-e2254d071fe7f25bd053439b8e67ea1a972f35d3</id>
      <published>Wed Dec 24 2025 00:17:17 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 24 2025 00:17:17 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2024/09/pythonoid.html&quot;&gt;pythonoid&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Imitation is the highest form of flattery which is why as part of the &lt;a href=&quot;https://metaist.com/blog/2025/12/cosmofy-0.2.0.html&quot;&gt;&lt;code&gt;cosmofy 0.2.0&lt;/code&gt;&lt;/a&gt; release, I decided to change everything about how the CLI behaved to make it work more like the way the &lt;a href=&quot;https://astral.sh/&quot;&gt;tools from Astral&lt;/a&gt; work.&lt;/p&gt;
&lt;p&gt;I have a long-term plan for Astral to take over making Cosmopolitan Python apps. It&#39;s a long shot, but if they do, it&#39;ll be a huge win for cross-platform compatible executables. I also saw &lt;a href=&quot;https://github.com/astral-sh/uv/issues/5802&quot;&gt;this popular issue&lt;/a&gt; that there should be a &lt;code&gt;uv bundle&lt;/code&gt; command that bundles everything up.&lt;/p&gt;
&lt;p&gt;To make it easier to adopt, I decided to make the interface follow Astral&#39;s style in three important ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Subcommand structure&lt;/strong&gt;: It&#39;s gotta be &lt;code&gt;cosmofy bundle&lt;/code&gt; and &lt;code&gt;cosmofy self update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Colored output&lt;/strong&gt;: Gotta auto-detect that stuff. Luckily, I had fun with &lt;a href=&quot;https://github.com/metaist/brush&quot;&gt;brush&lt;/a&gt; years ago, so I know about terminal color codes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global flags&lt;/strong&gt;: Some of those flags gotta be global.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smart ENV defaults&lt;/strong&gt;: smart defaults + pulling from environment variables to override.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now I didn&#39;t start out wanting to build my own argument parser (really, I promise I didn&#39;t!). I tried going the &lt;code&gt;argparse&lt;/code&gt; route (I even tried my own &lt;code&gt;attrbox / docopt&lt;/code&gt; solution), but I had a few constraints:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I really don&#39;t want 3rd party dependencies (even my own). &lt;code&gt;cosmofy&lt;/code&gt; needs to stay tight and small.&lt;/li&gt;
&lt;li&gt;I want argument parsing to go until it hits the subcommand and then delegate the rest of the args to the subcommand parser.&lt;/li&gt;
&lt;li&gt;I want to pass global options from parent to child sub-parser as needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Together these pushed for a &lt;a href=&quot;https://github.com/metaist/cosmofy/blob/main/src/cosmofy/baton.py&quot;&gt;dedicated parser&lt;/a&gt;. This lets me write things like:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;usage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&quot;&quot;&#92;
Print contents of a file within a Cosmopolitan bundle.

Usage: cosmofy fs cat &amp;lt;BUNDLE&gt; &amp;lt;FILE&gt;... [OPTIONS]

Arguments:
&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;common_args&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
  &amp;lt;FILE&gt;...                 one or more file patterns to show

  tip: Use `--` to separate options from filenames that start with `-`
  Example: cosmofy fs cat bundle.zip -- -weird-filename.txt

Options:
  -p, --prompt              prompt for a decryption password

&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;global_options&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;CommonArgs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    __doc__ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; usage
    &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arg&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; positional&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; required&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    prompt&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arg&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; short&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-p&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Command&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cosmofy.fs.cat&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; run&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the colored output, I took inspiration from William McGuan&#39;s &lt;a href=&quot;https://github.com/Textualize/rich&quot;&gt;rich&lt;/a&gt; which uses tag-like indicators to style text.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/blob/796abd21bc0679e028f15d3e6167f547917dbc5c/src/cosmofy/baton.py#L424&quot;&gt;Mine is much worse and minimal&lt;/a&gt;, but it gets the job done for the bits of color I need.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Is Cognitive Dissonance Actually a Thing?</title>
      <link href="https://metaist.com/blog/2025/12/is-cognitive-dissonance-actually-a-thing.html"/>
      <id>tag:metaist.com,2010:blog.post-579379b3ddd643517afe5e98c592cbda3578683e</id>
      <published>Wed Dec 24 2025 00:06:12 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 24 2025 00:06:12 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.newyorker.com/culture/the-lede/is-cognitive-dissonance-actually-a-thing&quot;&gt;Is Cognitive Dissonance Actually a Thing?&lt;/a&gt; (Shayla Love / The New Yorker; via &lt;a href=&quot;https://marginalrevolution.com/marginalrevolution/2025/12/friday-assorted-links-552.html&quot;&gt;Tyler Cowen&lt;/a&gt;). I need to believe it&#39;s a thing and not a thing at the same time.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How I Found Myself Running a Microschool</title>
      <link href="https://metaist.com/blog/2025/12/how-i-found-myself-running-a-microschool.html"/>
      <id>tag:metaist.com,2010:blog.post-2f6814fac133f3c5efe176a500cda97db275e0a5</id>
      <published>Wed Dec 24 2025 00:03:36 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 24 2025 00:03:36 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.educationprogress.org/p/how-i-found-myself-running-a-microschool&quot;&gt;How I Found Myself Running a Microschool&lt;/a&gt; (Kelsey Piper / Center for Educational Progress). Over the past 10 years I have migrated to essentially this view: you need direct instruction to get the basics and a foundation; you need to see people enact the values you want to transmit; and you need a strong motivating project to get you over the humps when the going gets tough.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Your job is to deliver code you have proven to work</title>
      <link href="https://metaist.com/blog/2025/12/code-proven-to-work.html"/>
      <id>tag:metaist.com,2010:blog.post-24847bb1370ed93850ac10bd61848ab7ee07e8b5</id>
      <published>Wed Dec 24 2025 00:01:50 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 24 2025 00:01:50 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2025/Dec/18/code-proven-to-work/&quot;&gt;Your job is to deliver code you have proven to work&lt;/a&gt; (Simon Willison). Strongly endorse.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Ideas Aren’t Getting Harder to Find</title>
      <link href="https://metaist.com/blog/2025/12/ideas-arent-getting-harder-to-find.html"/>
      <id>tag:metaist.com,2010:blog.post-01086d1f3dadbb6645d0e338be46780f88ad7a76</id>
      <published>Tue Dec 23 2025 23:58:22 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Dec 23 2025 23:58:22 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/12-books/ideas-arent-getting-harder-to-find&quot;&gt;Ideas Aren’t Getting Harder to Find&lt;/a&gt; (Karthik Tadepalli / Asterisk). Knowing what is causing productivity growth to start to slow is critical to selecting appropriate policies for how to get it going again. Karthik makes a good case for why the idea that &amp;quot;ideas are getting harder to find&amp;quot; is wrong and why it&#39;s more of a failure of the market to weed out bad ideas and promote good ones.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI has Educators Polarized</title>
      <link href="https://metaist.com/blog/2025/12/the-disagreement-about-ai-in-education.html"/>
      <id>tag:metaist.com,2010:blog.post-8d8c26624e4fc0db46b35e9399197b161f1ff969</id>
      <published>Tue Dec 23 2025 23:55:35 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Dec 23 2025 23:55:35 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://arnoldkling.substack.com/p/the-disagreement-about-ai-in-education&quot;&gt;AI has Educators Polarized&lt;/a&gt; (Arnold Kling; via &lt;a href=&quot;https://thezvi.wordpress.com/2025/12/11/ai-146-chipping-in/&quot;&gt;Zvi Mowshowitz&lt;/a&gt;). Nice framing: some think education is adversarial, others that it&#39;s cooperative.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Oliver Sacks Put Himself Into His Case Studies. What Was the Cost?</title>
      <link href="https://metaist.com/blog/2025/12/oliver-sacks-put-himself-into-his-case-studies-what-was-the-cost.html"/>
      <id>tag:metaist.com,2010:blog.post-50510e712fe261b298af305d6b3cb46f333a4673</id>
      <published>Tue Dec 23 2025 23:47:49 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Dec 23 2025 23:47:49 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.newyorker.com/magazine/2025/12/15/oliver-sacks-put-himself-into-his-case-studies-what-was-the-cost&quot;&gt;Oliver Sacks Put Himself Into His Case Studies. What Was the Cost?&lt;/a&gt; (Rachel Aviv / The New Yorker). Seems like a high cost. The whole field has taken such a pummeling since 2017, that it makes me think of &lt;a href=&quot;https://youtu.be/qQ6wSei-NJU?t=66&quot;&gt;The Simpsons meme&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Justified</title>
      <link href="https://metaist.com/blog/2025/12/justified.html"/>
      <id>tag:metaist.com,2010:blog.post-bf561f36add1b220faab52337c1196f2ad0ada1c</id>
      <published>Tue Dec 23 2025 23:43:39 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Dec 23 2025 23:43:39 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.bitecode.dev/p/justified&quot;&gt;Justified&lt;/a&gt; (Bite code!). &lt;code&gt;just&lt;/code&gt; is a Rust-based task runner and here&#39;s a good write up about its features. If I wasn&#39;t writing &lt;code&gt;ds&lt;/code&gt; (my own task runner), I&#39;d probably use &lt;code&gt;just&lt;/code&gt;. I&#39;ll probably experimentally support some subset of &lt;code&gt;just&lt;/code&gt;&#39;s syntax in &lt;code&gt;ds&lt;/code&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Book Time #26: How I Read</title>
      <link href="https://metaist.com/blog/2025/12/book-time-26-how-i-read.html"/>
      <id>tag:metaist.com,2010:blog.post-05f5643659ed05d2f7af508c0d050580c577232f</id>
      <published>Tue Dec 23 2025 23:26:33 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Dec 23 2025 23:26:33 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://buttondown.com/Booktime/archive/book-time-26-how-i-read&quot;&gt;Book Time #26: How I Read&lt;/a&gt; (Aaron Gordon / Book Time). My process for selecting books is very different from Aaron&#39;s, but it&#39;s nice to see someone else&#39;s process.&lt;/p&gt;
&lt;p&gt;Mine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I get recommendations from friends, colleagues, podcasts, and other books.&lt;/li&gt;
&lt;li&gt;I add them to a list (currently an Amazon Wishlist). I prefer digital books over physical books because I can make them into audiobook (at 4x) and they take up very little physical space.&lt;/li&gt;
&lt;li&gt;When I get to the end of the books I have in my queue, I sort the wishlist by price (lowest to highest) and buy everything under $5. That keeps me busy for about 3 months.&lt;/li&gt;
&lt;li&gt;I take all the books that I&#39;ve purchased and sort them by the number of pages (lowest to highest). This is my new reading queue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are only a couple of exceptions for me to deviate from this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;My wife recommends I read something next, especially as it may impact our kids. This bumps the book to the top of the list (both for purchase and reading).&lt;/li&gt;
&lt;li&gt;I&#39;m about to meet someone who recently published a book. There have been a few times where I got through their most-recently published book the day before meeting them. HT: Ramit Sethi who teaches the importance of being overly prepared for certain kinds of meetings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I often get asked how much I retain from the audio versions of books. My informal tests show no more or less than most people when they read books. I don&#39;t remember every detail, but neither do most people. HT: Mike Masnick who introduced me to the idea of listening to podcasts at greater than 2x.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Writer&#39;s Journey: Mythic Structure for Writers, 3rd Edition</title>
      <link href="https://metaist.com/blog/2025/12/the-writers-journey.html"/>
      <id>tag:metaist.com,2010:blog.post-974ebf2f54d39b90d59fd2ffbef418df2aa3919a</id>
      <published>Sun Dec 07 2025 13:39:08 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Dec 07 2025 13:39:08 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Writers-Journey-Mythic-Structure-3rd/dp/193290736X&quot;&gt;The Writer&#39;s Journey: Mythic Structure for Writers, 3rd Edition&lt;/a&gt; by Christopher Vogler (2007; via &lt;strong&gt;Chanan Berkovits&lt;/strong&gt;). You may have heard of Joseph Campbell&#39;s &lt;em&gt;The Hero with a Thousand Faces&lt;/em&gt;, but how about something with more contemporary references? Also, does the obligatory meta thing and shows how the process of writing itself follows the mythic structure.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>On the Consumption of AI-Generated Content at Scale</title>
      <link href="https://metaist.com/blog/2025/12/consumption-ai-scale.html"/>
      <id>tag:metaist.com,2010:blog.post-02697f742f5e6d8fe2969c463954b434b1cbc508</id>
      <published>Sun Dec 07 2025 13:36:26 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Dec 07 2025 13:36:26 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.sh-reya.com/blog/consumption-ai-scale/&quot;&gt;On the Consumption of AI-Generated Content at Scale&lt;/a&gt; (Shreya Shankar). Thoughtful take.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>TIL: importlib.metadata.version</title>
      <link href="https://metaist.com/blog/2025/12/til-metadata-version.html"/>
      <id>tag:metaist.com,2010:blog.post-afd2681b4ab21e7688db06febfd9b7c05943fee6</id>
      <published>Thu Dec 04 2025 19:29:10 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Dec 04 2025 19:29:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;While I was &lt;a href=&quot;https://metaist.com/blog/2025/12/dependency-groups.html&quot;&gt;updating my standard &lt;code&gt;pyproject.toml&lt;/code&gt; to use dependency groups&lt;/a&gt;, I switched to using &lt;code&gt;uv&lt;/code&gt; as my build backend (from &lt;code&gt;setuptools&lt;/code&gt;). Like all the other design choices, it has very sensible defaults with good overrides when you need them.&lt;/p&gt;
&lt;p&gt;One thing that it doesn&#39;t support is dynamic versions (i.e. reading &lt;code&gt;__version__&lt;/code&gt; from &lt;code&gt;__init__.py&lt;/code&gt;). &lt;a href=&quot;https://x.com/charliermarsh/status/1805196878545342663&quot;&gt;Charlie Marsh explains&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using dynamic metadata for things that are actually just static lookups feels like the wrong tradeoff.&lt;/p&gt;
&lt;p&gt;Like &lt;code&gt;version = [&amp;quot;dynamic&amp;quot;]&lt;/code&gt; to read the version from &lt;code&gt;__init__.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As soon as you have dynamic metadata, you need to install dependencies and run Python just to get that info.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Static metadata rules. Just write the version out twice!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This makes sense, but I really didn&#39;t want to write out the version twice. Luckily, &lt;code&gt;uv&lt;/code&gt; has a nice &lt;code&gt;uv version&lt;/code&gt; command to change/bump the version number in the &lt;code&gt;pyproject.toml&lt;/code&gt;, so I started thinking about how I&#39;d &lt;em&gt;also&lt;/em&gt; change the version in the &lt;code&gt;__init__.py&lt;/code&gt; at the same time.&lt;/p&gt;
&lt;p&gt;I asked ChatGPT what the best approach was and it suggested something quite different: don&#39;t write the value in &lt;code&gt;__init__.py&lt;/code&gt; at all.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; importlib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;metadata &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PackageNotFoundError
&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    __version__ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;package-name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# from pyproject.toml: project.name&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; PackageNotFoundError&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    __version__ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.0.0&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# aka unknown version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I have since noticed that this was also the suggestion &lt;a href=&quot;https://x.com/AdamChainz/status/1805205201357308413&quot;&gt;Adam Johnson had in the same thread&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One minor concern I have is whether this works in a &lt;a href=&quot;https://github.com/metaist/cosmofy&quot;&gt;&lt;code&gt;cosmofy&lt;/code&gt;&lt;/a&gt; build, but that will be a separate exploration.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Dependency Groups to the Rescue</title>
      <link href="https://metaist.com/blog/2025/12/dependency-groups.html"/>
      <id>tag:metaist.com,2010:blog.post-d15a520009a61f7408f1683e25bb13e984ea3978</id>
      <published>Thu Dec 04 2025 14:00:54 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Dec 04 2025 14:00:54 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2024/07/python-dev-deps.html&quot;&gt;Stop Hiding Python Dev Dependencies&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m a bit late to the party, but even when I saw that &lt;a href=&quot;https://peps.python.org/pep-0735/&quot;&gt;PEP 735 – Dependency Groups in pyproject.toml&lt;/a&gt; had been accepted and &lt;a href=&quot;https://packaging.python.org/en/latest/specifications/dependency-groups/#dependency-groups&quot;&gt;standardized by PyPA&lt;/a&gt;, it still didn&#39;t register how this should impact my &lt;code&gt;pyproject.toml&lt;/code&gt; configurations.&lt;/p&gt;
&lt;p&gt;In my &lt;a href=&quot;https://metaist.com/blog/2024/07/python-dev-deps.html&quot;&gt;previous post&lt;/a&gt;, I argued that absent a standard place to put dev dependencies in &lt;code&gt;pyproject.toml&lt;/code&gt;, we should opt to use &lt;code&gt;optional-dependencies&lt;/code&gt;. However, dependency groups seem to offer a nice standard place for such dependencies: these are bundles of dependencies that &lt;strong&gt;don&#39;t&lt;/strong&gt; get built into the final distribution (i.e. they are not required to run the package).&lt;/p&gt;
&lt;p&gt;Feels like the best of both worlds and &lt;code&gt;uv&lt;/code&gt; already started using &lt;code&gt;dependency-groups.dev&lt;/code&gt; as the place that &lt;code&gt;uv add --dev&lt;/code&gt; writes to and this group is sync&#39;d by default when using &lt;code&gt;uv sync&lt;/code&gt; and &lt;code&gt;uv run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I only really got this when I read Simon Willison&#39;s post about &lt;a href=&quot;https://til.simonwillison.net/uv/dependency-groups&quot;&gt;how he&#39;s using dependency groups&lt;/a&gt; to make it easier for people to hack on his code.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Remix: Making Art and Commerce Thrive in the Hybrid Economy</title>
      <link href="https://metaist.com/blog/2025/11/remix.html"/>
      <id>tag:metaist.com,2010:blog.post-c3c8c9ce8bc3f08a4f6eeaacd872965bdf026dd6</id>
      <published>Sun Nov 30 2025 19:51:23 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 30 2025 19:51:23 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Remix-Making-Commerce-Thrive-Economy-ebook/dp/B001FA0LG2&quot;&gt;Remix: Making Art and Commerce Thrive in the Hybrid Economy&lt;/a&gt; by Lawrence Lessig (2002; via Tribe of Mentors &amp;amp; Joseph Gordon Levitt). I knew most of these ideas from having read TechDirt for so many years and listening to Lessig talk about these ideas for several decades. Still, I was surprised how much of the fights we have today still stem from a basic disagreement about copyright and how art gets made.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Topgrading: The Proven Hiring and Promoting Method that Turbocharges Company Performance, Third Edition</title>
      <link href="https://metaist.com/blog/2025/11/topgrading.html"/>
      <id>tag:metaist.com,2010:blog.post-39d12a7add33cdd26155a93533d3188d9df7b0ce</id>
      <published>Sun Nov 30 2025 19:48:13 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 30 2025 19:48:13 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Topgrading-3rd-Promoting-Turbocharges-Performance-ebook/dp/B0074VTH02&quot;&gt;Topgrading: The Proven Hiring and Promoting Method that Turbocharges Company Performance, Third Edition&lt;/a&gt; by Bradford D. Smart (2012; via Tim Ferriss). More than 20 years later, many parts of this still make sense even though core parts would require rethinking in an LLM world.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Dare To Author!: Take Charge of the Narrative of Your Life</title>
      <link href="https://metaist.com/blog/2025/11/dare-to-author.html"/>
      <id>tag:metaist.com,2010:blog.post-a933e4e241879f787d0374fe24b08ccc13f0b37e</id>
      <published>Sun Nov 30 2025 19:43:11 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 30 2025 19:43:11 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Dare-Author-Take-Charge-Narrative-ebook/dp/B0DJMT2PFV&quot;&gt;Dare To Author!: Take Charge of the Narrative of Your Life&lt;/a&gt; by Lior Arussy (2024; via &lt;strong&gt;Elizabeth Kratz&lt;/strong&gt;). A nice structured approach to updating how you think about your life story.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Don’t Build an Audience</title>
      <link href="https://metaist.com/blog/2025/11/dont-build-an-audience.html"/>
      <id>tag:metaist.com,2010:blog.post-839070318c8d1d36659726cdc4fa971ecad48fad</id>
      <published>Sun Nov 30 2025 19:35:41 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 30 2025 19:35:41 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.humaninvariant.com/blog/audience&quot;&gt;Don’t Build an Audience&lt;/a&gt; (Human Invariant). It&#39;s the bell curve meme: create cool stuff - I need to build an audience - create cool stuff.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Closed: Bad error messages from blog post</title>
      <link href="https://metaist.com/blog/2025/11/update-pyrefly.html"/>
      <id>tag:metaist.com,2010:blog.post-b41f65dd8dac55213da5a0dd084f0aba813b096f</id>
      <published>Sun Nov 30 2025 18:32:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 30 2025 18:32:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://github.com/facebook/pyrefly/issues/225&quot;&gt;Closed: Bad error messages from blog post&lt;/a&gt; (Facebook). Turns out &lt;code&gt;pyrefly&lt;/code&gt; developers saw my &lt;a href=&quot;https://metaist.com/blog/2025/05/trying-pyrefly.html&quot;&gt;previous post&lt;/a&gt;, broke things down into many sub-issues and fixed them all. &lt;code&gt;pyrefly&lt;/code&gt; now reports zero errors in &lt;a href=&quot;https://github.com/metaist/castfit&quot;&gt;&lt;code&gt;castfit&lt;/code&gt;&lt;/a&gt; and the errors it find in other repos have pretty understandable error messages!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Disrupting the first reported AI-orchestrated cyber espionage campaign</title>
      <link href="https://metaist.com/blog/2025/11/disrupting-ai-espionage.html"/>
      <id>tag:metaist.com,2010:blog.post-342f1020a330446ccd7f211fabab344c5708d77b</id>
      <published>Sun Nov 30 2025 18:30:03 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 30 2025 18:30:03 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.anthropic.com/news/disrupting-AI-espionage&quot;&gt;Disrupting the first reported AI-orchestrated cyber espionage campaign&lt;/a&gt; (Anthropic). Expect more of this in the future.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>castfit 0.1.3</title>
      <link href="https://metaist.com/blog/2025/11/castfit-0.1.3.html"/>
      <id>tag:metaist.com,2010:blog.post-b454b9000b147c17a03281d5eec9d188d0172b57</id>
      <published>Wed Nov 26 2025 22:12:11 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Nov 26 2025 22:12:11 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/castfit/releases/tag/0.1.3&quot;&gt;&lt;code&gt;castfit 0.1.3&lt;/code&gt;&lt;/a&gt; is available. The biggest thing I did was implement &lt;a href=&quot;https://github.com/metaist/castfit/blob/08f6a5526ca5401702ce382200ea4cf9331ab3e4/src/castfit/__init__.py#L346&quot;&gt;&lt;code&gt;is_subtype&lt;/code&gt;&lt;/a&gt; which is a forced me to &lt;a href=&quot;https://metaist.com/blog/2025/05/til-typevar.html&quot;&gt;learn about invariant, covariant, and contravariant types&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;castfit&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# modern (recommended)&lt;/span&gt;
uv &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; castfit

&lt;span class=&quot;token comment&quot;&gt;# classic&lt;/span&gt;
python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; castfit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/castfit&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;release-notes-0-1-3-2025-11-27t03-12-11z&quot; tabindex=&quot;-1&quot;&gt;Release Notes &lt;a href=&quot;https://github.com/metaist/castfit/compare/0.1.2...0.1.3&quot;&gt;0.1.3&lt;/a&gt; - 2025-11-27T03:12:11Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/11/castfit-0.1.3.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/33&quot;&gt;#33&lt;/a&gt; PyPI publishing to support newer &lt;code&gt;uv build&lt;/code&gt; metadata&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/40&quot;&gt;#40&lt;/a&gt; PyPI publishing to use &lt;code&gt;uv publish&lt;/code&gt; instead of &lt;code&gt;pypa/gh-action-pypi-publish&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/23&quot;&gt;#23&lt;/a&gt; ability to type check &lt;code&gt;Callable&lt;/code&gt; via &lt;code&gt;is_subtype&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/34&quot;&gt;#34&lt;/a&gt; support for &lt;code&gt;property&lt;/code&gt; fields on classes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/35&quot;&gt;#35&lt;/a&gt; &lt;code&gt;__name__&lt;/code&gt; to &lt;code&gt;TypeInfo&lt;/code&gt; if present&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/36&quot;&gt;#36&lt;/a&gt; support for default values in &lt;code&gt;dataclasses.Field&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/37&quot;&gt;#37&lt;/a&gt; support for function definitions in classes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/40&quot;&gt;#40&lt;/a&gt; support for python 3.9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/40&quot;&gt;#40&lt;/a&gt; We are trying out &lt;code&gt;uv publish&lt;/code&gt; instead of &lt;code&gt;pypa/gh-action-pypi-publish&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Power: Why Some People Have It—and Others Don&#39;t</title>
      <link href="https://metaist.com/blog/2025/11/power.html"/>
      <id>tag:metaist.com,2010:blog.post-51480434ae4a0bc3ce83fc20c9bf0ddbf1ceb8d2</id>
      <published>Tue Nov 11 2025 16:38:53 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 16:38:53 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Power-Some-People-Have-Others-ebook/dp/B003V1WSZK&quot;&gt;Power: Why Some People Have It—and Others Don&#39;t&lt;/a&gt; by Jeffrey Pfeffer (2010; via Robin Hanson). A blend of anecdotes and social science experiments that didn&#39;t replicate. The networking bits seemed fine. Everything else was kinda meh.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Remote: Office Not Required</title>
      <link href="https://metaist.com/blog/2025/11/remote.html"/>
      <id>tag:metaist.com,2010:blog.post-264ba5248d0fe109e9c0278fd30e6130eb7ade42</id>
      <published>Tue Nov 11 2025 16:23:24 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 16:23:24 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Remote-Office-Required-Jason-Fried-ebook/dp/B00C0ALZ0W&quot;&gt;Remote: Office Not Required&lt;/a&gt; by Jason Fried &amp;amp; David Heinemeier Hansson (2013; via Iridescent Learning). It&#39;s interesting to see how work from home policies have ebbed and flowed since 2013.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Why 98.5% of organizations have slow actions/checkout</title>
      <link href="https://metaist.com/blog/2025/11/why-organizations-have-slow-actions-checkout.html"/>
      <id>tag:metaist.com,2010:blog.post-f45893bfcbb5858da30b9610151b7b7dbbd8bf7e</id>
      <published>Tue Nov 11 2025 15:58:50 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:58:50 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://depot.dev/blog/why-organizations-have-slow-actions-checkout&quot;&gt;Why 98.5% of organizations have slow actions/checkout&lt;/a&gt; (Chris Goller / depot; via &lt;a href=&quot;https://changelog.com/news/169&quot;&gt;Changelog News&lt;/a&gt;). I&#39;m hesitant to fiddle with the git internals, but the sparse checkout and partial clone sound like easy things to try. (Most of GitHub Actions were sped up by using &lt;code&gt;uv&lt;/code&gt;.)&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Deploying to Amazon&#39;s cloud is a pain in the AWS younger devs won&#39;t tolerate</title>
      <link href="https://metaist.com/blog/2025/11/aws-genz-misery-nope.html"/>
      <id>tag:metaist.com,2010:blog.post-b454406c7b492c2968c2b1e78d1aa4ef519e7ed8</id>
      <published>Tue Nov 11 2025 15:54:27 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:54:27 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theregister.com/2025/11/04/aws_genz_misery_nope/&quot;&gt;Deploying to Amazon&#39;s cloud is a pain in the AWS younger devs won&#39;t tolerate&lt;/a&gt; (Corey Quinn / The Register; via &lt;a href=&quot;https://changelog.com/news/169&quot;&gt;Changelog News&lt;/a&gt;). Hilarious take, but so true. It took me 7 years to be able to close a handful of student accounts (who had inactive emails after graduation) that were still charging my billing account, but whose EC2 instances were not visible to me because of AWS permissions issues.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Game design is simple, actually</title>
      <link href="https://metaist.com/blog/2025/11/game-design-is-simple-actually.html"/>
      <id>tag:metaist.com,2010:blog.post-97f237c2c2f7b4492c54583d4031adef10afa2d0</id>
      <published>Tue Nov 11 2025 15:50:33 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:50:33 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.raphkoster.com/2025/11/03/game-design-is-simple-actually/&quot;&gt;Game design is simple, actually&lt;/a&gt; (Raph Koster). Clickbait title aside, there are twelve compact and useful design lessons each of which is a whole world unto itself.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Algorithmic Turn: The Emerging Evidence On AI Tutoring That&#39;s Hard to Ignore</title>
      <link href="https://metaist.com/blog/2025/11/the-algorithmic-turn-the-emerging.html"/>
      <id>tag:metaist.com,2010:blog.post-9bfdcf1c81f304aa27bd9b0509833e7214d2af23</id>
      <published>Tue Nov 11 2025 15:46:25 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:46:25 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://carlhendrick.substack.com/p/the-algorithmic-turn-the-emerging&quot;&gt;The Algorithmic Turn: The Emerging Evidence On AI Tutoring That&#39;s Hard to Ignore&lt;/a&gt; (Carl Hendrick / The Learning Dispatch). Long post covers many questions about the material properties of learning and teaching. Also covers both the disappointment of various EdTech approaches and the possibility of surpassing them.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Making XML human-readable without XSLT</title>
      <link href="https://metaist.com/blog/2025/11/making-xml-human-readable-without-xslt.html"/>
      <id>tag:metaist.com,2010:blog.post-928f4b97793bb2d94eb5d5d80426f6cd62cb2c5f</id>
      <published>Tue Nov 11 2025 15:40:32 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:40:32 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://jakearchibald.com/2025/making-xml-human-readable-without-xslt/&quot;&gt;Making XML human-readable without XSLT&lt;/a&gt; (Jake Archibald; via &lt;a href=&quot;https://simonwillison.net/2025/Nov/5/removing-xslt/&quot;&gt;Simon Willison&lt;/a&gt;). I have always found XSLT to be both impressive and horrifying. Makes sense that it&#39;s a security nightmare for browsers.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Case Against pgvector</title>
      <link href="https://metaist.com/blog/2025/11/the-case-against-pgvector.html"/>
      <id>tag:metaist.com,2010:blog.post-85bebc27bfc0a7aadb9e0644799b5a1fc2adcb6d</id>
      <published>Tue Nov 11 2025 15:34:46 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:34:46 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://alex-jacobs.com/posts/the-case-against-pgvector/&quot;&gt;The Case Against pgvector&lt;/a&gt; (Alex Jacobs; via &lt;a href=&quot;https://simonwillison.net/2025/Nov/3/the-case-against-pgvector/&quot;&gt;Simon Willison&lt;/a&gt;). I actually got questions about picking an index for &lt;code&gt;pgvector&lt;/code&gt;; the options aren&#39;t great and this article explains why.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Claude Agent Skills: A First Principles Deep Dive</title>
      <link href="https://metaist.com/blog/2025/11/claude-skills-deep-dive.html"/>
      <id>tag:metaist.com,2010:blog.post-9138faffd1e80093d1821a36fefc57bd73e38978</id>
      <published>Tue Nov 11 2025 15:30:57 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:30:57 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://leehanchung.github.io/blogs/2025/10/26/claude-skills-deep-dive/&quot;&gt;Claude Agent Skills: A First Principles Deep Dive&lt;/a&gt; (Han Lee). Very long, but informative break down of how Claude&#39;s Agent &lt;code&gt;Skills&lt;/code&gt; works and how its different from function calling. I was particularly impressed by how the UI has to adapt between information being fed back to the LLM and information for the user.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>SQLite concurrency and why you should care about it</title>
      <link href="https://metaist.com/blog/2025/11/sqlite-locking.html"/>
      <id>tag:metaist.com,2010:blog.post-b0720016382edba40fd513c33830d1800fbda3a9</id>
      <published>Tue Nov 11 2025 15:08:17 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 11 2025 15:08:17 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://jellyfin.org/posts/SQLite-locking/&quot;&gt;SQLite concurrency and why you should care about it&lt;/a&gt; (Jean-Pierre Bachmann / Jellyfin). In all the times I&#39;ve gotten a SQLite locking issue, the solution has always been to retry a few times (until some other process releases the lock). But this article suggests a few other ways to solve the problem.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Wise Man&#39;s Fear</title>
      <link href="https://metaist.com/blog/2025/11/wise-mans-fear.html"/>
      <id>tag:metaist.com,2010:blog.post-65bc9ffe7a2c1dea34a5f4f8db94eba042223d95</id>
      <published>Sat Nov 01 2025 21:15:11 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 21:15:11 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/gp/product/B00475AYJQ&quot;&gt;The Wise Man&#39;s Fear&lt;/a&gt; by Patrick Rothfuss (2011; via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). Sequel to &lt;a href=&quot;https://metaist.com/blog/2025/11/name-of-the-wind.html&quot;&gt;The Name of the Wind&lt;/a&gt;. Patrick Rothfuss joins the ranks of several other fantasy authors in having an unfinished series. I ended up reading the rants of his fans and editors as well as counter points that authors don&#39;t owe readers books. This book was a fine sequel; not as great and a bit graphic at times.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Name of the Wind</title>
      <link href="https://metaist.com/blog/2025/11/name-of-the-wind.html"/>
      <id>tag:metaist.com,2010:blog.post-720caff2b8df880013058842545ece06afc24950</id>
      <published>Sat Nov 01 2025 21:11:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 21:11:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Name-Wind-Kingkiller-Chronicle-Book-ebook/dp/B0010SKUYM&quot;&gt;The Name of the Wind&lt;/a&gt; by Patrick Rothfuss (2007; via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). It&#39;s got stories-within-stories, sympathetic magic-as-physics, and a prodigy for a main character. What more could you want?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The 4-Hour Workweek: Escape 9–5, Live Anywhere, and Join the New Rich</title>
      <link href="https://metaist.com/blog/2025/11/the-four-hour-workweek.html"/>
      <id>tag:metaist.com,2010:blog.post-85ac8c0d96b3b60585295319228936d9f6222e7d</id>
      <published>Sat Nov 01 2025 21:07:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 21:07:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/4-Hour-Workweek-Expanded-Updated-Cutting-Edge-ebook/dp/B002WE46UW&quot;&gt;The 4-Hour Workweek: Escape 9–5, Live Anywhere, and Join the New Rich&lt;/a&gt; by Tim Ferriss (2009). Took me 16 years to finally read the book that bootstrapped Tim&#39;s takeoff. Turns out all of his books are in the same action-packed-encyclopedia style.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Side project advice</title>
      <link href="https://metaist.com/blog/2025/11/side-project-advice.html"/>
      <id>tag:metaist.com,2010:blog.post-207fea9e2501590a686abc53cad3a75a0dfb2806</id>
      <published>Sat Nov 01 2025 21:01:22 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 21:01:22 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://nedbatchelder.com/blog/202510/side_project_advice.html&quot;&gt;Side project advice&lt;/a&gt; (Ned Batchelder). This reads like short &amp;amp; simple advice, but it is clearly hard-won and I should re-read this several times a year.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Three tough truths about climate</title>
      <link href="https://metaist.com/blog/2025/11/three-tough-truths-about-climate.html"/>
      <id>tag:metaist.com,2010:blog.post-3bad3fb67f25382803905d0117ed12698ff99df3</id>
      <published>Sat Nov 01 2025 20:59:04 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:59:04 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.gatesnotes.com/three-tough-truths-about-climate&quot;&gt;Three tough truths about climate&lt;/a&gt; (Bill Gates). One of the more grounded perspectives on cost-benefit analysis as applied to climate change.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI isn&#39;t replacing radiologists</title>
      <link href="https://metaist.com/blog/2025/11/why-ai-isnt-replacing-radiologists.html"/>
      <id>tag:metaist.com,2010:blog.post-72b6bbb8907acda49285355d6054d97d33cd6798</id>
      <published>Sat Nov 01 2025 20:55:46 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:55:46 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.worksinprogress.news/p/why-ai-isnt-replacing-radiologists&quot;&gt;AI isn&#39;t replacing radiologists&lt;/a&gt; (Deena Mousa / Works in Progress; via &lt;strong&gt;Benj Azose&lt;/strong&gt;). How long do we think the islands of automation will last?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>You already have a git server</title>
      <link href="https://metaist.com/blog/2025/11/easy-git.html"/>
      <id>tag:metaist.com,2010:blog.post-0d6f2a777741745afa5c0c9d8232b0699cd2a5ed</id>
      <published>Sat Nov 01 2025 20:48:23 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:48:23 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://maurycyz.com/misc/easy_git&quot;&gt;You already have a git server&lt;/a&gt; (maurycyz; via &lt;a href=&quot;https://changelog.com/news/167&quot;&gt;Changelog News&lt;/a&gt;). I&#39;m so tempted to do this, but it feels wrong.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Battling Infectious Diseases in the 20th Century: The Impact of Vaccines</title>
      <link href="https://metaist.com/blog/2025/11/infectious-diseases-and-vaccines.html"/>
      <id>tag:metaist.com,2010:blog.post-0c3348f599984f0430c8a3e0aaac06f389c46c2e</id>
      <published>Sat Nov 01 2025 20:44:09 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:44:09 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://graphics.wsj.com/infectious-diseases-and-vaccines/&quot;&gt;Battling Infectious Diseases in the 20th Century: The Impact of Vaccines&lt;/a&gt; (Tynan DeBold &amp;amp; Dov Friedman / WSJ). Some of my favorite graphics depicting the impact of vaccines on mortality after being introduced. These are about a decade old and, unfortunately, vaccine hesitancy / avoidance is going to make mortality go up again.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Will AI displace humans in the economy and culture?</title>
      <link href="https://metaist.com/blog/2025/11/will-ai-displace-humans-in-the-economy-and-culture.html"/>
      <id>tag:metaist.com,2010:blog.post-7540fec4b9ce5bcafb428c3fb4b4c0fa530e85dd</id>
      <published>Sat Nov 01 2025 20:28:36 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:28:36 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://andrewmayne.com/2025/10/27/will-ai-displace-humans-in-the-economy-and-culture/&quot;&gt;Will AI displace humans in the economy and culture?&lt;/a&gt; (Andrew Mayne). A thoughtful take, although I don&#39;t know how to rate the predictions.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Simon Maechling on microplastics</title>
      <link href="https://metaist.com/blog/2025/11/simon-maechling-on-microplastics.html"/>
      <id>tag:metaist.com,2010:blog.post-95b2e79f6c3c356620960ec211d3aa271612d395</id>
      <published>Sat Nov 01 2025 20:25:23 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:25:23 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/simonmaechling/status/1982041147091349863&quot;&gt;Simon Maechling on microplastics&lt;/a&gt; (Simon Maechling).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You’ve been told microplastics are everywhere.&lt;/p&gt;
&lt;p&gt;In your food.
In your blood.
Even in your brain.&lt;/p&gt;
&lt;p&gt;You should panic.
You should rage.&lt;/p&gt;
&lt;p&gt;But what if most of it was junk science?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Worth reading the whole thread.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>You Aren’t In The DSM</title>
      <link href="https://metaist.com/blog/2025/11/you-arent-in-the-dsm.html"/>
      <id>tag:metaist.com,2010:blog.post-e554a021f6ba6867a287c4379406dae80fbc2e8c</id>
      <published>Sat Nov 01 2025 20:22:35 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:22:35 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/12-books/you-arent-in-the-dsm&quot;&gt;You Aren’t In The DSM&lt;/a&gt; (Awais Aftab / Asterisk). From record-keeping to people&#39;s self-concept.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Memorization, Trivia and Atomic Units for Creativity</title>
      <link href="https://metaist.com/blog/2025/11/memorization-trivia-and-atomic-units.html"/>
      <id>tag:metaist.com,2010:blog.post-69c8f2c7c6eebcce2daf737d5a0076997b6bd38c</id>
      <published>Sat Nov 01 2025 20:12:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:12:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://everestera.substack.com/p/memorization-trivia-and-atomic-units&quot;&gt;Memorization, Trivia and Atomic Units for Creativity&lt;/a&gt; (Edward Nevraumont). Edwards is the &lt;a href=&quot;https://www.astralcodexten.com/p/non-book-review-contest-2025-winners&quot;&gt;second-place winner of the Astral Codex Ten Non-Book Review Contest&lt;/a&gt; for &lt;a href=&quot;https://metaist.com/blog/2025/06/your-review-alpha-school.html&quot;&gt;his review of Alpha School&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Late Night is Dying Because of the Format Not The Hosts</title>
      <link href="https://metaist.com/blog/2025/11/late-night-is-dying-because-of-the.html"/>
      <id>tag:metaist.com,2010:blog.post-2608129af391feedc7dd4af37fd77e7d4ffdd4bd</id>
      <published>Sat Nov 01 2025 20:08:02 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Nov 01 2025 20:08:02 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thinkinganddata.substack.com/p/late-night-is-dying-because-of-the&quot;&gt;Late Night is Dying Because of the Format Not The Hosts&lt;/a&gt; (thinkinganddata). Goes back to vaudeville to describe changes in entertainment formats.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>I Am Out Of Data Hell</title>
      <link href="https://metaist.com/blog/2025/10/i-am-out-of-data-hell.html"/>
      <id>tag:metaist.com,2010:blog.post-bfccc3c330afe9b4ba0062dd257e9e575fe28645</id>
      <published>Fri Oct 31 2025 16:51:33 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:51:33 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://ludic.mataroa.blog/blog/i-am-out-of-data-hell/&quot;&gt;I Am Out Of Data Hell&lt;/a&gt; (Nikhil Suresh; via &lt;strong&gt;Josh Vogel&lt;/strong&gt;). Agency does a body good.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Continual Learning Problem</title>
      <link href="https://metaist.com/blog/2025/10/continual-learning.html"/>
      <id>tag:metaist.com,2010:blog.post-9dbf971c6d7d1b73c8ef72df23f2394860dbef2e</id>
      <published>Fri Oct 31 2025 16:50:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:50:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://jessylin.com/2025/10/20/continual-learning/&quot;&gt;The Continual Learning Problem&lt;/a&gt; (Jessy Lin). Interesting take.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What Went Wrong with Math Instruction in New York?</title>
      <link href="https://metaist.com/blog/2025/10/what-went-wrong-with-math-instruction.html"/>
      <id>tag:metaist.com,2010:blog.post-fb78194bb917580210bc7f5f284bfda10c6f7da2</id>
      <published>Fri Oct 31 2025 16:47:48 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:47:48 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.educationprogress.org/p/what-went-wrong-with-math-instruction&quot;&gt;What Went Wrong with Math Instruction in New York?&lt;/a&gt; (Benjamin Solomon / Center for Educational Progress). Quite a bit it would seem.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Rearchitecting GitHub Pages</title>
      <link href="https://metaist.com/blog/2025/10/rearchitecting-github-pages.html"/>
      <id>tag:metaist.com,2010:blog.post-861a3045d4ddaa6a3c2224a97c63dda6940beaa9</id>
      <published>Fri Oct 31 2025 16:44:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:44:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://github.blog/news-insights/the-library/rearchitecting-github-pages/&quot;&gt;Rearchitecting GitHub Pages&lt;/a&gt; (Hailey Somerville / GitHub Blog; via &lt;a href=&quot;https://x.com/isamlambert/status/1979337340096262619&quot;&gt;Sam Lambert&lt;/a&gt;). Sam&#39;s tweet says it all:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Until ~2015, GitHub Pages hosted over 2 million websites on 2 servers with a multi-million-line nginx.conf, edited and reloaded per deploy. This worked incredibly well, with github.io ranking as the 140th most visited domain on the web at the time.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>How the World’s Most Famous Code Was Cracked</title>
      <link href="https://metaist.com/blog/2025/10/how-the-cias-kryptos-sculpture-gave-up-its-final-secret.html"/>
      <id>tag:metaist.com,2010:blog.post-802e0b563f6980a27ad9a1e51d282f3d255ac412</id>
      <published>Fri Oct 31 2025 16:42:52 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:42:52 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.scientificamerican.com/article/how-the-cias-kryptos-sculpture-gave-up-its-final-secret/&quot;&gt;How the World’s Most Famous Code Was Cracked&lt;/a&gt; (Jack Murtagh &amp;amp; Jeanna Bryner / Scientific American). Reminds me of the &lt;a href=&quot;https://xkcd.com/538/&quot;&gt;relevant XKCD&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>When is it better to think without words?</title>
      <link href="https://metaist.com/blog/2025/10/wordless-thought.html"/>
      <id>tag:metaist.com,2010:blog.post-d1316200a848d4f1854e9fd1af64a15a801e183d</id>
      <published>Fri Oct 31 2025 16:40:35 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:40:35 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.henrikkarlsson.xyz/p/wordless-thought&quot;&gt;When is it better to think without words?&lt;/a&gt; (Henrik Karlsson / Escaping Flatland). I think I only do this rarely.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>I Figured Out How to Engineer Emergence</title>
      <link href="https://metaist.com/blog/2025/10/i-figured-out-how-to-engineer-emergence.html"/>
      <id>tag:metaist.com,2010:blog.post-3c863265d3515e081d1745ed3d61467a33f0d5bb</id>
      <published>Fri Oct 31 2025 16:38:38 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:38:38 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theintrinsicperspective.com/p/i-figured-out-how-to-engineer-emergence&quot;&gt;I Figured Out How to Engineer Emergence&lt;/a&gt; (Erik Hoel / The Intrinsic Perspective). This is a follow-up to Erik&#39;s concept of how high-level features emerge from lower-level descriptions.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Languaging: The Software of Belief</title>
      <link href="https://metaist.com/blog/2025/10/languaging-the-software-of-belief.html"/>
      <id>tag:metaist.com,2010:blog.post-0ea5b41d6f3e9b6cd6cb85e102fe47905e896516</id>
      <published>Fri Oct 31 2025 16:33:36 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:33:36 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://patternbreakers.substack.com/p/languaging-the-software-of-belief&quot;&gt;Languaging: The Software of Belief&lt;/a&gt; (Mike Maples / Pattern Breakers; via &lt;strong&gt;Kevin Munnelly&lt;/strong&gt;). Pairs well with Peter Thiel&#39;s Zero-to-One concept.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Unseeable prompt injections in screenshots</title>
      <link href="https://metaist.com/blog/2025/10/unseeable-prompt-injections.html"/>
      <id>tag:metaist.com,2010:blog.post-a96c49755519b683cefc4ce6e0f12ddd8d12e23c</id>
      <published>Fri Oct 31 2025 16:26:24 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 31 2025 16:26:24 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://brave.com/blog/unseeable-prompt-injections/&quot;&gt;Unseeable prompt injections in screenshots&lt;/a&gt; (Shivan Kaul Sahib &amp;amp; Artem Chaikin / Brave; via &lt;a href=&quot;https://simonwillison.net/2025/Oct/21/unseeable-prompt-injections/&quot;&gt;Simon Willison&lt;/a&gt;). Solving AI browser security feels so much harder than solving secure credit card processing.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Abundance: The Future Is Better Than You Think</title>
      <link href="https://metaist.com/blog/2025/10/abundance.html"/>
      <id>tag:metaist.com,2010:blog.post-6ef1caceb3c8cd875a303de094d89a11586a8c76</id>
      <published>Sun Oct 19 2025 16:00:06 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Oct 19 2025 16:00:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Abundance-Future-Better-Than-Think-ebook/dp/B005FLOGMM&quot;&gt;Abundance: The Future Is Better Than You Think&lt;/a&gt; by Peter H. Diamandis &amp;amp; Steven Kotler (2012). Lots of predictions, some of which may already have come true.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Cues versus Content: Hyrum Lewis Replies to Marlen-Starr&#39;s Proposal</title>
      <link href="https://metaist.com/blog/2025/10/cues-versus-content-hyrum-lewis-replies.html"/>
      <id>tag:metaist.com,2010:blog.post-2be222b171fbabc13c0804730018169a322e015e</id>
      <published>Sun Oct 19 2025 15:56:28 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Oct 19 2025 15:56:28 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.betonit.ai/p/cues-versus-content-hyrum-lewis-replies&quot;&gt;Cues versus Content: Hyrum Lewis Replies to Marlen-Starr&#39;s Proposal&lt;/a&gt; (Bryan Caplan). This is part of a conversation on how to understand the nature of ideologies.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Play Nice But Win: A CEO&#39;s Journey from Founder to Leader</title>
      <link href="https://metaist.com/blog/2025/10/place-nice-but-win.html"/>
      <id>tag:metaist.com,2010:blog.post-526f7b20217ff752a3347aaaf76e2584a8200338</id>
      <published>Thu Oct 16 2025 18:15:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Oct 16 2025 18:15:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Play-Nice-But-Win-Journey-ebook/dp/B08VWFW56N/&quot;&gt;Play Nice But Win: A CEO&#39;s Journey from Founder to Leader&lt;/a&gt; by Michael Dell &amp;amp; James Kaplan (2021). I remember being totally confused by the EMC + Dell story when it was happening. Lots of oh-so-that&#39;s-what-that was behind-the-scenes stories.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Nine Lives: My time as the MI6&#39;s top spy inside al-Qaeda</title>
      <link href="https://metaist.com/blog/2025/10/nine-lives.html"/>
      <id>tag:metaist.com,2010:blog.post-068ea70a9c3b62ac1fb082daf2b8ff39a029b496</id>
      <published>Thu Oct 16 2025 18:10:15 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Oct 16 2025 18:10:15 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/B07BHMZHYT&quot;&gt;Nine Lives: My time as the MI6&#39;s top spy inside al-Qaeda&lt;/a&gt; by Aimen Dean, Paul Cruickshank, and Tim Lister (2018). Wild story.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Days of Deliverance: Essays on Purim and Hanukkah</title>
      <link href="https://metaist.com/blog/2025/10/days-of-deliverance.html"/>
      <id>tag:metaist.com,2010:blog.post-d1587e59752ca17b24d34f00a8c88d036435fe18</id>
      <published>Thu Oct 16 2025 18:07:42 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Oct 16 2025 18:07:42 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Days-Deliverance-Essays-Hanukkah-Meotzar/dp/0881259446&quot;&gt;Days of Deliverance: Essays on Purim and Hanukkah&lt;/a&gt; by Rabbi Joseph B. Soloveitchik (2007).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A window into modern loan origination</title>
      <link href="https://metaist.com/blog/2025/10/window-modern-loan-origination.html"/>
      <id>tag:metaist.com,2010:blog.post-deb0d6f35a2c88a735b46a49f078dfe12b4f3b97</id>
      <published>Thu Oct 16 2025 18:03:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Oct 16 2025 18:03:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.bitsaboutmoney.com/archive/window-modern-loan-origination/&quot;&gt;A window into modern loan origination&lt;/a&gt; (Patrick McKenzie / Bits about Money). How the sausage gets made.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The VR Hype Cycle: Lessons for the Age of AI</title>
      <link href="https://metaist.com/blog/2025/10/vr-hype-cycle-lessons-for-ai.html"/>
      <id>tag:metaist.com,2010:blog.post-9d76311de30c8255d79738df1d6ae8d707f8975c</id>
      <published>Thu Oct 16 2025 18:01:22 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Oct 16 2025 18:01:22 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.nngroup.com/articles/vr-hype-cycle-lessons-for-ai/&quot;&gt;The VR Hype Cycle: Lessons for the Age of AI&lt;/a&gt; (Caleb Sponheim / NN/g).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hype cycles occur when expectations, narratives, and messaging outpace technological capability.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>How well can large language models predict the future?</title>
      <link href="https://metaist.com/blog/2025/10/ai-llm-forecasting-model-forecastbench-benchmark.html"/>
      <id>tag:metaist.com,2010:blog.post-acaa1b963fcf2806b322413196dcf8f55dc04dd0</id>
      <published>Thu Oct 16 2025 17:58:48 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Oct 16 2025 17:58:48 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://forecastingresearch.substack.com/p/ai-llm-forecasting-model-forecastbench-benchmark&quot;&gt;How well can large language models predict the future?&lt;/a&gt; (Houtan Bastani, Simas Kučinskas, and Ezra Karger / Forecasting Research Institute). A continuous approach to test forecasting models. They do mention a potential hiccup:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When provided market forecasts in their prompts, multiple LLMs—including GPT-4.5—simply copy them.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>The Captain Class: A New Theory of Leadership</title>
      <link href="https://metaist.com/blog/2025/10/the-captain-class.html"/>
      <id>tag:metaist.com,2010:blog.post-4037a63a299cef28d194a7fd9046fbe4f5389e75</id>
      <published>Sun Oct 05 2025 19:46:44 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Oct 05 2025 19:46:44 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Captain-Class-New-Theory-Leadership-ebook/dp/B01LKCRKFY&quot;&gt;The Captain Class: A New Theory of Leadership&lt;/a&gt; by Sam Walker (2017; via Ryan Holiday). A book about leadership in various sports dressed up as a business book. The main thing it seems to promote is &amp;quot;unusual&amp;quot; leadership which would seem to account for all the contradictory advice.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>21 Facts About Throwing Good Parties</title>
      <link href="https://metaist.com/blog/2025/10/21-facts-about-throwing-good-parties.html"/>
      <id>tag:metaist.com,2010:blog.post-447b7bcc6e614873b432c9dc8d9d42e1ddd63c87</id>
      <published>Sun Oct 05 2025 19:42:27 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Oct 05 2025 19:42:27 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.atvbt.com/21-facts-about-throwing-good-parties/&quot;&gt;21 Facts About Throwing Good Parties&lt;/a&gt; (Uri Bram / Atoms vs Bits; via &lt;a href=&quot;https://marginalrevolution.com/marginalrevolution/2025/10/uri-bram-on-throwing-a-good-party.html&quot;&gt;Tyler Cowen&lt;/a&gt;). These rules apply broadly to many other kinds of interactions too.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Hacker Laws</title>
      <link href="https://metaist.com/blog/2025/10/hacker-laws.html"/>
      <id>tag:metaist.com,2010:blog.post-dd3ab62a3c97237d4101a376986b76ba0c94a32f</id>
      <published>Sun Oct 05 2025 19:39:57 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Oct 05 2025 19:39:57 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://hacker-laws.com/&quot;&gt;Hacker Laws&lt;/a&gt; (Dave Kerr). Nice collection of rules-of-thumb.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Karpathy on Sutton</title>
      <link href="https://metaist.com/blog/2025/10/karpathy-on-sutton.html"/>
      <id>tag:metaist.com,2010:blog.post-65ca36df93c1b1b1200b2ba37b94ec4973d7082d</id>
      <published>Sun Oct 05 2025 19:36:16 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Oct 05 2025 19:36:16 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/karpathy/status/1973435013875314729&quot;&gt;Karpathy on Sutton&lt;/a&gt; (Andrej Karpathy). This helped me understand the debate that Sutton and Dwarkesh were having when it seemed like they just used words very differently.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Scam GPT: GenAI and the Automation of Fraud</title>
      <link href="https://metaist.com/blog/2025/10/scam-gpt.html"/>
      <id>tag:metaist.com,2010:blog.post-97b600501acead619bce0fd5e28a6bc8c6723573</id>
      <published>Sun Oct 05 2025 16:45:23 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Oct 05 2025 16:45:23 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://datasociety.net/library/scam-gpt/&quot;&gt;Scam GPT: GenAI and the Automation of Fraud&lt;/a&gt; (Lana Swartz, Alice E. Marwick, &amp;amp; Kate Larson / Data &amp;amp; Society; via &lt;a href=&quot;https://www.schneier.com/blog/archives/2025/10/use-of-generative-ai-in-scams.html&quot;&gt;Bruce Shneier&lt;/a&gt;). Make sure you have a talk with your parents about how these things work.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Fate and Destiny: From Holocaust to the State of Israel</title>
      <link href="https://metaist.com/blog/2025/09/fate-and-destiny.html"/>
      <id>tag:metaist.com,2010:blog.post-f023b138ea753d1803beaa9691e0bc82d605e436</id>
      <published>Wed Oct 01 2025 00:34:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Oct 01 2025 00:34:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Fate-Destiny-Holocaust-State-Israel/dp/0881256854&quot;&gt;Fate and Destiny: From Holocaust to the State of Israel&lt;/a&gt; by Rabbi Joseph B. Soloveitchik (2000). A reprint of &lt;em&gt;Kol Dodi Dofek&lt;/em&gt;. Change some of the senator names plus a few dates and this could have been written yesterday.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Why Not Me?</title>
      <link href="https://metaist.com/blog/2025/09/why-not-me.html"/>
      <id>tag:metaist.com,2010:blog.post-782c8f5c86c9a3991eb0a9dfbe8f8f030d64142d</id>
      <published>Wed Oct 01 2025 00:30:43 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Oct 01 2025 00:30:43 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Why-Not-Me-Mindy-Kaling-ebook/dp/B00N6PEMZK&quot;&gt;Why Not Me?&lt;/a&gt; by Mindy Kaling (2015; via Seth Rogan). Where in the world did I see a recommendation from Seth Rogan and what possessed me to add this book to my queue? No clue. Sometimes I just end up reading random things. This was pretty random.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Someday This Pain Will Be Useful to You: A Novel</title>
      <link href="https://metaist.com/blog/2025/09/someday-this-pain-will-be-useful-to-you.html"/>
      <id>tag:metaist.com,2010:blog.post-7665765d651bbb8a1ffac69a3879e1fb6d856f9a</id>
      <published>Wed Oct 01 2025 00:28:48 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Oct 01 2025 00:28:48 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Someday-This-Pain-Will-Useful-ebook/dp/B004UND8GG&quot;&gt;Someday This Pain Will Be Useful to You: A Novel&lt;/a&gt; by Peter Cameron (2025; via Tim Ferriss &amp;amp; Gretchen Ruben). No clue what I expected.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Scale: The Universal Laws of Life, Growth, and Death in Organisms, Cities, and Companies</title>
      <link href="https://metaist.com/blog/2025/09/scale.html"/>
      <id>tag:metaist.com,2010:blog.post-c90ba10374360f51d7afbac9131d35d6152c15c3</id>
      <published>Wed Oct 01 2025 00:26:37 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Oct 01 2025 00:26:37 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Scale-Universal-Growth-Organisms-Companies-ebook/dp/B01KGZVYDK&quot;&gt;Scale: The Universal Laws of Life, Growth, and Death in Organisms, Cities, and Companies&lt;/a&gt; by Geoffrey West (2017; via Robin Hanson). A look at constraints in different systems.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Tap Dancing to Work: Warren Buffett on Practically Everything, 1966-2013</title>
      <link href="https://metaist.com/blog/2025/09/tap-dancing-to-work.html"/>
      <id>tag:metaist.com,2010:blog.post-defeb84687745d6aee0f6b14e7449916c8eef5dd</id>
      <published>Wed Oct 01 2025 00:24:35 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Oct 01 2025 00:24:35 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/1591845734&quot;&gt;Tap Dancing to Work: Warren Buffett on Practically Everything, 1966-2013&lt;/a&gt; by Carol J. Loomis (2012; via Bill Gates). If you&#39;ve read other books about Buffett, not much new here.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Like, Comment, Subscribe: Inside YouTube&#39;s Chaotic Rise to World Domination</title>
      <link href="https://metaist.com/blog/2025/09/like-comment-subscribe.html"/>
      <id>tag:metaist.com,2010:blog.post-3eaae3351435510ce0ffe2676387ed8d550fc883</id>
      <published>Wed Oct 01 2025 00:13:02 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Oct 01 2025 00:13:02 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Like-Comment-Subscribe-YouTubes-Domination-ebook/dp/B09N6NYB8Q&quot;&gt;Like, Comment, Subscribe: Inside YouTube&#39;s Chaotic Rise to World Domination&lt;/a&gt; by Mark Bergen (2022). Like many books in this genre, you get a sense of how quickly people&#39;s id/ego/superego merged with a quickly growing internet startup.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Predictioneer&#39;s Game: Using the Logic of Brazen Self-Interest to See and Shape the Future</title>
      <link href="https://metaist.com/blog/2025/09/predictioneers-game.html"/>
      <id>tag:metaist.com,2010:blog.post-e53db4362e7b85c558c5956c579d0db6fed1eaba</id>
      <published>Wed Oct 01 2025 00:03:09 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Oct 01 2025 00:03:09 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Predictioneers-Game-Brazen-Self-Interest-Future-ebook/dp/B002PXFYOC&quot;&gt;The Predictioneer&#39;s Game: Using the Logic of Brazen Self-Interest to See and Shape the Future&lt;/a&gt; by Bruce Bueno De Mesquita (2009). Reading this book in 2025 is like finding an ancient prophecy that everyone has forgotten. Not perfect, but so many good calls. It also contains this gem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My idea is that the Israeli and Palestinian governments will distribute a portion of their tax revenue generated from tourism (and only from tourism) to each other. Before going into the details—where the devil resides—let’s first see why tourist revenue and not any other. Why not, for example, promote peace by setting up joint Israeli-Palestinian ventures, or allowing freer movement between regions, or some other scheme? As we will see, shared tourist revenue provides a nearly unique opportunity.&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;The tourist tax revenue arrangement need not last forever. It must include an irrevocable commitment for it to persist for a long time (say twenty years), and it is important that this tax revenue sharing be tied to a fixed formula based on the current populations and not on future changes in those populations. Opening the formula to renegotiation could create perverse incentives. It is also essential that the definition of tax revenue originating from spending by tourists be based on predetermined rules for estimating this source of income. Independent accounting firms might be used to provide a standard way to define and identify tourist revenue and the taxes derived from it. This tax revenue would then be allocated to each side over the agreed duration of the program based on a onetime fixed population-based formula with no questions asked.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using Game Theory to play through the whole scenario was a fascinating take.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How to Win in a Winner-Take-All World: The Definitive Guide to Adapting and Succeeding in High-Performance Careers</title>
      <link href="https://metaist.com/blog/2025/09/how-to-win-in-a-winner-take-all-world.html"/>
      <id>tag:metaist.com,2010:blog.post-1e31982218343940b9767ab5f7eda5a9ed5f5472</id>
      <published>Tue Sep 30 2025 23:56:39 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:56:39 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/How-Win-Winner-Take-All-World-High-Performance-ebook/dp/B07J4RSKYZ&quot;&gt;How to Win in a Winner-Take-All World: The Definitive Guide to Adapting and Succeeding in High-Performance Careers&lt;/a&gt; by Neil Irwin (2025; via &lt;a href=&quot;https://marginalrevolution.com/marginalrevolution/2019/06/what-ive-been-reading-146.html&quot;&gt;Tyler Cowen&lt;/a&gt;). The advice isn&#39;t bad, per se. But I definitely thought this was written in the 90s and not &lt;strong&gt;June 2025&lt;/strong&gt;. Tyler Cowen called it &amp;quot;both subtler and broader than the title alone would indicate,&amp;quot; but I guess I missed the deep insight.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Old Man&#39;s War</title>
      <link href="https://metaist.com/blog/2025/09/old-mans-war.html"/>
      <id>tag:metaist.com,2010:blog.post-4b6a629be9a99c061c7cff5ee933873a9db66f75</id>
      <published>Tue Sep 30 2025 23:53:37 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:53:37 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Old-Mans-War-John-Scalzi-ebook/dp/B000SEIK2S&quot;&gt;Old Man&#39;s War&lt;/a&gt; by John Scalzi (2007; via &lt;strong&gt;Jeffrey Klein&lt;/strong&gt;). Fun read.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Courage to Be Disliked: The Japanese Phenomenon That Shows You How to Change Your Life and Achieve Real Happiness</title>
      <link href="https://metaist.com/blog/2025/09/courage-to-be-disliked.html"/>
      <id>tag:metaist.com,2010:blog.post-d7ee0ecdec727987792aa88c4ad6dd82c51409d1</id>
      <published>Tue Sep 30 2025 23:45:54 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:45:54 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Courage-Be-Disliked-Phenomenon-Happiness-ebook/dp/B078MDSV8T&quot;&gt;The Courage to Be Disliked: The Japanese Phenomenon That Shows You How to Change Your Life and Achieve Real Happiness&lt;/a&gt; by Ichiro Kishimi &amp;amp; Fumitake Koga (2018; via &lt;strong&gt;Patrick Gleason&lt;/strong&gt;). I never heard of &lt;a href=&quot;https://en.wikipedia.org/wiki/Alfred_Adler&quot;&gt;Alfred Adler&lt;/a&gt; or his school of psychology (he was a contemporary of Freud&#39;s). There are lots of commonplace examples which makes this an interesting read, but I suspect some of the claims are a bit too strong (e.g., &amp;quot;trauma&amp;quot; not being a real thing).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Sweaty Startup: How to Get Rich Doing Boring Things</title>
      <link href="https://metaist.com/blog/2025/09/sweaty-startup.html"/>
      <id>tag:metaist.com,2010:blog.post-bdc899821eac9e539271cee21c52cc2d1c601098</id>
      <published>Tue Sep 30 2025 23:42:21 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:42:21 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/B0DBHS2YJT&quot;&gt;The Sweaty Startup: How to Get Rich Doing Boring Things&lt;/a&gt; by Nick Huber (2025). Small things make a pile.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Legal Systems Very Different from Ours</title>
      <link href="https://metaist.com/blog/2025/09/legal-systems-very-different-from-ours.html"/>
      <id>tag:metaist.com,2010:blog.post-ab02fb06932cc819fc501a6c017bcb8ebeb2e943</id>
      <published>Tue Sep 30 2025 23:38:58 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:38:58 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Legal-Systems-Very-Different-Ours-ebook/dp/B07MTPZVX9&quot;&gt;Legal Systems Very Different from Ours&lt;/a&gt; by David Friedman, Peter Leeson, &amp;amp; David Skarbek (2019). I re-read this to remember the general kinds of problems human legal systems solve.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The No S Diet: The Strikingly Simple Weight-Loss Strategy That Has Dieters Raving--and DroppingPounds</title>
      <link href="https://metaist.com/blog/2025/09/no-s-diet.html"/>
      <id>tag:metaist.com,2010:blog.post-b4ecafd6241c48b9d5eeb8c4b18d422c9fe6f763</id>
      <published>Tue Sep 30 2025 23:35:39 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:35:39 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Diet-Weight-Loss-Raving-DroppingPounds-DietersRaving-ebook/dp/B0013TRRWG&quot;&gt;The No S Diet: The Strikingly Simple Weight-Loss Strategy That Has Dieters Raving--and DroppingPounds&lt;/a&gt; by Reinhard Engels &amp;amp; Ben Kallen (2008). The rules are literally on the cover and the rest of the book is commentary. Being a diet book from 2008 it&#39;s got some references to psych studies that didn&#39;t replicate. But from a UX perspective, brilliant.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Transform: Mayo Clinic Platform and the Digital Future of Health</title>
      <link href="https://metaist.com/blog/2025/09/transform.html"/>
      <id>tag:metaist.com,2010:blog.post-b1b6ba69d366637771d0d966905302b2e77bcfeb</id>
      <published>Tue Sep 30 2025 23:32:36 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:32:36 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/B0DQ77WZ9Y&quot;&gt;Transform: Mayo Clinic Platform and the Digital Future of Health&lt;/a&gt; by Paul Cerrato M.A. &amp;amp; John D. Halamka M.D. M.S. (2025; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). The bits about NLP felt ancient, but other bits were modern enough.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Good To Great And The Social Sectors: A Monograph to Accompany Good to Great</title>
      <link href="https://metaist.com/blog/2025/09/good-to-great-and-the-social-sectors.html"/>
      <id>tag:metaist.com,2010:blog.post-e91584ab2165ea07e8f975657bc3df98f008dca9</id>
      <published>Tue Sep 30 2025 23:29:46 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:29:46 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Good-Great-Social-Sectors-Monograph-ebook/dp/B0058DRTGC&quot;&gt;Good To Great And The Social Sectors: A Monograph to Accompany Good to Great&lt;/a&gt; by Jim Collins (2011). Short and to the point.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>You&#39;re a Slow Thinker. Now what?</title>
      <link href="https://metaist.com/blog/2025/09/youre-a-slow-thinker-now-what.html"/>
      <id>tag:metaist.com,2010:blog.post-e05eeff7eec56759fd1a590ea184bb07eea18b45</id>
      <published>Tue Sep 30 2025 23:22:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:22:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://chillphysicsenjoyer.substack.com/p/youre-a-slow-thinker-now-what&quot;&gt;You&#39;re a Slow Thinker. Now what?&lt;/a&gt; (Afiq / Casual Physics). I wish this was studied more.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Thank you for being annoying</title>
      <link href="https://metaist.com/blog/2025/09/thank-you-for-being-annoying.html"/>
      <id>tag:metaist.com,2010:blog.post-fde509f480528ec7b2b8ba6f6158989253ae2b8b</id>
      <published>Tue Sep 30 2025 23:20:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:20:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.experimental-history.com/p/thank-you-for-being-annoying&quot;&gt;Thank you for being annoying&lt;/a&gt; (Adam Mastroianni / Experimental History). Many things are the result of being irritated.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Brainstorming terrible ideas in a group</title>
      <link href="https://metaist.com/blog/2025/09/brainstorming-terrible-ideas-in-a-group.html"/>
      <id>tag:metaist.com,2010:blog.post-0451b16195de644ae03c69a4edb2e8f537dc6600</id>
      <published>Tue Sep 30 2025 23:18:07 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:18:07 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://rosipov.com/blog/brainstorming-terrible-ideas-in-a-group/&quot;&gt;Brainstorming terrible ideas in a group&lt;/a&gt; (Ruslan Osipov). Brainstorming doesn&#39;t usually get people moving around in the search space enough; coming up with terrible ideas might actually help.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Why Today’s Humanoids Won’t Learn Dexterity</title>
      <link href="https://metaist.com/blog/2025/09/why-todays-humanoids-wont-learn-dexterity.html"/>
      <id>tag:metaist.com,2010:blog.post-239a1162feb4c1de8b2af699b983cd39affa6352</id>
      <published>Tue Sep 30 2025 23:15:16 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:15:16 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://rodneybrooks.com/why-todays-humanoids-wont-learn-dexterity/&quot;&gt;Why Today’s Humanoids Won’t Learn Dexterity&lt;/a&gt; (Rodney Brooks). While it&#39;s hard for me to judge on the main argument, I can totally see the words changing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Following that pattern, what it means to be a &lt;em&gt;humanoid robot&lt;/em&gt; will change over time.&lt;/p&gt;
&lt;p&gt;Before too long (and we already start to see this) humanoid robots will get wheels for feet, at first two, and later maybe more, with nothing that any longer really resembles human legs in gross form. But they will still be called &lt;em&gt;humanoid robots&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Getting More Strategic</title>
      <link href="https://metaist.com/blog/2025/09/getting-more-strategic.html"/>
      <id>tag:metaist.com,2010:blog.post-3d5bdb71dd5c961f6fe798d0075099a64e3da5cf</id>
      <published>Tue Sep 30 2025 23:11:52 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:11:52 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://cate.blog/2025/09/23/getting-more-strategic/&quot;&gt;Getting More Strategic&lt;/a&gt; (Cate Huston / Accidentally in Code).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We often talk about strategy like it’s defining the end state, setting and describing the destination. But strategy is about defining the incremental steps – the proximate objectives – that can take us towards that end state. Strategy is understanding where we are at – context – and the path from there to where we need to go. Any strategic “plan”, is best executed as a set of proximate objectives.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Illiteracy is a policy choice</title>
      <link href="https://metaist.com/blog/2025/09/illiteracy-is-a-policy-choice.html"/>
      <id>tag:metaist.com,2010:blog.post-55a74a727f700abad1b1a62b0dc77e9724360bdf</id>
      <published>Tue Sep 30 2025 23:09:49 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:09:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theargumentmag.com/p/illiteracy-is-a-policy-choice&quot;&gt;Illiteracy is a policy choice&lt;/a&gt; (Kelsey Piper / The Argument). Some things actually work.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Your UX Design EDC (Every Day Carry)</title>
      <link href="https://metaist.com/blog/2025/09/your-ux-design-edc-every-day-carry.html"/>
      <id>tag:metaist.com,2010:blog.post-1e88d4092ba23b8ce881513fa2f83c3a08f3c131</id>
      <published>Tue Sep 30 2025 23:07:31 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:07:31 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.jondaiello.com/posts/your-ux-design-edc-every-day-carry&quot;&gt;Your UX Design EDC (Every Day Carry)&lt;/a&gt; (Jon Daiello). I particularly like the &amp;quot;Evidence Arsenal&amp;quot; because that has, historically, been the hardest bit for me with clients.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How to Motivate Yourself To Do A Thing You Don&#39;t Want to Do</title>
      <link href="https://metaist.com/blog/2025/09/how-to-motivate-yourself-to-do-a-thing-you-dont-want-to-do.html"/>
      <id>tag:metaist.com,2010:blog.post-8a95a08ee354bb7617289a49330b4850b8695942</id>
      <published>Tue Sep 30 2025 23:06:04 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 23:06:04 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://ashleyjanssen.com/how-to-motivate-yourself-to-do-a-thing-you-dont-want-to-do/&quot;&gt;How to Motivate Yourself To Do A Thing You Don&#39;t Want to Do&lt;/a&gt; (Ashley Janssen). A reasonable framework.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI Psychosis Is Rarely Psychosis at All</title>
      <link href="https://metaist.com/blog/2025/09/ai-psychosis-is-rarely-psychosis-at-all.html"/>
      <id>tag:metaist.com,2010:blog.post-8231cef9fe948b50e16218624861185ec02690e9</id>
      <published>Tue Sep 30 2025 22:58:40 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:58:40 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.wired.com/story/ai-psychosis-is-rarely-psychosis-at-all/&quot;&gt;AI Psychosis Is Rarely Psychosis at All&lt;/a&gt; (Robert Hart / Wired). &amp;quot;&lt;a href=&quot;https://www.youtube.com/watch?v=AqNjZ97x48s&quot;&gt;It&#39;s a &lt;strong&gt;delusion&lt;/strong&gt;, Michael!&lt;/a&gt;&amp;quot;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>I Vibecoded a Dispute Resolution App</title>
      <link href="https://metaist.com/blog/2025/09/i-vibecoded-a-dispute-resolution.html"/>
      <id>tag:metaist.com,2010:blog.post-cd7ca7fc88705e0b1ec0a65c5786eb5574e33b73</id>
      <published>Tue Sep 30 2025 22:56:16 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:56:16 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://sarahconstantin.substack.com/p/i-vibecoded-a-dispute-resolution&quot;&gt;I Vibecoded a Dispute Resolution App&lt;/a&gt; (Sarah Constantin / Rough Diamonds). There should be 10 versions of this. Too bad people got so upset about the &lt;em&gt;idea&lt;/em&gt; of such an app.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Is it Time to Un-Sass?</title>
      <link href="https://metaist.com/blog/2025/09/is-it-time-to-un-sass.html"/>
      <id>tag:metaist.com,2010:blog.post-f0cc0b08e380ed6c0009834ae13fc6b2691b2cf2</id>
      <published>Tue Sep 30 2025 22:54:13 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:54:13 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://css-tricks.com/is-it-time-to-un-sass/&quot;&gt;Is it Time to Un-Sass?&lt;/a&gt; (Jeff Bridgforth / CSS-Tricks). Aside from the snub at Less.js, I largely agree.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Minimal Version Selection Revisited</title>
      <link href="https://metaist.com/blog/2025/09/minimal-version-selection-revisited.html"/>
      <id>tag:metaist.com,2010:blog.post-a128b3b3a990f30837ce2a32ba0c6394cc00df11</id>
      <published>Tue Sep 30 2025 22:51:07 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:51:07 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://matklad.github.io/2024/12/24/minimal-version-selection-revisited.html&quot;&gt;Minimal Version Selection Revisited&lt;/a&gt; (Alex Kladov).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is quite neat — it puts a natural damper on the supply chain attacks. If a bad version of a library is released, someone needs to explicitly opt into this new version. What’s more, the deeper in your dependency tree the library is, the more explicit approvals are required for the library to propagate to your project.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>You no longer need JavaScript</title>
      <link href="https://metaist.com/blog/2025/09/you-dont-need-js.html"/>
      <id>tag:metaist.com,2010:blog.post-15a9090ba4a925d996ab26faccbf62866bfb8208</id>
      <published>Tue Sep 30 2025 22:48:47 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:48:47 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://lyra.horse/blog/2025/08/you-dont-need-js/&quot;&gt;You no longer need JavaScript&lt;/a&gt; (Lyra Rebane). Huh. CSS does a lot nowadays.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Is Jonathan Haidt right about smartphones?</title>
      <link href="https://metaist.com/blog/2025/09/is-jonathan-haidt-right-about-smartphones.html"/>
      <id>tag:metaist.com,2010:blog.post-93e9163a4a85e5b9fc5b94f6c78ef935ff4d7bd8</id>
      <published>Tue Sep 30 2025 22:46:12 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:46:12 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.tes.com/magazine/teaching-learning/general/jonathan-haidt-anxious-generation-right-about-smartphones&quot;&gt;Is Jonathan Haidt right about smartphones?&lt;/a&gt; (Jon Severs / tes). I can agree with Haidt&#39;s policy choices but disagree that the evidence is unequivocal.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Islamic Argument for Competence</title>
      <link href="https://metaist.com/blog/2025/09/the-islamic-argument-for-competence.html"/>
      <id>tag:metaist.com,2010:blog.post-e8dc08ef6061d9f8618ccc57d81a05110d835f41</id>
      <published>Tue Sep 30 2025 22:41:49 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:41:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.avdullahyousef.com/p/the-islamic-argument-for-competence&quot;&gt;The Islamic Argument for Competence&lt;/a&gt; (Abdullah Yousef; via &lt;a href=&quot;https://marginalrevolution.com/marginalrevolution/2025/09/tuesday-assorted-links-533.html&quot;&gt;Tyler Cowen&lt;/a&gt;). A familiar tale.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Magical Thinking on AI</title>
      <link href="https://metaist.com/blog/2025/09/magical-thinking-on-ai.html"/>
      <id>tag:metaist.com,2010:blog.post-8ad74f04fe4a819b4f5c12fe20d7194555d74e62</id>
      <published>Tue Sep 30 2025 22:39:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:39:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://aiguide.substack.com/p/magical-thinking-on-ai&quot;&gt;Magical Thinking on AI&lt;/a&gt; (Melanie Mitchell). There are arguments to be made on both sides of the debate, but these ain&#39;t them.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>&#39;Make invalid states unrepresentable&#39; considered harmful</title>
      <link href="https://metaist.com/blog/2025/09/invalid-states.html"/>
      <id>tag:metaist.com,2010:blog.post-c300fa1ca367d75e34fbf364fa73bf2a8f6479c5</id>
      <published>Tue Sep 30 2025 22:37:09 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:37:09 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.seangoedecke.com/invalid-states/&quot;&gt;&#39;Make invalid states unrepresentable&#39; considered harmful&lt;/a&gt; (Sean Goedecke). Because you need a certain amount of flexibility when writing software.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Artificial Writing and Automated Detection</title>
      <link href="https://metaist.com/blog/2025/09/artificial-writing-and-automated-detection.html"/>
      <id>tag:metaist.com,2010:blog.post-616afd1777728b61224d33528985bb72625c7376</id>
      <published>Tue Sep 30 2025 22:35:04 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:35:04 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/brian_jabarian/status/1960717429467693100&quot;&gt;Artificial Writing and Automated Detection&lt;/a&gt; (Brian Jabarian). Nice approach.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Seeing like a software company</title>
      <link href="https://metaist.com/blog/2025/09/seeing-like-a-software-company.html"/>
      <id>tag:metaist.com,2010:blog.post-b700074c09cc3034fc4e7fda05c8b74697c86557</id>
      <published>Tue Sep 30 2025 22:31:58 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:31:58 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.seangoedecke.com/seeing-like-a-software-company/&quot;&gt;Seeing like a software company&lt;/a&gt; (Sean Goedecke). On the importance of legibility in corporate software development.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What Is Man, That Thou Art Mindful Of Him?</title>
      <link href="https://metaist.com/blog/2025/09/what-is-man-that-thou-art-mindful.html"/>
      <id>tag:metaist.com,2010:blog.post-023afc9761292155eadfa368f92cff7eed2a94d8</id>
      <published>Tue Sep 30 2025 22:27:29 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 30 2025 22:27:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.astralcodexten.com/p/what-is-man-that-thou-art-mindful&quot;&gt;What Is Man, That Thou Art Mindful Of Him?&lt;/a&gt; (Scott Alexander / ACX). Funny take on LLM evaluations when looking at human intelligence.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Torah United: Teachings on the Weekly Parashah from Rav Avraham Yitzchak HaKohen Kook, Rabbi Joseph B. Soloveitchik, and the Chassidic Masters</title>
      <link href="https://metaist.com/blog/2025/08/torah-united.html"/>
      <id>tag:metaist.com,2010:blog.post-0772e3fca8154c67b3b5220635ded50d2a007115</id>
      <published>Sun Aug 31 2025 21:50:44 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:50:44 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Teachings-Parashah-Yitzchak-Soloveitchik-Chassidic/dp/1602804966&quot;&gt;Torah United: Teachings on the Weekly Parashah from Rav Avraham Yitzchak HaKohen Kook, Rabbi Joseph B. Soloveitchik, and the Chassidic Masters&lt;/a&gt; by Aaron Goldscheider (2023; via &lt;strong&gt;Rachel &amp;amp; Jacob Novikov&lt;/strong&gt;).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Demon Copperhead</title>
      <link href="https://metaist.com/blog/2025/08/demon-copperhead.html"/>
      <id>tag:metaist.com,2010:blog.post-d62133e63daf295c3d338a47dc53a45761982c6b</id>
      <published>Sun Aug 31 2025 21:47:52 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:47:52 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Demon-Copperhead-Novel-Barbara-Kingsolver-ebook/dp/B09QMHZ53K&quot;&gt;Demon Copperhead&lt;/a&gt; by Barbara Kingsolver (2022; via &lt;strong&gt;Jenny Melcher&lt;/strong&gt;). If &lt;em&gt;David Copperfield&lt;/em&gt; happened during the modern opioid epidemic.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Fossil Future: Why Global Human Flourishing Requires More Oil, Coal, and Natural Gas--Not Less</title>
      <link href="https://metaist.com/blog/2025/08/fossil-future.html"/>
      <id>tag:metaist.com,2010:blog.post-2e3405280f641038a73ccaed62eac1297d22f753</id>
      <published>Sun Aug 31 2025 21:45:06 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:45:06 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/0593420411&quot;&gt;Fossil Future: Why Global Human Flourishing Requires More Oil, Coal, and Natural Gas--Not Less&lt;/a&gt; by Alex Epstein (2022; via Bryan Caplan). The title and subtitle are intentionally provocative, but not technically wrong once you think about how many things are made of, e.g., plastic. However, glad to see nuclear get its own chapter.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Black Flags: The Rise of ISIS</title>
      <link href="https://metaist.com/blog/2025/08/black-flags.html"/>
      <id>tag:metaist.com,2010:blog.post-e172a7154fe673074893f396e941b76c5a068a53</id>
      <published>Sun Aug 31 2025 21:43:18 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:43:18 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/B014RHT8T0&quot;&gt;Black Flags: The Rise of ISIS&lt;/a&gt; by Joby Warrick (2015; via Rob Reid). A bit outdated now, but still a wild ride.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Number Go Up: Inside Crypto&#39;s Wild Rise and Staggering Fall</title>
      <link href="https://metaist.com/blog/2025/08/number-go-up.html"/>
      <id>tag:metaist.com,2010:blog.post-769f5841711271f1036023870ca8b97ad7836900</id>
      <published>Sun Aug 31 2025 21:41:21 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:41:21 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/B0BZTBKK78&quot;&gt;Number Go Up: Inside Crypto&#39;s Wild Rise and Staggering Fall&lt;/a&gt; by Zeke Faux (2023; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Peak Mind: Achieve Peak Mindfulness and Unlock Your Full Potential</title>
      <link href="https://metaist.com/blog/2025/08/peak-mind.html"/>
      <id>tag:metaist.com,2010:blog.post-f0b6321c5317567db983eba3e4e7a93f9820d4b2</id>
      <published>Sun Aug 31 2025 21:39:45 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:39:45 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Peak-Mind-Attention-Invest-Minutes-ebook/dp/B08THNJ978&quot;&gt;Peak Mind: Achieve Peak Mindfulness and Unlock Your Full Potential&lt;/a&gt; by Amishi P. Jha (2021; via &lt;strong&gt;Ann Rose Greenberg&lt;/strong&gt;).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Learn Better: Mastering the Skills for Success in Life, Business, and School, or How to Become an Expert in Just About Anything</title>
      <link href="https://metaist.com/blog/2025/08/learn-better.html"/>
      <id>tag:metaist.com,2010:blog.post-0e46d912022cf408458267fb0ad1ad2e2f6b7484</id>
      <published>Sun Aug 31 2025 21:37:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:37:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/0593135318/&quot;&gt;Learn Better: Mastering the Skills for Success in Life, Business, and School, or How to Become an Expert in Just About Anything&lt;/a&gt; by Ulrich Boser (2017).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Multimodal AI Models on Apple Silicon with MLX with Prince Canuma</title>
      <link href="https://metaist.com/blog/2025/08/multimodal-ai-models-on-apple-sillicon-with-mlx.html"/>
      <id>tag:metaist.com,2010:blog.post-04d4309c71efd22f9cba9dc7fa59bd8c19283abd</id>
      <published>Sun Aug 31 2025 21:34:22 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:34:22 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🎙️ &lt;a href=&quot;https://twimlai.com/podcast/twimlai/multimodal-ai-models-on-apple-silicon-with-mlx/&quot;&gt;Multimodal AI Models on Apple Silicon with MLX with Prince Canuma&lt;/a&gt; (Prince Canuma / TWIMLAI). Very cool story about how MLX came to be and how it got good.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Is AI already impacting the job market?</title>
      <link href="https://metaist.com/blog/2025/08/is-ai-impacting-job-market.html"/>
      <id>tag:metaist.com,2010:blog.post-1c5f0a6e0e879bbea5441a53be1e3f1421530b4d</id>
      <published>Sun Aug 31 2025 21:32:42 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:32:42 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/econ_b/status/1960242091159667116&quot;&gt;Is AI already impacting the job market?&lt;/a&gt; (Bharat Chandar). Seems like solid initial signal from paycheck data.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Nine Rules for Managing Humans Managing Nuclear Reactors</title>
      <link href="https://metaist.com/blog/2025/08/nine-rules-for-managing-humans-managing-nuclear-reactors.html"/>
      <id>tag:metaist.com,2010:blog.post-7704c0e037947b93c815d5412483987cc7a961c8</id>
      <published>Sun Aug 31 2025 21:29:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:29:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/11/nine-rules-for-managing-humans-managing-nuclear-reactors&quot;&gt;Nine Rules for Managing Humans Managing Nuclear Reactors&lt;/a&gt; (Charles Yang / Asterisk). Includes a reprint of a powerful article by Admiral Hyman Rickover from 1979.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Class Dismissed</title>
      <link href="https://metaist.com/blog/2025/08/joe-liemandt-class-dismissed.html"/>
      <id>tag:metaist.com,2010:blog.post-74322800eb5363d3a0794ac529cac3b6bdf8969e</id>
      <published>Sun Aug 31 2025 21:27:05 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:27:05 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://joincolossus.com/article/joe-liemandt-class-dismissed/&quot;&gt;Class Dismissed&lt;/a&gt; (Jeremy Stern / Colossus). Deep-dive interview with Joe Liemandt to include details about Alpha School.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>10 Lessons from Ryan Petersen</title>
      <link href="https://metaist.com/blog/2025/08/10-lessons-from-typesfast.html"/>
      <id>tag:metaist.com,2010:blog.post-01cc70f53c71aeded4cdb58ba4d90b6f77d28c66</id>
      <published>Sun Aug 31 2025 21:25:12 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:25:12 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/ShaneAParrish/status/1954157833160634552&quot;&gt;10 Lessons from Ryan Petersen&lt;/a&gt; (Shane Parrish).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Building Ultra Cheap Energy Storage for Solar PV</title>
      <link href="https://metaist.com/blog/2025/08/building-ultra-cheap-energy-storage.html"/>
      <id>tag:metaist.com,2010:blog.post-e6b66a72e9a9239f5fdcac5974499e0682a06e3e</id>
      <published>Sun Aug 31 2025 21:22:49 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:22:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://austinvernon.substack.com/p/building-ultra-cheap-energy-storage&quot;&gt;Building Ultra Cheap Energy Storage for Solar PV&lt;/a&gt; (Austin Vernon). Detailed and with strong testable claims for the business Austin is building.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Designing a mobile-first HTML editor</title>
      <link href="https://metaist.com/blog/2025/08/designing-a-mobile-first-html-editor.html"/>
      <id>tag:metaist.com,2010:blog.post-5935f89e18b0447184ba1ec94690c7ac7fc6b2a1</id>
      <published>Sun Aug 31 2025 21:20:04 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:20:04 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://jamesg.blog/2025/08/17/designing-a-mobile-first-html-editor&quot;&gt;Designing a mobile-first HTML editor&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The McPhee method</title>
      <link href="https://metaist.com/blog/2025/08/the-mcphee-method.html"/>
      <id>tag:metaist.com,2010:blog.post-c76b7dafbd680b1c974c919b154c21d830bbb188</id>
      <published>Sun Aug 31 2025 21:17:14 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:17:14 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://jsomers.net/blog/the-mcphee-method&quot;&gt;The McPhee method&lt;/a&gt; (James Somers). If you capture and enumerate enough detail, you&#39;ll have the materials to mechanically produce great work.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>“Asthenes” as a Jewish Textual Reference to Obsessive-Compulsive Disorder</title>
      <link href="https://metaist.com/blog/2025/08/asthenes-as-a-jewish-textual-reference-to-obsessive-compulsive-disorder.html"/>
      <id>tag:metaist.com,2010:blog.post-5a727b7a0e14cb869a685418fad26788602fb877</id>
      <published>Sun Aug 31 2025 21:14:17 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:14:17 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thelehrhaus.com/scholarship/asthenes-as-a-jewish-textual-reference-to-obsessive-compulsive-disorder/&quot;&gt;“Asthenes” as a Jewish Textual Reference to Obsessive-Compulsive Disorder&lt;/a&gt; (Shayna Herszage-Feldan / Lehrhaus). Despite knowing all the behaviors from the Gemara, I don&#39;t think I ever thought of OCD as explaining them.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What are Forward Deployed Engineers, and why are they so in demand?</title>
      <link href="https://metaist.com/blog/2025/08/forward-deployed-engineers.html"/>
      <id>tag:metaist.com,2010:blog.post-11d16f9cb4d423e38550283dc33c3cfeee5ef35f</id>
      <published>Sun Aug 31 2025 21:11:50 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:11:50 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/forward-deployed-engineers&quot;&gt;What are Forward Deployed Engineers, and why are they so in demand?&lt;/a&gt; (Gregely Orosz / The Pragmatic Engineer). An enzyme-like position that empowers engineers to convert specific customer needs into product features.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Starting with pytest’s parametrize</title>
      <link href="https://metaist.com/blog/2025/08/starting-with-pytests-parametrize.html"/>
      <id>tag:metaist.com,2010:blog.post-1f8be8f8890c19a32e488e85bbd27ef13703f44d</id>
      <published>Sun Aug 31 2025 21:10:17 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:10:17 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://nedbatchelder.com/blog/202508/starting_with_pytests_parametrize.html&quot;&gt;Starting with pytest’s parametrize&lt;/a&gt; (Ned Batchelder). I have so many tests that could use this.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>NIST Finalizes ‘Lightweight Cryptography’ Standard to Protect Small Devices</title>
      <link href="https://metaist.com/blog/2025/08/nist-finalizes-lightweight-cryptography-standard-protect-small-devices.html"/>
      <id>tag:metaist.com,2010:blog.post-0a2b5ba13bd3b94e7e5c3af47ecdd954d914402c</id>
      <published>Sun Aug 31 2025 21:08:27 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:08:27 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.nist.gov/news-events/news/2025/08/nist-finalizes-lightweight-cryptography-standard-protect-small-devices&quot;&gt;NIST Finalizes ‘Lightweight Cryptography’ Standard to Protect Small Devices&lt;/a&gt; (NIST). I guess better 15 years late than never.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Of Marx and Moloch: How My Attempt to Convince Effective Altruists to Become Socialists Backfired Completely</title>
      <link href="https://metaist.com/blog/2025/08/of-marx-and-moloch-or-my-misguided.html"/>
      <id>tag:metaist.com,2010:blog.post-f660cac732cd26e23ba921a864c94834dc18af45</id>
      <published>Sun Aug 31 2025 21:05:49 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:05:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://honestsignals.substack.com/p/of-marx-and-moloch-or-my-misguided&quot;&gt;Of Marx and Moloch: How My Attempt to Convince Effective Altruists to Become Socialists Backfired Completely&lt;/a&gt; (Lennox). We should strongly encourage people to admit when they change their mind.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Virtual School Hit the Mainstream 5 Years Ago. How Popular Has It Gotten?</title>
      <link href="https://metaist.com/blog/2025/08/virtual-school-hit-the-mainstream.html"/>
      <id>tag:metaist.com,2010:blog.post-aca04ade18d17a74d4ae96fadc9325dc15d47e5b</id>
      <published>Sun Aug 31 2025 21:04:30 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:04:30 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.edsurge.com/news/2025-08-12-virtual-school-hit-the-mainstream-5-years-ago-how-popular-has-it-gotten&quot;&gt;Virtual School Hit the Mainstream 5 Years Ago. How Popular Has It Gotten?&lt;/a&gt; (Lauren Coffey / EdSurge). Somewhat.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI: great expectations</title>
      <link href="https://metaist.com/blog/2025/08/ai-great-expectations.html"/>
      <id>tag:metaist.com,2010:blog.post-48d87b02c00ca7c46ac97a1ff5112d8a3a39ea53</id>
      <published>Sun Aug 31 2025 21:01:39 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 21:01:39 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://rodneybrooks.com/ai-great-expectations/&quot;&gt;AI: great expectations&lt;/a&gt; (Rodney Brooks). This is a republication of Rodney&#39;s article from March 1988. Great example of the difficulty of &amp;quot;over and under estimating the power of AI.&amp;quot;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Heritability puzzlers</title>
      <link href="https://metaist.com/blog/2025/08/heritable.html"/>
      <id>tag:metaist.com,2010:blog.post-0d58a4f5d9067b2d24bb50cd0c7c602b472c241c</id>
      <published>Sun Aug 31 2025 20:58:58 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 20:58:58 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://dynomight.net/heritable/&quot;&gt;Heritability puzzlers&lt;/a&gt; (Dynomight). Pretty good explanation of what &amp;quot;heritability&amp;quot; actually means. Still confusing.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Your Review: My Father’s Instant Mashed Potatoes</title>
      <link href="https://metaist.com/blog/2025/08/your-review-my-fathers-instant-mashed.html"/>
      <id>tag:metaist.com,2010:blog.post-cf492c1b85cf509bf21877b3c974a5d26fcced59</id>
      <published>Sun Aug 31 2025 20:56:32 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 20:56:32 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.astralcodexten.com/p/your-review-my-fathers-instant-mashed&quot;&gt;Your Review: My Father’s Instant Mashed Potatoes&lt;/a&gt; (Chris Finkle / ACX). Simulacra of simulacra.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Developers, Reinvented</title>
      <link href="https://metaist.com/blog/2025/08/developers-reinvented.html"/>
      <id>tag:metaist.com,2010:blog.post-21bf5fda25933714e85344e342615d50f0e5815d</id>
      <published>Sun Aug 31 2025 20:55:16 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 20:55:16 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://ashtom.github.io/developers-reinvented&quot;&gt;Developers, Reinvented&lt;/a&gt; (Thomas Dohmke).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Bag of words, have mercy on us</title>
      <link href="https://metaist.com/blog/2025/08/bag-of-words-have-mercy-on-us.html"/>
      <id>tag:metaist.com,2010:blog.post-1bb041b4bd8e3442113142472c53203c313b7469</id>
      <published>Sun Aug 31 2025 20:52:42 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 20:52:42 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.experimental-history.com/p/bag-of-words-have-mercy-on-us&quot;&gt;Bag of words, have mercy on us&lt;/a&gt; (Adam Mastroianni / Experimental History). Humans gonna anthropomorphize.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>No, AI is not Making Engineers 10x as Productive</title>
      <link href="https://metaist.com/blog/2025/08/curing-your-ai-10x-engineer-imposter-syndrome.html"/>
      <id>tag:metaist.com,2010:blog.post-95f9d355336e8f2b7a07836a6e63b04c104a9fbb</id>
      <published>Sun Aug 31 2025 20:44:50 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 20:44:50 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://colton.dev/blog/curing-your-ai-10x-engineer-imposter-syndrome/&quot;&gt;No, AI is not Making Engineers 10x as Productive&lt;/a&gt; (Colton Voege). One time I was in a meeting with over 100 people where we were told that we had to improve our performance by 10X year-over-year. After many rousing speeches of how important it was to 10X our performance, I asked the only question that came to mind: &amp;quot;For how many years in a row, do we expect to be able to 10X our performance?&amp;quot; The non-engineering speaker did not understand why all the engineers laughed.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The ChatGPT sharing dialog demonstrates how difficult it is to design privacy preferences</title>
      <link href="https://metaist.com/blog/2025/08/privacy-design.html"/>
      <id>tag:metaist.com,2010:blog.post-107a26f09a3d50e2f46cb199dbd95a6f378fb917</id>
      <published>Sun Aug 31 2025 20:36:47 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Aug 31 2025 20:36:47 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2025/Aug/3/privacy-design/&quot;&gt;The ChatGPT sharing dialog demonstrates how difficult it is to design privacy preferences&lt;/a&gt; (Simon Willison). Soon: NeuraLink policy to default share all thoughts to the internet considered harmful.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>An Unsolved Victorian-Era Riddle</title>
      <link href="https://metaist.com/blog/2025/08/unsolved-riddle.html"/>
      <id>tag:metaist.com,2010:blog.post-5a800c187ee24b2dc3bb138973f2706373598e91</id>
      <published>Fri Aug 01 2025 09:21:09 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Aug 01 2025 09:21:09 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;I came across this riddle, purportedly by &lt;a href=&quot;https://en.wikipedia.org/wiki/Samuel_Wilberforce&quot;&gt;Bishop Samuel Wilberforce&lt;/a&gt;, but it seems &lt;a href=&quot;http://anomalyinfo.com/Stories/1873-unsolved-riddle-bishop-wilberforce&quot;&gt;that attribution is in error&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m the sweetest of voices in orchestra heard,&lt;br&gt;
But yet in an orchestra never have been.&lt;br&gt;
I’m a bird of fine plumage, but less like a bird&lt;br&gt;
Nothing ever in Nature was seen.&lt;br&gt;
Touching earth I expire; in water I die;&lt;br&gt;
Though I do progress, I can run, swim and fly.&lt;br&gt;
Darkness destroys me, and light is my death;&lt;br&gt;
And I can&#39;t keep alive without stopping my breath.&lt;br&gt;
If my name can’t be guessed by a boy or a man,&lt;br&gt;
By a woman or girl it certainly can.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some proposed answers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Time&amp;quot; or &amp;quot;Whale&amp;quot; (&amp;quot;orca&amp;quot;) (&lt;a href=&quot;http://anomalyinfo.com/Stories/1873-unsolved-riddle-bishop-wilberforce&quot;&gt;via Anomaly Info&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&amp;quot;Angel&amp;quot; (&lt;a href=&quot;https://en.m.wikisource.org/wiki/Page:Notes_and_Queries_-_Series_12_-_Volume_3.djvu/377&quot;&gt;via Notes and Queries&lt;/a&gt;) meaning &amp;quot;(1) a heavenly being, (2) an old English coin, and (3) a fish.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Comet&amp;quot; or &amp;quot;Painting&amp;quot; (&lt;a href=&quot;https://www.reddit.com/r/riddles/comments/1c8fdt/the_unsolved_riddle_of_bishop_samuel_wilberforce/&quot;&gt;via Reddit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I sort of get &amp;quot;Whale&amp;quot; and &amp;quot;Angel&amp;quot; (assuming those definitions are real), but I don&#39;t get the others, so I&#39;d like to propose a different solution: &amp;quot;&lt;strong&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/HMS_Kestrel_(1856)&quot;&gt;The HMS Kestrel&lt;/a&gt;&lt;/strong&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;The ship did exist in Wilberforce&#39;s time (in case he did write the riddle): it was launched in 1856 when Wilberforce was 51 (he died in 1873, aged 68) and it was sold in 1866 after seeing some action in the 1850s and 1860s.&lt;/p&gt;
&lt;p&gt;My analysis:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m the sweetest of voices in orchestra heard,&lt;br&gt;
But yet in an orchestra never have been.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;quot;Kestrel&amp;quot; is a play on the prominent sound (&amp;quot;sweetest sound&amp;quot;) in &amp;quot;Orchestra,&amp;quot; but the ship was never in an orchestra.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m a bird of fine plumage, but less like a bird&lt;br&gt;
Nothing ever in Nature was seen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A &lt;a href=&quot;https://en.wikipedia.org/wiki/Kestrel&quot;&gt;kestrel&lt;/a&gt; is &amp;quot;the common name give to several species of predatory birds,&amp;quot; so its a &amp;quot;bird of fine plumage&amp;quot;. A ship looks nothing like a bird.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Touching earth I expire; in water I die;
Though I do progress, I can run, swim and fly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The HMS Kestrel was a &lt;a href=&quot;https://en.wikipedia.org/wiki/Clown-class_gunboat&quot;&gt;&lt;em&gt;Clown&lt;/em&gt;-class gunboat&lt;/a&gt; which had a wood hull, steam power, and sails. They were often used for shallow water bombardment.&lt;/p&gt;
&lt;p&gt;The dangers of running aground (&amp;quot;touching earth&amp;quot;) and sinking (&amp;quot;in water&amp;quot;) were real (see next item). The &amp;quot;run&amp;quot; of the steam engine helped &amp;quot;swim&amp;quot; (in water) while the sails let it &amp;quot;fly&amp;quot; (by air).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Darkness destroys me, and light is my death;&lt;br&gt;
And I can&#39;t keep alive without stopping my breath.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bit of a stretch, but with ChatGPT&#39;s help: Night operations (&amp;quot;darkness&amp;quot;) and being discovered by the enemy (&amp;quot;light&amp;quot;) were both operational hazards. Indeed, the HMS Kestrel was part of the &lt;a href=&quot;https://web.archive.org/web/20211206021214/https://warfarehistorynetwork.com/2015/09/21/qing-dynasty-and-british-empire-clash-in-the-second-opium-war/&quot;&gt;second Battle of Taku Forts&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The attack was a bloody shambles, and it was clear that retreat was the only alternative to complete annihilation. &lt;em&gt;Lee&lt;/em&gt; had grounded, and &lt;em&gt;Kestrel&lt;/em&gt; had sunk halfway to its funnels in the Hai’s brown waters. &lt;em&gt;Cormorant&lt;/em&gt; was a loss, and the shattered &lt;em&gt;Plover&lt;/em&gt; was grounded and abandoned. The &lt;em&gt;Kestrel&lt;/em&gt; was later recovered, but the other three were written off as total losses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To avoid detection, perhaps the ship had to turn off the loud steam engine (&amp;quot;stopping my breath&amp;quot;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If my name can’t be guessed by a boy or a man,&lt;br&gt;
By a woman or girl it certainly can.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A kestrel is a predatory bird which Victorians considered a masculine trait, but &lt;a href=&quot;https://eprints.lancs.ac.uk/id/eprint/227644/&quot;&gt;birds, more generally, were largely associated with feminity&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Literacy lag: We start reading too late</title>
      <link href="https://metaist.com/blog/2025/08/literacy-lag-we-start-reading-too.html"/>
      <id>tag:metaist.com,2010:blog.post-c97fe9d957e579e6f7985cca34c052797f2e4095</id>
      <published>Fri Aug 01 2025 08:37:49 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Aug 01 2025 08:37:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theintrinsicperspective.com/p/literacy-lag-we-start-reading-too&quot;&gt;Literacy lag: We start reading too late&lt;/a&gt; (Erik Hoel / The Intrinsic Perspective). I&#39;m not saying you need to force parents to teach their 3 year-olds to read, but claiming it&#39;s not &amp;quot;developmentally appropriate&amp;quot; seems crazy.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Physicists disagree wildly on what quantum mechanics says about reality</title>
      <link href="https://metaist.com/blog/2025/08/physicists-disagree-wildly-on-what-quantum-mechanics-says-about-reality.html"/>
      <id>tag:metaist.com,2010:blog.post-a57a5c1810deda7424f7e5ec2e32876a43ab8619</id>
      <published>Fri Aug 01 2025 08:30:45 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Aug 01 2025 08:30:45 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.nature.com/articles/d41586-025-02342-y&quot;&gt;Physicists disagree wildly on what quantum mechanics says about reality&lt;/a&gt; (Elizabeth Gibney / Nature; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). I took the quiz and received:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You are probably content with a Copenhagen-like interpretation.&lt;/p&gt;
&lt;p&gt;You enjoy the idea that quantum mechanics is, in some way, able to describe the real world and you enjoy that there is some inherent randomness in the Universe. For you, the observer of quantum objects, and their classical world, is distinct from the quantum systems they interact with; a quantum particle&#39;s location and other attributes are not pre-defined, but emerge as well-defined states when an observer measures them.&lt;/p&gt;
&lt;p&gt;Exactly why a measurement triggers a shift from a probabilistic to a well-defined state is not clear, but our brains are macroscopic, so you don’t let that bother you.&lt;/p&gt;
&lt;p&gt;You might be among the 10% of researchers who, according to our survey, said that the Copenhagen interpretation was their favourite approach, but who also think that the wavefunction represents reality in some way.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Worship of the Heart: Essays on Jewish Prayer</title>
      <link href="https://metaist.com/blog/2025/07/worship-of-the-heart.html"/>
      <id>tag:metaist.com,2010:blog.post-034dbdaae375d98df94136546aab9d278a27e32a</id>
      <published>Thu Jul 31 2025 23:35:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:35:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Worship-Heart-Essays-Jewish-Meotzar/dp/0881257710&quot;&gt;Worship of the Heart: Essays on Jewish Prayer&lt;/a&gt; by Rabbi Joseph B. Soloveitchik (2003). I liked the analysis of boredom.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Here Comes Everybody: The Power of Organizing Without Organizations</title>
      <link href="https://metaist.com/blog/2025/07/here-comes-everybody.html"/>
      <id>tag:metaist.com,2010:blog.post-e7627db0ab84c460a64c303e8e6dc30785c6fdbd</id>
      <published>Thu Jul 31 2025 23:33:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:33:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Here-Comes-Everybody-Organizing-Organizations-ebook/dp/B0013TTKQC&quot;&gt;Here Comes Everybody: The Power of Organizing Without Organizations&lt;/a&gt; by Clay Shirky (2008; via Tyler Cowen). This is almost 20 years old. Quaint, but not wrong.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Machiavelli for Women: Defend Your Worth, Grow Your Ambition, and Win the Workplace</title>
      <link href="https://metaist.com/blog/2025/07/machiavelli-for-women.html"/>
      <id>tag:metaist.com,2010:blog.post-a702476f0bb5b86d68363b607e1fb3ec26cf186c</id>
      <published>Thu Jul 31 2025 23:29:19 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:29:19 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Machiavelli-Women-Playbook-Getting-Ahead-ebook/dp/B07Z45683Y&quot;&gt;Machiavelli for Women: Defend Your Worth, Grow Your Ambition, and Win the Workplace&lt;/a&gt; by Stacey Vanek Smith (2021). Extremely pragmatic and not evil.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Secrets of Happy Families: Improve Your Mornings, Rethink Family Dinner, Fight Smarter, Go Out and Play, and Much More</title>
      <link href="https://metaist.com/blog/2025/07/secret-of-happy-families.html"/>
      <id>tag:metaist.com,2010:blog.post-e429f12fddc0f7b8bde4f8374e64b589f8632386</id>
      <published>Thu Jul 31 2025 23:26:40 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:26:40 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Secrets-Happy-Families-Improve-Mornings-ebook/dp/B0089LOHHO&quot;&gt;The Secrets of Happy Families: Improve Your Mornings, Rethink Family Dinner, Fight Smarter, Go Out and Play, and Much More&lt;/a&gt; by Bruce Feiler (2013).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What&#39;s really true about intelligence and IQ? We empirically tested 40 claims</title>
      <link href="https://metaist.com/blog/2025/07/what-s-really-true-about-intelligence-and-iq-we-empirically-tested-40-claims.html"/>
      <id>tag:metaist.com,2010:blog.post-c6d836c665b0d847357b0010eba8ee8f71bdc3ca</id>
      <published>Thu Jul 31 2025 23:21:50 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:21:50 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.clearerthinking.org/post/what-s-really-true-about-intelligence-and-iq-we-empirically-tested-40-claims&quot;&gt;What&#39;s really true about intelligence and IQ? We empirically tested 40 claims&lt;/a&gt; (Nikola Erceg, Spencer Greenberg, and Beleń Cobeta / Clearer Thinking).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Critique of Paper: “An astonishing regularity in student learning rate”</title>
      <link href="https://metaist.com/blog/2025/07/critique-of-paper-an-astonishing-regularity-in-student-learning-rate.html"/>
      <id>tag:metaist.com,2010:blog.post-676a28906eb52b16147e6e4e376b188b8f883e06</id>
      <published>Thu Jul 31 2025 23:19:34 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:19:34 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.justinmath.com/critique-of-paper-an-astonishing-regularity-in-student-learning-rate/&quot;&gt;Critique of Paper: “An astonishing regularity in student learning rate”&lt;/a&gt; (Justin Skycak). Extrapolating from initial instructions is huge.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Making Postgres 42,000x slower because I am unemployed</title>
      <link href="https://metaist.com/blog/2025/07/making-postgres-slow.html"/>
      <id>tag:metaist.com,2010:blog.post-26272d4290917cd4b0cb629b91325565dd43b923</id>
      <published>Thu Jul 31 2025 23:17:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:17:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://byteofdev.com/posts/making-postgres-slow/&quot;&gt;Making Postgres 42,000x slower because I am unemployed&lt;/a&gt; (Jacob Jackson). Negative examples can be useful. See also &lt;a href=&quot;https://byteofdev.com/posts/tuning-postgres-intro/&quot;&gt;A Quick(ish) Introduction to Tuning Postgres&lt;/a&gt; for the positive version.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Enough AI copilots! We need AI HUDs</title>
      <link href="https://metaist.com/blog/2025/07/enough-ai-copilots-we-need-ai-huds.html"/>
      <id>tag:metaist.com,2010:blog.post-95ffe5c568b90a2277512b80b75c74e03cc25dbc</id>
      <published>Thu Jul 31 2025 23:16:12 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:16:12 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.geoffreylitt.com/2025/07/27/enough-ai-copilots-we-need-ai-huds&quot;&gt;Enough AI copilots! We need AI HUDs&lt;/a&gt; (Geoffrey Litt). Interesting UX implications.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How the Solid Protocol Restores Digital Agency</title>
      <link href="https://metaist.com/blog/2025/07/how-solid-protocol-restores-digital-agency.html"/>
      <id>tag:metaist.com,2010:blog.post-ba4ab66ac7db9c709f201cc9c5f5452469275944</id>
      <published>Thu Jul 31 2025 23:14:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:14:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.schneier.com/blog/archives/2025/07/how-solid-protocol-restores-digital-agency.html&quot;&gt;How the Solid Protocol Restores Digital Agency&lt;/a&gt; (Bruce Schneier). An interesting attempt to invert the data flow.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Task Runner Census 2025</title>
      <link href="https://metaist.com/blog/2025/07/2025-task-runners-census.html"/>
      <id>tag:metaist.com,2010:blog.post-18e4e5f0ae052b79104c9c3a0681e883f1fcaaab</id>
      <published>Thu Jul 31 2025 23:11:16 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:11:16 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://aleyan.com/blog/2025-task-runners-census/&quot;&gt;Task Runner Census 2025&lt;/a&gt; (Alexander Yankov). I saw this because I&#39;m &lt;a href=&quot;https://github.com/astral-sh/uv/issues/5903#issuecomment-3122105145&quot;&gt;tracking this &lt;code&gt;uv&lt;/code&gt; issue&lt;/a&gt;. This might have impacts on how &lt;code&gt;ds&lt;/code&gt; should work.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Could AI slow science?</title>
      <link href="https://metaist.com/blog/2025/07/could-ai-slow-science.html"/>
      <id>tag:metaist.com,2010:blog.post-76076b734e350479ea9d31432128bc282d310604</id>
      <published>Thu Jul 31 2025 23:09:36 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:09:36 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.aisnakeoil.com/p/could-ai-slow-science&quot;&gt;Could AI slow science?&lt;/a&gt; (Sayash Kapoor and Arvind Narayanan / AI Snake Oil). Maybe.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Fell in a hole, got out.</title>
      <link href="https://metaist.com/blog/2025/07/fell-in-a-hole-got-out.html"/>
      <id>tag:metaist.com,2010:blog.post-7efd3629102e08ca31939d8297ee9c22fa026121</id>
      <published>Thu Jul 31 2025 23:07:23 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:07:23 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://medium.com/the-coach-life/fell-in-a-hole-got-out-381356ec8d7f&quot;&gt;Fell in a hole, got out.&lt;/a&gt; (Tony Stubblebine). I had no idea about the tumultuous story of how Medium got to profitability in August 2024. Lots of basics had to be aligned.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>We aren&#39;t worried about misalignment as self-fulfilling prophecy</title>
      <link href="https://metaist.com/blog/2025/07/against-misalignment-as-self-fulfilling.html"/>
      <id>tag:metaist.com,2010:blog.post-09f883bea62f8f02590b5cef9a490724fb732bcf</id>
      <published>Thu Jul 31 2025 23:03:31 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 23:03:31 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://blog.ai-futures.org/p/against-misalignment-as-self-fulfilling&quot;&gt;We aren&#39;t worried about misalignment as self-fulfilling prophecy&lt;/a&gt; (Scott Alexander et al. / AI Futures Project). The topic under discussion is similar to &lt;a href=&quot;https://www.sefaria.org/Ecclesiastes.10?lang=bi&amp;amp;with=Translations&amp;amp;lang2=en&quot;&gt;Ecclesiastes 10:20&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don’t revile a king even among your intimates.
Don’t revile a rich man even in your bedchamber;
For a bird of the air may carry the utterance,
And a winged creature may report the word.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>The HALO Effect</title>
      <link href="https://metaist.com/blog/2025/07/the-halo-effect.html"/>
      <id>tag:metaist.com,2010:blog.post-1f7d8bdc645e6fc1e1d1a892033187c0c53f4820</id>
      <published>Thu Jul 31 2025 22:58:10 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:58:10 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://kwokchain.com/2025/07/15/the-halo-effect/&quot;&gt;The HALO Effect&lt;/a&gt; (Kevin Kwok). Interesting new arrangement (&amp;quot;Hire and License Out&amp;quot;) that is similar to &lt;a href=&quot;https://en.wikipedia.org/wiki/Acqui-hiring&quot;&gt;acqui-hiring&lt;/a&gt;, but much faster.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Reflections on OpenAI</title>
      <link href="https://metaist.com/blog/2025/07/openai-reflections.html"/>
      <id>tag:metaist.com,2010:blog.post-e605020b8da79752d22c0bbd5e358d974300f2b0</id>
      <published>Thu Jul 31 2025 22:48:14 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:48:14 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://calv.info/openai-reflections&quot;&gt;Reflections on OpenAI&lt;/a&gt; (Calvin French-Owen; via &lt;a href=&quot;https://x.com/mitsuhiko/status/1945381889985953926&quot;&gt;Armin Ronacher&lt;/a&gt;).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Grouping Students by Ability Transformed Our School. Could It Do the Same for Yours?</title>
      <link href="https://metaist.com/blog/2025/07/grouping-students-by-ability-transformed.html"/>
      <id>tag:metaist.com,2010:blog.post-c3a84a412fb176e5888f6c04ae9cf6f3eb9bb326</id>
      <published>Thu Jul 31 2025 22:43:50 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:43:50 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.educationprogress.org/p/grouping-students-by-ability-transformed&quot;&gt;Grouping Students by Ability Transformed Our School. Could It Do the Same for Yours?&lt;/a&gt; (Jessica Berg / Center for Educational Progress).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Happy 20th birthday Django!</title>
      <link href="https://metaist.com/blog/2025/07/django-birthday.html"/>
      <id>tag:metaist.com,2010:blog.post-7dd49dc22b70d69782de0913a07080dbccb316a6</id>
      <published>Thu Jul 31 2025 22:40:30 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:40:30 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2025/Jul/13/django-birthday/&quot;&gt;Happy 20th birthday Django!&lt;/a&gt; (Simon Willison). Lots of interesting details.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Joining Noetik</title>
      <link href="https://metaist.com/blog/2025/07/joining-noetik.html"/>
      <id>tag:metaist.com,2010:blog.post-63438c8652b71792bd7170029a52045e52d4737b</id>
      <published>Thu Jul 31 2025 22:37:59 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:37:59 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.owlposting.com/p/joining-noetik&quot;&gt;Joining Noetik&lt;/a&gt; (Abhishaike Mahajan; via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). Nice enumeration of reasons why the ML-Bio field is collapsing and a company (Noetik) possibly bucking the trend.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Everything I know about good system design</title>
      <link href="https://metaist.com/blog/2025/07/good-system-design.html"/>
      <id>tag:metaist.com,2010:blog.post-812a40d6d99381105d94817c6c50de0bd5461745</id>
      <published>Thu Jul 31 2025 22:35:29 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:35:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.seangoedecke.com/good-system-design/&quot;&gt;Everything I know about good system design&lt;/a&gt; (Sean Goedecke). This is about &lt;strong&gt;system&lt;/strong&gt; design; it&#39;s a programming article, but it uses a lot of intuition about what makes programs feel good (proper caching, hot path optimization, etc.).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>On agency</title>
      <link href="https://metaist.com/blog/2025/07/agency.html"/>
      <id>tag:metaist.com,2010:blog.post-7f20462934f5f8bc532b1ee408f485041794ede2</id>
      <published>Thu Jul 31 2025 22:33:48 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:33:48 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.henrikkarlsson.xyz/p/agency&quot;&gt;On agency&lt;/a&gt; (Henrik Karlsson / Escaping Flatland).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Often, agency is almost gentle—an attunement to the world and the self, a feeling out the details of reality, and a finding of the path of least resistance.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Solving Wordle with uv&#39;s dependency resolver</title>
      <link href="https://metaist.com/blog/2025/07/solving-wordle-with-uv-dependency-resolver.html"/>
      <id>tag:metaist.com,2010:blog.post-f54f4430676180360f6b3b0ed03b9f2ef74e7c44</id>
      <published>Thu Jul 31 2025 22:31:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:31:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://mildbyte.xyz/blog/solving-wordle-with-uv-dependency-resolver/&quot;&gt;Solving Wordle with uv&#39;s dependency resolver&lt;/a&gt; (mildbyte.xyz). Because of course you can.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>When AI Codes, What’s Left for me?</title>
      <link href="https://metaist.com/blog/2025/07/coding-agents.html"/>
      <id>tag:metaist.com,2010:blog.post-a301976714bc789e2a4ae2af074a55e5df2b113a</id>
      <published>Thu Jul 31 2025 22:28:47 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:28:47 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://corecursive.com/coding-agents/&quot;&gt;When AI Codes, What’s Left for me?&lt;/a&gt; (Adam Gordon Bell / Corecursive). Nice discussion about reinventing yourself in the age of AI coding agents.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>I Deleted My Second Brain</title>
      <link href="https://metaist.com/blog/2025/07/i-deleted-my-second-brain.html"/>
      <id>tag:metaist.com,2010:blog.post-1d14c07c9d104e0b93a4847d9b7ae05ce706d882</id>
      <published>Thu Jul 31 2025 22:25:36 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 31 2025 22:25:36 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.joanwestenberg.com/p/i-deleted-my-second-brain&quot;&gt;I Deleted My Second Brain&lt;/a&gt; (Joan Westenberg). I don&#39;t love the &amp;quot;second brain&amp;quot; nomenclature, but I agree that carefully cataloging everything, but never using it is just another form of navel-gazing.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How to Fix Your Context</title>
      <link href="https://metaist.com/blog/2025/06/how-to-fix-your-context.html"/>
      <id>tag:metaist.com,2010:blog.post-914a03504513af80808b9bdb03e0576781126777</id>
      <published>Mon Jun 30 2025 22:30:49 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:30:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html&quot;&gt;How to Fix Your Context&lt;/a&gt; (Drew Breunig; via &lt;a href=&quot;https://simonwillison.net/2025/Jun/29/how-to-fix-your-context/&quot;&gt;Simon Willison&lt;/a&gt;). Drew is coining lots of little phrases around the problems of LLM context (even in huge 1M context windows). Better yet, he&#39;s describing how to fix those problems.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Your Review: Alpha School</title>
      <link href="https://metaist.com/blog/2025/06/your-review-alpha-school.html"/>
      <id>tag:metaist.com,2010:blog.post-ffa9ceb9eaa29d233928f7019cf722869e6d7318</id>
      <published>Mon Jun 30 2025 22:28:49 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:28:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.astralcodexten.com/p/your-review-alpha-school&quot;&gt;Your Review: Alpha School&lt;/a&gt; (Edward Nevraumont / ACX). This is the most detail I&#39;ve gotten about Alpha School since I heard about them a few years ago. This review actually immediately changed my perspective on what I could have my son accomplish over the summer and we started implementing it yesterday. Let&#39;s see how this goes.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Sam Altman on Founder Secrecy: No One Cares</title>
      <link href="https://metaist.com/blog/2025/06/sam-altman-on-founder-secrecy.html"/>
      <id>tag:metaist.com,2010:blog.post-30c079665bf446408d0f958856fe98adad650605</id>
      <published>Mon Jun 30 2025 22:26:36 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:26:36 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/StartupArchive_/status/1938203112314937489&quot;&gt;Sam Altman on Founder Secrecy: No One Cares&lt;/a&gt; (Sam Altman). &amp;quot;No matter how great your idea is, no one cares.&amp;quot; I see this a lot.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Maybe you’re not Actually Trying</title>
      <link href="https://metaist.com/blog/2025/06/maybe-youre-not-actually-trying.html"/>
      <id>tag:metaist.com,2010:blog.post-5e9a0b932dd62144601457a2afb894d4208a6be6</id>
      <published>Mon Jun 30 2025 22:24:39 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:24:39 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://usefulfictions.substack.com/p/maybe-youre-not-actually-trying&quot;&gt;Maybe you’re not Actually Trying&lt;/a&gt; (Cate Hall / Useful Fictions; via &lt;a href=&quot;https://www.thinking-about-things.com/&quot;&gt;Thinking About Things&lt;/a&gt;). But actual reasons why you might not be trying.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI to the Rescue</title>
      <link href="https://metaist.com/blog/2025/06/ai-to-the-rescue.html"/>
      <id>tag:metaist.com,2010:blog.post-65d8933ecf1a6086fe5b32f0e37f1cac76c90312</id>
      <published>Mon Jun 30 2025 22:18:27 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:18:27 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.chronicle.com/special-projects/the-different-voices-of-student-success/ai-to-the-rescue&quot;&gt;AI to the Rescue&lt;/a&gt; (Beth McMurtrie / The Chronicle of Higher Education; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). Strong students ask questions; weaker students try to avoid asking questions.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Face it: you&#39;re a crazy person</title>
      <link href="https://metaist.com/blog/2025/06/face-it-youre-a-crazy-person.html"/>
      <id>tag:metaist.com,2010:blog.post-0d908261924f65d7caa3dc9b3ac4ccd1fc112f1f</id>
      <published>Mon Jun 30 2025 22:16:02 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:16:02 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.experimental-history.com/p/face-it-youre-a-crazy-person&quot;&gt;Face it: you&#39;re a crazy person&lt;/a&gt; (Adam Mastroianni / Experimental History). Unpacking a job into what it actually entails is a thing I actually enjoy doing.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Real Reasons Your Appliances Die Young</title>
      <link href="https://metaist.com/blog/2025/06/modern-appliances-short-lifespan.html"/>
      <id>tag:metaist.com,2010:blog.post-57b340dea8fb37d81b29d40744f721baaadc5cd7</id>
      <published>Mon Jun 30 2025 22:14:26 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:14:26 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.nytimes.com/wirecutter/reviews/modern-appliances-short-lifespan/&quot;&gt;The Real Reasons Your Appliances Die Young&lt;/a&gt; (Rachel Wharton / Wirecutter). Did you have &amp;quot;It&#39;s Complicated!&amp;quot; on your bingo card?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How not to lose your job to AI</title>
      <link href="https://metaist.com/blog/2025/06/skills-ai-makes-valuable.html"/>
      <id>tag:metaist.com,2010:blog.post-aec054d8f4d97f43bbff8797526c2dfe80e3abb1</id>
      <published>Mon Jun 30 2025 22:12:51 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:12:51 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://80000hours.org/agi/guide/skills-ai-makes-valuable/&quot;&gt;How not to lose your job to AI&lt;/a&gt; (Benjamin Todd / 80,000 Hours). We&#39;re all managing someone&#39;s context now.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Writing Toy Software Is A Joy</title>
      <link href="https://metaist.com/blog/2025/06/software-is-joy.html"/>
      <id>tag:metaist.com,2010:blog.post-7c2b8a6f96cc6e348c72189196fee8377f5bf2a1</id>
      <published>Mon Jun 30 2025 22:08:50 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:08:50 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://blog.jsbarretto.com/post/software-is-joy&quot;&gt;Writing Toy Software Is A Joy&lt;/a&gt; (Joshua Barretto). Nice eclectic set of examples.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Running &quot;Running a Bootcamp&quot; Bootcamp</title>
      <link href="https://metaist.com/blog/2025/06/running-running-a-bootcamp-bootcamp.html"/>
      <id>tag:metaist.com,2010:blog.post-b8ab9735713fd042c73f9f92bc6532a6ad6a5479</id>
      <published>Mon Jun 30 2025 22:06:17 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:06:17 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://bayesshammai.substack.com/p/running-running-a-bootcamp-bootcamp&quot;&gt;Running &amp;quot;Running a Bootcamp&amp;quot; Bootcamp&lt;/a&gt; (Ricki Heicklen). Teaching teacher-teachers how to teach teachers to teach.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Going to an office and pretending to work: A business that’s booming in China</title>
      <link href="https://metaist.com/blog/2025/06/going-to-an-office-and-pretending-to-work-a-business-thats-booming-in-china.html"/>
      <id>tag:metaist.com,2010:blog.post-9c63f41530232209515016c16a10cd2e18f63c42</id>
      <published>Mon Jun 30 2025 22:03:25 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:03:25 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://english.elpais.com/international/2025-05-31/going-to-an-office-and-pretending-to-work-a-business-thats-booming-in-china.html&quot;&gt;Going to an office and pretending to work: A business that’s booming in China&lt;/a&gt; (Inma Bonet / El Pais; via &lt;a href=&quot;https://marginalrevolution.com/marginalrevolution/2025/06/china-markets-in-everything-7.html&quot;&gt;Tyler Cowen&lt;/a&gt;). It&#39;s a role-playing co-working space.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How I Built A Task Management Tool For Almost Nothing</title>
      <link href="https://metaist.com/blog/2025/06/how-i-built-a-task-management-tool-for-almost-nothing.html"/>
      <id>tag:metaist.com,2010:blog.post-c2c6836f8c96c52615163b46db94524efd462e68</id>
      <published>Mon Jun 30 2025 22:01:09 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 22:01:09 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.techdirt.com/2025/06/03/how-i-built-a-task-management-tool-for-almost-nothing/&quot;&gt;How I Built A Task Management Tool For Almost Nothing&lt;/a&gt; (Mike Masnick / TechDirt). We&#39;re entering an age of bespoke tools. Mike is a power user who had very little programming experience, but a clear vision for what he wants.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Consider Knitting</title>
      <link href="https://metaist.com/blog/2025/06/consider-knitting.html"/>
      <id>tag:metaist.com,2010:blog.post-006e102f7b7ff9db3d0d5fff90e60af92c84f05a</id>
      <published>Mon Jun 30 2025 21:55:18 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 30 2025 21:55:18 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://journal.stuffwithstuff.com/2025/05/30/consider-knitting/&quot;&gt;Consider Knitting&lt;/a&gt; (Bob Nystrom). Not sure I&#39;m going to start knitting, but Bob makes a pretty good case for it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Holacracy: The New Management System for a Rapidly Changing World</title>
      <link href="https://metaist.com/blog/2025/05/holacracy.html"/>
      <id>tag:metaist.com,2010:blog.post-8e8ae8e0f6c6c056a340592a42ad98e02377e562</id>
      <published>Sat May 31 2025 22:31:41 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 22:31:41 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Holacracy-Management-System-Rapidly-Changing-ebook/dp/B00PF6QM6K&quot;&gt;Holacracy: The New Management System for a Rapidly Changing World&lt;/a&gt; by Brian J. Robertson (2015). If you wait a decade to read a book, you&#39;ll discover that all the major early adopters (Medium, Zappos) have already abandoned this newfangled philosophy.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Great Z&#39;manim Debate: The History, The Science, And The Lomdus</title>
      <link href="https://metaist.com/blog/2025/05/the-great-zmanim-debate.html"/>
      <id>tag:metaist.com,2010:blog.post-9d9db9a3f21f276a02faabdf8dda58355faff32a</id>
      <published>Sat May 31 2025 22:28:45 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 22:28:45 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Great-Zmanim-Debate-History-Science/dp/1957579129&quot;&gt;The Great Z&#39;manim Debate: The History, The Science, And The Lomdus&lt;/a&gt; by Rabbi Ahron Notis (2022; via &lt;strong&gt;Harold Zazula&lt;/strong&gt;). Solid introduction to the relevant astronomical terms and older and more modern astronomical models. Good discussion of the relevant halachot.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Halakhic Positions of Rabbi Joseph B. Soloveitchik: Volume 8</title>
      <link href="https://metaist.com/blog/2025/05/halachic-positions-of-rabbi-joseph-b-soloveitchik-volume-8.html"/>
      <id>tag:metaist.com,2010:blog.post-4a5e1fa54e51b2fa3603d3e3b0239505dc907247</id>
      <published>Sat May 31 2025 22:25:53 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 22:25:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Halakhic-Positions-Rabbi-Joseph-Soloveitchik/dp/1602804087&quot;&gt;Halakhic Positions of Rabbi Joseph B. Soloveitchik: Volume 8&lt;/a&gt; by Aharon Ziegler (2020). Only two more to go until I finish the series.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Outlive: The Science and Art of Longevity</title>
      <link href="https://metaist.com/blog/2025/05/outlive-the-science-and-art-of-longevity.html"/>
      <id>tag:metaist.com,2010:blog.post-8850925db9a9598b74b89fd11dcf8c18928746ee</id>
      <published>Sat May 31 2025 22:21:56 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 22:21:56 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Outlive-Science-Longevity-Peter-Attia-ebook/dp/B0B1BTJLJN&quot;&gt;Outlive: The Science and Art of Longevity&lt;/a&gt; by Peter Attia &amp;amp; Bill Gifford (2023; via &lt;strong&gt;Isaac Selya&lt;/strong&gt;). Assuming you want to have certain kinds of mobility when you&#39;re older, this book helps you work backwards to where you want to be today.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Education of an Idealist: A Memoir</title>
      <link href="https://metaist.com/blog/2025/05/education-of-an-idealist.html"/>
      <id>tag:metaist.com,2010:blog.post-42235985148c1cebb87377e582cc3c302b265ce2</id>
      <published>Sat May 31 2025 22:16:42 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 22:16:42 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/dp/0062820702&quot;&gt;The Education of an Idealist: A Memoir&lt;/a&gt; by Samantha Power (2019; via Tyler Cowen).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some may interpret this book’s title as suggesting that I began with lofty dreams about how one person could make a difference, only to be “educated” by the brutish forces that I encountered. That is not the story that follows.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I mean, that&#39;s kinda what happens. She learns very quickly how to say the right things to get the things she wants.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The E-Myth Revisited: Why Most Small Businesses Don&#39;t Work and What to Do About It</title>
      <link href="https://metaist.com/blog/2025/05/e-myth-revisited.html"/>
      <id>tag:metaist.com,2010:blog.post-244616da32d26126c854bd565983e5090bb49669</id>
      <published>Sat May 31 2025 22:11:25 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 22:11:25 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Myth-Revisited-Small-Businesses-About-ebook/dp/B000RO9VJK&quot;&gt;The E-Myth Revisited: Why Most Small Businesses Don&#39;t Work and What to Do About It&lt;/a&gt; by Michael E. Gerber (2009; via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). Inside you there are three wolves. The Technician just wants to do good work and thinks bottom up. The Entrepreneur looks ahead and thinks top down. The manager wants everything in a little box and hates change.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Inside the AI boom that&#39;s transforming how consultants work at McKinsey, BCG, and Deloitte</title>
      <link href="https://metaist.com/blog/2025/05/consulting-ai-mckinsey-bcg-deloitte-pwc-kpmg-chatbots-ai-tools.html"/>
      <id>tag:metaist.com,2010:blog.post-42dcbab07f695783bbc216169ea6e7802be5b38d</id>
      <published>Sat May 31 2025 22:00:55 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 22:00:55 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.businessinsider.com/consulting-ai-mckinsey-bcg-deloitte-pwc-kpmg-chatbots-ai-tools-2025-4&quot;&gt;Inside the AI boom that&#39;s transforming how consultants work at McKinsey, BCG, and Deloitte&lt;/a&gt; (Lakshmi Varanasi / Business Insider; via &lt;strong&gt;Moshe Kinderlehrer&lt;/strong&gt;). I wonder how long this policy will last:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;McKinsey consultants have access to ChatGPT with guardrails and cannot input client data into it.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>DOGE Days</title>
      <link href="https://metaist.com/blog/2025/05/doge.html"/>
      <id>tag:metaist.com,2010:blog.post-ed8a4ec592b363eb4ea58f7c20ef25501a77fd54</id>
      <published>Sat May 31 2025 21:57:27 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 21:57:27 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://sahillavingia.com/doge&quot;&gt;DOGE Days&lt;/a&gt; (Sahil Lavingia; via &lt;a href=&quot;https://marginalrevolution.com/marginalrevolution/2025/05/a-report-from-inside-doge.html&quot;&gt;Tyler Cowen&lt;/a&gt;). In which Sahil discovers, like many before him, that you may have aspirations to write wonderful code to help the government, but you will be thwarted every step of the way.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Saying Bye to Glitch</title>
      <link href="https://metaist.com/blog/2025/05/bye-glitch.html"/>
      <id>tag:metaist.com,2010:blog.post-611081ab69fa93c589b929d5b314b62ee21c7dac</id>
      <published>Sat May 31 2025 21:53:24 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 21:53:24 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://pketh.org/bye-glitch.html&quot;&gt;Saying Bye to Glitch&lt;/a&gt; (Pirijan Keth; via &lt;a href=&quot;https://simonwillison.net/2025/May/29/saying-bye-to-glitch/&quot;&gt;Simon Willison&lt;/a&gt;). I never used Glitch, but I remember when it was announced and thinking that it was very cool. Pirijan also describes how various FogCreek software was ahead of its time.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Thoughts on thinking</title>
      <link href="https://metaist.com/blog/2025/05/thinking.html"/>
      <id>tag:metaist.com,2010:blog.post-8fcec95b29a4ae2daf81e9ec54cdcb2a9f6bf35f</id>
      <published>Sat May 31 2025 21:51:48 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 21:51:48 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://dcurt.is/thinking&quot;&gt;Thoughts on thinking&lt;/a&gt; (Dustin Curtis). As the nature of work transitions, I expect to see lots of posts of this nature.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How I taught my 3-year-old to read like a 9-year-old</title>
      <link href="https://metaist.com/blog/2025/05/how-i-taught-my-3-year-old-to-read.html"/>
      <id>tag:metaist.com,2010:blog.post-5e3a139baf292a0b37fd5b842de13ec0680d9e29</id>
      <published>Sat May 31 2025 21:48:54 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 21:48:54 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theintrinsicperspective.com/p/how-i-taught-my-3-year-old-to-read&quot;&gt;How I taught my 3-year-old to read like a 9-year-old&lt;/a&gt; (Erik Hoel / The Intrinsic Perspective).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s all the advantages of an iPad, none of the guilt. You’ve unlocked infinite self-entertainment. Long drive? Bring a book. Or five. Roman toddles into restaurants clutching a book as a backup activity, and reads while waiting in boring lines. It’s also calming, and so helps with emotional regulation. Toddler energy descending rapidly into deviance? Go read a book! It’s a parenting cheat code. I don’t know if this alone justifies the hours spent, but it sure is one heck of a benefit.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>I really don’t like ChatGPT’s new memory dossier</title>
      <link href="https://metaist.com/blog/2025/05/chatgpt-new-memory.html"/>
      <id>tag:metaist.com,2010:blog.post-f9ef9e7f4f8cdcba45448f5ca447f22bade99596</id>
      <published>Sat May 31 2025 21:46:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat May 31 2025 21:46:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2025/May/21/chatgpt-new-memory/&quot;&gt;I really don’t like ChatGPT’s new memory dossier&lt;/a&gt; (Simon Willison). It&#39;s pretty detailed.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>LLM Memory</title>
      <link href="https://metaist.com/blog/2025/05/llm-memory.html"/>
      <id>tag:metaist.com,2010:blog.post-2905f9b51206ebe33bd8a6771c5aac3efb71227b</id>
      <published>Wed May 21 2025 19:35:02 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 21 2025 19:35:02 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://grantslatton.com/llm-memory&quot;&gt;LLM Memory&lt;/a&gt; (Grant Slatton). I like mini taxonomy of approaches to memory. I think this shows us that we don&#39;t yet have a really good model for our own memory.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Price of Remission</title>
      <link href="https://metaist.com/blog/2025/05/revlimid-price-cancer-celgene-drugs-fda-multiple-myeloma.html"/>
      <id>tag:metaist.com,2010:blog.post-d17964d21f88f604ff97d32068b8192abc455f07</id>
      <published>Wed May 21 2025 19:31:42 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 21 2025 19:31:42 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.propublica.org/article/revlimid-price-cancer-celgene-drugs-fda-multiple-myeloma&quot;&gt;The Price of Remission&lt;/a&gt; (David Armstrong / ProPublica).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When I started taking the drug, I’d look at the smooth, cylindrical capsule
in my hand and consider the fact I was about to swallow something that costs
about the same as a new iPhone. A month’s supply, which arrives in an
ordinary, orange-tinged plastic bottle, is the same price as a new Nissan Versa.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Book Review: Selfish Reasons To Have More Kids</title>
      <link href="https://metaist.com/blog/2025/05/book-review-selfish-reasons-to-have-more-kids.html"/>
      <id>tag:metaist.com,2010:blog.post-e90183e65c5e6feee2f5d63a014892539f782891</id>
      <published>Wed May 21 2025 19:20:22 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 21 2025 19:20:22 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.astralcodexten.com/p/book-review-selfish-reasons-to-have&quot;&gt;Book Review: Selfish Reasons To Have More Kids&lt;/a&gt; (Scott Alexander / Astral Codex Ten). &amp;quot;Have you tried doing less?&amp;quot; is often a good question. I don&#39;t think I&#39;ve been able to implement the advice (at all?).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI-Generated Law</title>
      <link href="https://metaist.com/blog/2025/05/ai-generated-law.html"/>
      <id>tag:metaist.com,2010:blog.post-8df34fb52d98ce8f508bcee23907441278b13da0</id>
      <published>Wed May 21 2025 19:13:10 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 21 2025 19:13:10 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.schneier.com/blog/archives/2025/05/ai-generated-law.html&quot;&gt;AI-Generated Law&lt;/a&gt; (Bruce Schneier). Soon: AI laws on the limits of AI laws.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>I don&#39;t like NumPy</title>
      <link href="https://metaist.com/blog/2025/05/numpy.html"/>
      <id>tag:metaist.com,2010:blog.post-e6aec4278a7d1c6d13fa746de752f1992702493f</id>
      <published>Wed May 21 2025 19:00:51 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 21 2025 19:00:51 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://dynomight.net/numpy/&quot;&gt;I don&#39;t like NumPy&lt;/a&gt; (Dynomight). This one is for everyone who has ever had to try &lt;code&gt;axis=0&lt;/code&gt; when doing an operation in &lt;code&gt;numpy&lt;/code&gt;. The points about indexing and broadcasting hit home hard. I&#39;m looking forward to the API proposals.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>castfit 0.1.2</title>
      <link href="https://metaist.com/blog/2025/05/castfit-0.1.2.html"/>
      <id>tag:metaist.com,2010:blog.post-a5115ca6a59dda6ef1f792a28881dd081b9b744f</id>
      <published>Wed May 21 2025 18:52:41 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 21 2025 18:52:41 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/castfit/releases/tag/0.1.2&quot;&gt;&lt;code&gt;castfit 0.1.2&lt;/code&gt;&lt;/a&gt; is available. &lt;a href=&quot;https://metaist.com/blog/2025/04/castfit-code-review.html&quot;&gt;I previously asked both Gemini 2.5 Pro and ChatGPT o3&lt;/a&gt; to review my previous release and provide suggestions. While implementing those suggestions I ended up simplifying several things and making certain interfaces more consistent.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;castfit&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# modern (recommended)&lt;/span&gt;
uv &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; castfit

&lt;span class=&quot;token comment&quot;&gt;# classic&lt;/span&gt;
python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; castfit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/castfit&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;release-notes-0-1-2-2025-05-21t20-54-51z&quot; tabindex=&quot;-1&quot;&gt;Release Notes &lt;a href=&quot;https://github.com/metaist/castfit/compare/0.1.1...0.1.2&quot;&gt;0.1.2&lt;/a&gt; - 2025-05-21T20:54:51Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/05/castfit-0.1.2.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/4&quot;&gt;#4&lt;/a&gt;: &lt;code&gt;get_args&lt;/code&gt; on raw types&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/5&quot;&gt;#5&lt;/a&gt;: &lt;code&gt;to_tuple&lt;/code&gt; with too-long input&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/18&quot;&gt;#18&lt;/a&gt;: handling of &lt;code&gt;types.UnionType&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/25&quot;&gt;#25&lt;/a&gt;: delinted using &lt;code&gt;pyrefly&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/27&quot;&gt;#27&lt;/a&gt;: &lt;code&gt;str&lt;/code&gt; to &lt;code&gt;int&lt;/code&gt; conversion when the string has decimal places&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/28&quot;&gt;#28&lt;/a&gt;: &lt;code&gt;float&lt;/code&gt; to &lt;code&gt;datetime&lt;/code&gt; conversion; added UTC timezone&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/29&quot;&gt;#29&lt;/a&gt;: handling an untyped default value in a class&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/14&quot;&gt;#14&lt;/a&gt;: &lt;code&gt;TypeForm&lt;/code&gt; comment to clarify what we want&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/19&quot;&gt;#19&lt;/a&gt;: set instance fields based on class metadata rather than tried to put all the data into the instance&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/22&quot;&gt;#22&lt;/a&gt;: register converters based on both source and destination types rather than assuming that each function must convert everything to a specific destination type&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/24&quot;&gt;#24&lt;/a&gt;: renamed &lt;code&gt;casts_to&lt;/code&gt; to &lt;code&gt;casts&lt;/code&gt; and added support for short-form (1 argument) cast function&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/30&quot;&gt;#30&lt;/a&gt;: updated the public API to be more compact and consistent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/2&quot;&gt;#2&lt;/a&gt;: support for nested types&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/3&quot;&gt;#3&lt;/a&gt;: original cause of &lt;code&gt;to_type&lt;/code&gt; error&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/6&quot;&gt;#6&lt;/a&gt;: additional &lt;code&gt;datetime&lt;/code&gt; formats&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/7&quot;&gt;#7&lt;/a&gt;: custom casts to &lt;code&gt;castfit&lt;/code&gt; (closes #7)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/11&quot;&gt;#11&lt;/a&gt;: more README examples&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/12&quot;&gt;#12&lt;/a&gt;: more complete docstrings for the public API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/15&quot;&gt;#15&lt;/a&gt;: cache for fetching &lt;code&gt;get_origin&lt;/code&gt; and &lt;code&gt;get_args&lt;/code&gt; information&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/16&quot;&gt;#16&lt;/a&gt;: &lt;code&gt;DEFAULT_ENCODING&lt;/code&gt; constant for &lt;code&gt;to_bytes&lt;/code&gt; and &lt;code&gt;to_str&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/17&quot;&gt;#17&lt;/a&gt;: alternatives to README&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/20&quot;&gt;#20&lt;/a&gt;: infer types based on class field defaults&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/31&quot;&gt;#31&lt;/a&gt;: more negative tests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/21&quot;&gt;#21&lt;/a&gt;: &lt;code&gt;castfit&lt;/code&gt; on an instance instead of a &lt;code&gt;type&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Won&#39;t Fix&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/8&quot;&gt;#8&lt;/a&gt;: Gemini suggested having an explicit caster for &lt;code&gt;pathlib.Path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/9&quot;&gt;#9&lt;/a&gt;: Gemini suggested having an explicit recursive dataclass/class casting&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/10&quot;&gt;#10&lt;/a&gt;: Gemini suggested optionally collecting errors instead of raising the first one encountered. It&#39;s a good idea, but not for now.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/13&quot;&gt;#13&lt;/a&gt;: Tried implementing a workaround for &lt;code&gt;TypeGuard&lt;/code&gt; in older versions of python, but it didn&#39;t work.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/23&quot;&gt;#23&lt;/a&gt;: Started and rolled back &lt;code&gt;is_callable&lt;/code&gt; because &lt;code&gt;castfit&lt;/code&gt; can&#39;t currently do anything with a callable that is the wrong type.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/26&quot;&gt;#26&lt;/a&gt;: Rolled back having a &lt;code&gt;checks&lt;/code&gt; parameter that overrides how types are checked.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/32&quot;&gt;#32&lt;/a&gt;: Tried fixing &lt;code&gt;TypeForm&lt;/code&gt; to be the union of &lt;code&gt;type[T]&lt;/code&gt; and &lt;code&gt;_SpecialForm&lt;/code&gt;, but only &lt;code&gt;pyright&lt;/code&gt; was able to handle it. &lt;code&gt;mypy&lt;/code&gt; still can&#39;t handle it and &lt;code&gt;ty&lt;/code&gt; isn&#39;t mature enough yet.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>TIL: invariant, covariant, and contravariant type variables</title>
      <link href="https://metaist.com/blog/2025/05/til-typevar.html"/>
      <id>tag:metaist.com,2010:blog.post-979c1ac39621f677865485998d36d4b9ecd0d117</id>
      <published>Fri May 16 2025 12:36:32 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 12:36:32 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;While working on &lt;a href=&quot;https://metaist.com/blog/tag/castfit/&quot;&gt;&lt;code&gt;castfit&lt;/code&gt;&lt;/a&gt;, I ended up going down a rabbit hole learning about what makes something a subtype of something else. I vaguely knew the terms &amp;quot;invariant&amp;quot;, &amp;quot;covariant&amp;quot;, and &amp;quot;contravariant&amp;quot;, but have very carefully avoided ever learning what they meant.&lt;/p&gt;
&lt;p&gt;If you look at the Wikipedia entry on &lt;a href=&quot;https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)&quot;&gt;Covariance and contravariance (computer science)&lt;/a&gt; you see explanations like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Suppose &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; are types, and &lt;code&gt;I&amp;lt;U&amp;gt;&lt;/code&gt; denotes application of a &lt;a href=&quot;https://en.wikipedia.org/wiki/Type_constructor&quot; title=&quot;Type constructor&quot;&gt;type constructor&lt;/a&gt; &lt;code&gt;I&lt;/code&gt; with type argument &lt;code&gt;U&lt;/code&gt;. Within the &lt;a href=&quot;https://en.wikipedia.org/wiki/Type_system&quot; title=&quot;Type system&quot;&gt;type system&lt;/a&gt; of a programming language, a &lt;a href=&quot;https://en.wikipedia.org/wiki/Typing_rule&quot; title=&quot;Typing rule&quot;&gt;typing rule&lt;/a&gt; for a type constructor &lt;code&gt;I&lt;/code&gt; is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;covariant&lt;/em&gt; if it preserves the &lt;a href=&quot;https://en.wikipedia.org/wiki/Subtyping&quot; title=&quot;Subtyping&quot;&gt;ordering of types (≤)&lt;/a&gt;, which orders types from more specific to more generic: If &lt;code&gt;A ≤ B&lt;/code&gt;, then &lt;code&gt;I&amp;lt;A&amp;gt; ≤ I&amp;lt;B&amp;gt;&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;contravariant&lt;/em&gt; if it reverses this ordering: If &lt;code&gt;A ≤ B&lt;/code&gt;, then &lt;code&gt;I&amp;lt;B&amp;gt; ≤ I&amp;lt;A&amp;gt;&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bivariant&lt;/em&gt; if both of these apply (i.e., if &lt;code&gt;A ≤ B&lt;/code&gt;, then &lt;code&gt;I&amp;lt;A&amp;gt; ≡ I&amp;lt;B&amp;gt;&lt;/code&gt;);&lt;a href=&quot;https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#cite_note-1&quot;&gt;[1]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;variant&lt;/em&gt; if covariant, contravariant or bivariant;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;invariant&lt;/em&gt; or &lt;em&gt;nonvariant&lt;/em&gt; if not variant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Uh, super helpful. The introductory description is a lot better than it used to be, but talking it over with ChatGPT was actually the best way for me to understand what these terms mean.&lt;/p&gt;
&lt;h2 id=&quot;simpler-definitions&quot; tabindex=&quot;-1&quot;&gt;Simpler Definitions &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/05/til-typevar.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Suppose we have a type hierarchy like:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Labrador → Dog → Animal
Siamese  → Cat → Animal&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The arrow indicates an &amp;quot;is a&amp;quot; relationship moving from more specific (narrow) to more general (broad): a Labrador is a type of Dog; a Dog is a type of Animal, etc.&lt;/p&gt;
&lt;p&gt;The question of co/contra/invariance comes up when you want to know: &lt;strong&gt;Can I substitute one type for another?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It turns out that this depends on many things, but the situations are classified as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Invariant&lt;/strong&gt;: It must be this exact type. No broader or narrower substitutions allowed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Covariant&lt;/strong&gt;: The same or broader (more general) type is acceptable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contravariant&lt;/strong&gt;: The same or narrower (more specific) type is acceptable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bivariant&lt;/strong&gt; (haven&#39;t seen this in Python): The same, broader, or narrower type is acceptable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This mostly comes into play when you start looking at containers of objects like &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;set&lt;/code&gt;, &lt;code&gt;tuple&lt;/code&gt;, &lt;code&gt;dict&lt;/code&gt;, etc. Also Python has several exceptions to its own rules that are not immediately obvious.&lt;/p&gt;
&lt;h2 id=&quot;general-python-rules&quot; tabindex=&quot;-1&quot;&gt;General Python Rules &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/05/til-typevar.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The contents of &lt;em&gt;mutable&lt;/em&gt; containers are &lt;em&gt;invariant&lt;/em&gt;&lt;/strong&gt;. For example, if a function takes &lt;code&gt;list[Animal]&lt;/code&gt;, you cannot pass &lt;code&gt;list[Dog]&lt;/code&gt; because that function might add a &lt;code&gt;Cat&lt;/code&gt; (which is an &lt;code&gt;Animal&lt;/code&gt;) there by violating the type safety of &lt;code&gt;list[Dog]&lt;/code&gt; that was passed in.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An exception to this rule in Python is when &amp;quot;implicit conversion&amp;quot; occurs. A function that takes &lt;code&gt;list[int]&lt;/code&gt; is ok to take &lt;code&gt;list[bool]&lt;/code&gt; because there is an implicit conversion that happens. It seems that the &lt;a href=&quot;https://peps.python.org/pep-0484/#the-numeric-tower&quot;&gt;numeric tower&lt;/a&gt; of &lt;code&gt;bool → int → float → complex&lt;/code&gt; all happens implicitly. There are a few other implicit conversions that I&#39;m still learning about.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;The contents of &lt;em&gt;immutable&lt;/em&gt; containers (or read-only situations) are &lt;em&gt;covariant&lt;/em&gt;&lt;/strong&gt;. A function that takes &lt;code&gt;Sequence[Animal]&lt;/code&gt; is ok to take &lt;code&gt;Sequence[Dog]&lt;/code&gt; because &lt;code&gt;Sequence&lt;/code&gt; is read-only (and &lt;code&gt;Animal&lt;/code&gt; is broader than &lt;code&gt;Dog&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Not really an exception, but fun fact: &lt;em&gt;fixed-length&lt;/em&gt; &lt;code&gt;tuple&lt;/code&gt; are &lt;strong&gt;covariant&lt;/strong&gt;, while &lt;em&gt;variable-length&lt;/em&gt; tuples are &lt;strong&gt;invariant&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0483/&quot;&gt;PEP 483&lt;/a&gt; has a nice example of &lt;strong&gt;contravariant&lt;/strong&gt; types: &lt;code&gt;Callable&lt;/code&gt;. While it is &lt;strong&gt;covariant&lt;/strong&gt; in its return type (&lt;code&gt;Callable[[], Dog]&lt;/code&gt; is a subtype of &lt;code&gt;Callable[[], Animal]&lt;/code&gt;), it is &lt;strong&gt;contravariant&lt;/strong&gt; in its arguments (&lt;code&gt;Callable[[Animal], None]&lt;/code&gt; &lt;strong&gt;is a subtype&lt;/strong&gt; of &lt;code&gt;Callable[[Dog], None]&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This leads to a good rule of thumb:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The example with &lt;code&gt;Callable&lt;/code&gt; shows how to make more precise type annotations for functions: choose the most general type for every argument, and the most specific type for the return value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It looks like &lt;a href=&quot;https://peps.python.org/pep-0695/&quot;&gt;PEP 695&lt;/a&gt; made it into Python 3.12, so maybe reasoning about this will get easier in the future especially because it &lt;a href=&quot;https://peps.python.org/pep-0695/#variance-inference&quot;&gt;automatically infers the variance&lt;/a&gt; of the type variables.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Trying pyrefly, Meta&#39;s type checker</title>
      <link href="https://metaist.com/blog/2025/05/trying-pyrefly.html"/>
      <id>tag:metaist.com,2010:blog.post-f23984c4199ef65ec20879a7479dc8d985a9ccf7</id>
      <published>Fri May 16 2025 12:08:15 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 12:08:15 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://engineering.fb.com/2025/05/15/developer-tools/introducing-pyrefly-a-new-type-checker-and-ide-experience-for-python/&quot;&gt;Meta announced that they are open sourcing their type checker, &lt;code&gt;pyrefly&lt;/code&gt;&lt;/a&gt;. It was easy enough to try:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;uvx pyrefly check&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On my tiny 640 lines of &lt;code&gt;castfit&lt;/code&gt; (which passes &lt;code&gt;pyright&lt;/code&gt; and &lt;code&gt;mypy --strict&lt;/code&gt;) I got 74 errors. Going through some of these was instructive.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;==&lt;/code&gt; is not supported between &lt;code&gt;type[@_]&lt;/code&gt; and &lt;code&gt;type[MyList]&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was in response to code like:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;assert&lt;/span&gt; castfit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_origin_type&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;MyList&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; MyList&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Good catch. That &lt;code&gt;==&lt;/code&gt; should &lt;code&gt;is&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can&#39;t apply arguments to non-class, got &lt;code&gt;LegacyImplicitTypeAlias[TypeForm, type[type[TypeVar(T, invariant)] | Any]]&lt;/code&gt; [bad-specialization]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not sure what this means or how to handle it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Argument &lt;code&gt;Forall[T, (value: Any, kind: Unknown) -&amp;gt; bool]&lt;/code&gt; is not assignable to parameter with type &lt;code&gt;(Any, Unknown) -&amp;gt; bool&lt;/code&gt; [bad-argument-type]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Imagine my confusion when I&#39;m trying to figure out why this is not assignable. Must be that &lt;code&gt;Unknown&lt;/code&gt; can&#39;t be assigned to &lt;code&gt;Unknown&lt;/code&gt;. I might try this again in the future, but the error messages could definitely use some work.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Tom Johnson on AI-assisted Programming</title>
      <link href="https://metaist.com/blog/2025/05/tom-johnson-on-ai-assisted-programming.html"/>
      <id>tag:metaist.com,2010:blog.post-b56e14ce6bc960bd2f596ede4d95e0d927c9ccfe</id>
      <published>Fri May 16 2025 12:04:01 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 12:04:01 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/tj_astro/status/1922966702368657507&quot;&gt;Tom Johnson on AI-assisted Programming&lt;/a&gt; (Tom Johnson).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I just spent a week using Cursor and PyCharm&#39;s AI [Assistant], The goal was to take a CLI-based Python script and add a basic front end UI. By the end of the day yesterday, I felt like chewing aluminum foil would be more fun ...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Recommend reading the whole thread. There are ways I imagine asking the AI differently, but I completely get the pain being described.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>New paradigm for psychology just dropped</title>
      <link href="https://metaist.com/blog/2025/05/new-pardigm-for-psychology-just-dropped.html"/>
      <id>tag:metaist.com,2010:blog.post-281ad3de406d76206d184e6ac7f425249756b7c1</id>
      <published>Fri May 16 2025 11:51:35 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:51:35 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.experimental-history.com/p/new-paradigm-for-psychology-just&quot;&gt;New paradigm for psychology just dropped&lt;/a&gt; (Adam Mastroianni). I queued up the &lt;a href=&quot;http://www.mindinthewheel.com/&quot;&gt;The Mind in the Wheel&lt;/a&gt; by Slime Mold Time Mold, but haven&#39;t read it yet. Adam&#39;s point is that a paradigm has to explain which things do what and what rules they follow.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So let’s get clear: a paradigm is made out of units and rules. It says, “the part of the world I’m studying is made up of these entities, which can do these activities.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He lays out three different kinds of research:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Naive research&lt;/strong&gt;: run experiments without knowing anything about the units and rules.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Impressionistic research&lt;/strong&gt;: make up words and study them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;The problem with this approach is that it gets you tangled up in things that don’t actually exist. What is “zest for life”? It is literally “how you respond to the Zest for Life Scale”. And what does the Zest for Life Scale measure? It measures...zest for life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;Actual science research&lt;/strong&gt; (my name): doing experiments where you can actually learn about the units and rules.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;We’re not doing impressionistic research here, so we can’t just create control systems by fiat, the way you can create “zest for life” by creating a Zest for Life Scale. Instead, discovering the drives requires a new set of methodologies. You might start by noticing that people seem inexplicably driven to do some things (like play Candy Crush) or inexplicably not driven to do other things (like drink lemon juice when they’re suffering from scurvy, even though it would save their life). This could give you an inkling of what kind of drives exist. Then you could try to isolate one of those drives through methods like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prevention&lt;/strong&gt;: If you stop someone from playing Candy Crush, what do they do instead?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knockout&lt;/strong&gt;: If you turn off the elements of Candy Crush one at a time—make it black and white, eliminate the scoring system, etc.—at what point do they no longer want to play?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behavioral exhaustion (knockout in reverse)&lt;/strong&gt;: If you give people one component of Candy Crush at a time—maybe, categorizing things, earning points, seeing lots of colors, etc.—and let them do that as much as they want, do they still want to play Candy Crush afterward?&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Adam also covers why neuroscience is the wrong level of abstraction for learning the things we need to learn.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>7 Phrases I use to make giving feedback easier for myself</title>
      <link href="https://metaist.com/blog/2025/05/7-phrases-i-use-when-giving-feedback.html"/>
      <id>tag:metaist.com,2010:blog.post-83ed9d588047d66443419eca3fde2dcf6180d950</id>
      <published>Fri May 16 2025 11:42:05 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:42:05 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://newsletter.weskao.com/p/7-phrases-i-use-when-giving-feedback&quot;&gt;7 Phrases I use to make giving feedback easier for myself&lt;/a&gt; (Wes Kao). &amp;quot;I noticed&amp;quot; that &amp;quot;this is a great start&amp;quot; for giving feedback in a modern environment. &amp;quot;At the same time&amp;quot; going forward you could sound &amp;quot;even more&amp;quot; authentic because &amp;quot;I believe you were trying to avoid hard feelings, but it doesn&#39;t quite work because it uses canned phrases. I recommend trying having a conversation.&amp;quot; &amp;quot;From what I&#39;ve seen&amp;quot; canned phrases come across as fake. You&#39;re &amp;quot;already&amp;quot; giving feedback regularly which is fantastic. Now, I&#39;d love for you to have more real conversations where you&#39;re clear about your expectations.&lt;/p&gt;
&lt;p&gt;(Seriously, though, the ideas behind the phrases and examples are extremely realistic.)&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Wrong Way to Motivate Your Kid</title>
      <link href="https://metaist.com/blog/2025/05/parenting-islands-of-competence-kids-motivation.html"/>
      <id>tag:metaist.com,2010:blog.post-b74efe1c1e6528566aa41d6ca2d6daae9d3fbac7</id>
      <published>Fri May 16 2025 11:38:28 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:38:31 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theatlantic.com/family/archive/2025/05/parenting-islands-of-competence-kids-motivation/682739/&quot;&gt;The Wrong Way to Motivate Your Kid&lt;/a&gt; (Russell Shaw / The Atlantic). The advice is to find an &amp;quot;island of competence&amp;quot; and help your kid build up from that. An implication is that we should help kids get competent at more things. Unfortunately, things are trending in the opposite direction.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How to title your blog post or whatever</title>
      <link href="https://metaist.com/blog/2025/05/titles.html"/>
      <id>tag:metaist.com,2010:blog.post-97663b9317063ac2d43ec9f6a9b13f13b3ba1ee7</id>
      <published>Fri May 16 2025 11:33:29 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:33:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://dynomight.net/titles/&quot;&gt;How to title your blog post or whatever&lt;/a&gt; (Dynomight). The advice is to name things in a way that quickly separates the people who&#39;ll love it from the people who hate it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The magic of software; or, what makes a good engineer also makes a good engineering organization</title>
      <link href="https://metaist.com/blog/2025/05/a-good-engineer.html"/>
      <id>tag:metaist.com,2010:blog.post-1c6599dbd67f442ba0833d6782ccb2c4487e8f05</id>
      <published>Fri May 16 2025 11:24:51 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:24:51 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://moxie.org/2024/09/23/a-good-engineer.html&quot;&gt;The magic of software; or, what makes a good engineer also makes a good engineering organization&lt;/a&gt; (Moxie Marlinspike; via &lt;a href=&quot;https://changelog.com/news/144&quot;&gt;Changelog News&lt;/a&gt;). Nice essay about how vision is translated into engineering. Also discusses abstraction layers and how organizations are structured.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, there are two ways of interacting with an abstraction layer: as shorthand for an understanding of what it is doing on your behalf, or as a black box. I think engineers are most capable and most effective when abstraction layers serve as shorthand rather than a black box.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>The Troubling Business of Bounty Hunting</title>
      <link href="https://metaist.com/blog/2025/05/my-time-as-a-bounty-hunter.html"/>
      <id>tag:metaist.com,2010:blog.post-49b7609893425263b02ab5ebc9e84bc17ce0792b</id>
      <published>Fri May 16 2025 11:16:21 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:16:21 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://web.archive.org/web/20190706160131/https://www.gq.com/story/my-time-as-a-bounty-hunter&quot;&gt;The Troubling Business of Bounty Hunting&lt;/a&gt; (Jeff Winkler / The New York Times; via &lt;a href=&quot;https://www.thinking-about-things.com/&quot;&gt;Thinking About Things&lt;/a&gt;). I feel like my mind updated every movie plot that involves someone skipping bail or a bounty hunter to be much more terrifying.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How much information is in DNA?</title>
      <link href="https://metaist.com/blog/2025/05/dna.html"/>
      <id>tag:metaist.com,2010:blog.post-13b99ed724d11673d7d41357c414067dd84c9059</id>
      <published>Fri May 16 2025 11:08:06 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:08:06 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://dynomight.net/about/&quot;&gt;How much information is in DNA?&lt;/a&gt; (Dynomight). I knew about both &lt;a href=&quot;https://en.wikipedia.org/wiki/Kolmogorov_complexity&quot;&gt;Kolmogorov complexity&lt;/a&gt; (smallest program that produces an output) and &lt;a href=&quot;https://en.wikipedia.org/wiki/Information_content&quot;&gt;Shannon information&lt;/a&gt; (probability of a sequence appearing in a large pool of sequences), but this was a cool way of combining the two concepts. Plus the craziness that is biology.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What I&#39;ve learned about writing AI apps so far</title>
      <link href="https://metaist.com/blog/2025/05/what-ive-learned-about-writing-ai-apps-so-far.html"/>
      <id>tag:metaist.com,2010:blog.post-caead135eba2ca3ef3a604cf786da2569398890b</id>
      <published>Fri May 16 2025 11:04:43 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 11:04:43 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://seldo.com/posts/what-ive-learned-about-writing-ai-apps-so-far&quot;&gt;What I&#39;ve learned about writing AI apps so far&lt;/a&gt; (Laurie Voss). Currently, LLMs are good at transforming text into less text. This implies you should give them lots of context (drop the whole manual / book / text) and ask a question.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Getting things &quot;done&quot; in large tech companies</title>
      <link href="https://metaist.com/blog/2025/05/getting-things-done.html"/>
      <id>tag:metaist.com,2010:blog.post-30a52c37a7d68f95cf08f4bb07d7b480dccb8ebd</id>
      <published>Fri May 16 2025 10:56:31 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 16 2025 10:56:31 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.seangoedecke.com/getting-things-done/&quot;&gt;Getting things &amp;quot;done&amp;quot; in large tech companies&lt;/a&gt; (Sean Goedecke). Short post about how to know when a project is done and how to make sure executives know what was done.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI as Normal Technology</title>
      <link href="https://metaist.com/blog/2025/05/ai-as-normal-technology.html"/>
      <id>tag:metaist.com,2010:blog.post-5106c4caccf44b61131851b0acbd1d031c5d3032</id>
      <published>Fri May 09 2025 16:31:55 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri May 09 2025 16:31:55 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://knightcolumbia.org/content/ai-as-normal-technology&quot;&gt;AI as Normal Technology&lt;/a&gt; (Arvind Narayanan &amp;amp; Sayash Kapoor / Knight First Amendment Institute). This is the approach being discussed in &lt;a href=&quot;https://metaist.com/blog/2025/05/does-ai-progress-have-a-speed-limit.html&quot;&gt;Does AI Progress Have a Speed Limit?&lt;/a&gt;. While I don&#39;t have as much evidence to support my intuitive opinion, I do agree that modeling the world (especially in general) is particularly hard.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Trying ty, Astral&#39;s type checker</title>
      <link href="https://metaist.com/blog/2025/05/astral-type-checker.html"/>
      <id>tag:metaist.com,2010:blog.post-57dda7115e44946147d777f5941ff50936af2a73</id>
      <published>Wed May 07 2025 19:08:33 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 07 2025 19:08:33 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Astral has been delivering impressive improvements to the Python ecosystem with &lt;code&gt;ruff&lt;/code&gt;, taking over &lt;code&gt;rye&lt;/code&gt;, and releasing &lt;code&gt;uv&lt;/code&gt; to manage projects and Python installs. And there have been musings about when they&#39;d release a type checker.&lt;/p&gt;
&lt;p&gt;Well the alpha release is now here (via &lt;strong&gt;Patrick Kage&lt;/strong&gt;). You can try it out:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# requires rust to compile&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; https://sh.rustup.rs &lt;span class=&quot;token parameter variable&quot;&gt;-sSf&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;
uv &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; git+https://github.com/astral-sh/ty
uv run ty check&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note: It takes a little bit of time to compile &lt;code&gt;ty&lt;/code&gt;, but like all the other Astral tools it runs very quickly.&lt;/p&gt;
&lt;p&gt;Also: Fair warning, lots of stuff doesn&#39;t work yet. For example, when I tried it on my &lt;code&gt;castfit&lt;/code&gt; library, it choked on &lt;code&gt;dict()&lt;/code&gt; (see &lt;a href=&quot;https://github.com/astral-sh/ty/issues/100&quot;&gt;#100&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;How long before &lt;code&gt;ty&lt;/code&gt; replaces &lt;code&gt;mypy&lt;/code&gt; and &lt;code&gt;pyright&lt;/code&gt; in my build process for all my projects? I&#39;ll probably wait for the official release, but I&#39;ll probably try it at least once on all my projects just to see what it produces.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Dos and don&#39;ts when sunsetting open source projects</title>
      <link href="https://metaist.com/blog/2025/05/sunsetting-open-source-projects.html"/>
      <id>tag:metaist.com,2010:blog.post-d785437d964fe156bb759e2daf6197ac564438a3</id>
      <published>Wed May 07 2025 15:21:35 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 07 2025 15:21:38 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://github.blog/open-source/maintainers/dos-and-donts-when-sunsetting-open-source-projects/&quot;&gt;Dos and don&#39;ts when sunsetting open source projects&lt;/a&gt; (Klint Finley / GitHub Blog). Good advice; I should probably archive a bunch of my older projects.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Project Xanadu: Even More Hindsight</title>
      <link href="https://metaist.com/blog/2025/05/xanadu.html"/>
      <id>tag:metaist.com,2010:blog.post-b8feb86449758d8b5efd01cd949e3e7e14a72a94</id>
      <published>Wed May 07 2025 08:23:56 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 07 2025 08:23:56 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://gwern.net/xanadu&quot;&gt;Project Xanadu: Even More Hindsight&lt;/a&gt; (Gwern Branwen). In &lt;em&gt;Minority Report&lt;/em&gt; they have &amp;quot;futuristic&amp;quot; interfaces where you wave your arms around to manipulate 3D projections. In the real world your arms would get very tired very quickly. &lt;a href=&quot;https://en.wikipedia.org/wiki/Project_Xanadu&quot;&gt;Project Xanadu&lt;/a&gt; tried to create a hypertext environment with lots of guarantees, but Gwern&#39;s realization about the UX is notable:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Oh my god. It’s completely unreadable.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The lines were confusing clutter, especially as they crisscrossed (a perennial problem in sidenotes layout, made far worse by the outlines). None of the ‘sidenotes’ were readable because the screen was so small. Even as you simply scrolled, for many possible settings, you were unable to read anything! How could a document UI where often you could read nothing have ever seemed like a good idea? The UI was just terrible—it could never have worked. Even on a large screen like my 4k monitor, I wouldn’t want that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The lesson?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So, to me, Project Xanadu is a case-study in why designers must mock-up and prototype their designs before too much is invested in them. Xanadu wasn’t the victim of “Worse is Better”; it was just a solution in search of a problem.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Does AI Progress Have a Speed Limit?</title>
      <link href="https://metaist.com/blog/2025/05/does-ai-progress-have-a-speed-limit.html"/>
      <id>tag:metaist.com,2010:blog.post-472275cc9b5bdb59d5415f39011182e21c396adc</id>
      <published>Tue May 06 2025 15:37:31 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 06 2025 15:37:31 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/10/does-ai-progress-have-a-speed-limit&quot;&gt;Does AI Progress Have a Speed Limit?&lt;/a&gt; (Ajeya Cotra &amp;amp; Arvind Narayanan / Asterisk). Very respectful back-and-forth. I&#39;m partial to Arvind&#39;s view, but I don&#39;t have enough evidence to support it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Parallels between Generative AI and Humanoid Robots</title>
      <link href="https://metaist.com/blog/2025/05/ai-robots.html"/>
      <id>tag:metaist.com,2010:blog.post-70a7516454ca6e662f3d16d27d58d5b95d7fc99b</id>
      <published>Tue May 06 2025 15:30:54 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 06 2025 15:30:54 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://rodneybrooks.com/parallels-between-generative-ai-and-humanoid-robots/&quot;&gt;Parallels between Generative AI and Humanoid Robots&lt;/a&gt; (Rodney Brooks). Worth reading the whole thing. Reminder of Rodney&#39;s First Law of AI:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When an AI system performs a task, human observers immediately estimate its general competence in areas that seem related. Usually that estimate is wildly overinflated.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Product Purgatory: When they love it but still don’t buy</title>
      <link href="https://metaist.com/blog/2025/05/product-pugatory.html"/>
      <id>tag:metaist.com,2010:blog.post-6cbd4785bfd46fa00dfdd0028082cac6e70a1210</id>
      <published>Tue May 06 2025 15:24:41 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 06 2025 15:24:45 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://longform.asmartbear.com/purgatory/&quot;&gt;Product Purgatory: When they love it but still don’t buy&lt;/a&gt; (Jason Cohen). Main takeaways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;People are surprised to discover that the prospective customer wouldn&#39;t even take your solution if it was free and had many other magical properties. This is an important signal.&lt;/li&gt;
&lt;li&gt;You need to solve a burning pain. Even if it&#39;s a great idea and otherwise important, if it&#39;s not urgent, it&#39;s probably not relevant.&lt;/li&gt;
&lt;li&gt;Towards the end of the post, there&#39;s a nice bit about &amp;quot;how you would find customers in this condition&amp;quot; that I thought was useful.&lt;/li&gt;
&lt;/ol&gt;
</content>
    </entry>
    <entry>
      <title>You Sent the Message. But Did You Write It?</title>
      <link href="https://metaist.com/blog/2025/05/you-sent-the-message.html"/>
      <id>tag:metaist.com,2010:blog.post-29b41d1e19367ccbe1d366ab158a2ebe1090829b</id>
      <published>Tue May 06 2025 15:21:44 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 06 2025 15:21:44 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://davidduncan.substack.com/p/you-sent-the-message-but-did-you&quot;&gt;You Sent the Message. But Did You Write It?&lt;/a&gt; (David Duncan). My favorite of these is &lt;strong&gt;GPTune&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Like Auto-Tune for writing. GPTune takes someone’s normal idea and smooths it into something that feels more articulate, structured, erudite - but less authentic.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Euromaidan Press on Gamified War</title>
      <link href="https://metaist.com/blog/2025/05/gamified-war.html"/>
      <id>tag:metaist.com,2010:blog.post-a0ad92fa9af1ca855dd1b6d2654905ebffa02604</id>
      <published>Tue May 06 2025 15:16:29 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 06 2025 15:16:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/EuromaidanPress/status/1917686185255747869&quot;&gt;Euromaidan Press on Gamified War&lt;/a&gt; (Euromaidan Press).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ukrainian soldiers get reward points for destroyed Russian targets, which they can then exchange for new equipment. Just like in a game. - Politico.&lt;/p&gt;
&lt;p&gt;The exchange happens through an online marketplace called Brave 1 and the troops need to provide video evidence to earn points.&lt;/p&gt;
&lt;p&gt;♦️6 points for eliminating a Russian soldier&lt;br&gt;
♦️40 points for destroying a tank&lt;br&gt;
♦️50 points for taking out a mobile rocket system&lt;br&gt;&lt;/p&gt;
&lt;p&gt;For example, 43 points can get a powerful &amp;quot;Vampire&amp;quot; drone capable of carrying a 15-kg warhead.&lt;/p&gt;
&lt;p&gt;What benefits?&lt;br&gt;
♦️gets equipment directly to the most effective fighting units without bureaucratic delays&lt;br&gt;
♦️motivates soldiers through friendly competition&lt;br&gt;
♦️has already doubled the rate of Russian casualties since adjusting the point values.&lt;br&gt;
♦️improves Ukraine&#39;s military intelligence by creating a verified database of Russian losses&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Incentives matter.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Making PyPI&#39;s test suite 81% faster</title>
      <link href="https://metaist.com/blog/2025/05/making-pypi-faster.html"/>
      <id>tag:metaist.com,2010:blog.post-63e333b39215cae975e97aba1f27b18bd0468944</id>
      <published>Tue May 06 2025 15:01:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 06 2025 15:01:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://blog.trailofbits.com/2025/05/01/making-pypis-test-suite-81-faster/&quot;&gt;Making PyPI&#39;s test suite 81% faster&lt;/a&gt; (Alexis Challande; via &lt;a href=&quot;https://simonwillison.net/2025/May/1/making-pypis-test-suite-81-faster/&quot;&gt;Simon Willison&lt;/a&gt;). One day I&#39;ll have enough tests to run on some project that I can try out &lt;a href=&quot;https://github.com/pytest-dev/pytest-xdist&quot;&gt;&lt;code&gt;pytest-xdist&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Two publishers and three authors fail to understand what “vibe coding” means</title>
      <link href="https://metaist.com/blog/2025/05/not-vibe-coding.html"/>
      <id>tag:metaist.com,2010:blog.post-ae49e87f2ded6a49d796c9ef38cc58d1c6f3e498</id>
      <published>Tue May 06 2025 14:51:10 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 06 2025 14:51:10 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2025/May/1/not-vibe-coding/&quot;&gt;Two publishers and three authors fail to understand what “vibe coding” means&lt;/a&gt; (Simon Willison). Simon &lt;a href=&quot;https://simonwillison.net/2025/May/1/vibes/&quot;&gt;later realized&lt;/a&gt; that it&#39;s all about the vibes.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What is wrong with TOML?</title>
      <link href="https://metaist.com/blog/2025/04/what-is-wrong-with-toml.html"/>
      <id>tag:metaist.com,2010:blog.post-0420d4b71cba659af7cf9ed86cbe55ef01e1fcf3</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://hitchdev.com/strictyaml/why-not/toml/&quot;&gt;What is wrong with TOML?&lt;/a&gt; (Colm O&#39;Connor). I like these spicy takes even if I&#39;m not totally sold.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What happened to genetic algorithms?</title>
      <link href="https://metaist.com/blog/2025/04/what-happened-to-genetic-algorithms.html"/>
      <id>tag:metaist.com,2010:blog.post-10a58fed744374dacb17372aa1fca4291984704c</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://statmodeling.stat.columbia.edu/2025/04/17/what-happened-to-genetic-algorithms/&quot;&gt;What happened to genetic algorithms?&lt;/a&gt; (Jared Winslow).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Web 3.0 Requires Data Integrity</title>
      <link href="https://metaist.com/blog/2025/04/web-3-0-requires-data-integrity.html"/>
      <id>tag:metaist.com,2010:blog.post-b2e97553a6e2fa00945020a99b7a1cb939c12df5</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.schneier.com/blog/archives/2025/04/web-3-0-requires-data-integrity.html&quot;&gt;Web 3.0 Requires Data Integrity&lt;/a&gt; (Bruce Schneier).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>We Can, Must, and Will Simulate Nematode Brains</title>
      <link href="https://metaist.com/blog/2025/04/we-can-must-and-will-simulate-nematode-brains.html"/>
      <id>tag:metaist.com,2010:blog.post-1bea8fd08b4172eac9fd6da2f0ffacdeb16836ad</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/09/we-can-must-and-will-simulate-nematode-brains&quot;&gt;We Can, Must, and Will Simulate Nematode Brains&lt;/a&gt; (Michael Skuhersky / Asterisk). I mean &lt;strong&gt;must&lt;/strong&gt; is kinda strong for this.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Talmudic Argument</title>
      <link href="https://metaist.com/blog/2025/04/the-talmudic-argument.html"/>
      <id>tag:metaist.com,2010:blog.post-91cd1ab2ae4bbf285dda305e7c5fc2570c3be704</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Talmudic-Argument-Study-Reasoning-Methodology/dp/0521269482&quot;&gt;The Talmudic Argument&lt;/a&gt; by Louis Jacobs (1984; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). Finally made some sense of a question I had since 8th grade: &amp;quot;Why didn&#39;t you just quote a few more words of that Braita earlier!?&amp;quot;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Dyslexic Advantage (Revised and Updated): Unlocking the Hidden Potential of the Dyslexic Brain</title>
      <link href="https://metaist.com/blog/2025/04/the-dyslexic-advantage-revised-and-updated-unlocking-the-hidden-potential-of-the-dyslexic-brain.html"/>
      <id>tag:metaist.com,2010:blog.post-33df43986be3c9bc300d0135350c4ac3b95a1465</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Dyslexic-Advantage-Revised-Updated-Unlocking-ebook/dp/B0B1BRHS6S&quot;&gt;The Dyslexic Advantage (Revised and Updated): Unlocking the Hidden Potential of the Dyslexic Brain&lt;/a&gt; by Brock Eide (2023; via &lt;strong&gt;Jacqueline Novikov&lt;/strong&gt;).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The curve is bending</title>
      <link href="https://metaist.com/blog/2025/04/the-curve-is-bending.html"/>
      <id>tag:metaist.com,2010:blog.post-a6c33be4f0aea8b1f0a4003f4301533b99376e9a</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://grantslatton.com/the-curve-is-bending&quot;&gt;The curve is bending&lt;/a&gt; (Grant Slatton).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Best Programmers I Know</title>
      <link href="https://metaist.com/blog/2025/04/the-best-programmers-i-know.html"/>
      <id>tag:metaist.com,2010:blog.post-b1edb4be06924674f19fbf05a8f16f6e3a884b79</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://endler.dev/2025/best-programmers/&quot;&gt;The Best Programmers I Know&lt;/a&gt; (Matthias Endler).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Startup Exercise: What can&#39;t be solved with money?</title>
      <link href="https://metaist.com/blog/2025/04/startup-exercise-what-cant-be-solved-with-money.html"/>
      <id>tag:metaist.com,2010:blog.post-d172ab1932c437f273a18175a8071f1616c5ef66</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://longform.asmartbear.com/startup-money/&quot;&gt;Startup Exercise: What can&#39;t be solved with money?&lt;/a&gt; (Jason Cohen).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Solution-space taste</title>
      <link href="https://metaist.com/blog/2025/04/solution-space-taste.html"/>
      <id>tag:metaist.com,2010:blog.post-b3ab52db0e8b5d46439769d6f04aae759fc93af4</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://grantslatton.com/solution-space-taste&quot;&gt;Solution-space taste&lt;/a&gt; (Grant Slatton).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Nutrition Beliefs Are Just-So Stories</title>
      <link href="https://metaist.com/blog/2025/04/nutrition-beliefs-are-just-so-stories.html"/>
      <id>tag:metaist.com,2010:blog.post-410b83c469d0c717907978392ec8060f18bf1b67</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.cremieux.xyz/p/nutrition-beliefs-are-just-so-stories&quot;&gt;Nutrition Beliefs Are Just-So Stories&lt;/a&gt; (Cremieux Recueil).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Falsehoods software teams believe about user feedback</title>
      <link href="https://metaist.com/blog/2025/04/falsehoods-software-teams-believe-about-user-feedback.html"/>
      <id>tag:metaist.com,2010:blog.post-5bf804eab02c5de5df3ffee7ad1639829d8cc44b</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thoughtbot.com/blog/falsehoods-software-teams-believe-about-user-feedback&quot;&gt;Falsehoods software teams believe about user feedback&lt;/a&gt; (Fritz Meissner).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Cell Phone OPSEC for Border Crossings</title>
      <link href="https://metaist.com/blog/2025/04/cell-phone-opsec-for-border-crossings.html"/>
      <id>tag:metaist.com,2010:blog.post-930eccc3f168bd9fc4b62f03be8f6151b14ac7d5</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.schneier.com/blog/archives/2025/04/cell-phone-opsec-for-border-crossings.html&quot;&gt;Cell Phone OPSEC for Border Crossings&lt;/a&gt; (Bruce Schneier).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Calm Down—Your Phone Isn’t Listening to Your Conversations. It’s Just Tracking Everything You Type, Every App You Use, Every Website You Visit, and Everywhere You Go in the Physical World</title>
      <link href="https://metaist.com/blog/2025/04/calm-down-your-phone-isnt-listening-to-your-conversations-its-just-tracking-everything-you-type-every-app-you-use-every-website-you-visit-and-everywhere-you-go-in-the-physical-world.html"/>
      <id>tag:metaist.com,2010:blog.post-6f42e0b75ebd512da773684e0ba67e448de87c56</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.mcsweeneys.net/articles/calm-down-your-phone-isnt-listening-to-your-conversations-its-just-tracking-everything-you-type-every-app-you-use-every-website-you-visit-and-everywhere-you-go-in-the-physical-world&quot;&gt;Calm Down—Your Phone Isn’t Listening to Your Conversations. It’s Just Tracking Everything You Type, Every App You Use, Every Website You Visit, and Everywhere You Go in the Physical World&lt;/a&gt; (Jonathan Zeller / McSweeney&#39;s).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Boxie - an always offline audio player for my 3 year old</title>
      <link href="https://metaist.com/blog/2025/04/boxie-an-always-offline-audio-player-for-my-3-year-old.html"/>
      <id>tag:metaist.com,2010:blog.post-60968d1faa2c70107cabe3f856074387b744286e</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://mariozechner.at/posts/2025-04-20-boxie/&quot;&gt;Boxie - an always offline audio player for my 3 year old&lt;/a&gt; (Mario Zechner).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Barking Up the Wrong Tree: The Surprising Science Behind Why Everything You Know About Success Is (Mostly) Wrong</title>
      <link href="https://metaist.com/blog/2025/04/barking-up-the-wrong-tree-the-surprising-science-behind-why-everything-you-know-about-success-is-mostly-wrong.html"/>
      <id>tag:metaist.com,2010:blog.post-3c9b548e485ada6c20927a34d87e2b254271bd2e</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Barking-Wrong-Tree-Surprising-Everything-ebook/dp/B01KT104RI&quot;&gt;Barking Up the Wrong Tree: The Surprising Science Behind Why Everything You Know About Success Is (Mostly) Wrong&lt;/a&gt; by Eric Barker (2017). Ugh. I probably need to remove all the books from 2016-2017 from my reading list that are overflowing with psych studies that never replicated. The mentorship parts were reasonably ok.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A Halakhic Guide to Dealing with Mental Illness</title>
      <link href="https://metaist.com/blog/2025/04/a-halakhic-guide-to-dealing-with-mental-illness.html"/>
      <id>tag:metaist.com,2010:blog.post-5b3004c58256fa8826ecc5c595f67bc79e8db23f</id>
      <published>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 19:33:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thelehrhaus.com/commentary/a-halakhic-guide-to-dealing-with-mental-illness/&quot;&gt;A Halakhic Guide to Dealing with Mental Illness&lt;/a&gt; (Meir Ekstein / Lehrhaus).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Backfill your blog</title>
      <link href="https://metaist.com/blog/2025/04/backfill-your-blog.html"/>
      <id>tag:metaist.com,2010:blog.post-8770bf48e10248e9885f0c1c4b0a242930539cef</id>
      <published>Tue Apr 29 2025 18:56:08 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Apr 30 2025 22:27:17 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2025/Apr/25/backfill-your-blog/&quot;&gt;Backfill your blog&lt;/a&gt; (Simon Willison). I took the time to convert 9 years worth of &lt;strong&gt;Keep In Touch&lt;/strong&gt; emails into Markdown so that I can &lt;a href=&quot;https://simonwillison.net/2024/Dec/22/link-blog/#more-people-should-do-this&quot;&gt;start a link blog&lt;/a&gt; starting today.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Patrick McKenzie on using Dangerous Professional Voice</title>
      <link href="https://metaist.com/blog/2025/04/dangerous-professional-voice.html"/>
      <id>tag:metaist.com,2010:blog.post-38af1eb5a2abeb46e5ae8914e4b56d535095111e</id>
      <published>Tue Apr 29 2025 16:50:55 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Apr 29 2025 16:50:55 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://twitter.com/patio11/status/1162561822248992768&quot;&gt;Patrick McKenzie on using Dangerous Professional Voice&lt;/a&gt; (Patrick McKenzie).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Memetically, being a Dangerous Professional means communicating in what might be a slightly adversarial context in a way which suggests that a bureaucracy take one’s concerns seriously and escalate them to someone empowered to resolve them swiftly.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>cattrs I: un/structuring speed</title>
      <link href="https://metaist.com/blog/2025/04/why-cattrs-is-fast.html"/>
      <id>tag:metaist.com,2010:blog.post-733f725bc0391a818eb052075a2819bebd89335a</id>
      <published>Tue Apr 29 2025 13:48:24 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Apr 29 2025 13:48:24 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://threeofwands.com/why-cattrs-is-so-fast/&quot;&gt;cattrs I: un/structuring speed&lt;/a&gt; (The Three Wands).&lt;/p&gt;
&lt;p&gt;During the &lt;a href=&quot;https://metaist.com/blog/2025/04/2025-04-29-castfit-code-review.html&quot;&gt;code review for &lt;code&gt;castfit&lt;/code&gt;&lt;/a&gt;, Gemini pointed me at &lt;a href=&quot;https://www.attrs.org/en/stable/&quot;&gt;&lt;code&gt;attrs&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://catt.rs/en/stable/&quot;&gt;&lt;code&gt;cattrs&lt;/code&gt;&lt;/a&gt;. Many of the features of the &lt;code&gt;attrs&lt;/code&gt; became &lt;code&gt;dataclasses&lt;/code&gt; in the standard python library while the features of the &lt;code&gt;cattrs&lt;/code&gt; look &lt;em&gt;very&lt;/em&gt; similar to my own &lt;code&gt;castfit&lt;/code&gt; library.&lt;/p&gt;
&lt;p&gt;I started reading up on &lt;code&gt;cattrs&lt;/code&gt; and I came across the article above which explains the three phases of optimization that &lt;code&gt;cattrs&lt;/code&gt; went through. The first phase roughly corresponds to how &lt;code&gt;castfit&lt;/code&gt; does conversions today. It also highlights the same problems I anticipate if &lt;code&gt;castfit&lt;/code&gt; were to ever be used in a production environment.&lt;/p&gt;
&lt;p&gt;The second (generated code) and third phases (optimized bytecode) reflect some very interesting optimizations. I&#39;m glad that they kept the initial phase code around for situations where you don&#39;t have time up front (e.g., at CLI start up).&lt;/p&gt;
&lt;p&gt;My simple test didn&#39;t work:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;uv run &lt;span class=&quot;token parameter variable&quot;&gt;--with&lt;/span&gt; cattrs python&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cattrs
&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Cat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;     name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;     age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; cattrs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;structure&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Garfield&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Cat&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Traceback &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;most recent call last&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  File &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;python-input-2&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;module&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    cattrs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;structure&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Garfield&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Cat&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;
  File &lt;span class=&quot;token string&quot;&gt;&quot;.../lib/python3.13/site-packages/cattrs/converters.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line &lt;span class=&quot;token number&quot;&gt;558&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; structure
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_structure_func&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dispatch&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;
  File &lt;span class=&quot;token string&quot;&gt;&quot;.../lib/python3.13/site-packages/cattrs/fns.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; raise_error
    &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; StructureHandlerNotFoundError&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; type_&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;cl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
cattrs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;StructureHandlerNotFoundError&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Unsupported &lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;__main__.Cat&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; Register a structure hook &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; it&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It turns out you need to use &lt;code&gt;attrs&lt;/code&gt; or &lt;code&gt;dataclasses&lt;/code&gt; to make this into an object that can be converted into:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; @dataclass
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Cat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;     name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;     age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; cattrs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;structure&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Garfield&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Cat&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Cat&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Garfield&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; age&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;castfit&lt;/code&gt; can handle the dataclass approach too, but for the undecorated version it just tries constructing an empty object and setting a bunch of attributes on it. Not sure if this is a reasonable assumption (probably isn&#39;t), but it reduces the number of required imports.&lt;/p&gt;
&lt;p&gt;Overall, though, I&#39;m pretty impressed by &lt;code&gt;cattrs&lt;/code&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>castfit code review</title>
      <link href="https://metaist.com/blog/2025/04/castfit-code-review.html"/>
      <id>tag:metaist.com,2010:blog.post-3e056a2215a27256adc9777b976ccced870f431f</id>
      <published>Tue Apr 29 2025 13:23:35 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Apr 29 2025 13:23:37 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;I asked both &lt;a href=&quot;https://gist.github.com/metaist/7691e5306a246a86b4f195075d95deec#file-2025-04-29-transcript-gemini-reviews-castfit-md&quot;&gt;Gemini 2.5 Pro Experimental&lt;/a&gt; and &lt;a href=&quot;https://gist.github.com/metaist/7691e5306a246a86b4f195075d95deec#file-2025-04-29-transcript-chatgpt-reviews-castfit-md&quot;&gt;ChatGPT o3&lt;/a&gt; to review the code in &lt;a href=&quot;https://metaist.com/blog/2025/04/castfit-0.1.1.html&quot;&gt;castfit 0.1.1&lt;/a&gt;. I attached the source files for &lt;code&gt;__init__.py&lt;/code&gt;, the two test files, and &lt;code&gt;README.md&lt;/code&gt; together with the following prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Please review the attached code and produce a comprehensive list of improvements. For any error or edge case, please produce sample code that would trigger the error/edge case. For any improvement, indicate the strength of the improvement. Improvements may include, among other things, performance, documentation, marketing, or ease-of-use.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While both found many similar issues, Gemini&#39;s output was both easier to convert to issues (although I should have been more explicit in the prompt) and it also exposed me to the great &lt;a href=&quot;https://catt.rs/en/stable/&quot;&gt;&lt;code&gt;cattrs&lt;/code&gt;&lt;/a&gt; library which I should explore more.&lt;/p&gt;
&lt;p&gt;I&#39;ll implement as many of these changes as I can and then see how the reviews change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: I&#39;m saving these transcripts to a private gist which is not indexed by search engines to try to reduce AI slop.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>castfit 0.1.1</title>
      <link href="https://metaist.com/blog/2025/04/castfit-0.1.1.html"/>
      <id>tag:metaist.com,2010:blog.post-7de18888bd4c53559acd56cba26179a4cac1be48</id>
      <published>Tue Apr 29 2025 13:14:06 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Apr 29 2025 13:14:08 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/castfit/releases/tag/0.1.1&quot;&gt;&lt;code&gt;castfit 0.1.1&lt;/code&gt;&lt;/a&gt; is available. &lt;code&gt;castfit&lt;/code&gt; is my tiny library for converting things (mostly &lt;code&gt;dict&lt;/code&gt; of keys) into classes using standard python type hints.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;castfit&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# modern (recommended)&lt;/span&gt;
uv &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; castfit

&lt;span class=&quot;token comment&quot;&gt;# classic&lt;/span&gt;
python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; castfit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/castfit&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;release-notes-0-1-1-2025-04-28t14-32-37z&quot; tabindex=&quot;-1&quot;&gt;Release Notes &lt;a href=&quot;https://github.com/metaist/castfit/compare/0.1.0...0.1.1&quot;&gt;0.1.1&lt;/a&gt; - 2025-04-28T14:32:37Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/04/castfit-0.1.1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/castfit/issues/1&quot;&gt;#1&lt;/a&gt;: type hints for &lt;code&gt;castfit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/LTS/issues/8&quot;&gt;metaist/LTS#8&lt;/a&gt;: using latest github actions&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Class-based docopt usage strings</title>
      <link href="https://metaist.com/blog/2025/04/class-based-docopt.html"/>
      <id>tag:metaist.com,2010:blog.post-c625665d87b1039a691c2d34dd97dd38a9a863cb</id>
      <published>Tue Apr 29 2025 12:23:29 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Apr 29 2025 12:23:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2023/11/how-to-get-type-hints-in-python.html&quot;&gt;Access type hints in python&lt;/a&gt;, &lt;a href=&quot;https://metaist.com/blog/2023/12/castfit-0.1.0.html&quot;&gt;castfit 0.1.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox&quot;&gt;&lt;code&gt;attrbox&lt;/code&gt;&lt;/a&gt; is my little library for loading configuration files, reading environment variables, and parsing command-line arguments. I reach for it every time I make a little CLI or throwaway script so that I can write out the usage and quickly get everything up and running.&lt;/p&gt;
&lt;p&gt;One &lt;a href=&quot;https://metaist.com/blog/2023/11/how-to-get-type-hints-in-python.html&quot;&gt;problem with using a &lt;code&gt;docopt&lt;/code&gt;-based approach&lt;/a&gt; is that the result isn&#39;t typed properly. I created &lt;a href=&quot;https://github.com/metaist/castfit&quot;&gt;&lt;code&gt;castfit&lt;/code&gt;&lt;/a&gt; exactly for this purpose: just define the class with the correct types for the fields and a usage string and you&#39;re good to go.&lt;/p&gt;
&lt;p&gt;But there are a few annoyances:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You have to import two things (&lt;code&gt;attrbox&lt;/code&gt; and &lt;code&gt;castfit&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Now you have to synchronize the usage string with the class members (which are far away).&lt;/li&gt;
&lt;li&gt;If you want to document the members, you&#39;re repeating yourself three times (usage string, member, and member docstring).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I keep wanting to move the documentation closer to the class members and then dynamically build up the usage string. But this introduces new problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You need to use &lt;a href=&quot;https://docs.python.org/3/library/ast.html&quot;&gt;&lt;code&gt;ast&lt;/code&gt;&lt;/a&gt; to find the floating string expressions that are near the class members. So this won&#39;t work in, e.g., the REPL.&lt;/li&gt;
&lt;li&gt;You need to format them some way. There&#39;s a tension between how you document a class member normally and how you do it when it&#39;s part of the &lt;code&gt;docopt&lt;/code&gt; usage string.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And now your usage string isn&#39;t as clean as it was when you started.&lt;/p&gt;
&lt;p&gt;I have a working version that I&#39;ll push out soon. We&#39;ll see if I ever reach for it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>attrbox 0.1.6</title>
      <link href="https://metaist.com/blog/2025/04/attrbox-0.1.6.html"/>
      <id>tag:metaist.com,2010:blog.post-9884fafb6f0aed8a33f62d60fca793f60f1315b9</id>
      <published>Mon Apr 21 2025 18:55:29 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Apr 21 2025 18:55:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/releases/tag/0.1.6&quot;&gt;&lt;code&gt;attrbox 0.1.6&lt;/code&gt;&lt;/a&gt; is available. This release vendorizes &lt;code&gt;docopt-ng&lt;/code&gt;, a more up-to-date version of the popular &lt;code&gt;docopt&lt;/code&gt; library that used to be a dependency.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;attrbox&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; attrbox

&lt;span class=&quot;token comment&quot;&gt;# or, if you use uv (recommended):&lt;/span&gt;
uv &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; attrbox&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;combined-release-notes-0-1-3-0-1-4-0-1-5-0-1-6-2025-04-17t21-49-10z&quot; tabindex=&quot;-1&quot;&gt;Combined Release Notes &lt;a href=&quot;https://github.com/metaist/attrbox/compare/0.1.2...0.1.3&quot;&gt;0.1.3&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/attrbox/compare/0.1.3...0.1.4&quot;&gt;0.1.4&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/attrbox/compare/0.1.4...0.1.5&quot;&gt;0.1.5&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/attrbox/compare/0.1.5...0.1.6&quot;&gt;0.1.6&lt;/a&gt; - 2025-04-17T21:49:10Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/04/attrbox-0.1.6.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Versions &lt;a href=&quot;https://github.com/metaist/attrbox/compare/0.1.3...0.1.4&quot;&gt;0.1.4&lt;/a&gt; and &lt;a href=&quot;https://github.com/metaist/attrbox/compare/0.1.4...0.1.5&quot;&gt;0.1.5&lt;/a&gt; were zero-change version bumps due to errors in how GitHub Actions publish to PyPI.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/issues/11&quot;&gt;#11&lt;/a&gt;: add &lt;code&gt;py.typed&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/issues/13&quot;&gt;#13&lt;/a&gt;: vendorized &lt;code&gt;docopt-ng&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/issues/14&quot;&gt;#14&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/attrbox/issues/16&quot;&gt;#16&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/LTS/issues/8&quot;&gt;metaist/LTS#8&lt;/a&gt;: using latest project configurations&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/LTS/issues/4&quot;&gt;metaist/LTS#4&lt;/a&gt;: switched to using &lt;code&gt;ds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/LTS/issues/6&quot;&gt;metaist/LTS#6&lt;/a&gt;: copyright year&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/LTS/issues/8&quot;&gt;metaist/LTS#8&lt;/a&gt;: using latest github actions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/issues/15&quot;&gt;#15&lt;/a&gt;: &lt;code&gt;cog&lt;/code&gt; to docs process&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/LTS/issues/5&quot;&gt;metaist/LTS#5&lt;/a&gt;: python 3.9 support&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Cropping and Merging PDFs</title>
      <link href="https://metaist.com/blog/2025/04/cropping-and-merging-pdfs.html"/>
      <id>tag:metaist.com,2010:blog.post-951070e3cd4b54e645ae665659915e84d42f3838</id>
      <published>Tue Apr 15 2025 22:39:05 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Apr 15 2025 22:39:05 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Here&#39;s a simple-sounding task: Crop the vocal and piano parts of a full orchestral score PDF (many pages) into a new condensed score (fewer pages). After talking it over with &lt;a href=&quot;https://isaacselya.com/&quot;&gt;Isaac Selya&lt;/a&gt; we discovered that, aside from the first page, both staves were in the same vertical position on every page.&lt;/p&gt;
&lt;p&gt;I thought ChatGPT would nail this using &lt;a href=&quot;https://github.com/py-pdf/pypdf&quot;&gt;&lt;code&gt;pypdf&lt;/code&gt;&lt;/a&gt; which was its first attempt. It couldn&#39;t find the correct coordinates for the cropping, but it gave me enough code that I could manually supply the coordinates. However, it was only able to crop each page into separate smaller pages, but not stack them on a new page. &lt;a href=&quot;https://pypdf.readthedocs.io/en/stable/user/cropping-and-transforming.html&quot;&gt;Turns out&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just because content is no longer visible, it is not gone. Cropping works by adjusting the viewbox. That means content that was cropped away can still be restored.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That means any time I tried putting a &amp;quot;cropped&amp;quot; part of a page on a blank page, I&#39;d get the whole page (with some vertical translation). I tried so many variations on the crop (e.g., crop to small pages in a new PDF, then try stacking &lt;em&gt;those&lt;/em&gt; pages), but just kept getting lots of pages of sheet music overlaid on top of each other.&lt;/p&gt;
&lt;p&gt;Finally, ChatGPT mentioned that &lt;a href=&quot;https://pymupdf.readthedocs.io/en/latest/&quot;&gt;&lt;code&gt;pymupdf&lt;/code&gt;&lt;/a&gt; might &lt;em&gt;actually&lt;/em&gt; crop PDFs in a way that destroys the content outside of view. The API made a lot of sense to me, especially the more normal X-Y coordinate system with an origin in the top-left (unlike other PDF libraries that use the bottom-left).&lt;/p&gt;
&lt;p&gt;That got me this working result which cuts vertical rectangles out of pages and glues them together on new pages. The only hard-coded bit was the extra margin on the first page to make sure that the vocal and piano pieces stay together. If I ever have to do this again, I&#39;ll probably add it as a feature to my &lt;a href=&quot;https://github.com/metaist/pdfmerge&quot;&gt;&lt;code&gt;pdfmerge&lt;/code&gt;&lt;/a&gt; tool.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#!/usr/bin/env -S uv run --script&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# /// script&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# requires-python = &quot;&gt;=3.11&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# dependencies = [&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#     &quot;attrbox&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#     &quot;pymupdf&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ///&lt;/span&gt;
&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;
Usage: ,crop-pdf.py
    [--help|--version][--debug]
    &amp;lt;input&gt; [--output PATH]
    &amp;lt;rules&gt;...

Options:
    -h, --help              show this message
    --version               show program version
    --debug                 show debug messages

    &amp;lt;input&gt;                 input path
    -o PATH, --output PATH  output path
    &amp;lt;rules&gt;                 rules

Example:
,crop-pdf.py scan.pdf &quot;1: 0-80, 171-252, 666-764; 2-: 150-240, 666-764&quot;
&quot;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# std&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; __future__ &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; annotations
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; field

&lt;span class=&quot;token comment&quot;&gt;# lib&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; attrbox &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; parse_docopt
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; pymupdf


__version__ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Ranges&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ranges&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;default_factory&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__contains__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;other &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; r &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; r &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ranges&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__iter__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; r &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ranges&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; r

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;as_list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; r &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ranges&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@staticmethod&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; beg&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; inclusive&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Ranges&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Ranges&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; rule &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; rule&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                left&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; right &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                left &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;left&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; left &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; beg
                right &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;right&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; right &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; end
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                left &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rule&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                right &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; left
            result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ranges&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;left&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; right &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; inclusive &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Rule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    pages&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Ranges
    parts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;default_factory&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__contains__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; other &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pages

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__iter__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; page &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pages&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; beg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; beg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@staticmethod&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Rule&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        pages&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Rule&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            Ranges&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pages&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            Ranges&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; inclusive&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;as_list&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; parse_docopt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__doc__&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; version&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;__version__&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;with_stem&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stem &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;_crop&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;unlink&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    doc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pymupdf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    out &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pymupdf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    end &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;doc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    rules&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Rule&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; rule &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rules&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        rules&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Rule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; s &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; rule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rules&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    margin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
    dest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
    y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; margin
    out_page_n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; rule &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; rules&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; idx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; beg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; rule&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            idx &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

            page &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; doc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;idx&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width
            height &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;height
            h &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; beg

            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; dest
                &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; h &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; height &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; margin
                &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out_page_n &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; h &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; height &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;new page&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                dest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;new_page&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;width&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; height&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;height&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                out_page_n &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
                y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; margin

            clip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pymupdf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Rect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; beg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            post &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pymupdf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Rect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; h&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            dest&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;show_pdf_page&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; doc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pno&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;idx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; clip&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;clip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;idx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; beg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            y &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; h

    out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ez_save&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>TIL: contextvars in python</title>
      <link href="https://metaist.com/blog/2025/04/til-contextvars.html"/>
      <id>tag:metaist.com,2010:blog.post-5dc9709117865a32dfee34cbe20631ea17af7947</id>
      <published>Mon Apr 07 2025 20:31:42 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Apr 08 2025 09:19:30 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;While I was working on my third attempt of a python version of &lt;a href=&quot;https://github.com/metaist/idempotent-bash&quot;&gt;&lt;code&gt;idempotent-bash&lt;/code&gt;&lt;/a&gt;, ChatGPT suggested I use &lt;a href=&quot;https://docs.python.org/3/library/contextvars.html&quot;&gt;&lt;code&gt;contextvars&lt;/code&gt;&lt;/a&gt; which has apparently been part of the standard library since python 3.7. This is different from &lt;a href=&quot;https://docs.python.org/3/library/contextlib.html&quot;&gt;&lt;code&gt;contextlib&lt;/code&gt;&lt;/a&gt; which I know and like.&lt;/p&gt;
&lt;p&gt;Let&#39;s start with a simple (imprecise) definition: A &lt;code&gt;ContextVar&lt;/code&gt; is like a global variable except that it can be reset to earlier values.&lt;/p&gt;
&lt;p&gt;Why would you want this? The situation where I found it helpful was to avoid having to track and pass the same variable into every function I was writing.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; __future__ &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; annotations
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; contextvars &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ContextVar


_current&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ContextVar&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;IdemPy &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ContextVar&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;_current&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IdemPy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# parameters for how functions should behave&lt;/span&gt;
    dry&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
    force&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
    keep_running&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
    show_progress&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__enter__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; IdemPy&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; self

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__exit__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; exc_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; exc_val&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; exc_tb&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        _current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reset&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@classmethod&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cls&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; IdemPy &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; IdemPy&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; default
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; IdemPy&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          _current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; current

&lt;span class=&quot;token comment&quot;&gt;# elsewhere&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;my_function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    idempy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; IdemPy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# continue with the correct context&lt;/span&gt;


my_function&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# creates a default IdemPy context&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; IdemPy&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    my_function&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# similar to above&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; IdemPy&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;force&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    my_function&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# slightly different IdemPy context&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are two alternatives that I have tried in the past:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add &lt;code&gt;idempy&lt;/code&gt; as an argument to &lt;code&gt;my_function&lt;/code&gt;. It works at the cost of having to pass that argument around into every function. And for a class where you almost always want the default version, that feels very expensive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wrap &lt;code&gt;my_function&lt;/code&gt; in a class which, when constructed, takes a class of &lt;code&gt;IdemPy&lt;/code&gt;. This is also very heavy and reminds me most of Java. Let construct the builder which will instantiate the initiator.... No.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Most of the time I just want to call &lt;code&gt;my_function&lt;/code&gt; and have it do the right thing. Occasionally, I want to more explicitly set the context using &lt;code&gt;with IdemPy(...)&lt;/code&gt; which overrides what &lt;code&gt;IdemPy.get()&lt;/code&gt; returns by changing the &lt;code&gt;ContextVar&lt;/code&gt;. I can even nest &lt;code&gt;with IdemPy():&lt;/code&gt; calls and it will do the right thing.&lt;/p&gt;
&lt;p&gt;While all the advice about global variables is reasonable, this is one of those cases where I actually think python&#39;s &lt;code&gt;with&lt;/code&gt; statement works incredibly well.&lt;/p&gt;
&lt;h2 id=&quot;is-it-like-a-stack&quot; tabindex=&quot;-1&quot;&gt;Is it like a stack? &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/04/til-contextvars.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Update 2025-04-08&lt;/strong&gt;: &lt;a href=&quot;https://github.com/Pugio&quot;&gt;Shalev NessAiver&lt;/a&gt; asked me whether &lt;code&gt;ContextVar&lt;/code&gt; acts like a stack and whether you can &lt;code&gt;pop&lt;/code&gt; and &lt;code&gt;push&lt;/code&gt; to the same token&#39;s value.&lt;/p&gt;
&lt;p&gt;Nope. First, unlike a stack you reset the values in a different order than you set them.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; contextvars &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ContextVar
v &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ContextVar&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;v&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
token1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
token2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
token3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reset&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;assert&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;

v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reset&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;assert&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;

v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reset&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;assert&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Second, you&#39;ll get an error if you try to reset the same token twice.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; contextvars &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ContextVar
v &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ContextVar&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;v&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reset&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;assert&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reset&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# raises RuntimeError: &amp;lt;Token ...&gt; has already been used once&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2025/04/til-contextvars.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2025-04-08: added Shalev NessAiver&#39;s question&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Weapons of Math Destruction: How Big Data Increases Inequality and Threatens Democracy</title>
      <link href="https://metaist.com/blog/2025/03/weapons-of-math-destruction-how-big-data-increases-inequality-and-threatens-democracy.html"/>
      <id>tag:metaist.com,2010:blog.post-73259856129e6879476033f96234dde676759cb7</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality-ebook/dp/B019B6VCLO&quot;&gt;Weapons of Math Destruction: How Big Data Increases Inequality and Threatens Democracy&lt;/a&gt; by Cathy O&#39;Neil (2016; via EdSurge). Glad the book includes some positive examples. Unfortunately, because there are more chaotic states than ordered states there are more poorly considered uses of mathematical modeling than excellent uses.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>We&#39;ve been wrong about math for 2300 years</title>
      <link href="https://metaist.com/blog/2025/03/we-ve-been-wrong-about-math-for-2300-years.html"/>
      <id>tag:metaist.com,2010:blog.post-e4574975031d212bf5207b13aab52f45861c4ede</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://davidbessis.substack.com/p/weve-been-wrong-about-math-for-2300&quot;&gt;We&#39;ve been wrong about math for 2300 years&lt;/a&gt; (David Bessis; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Two Americas, one bank branch, and $50,000 cash</title>
      <link href="https://metaist.com/blog/2025/03/two-americas-one-bank-branch-and-50000-cash.html"/>
      <id>tag:metaist.com,2010:blog.post-dfd5e2cb1721543d5b41678fb744d6688b4d7b99</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.bitsaboutmoney.com/archive/two-americas-one-bank-branch/&quot;&gt;Two Americas, one bank branch, and $50,000 cash&lt;/a&gt; (Patrick McKenzie). Imagine Patrick McKenzie as Columbo for this one. Just took a random bit of a description of a bank branch and went full deep-dive wild on trying to figure out if a story was legit.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>This is Not A Game About A Pipe</title>
      <link href="https://metaist.com/blog/2025/03/this-is-not-a-game-about-a-pipe.html"/>
      <id>tag:metaist.com,2010:blog.post-6d64fec1fded4d53624730a460904e3e546e7966</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://gtmac.itch.io/this-is-not-a-game-about-a-pipe&quot;&gt;This is Not A Game About A Pipe&lt;/a&gt; (Mac McAnally). If Metaist ever published card games, they&#39;d probably all end up like this.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Think Like a Freak: The Authors of Freakonomics Offer to Retrain Your Brain</title>
      <link href="https://metaist.com/blog/2025/03/think-like-a-freak-the-authors-of-freakonomics-offer-to-retrain-your-brain.html"/>
      <id>tag:metaist.com,2010:blog.post-9b86ba5999c1b938266e8d5dc72c563290b57564</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Think-Like-Freak-Authors-Freakonomics-ebook/dp/B00BATINVS&quot;&gt;Think Like a Freak: The Authors of Freakonomics Offer to Retrain Your Brain&lt;/a&gt; by Steven D. Levitt &amp;amp; Stephen J. Dubner (2014). Favorite part is when they revealed how their previous book was used to create a honeypot for would-be terrorists.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Manus Marketing Madness</title>
      <link href="https://metaist.com/blog/2025/03/the-manus-marketing-madness.html"/>
      <id>tag:metaist.com,2010:blog.post-1ab85feea124cf9804b1288e97ee5b6eb2f8abd5</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thezvi.wordpress.com/2025/03/10/the-manus-marketing-madness/&quot;&gt;The Manus Marketing Madness&lt;/a&gt; (Zvi Mowshowitz). &#39;twas madness indeed.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The 5 Most Difficult Employees (And How To Actually Handle Them)</title>
      <link href="https://metaist.com/blog/2025/03/the-5-most-difficult-employees-and-how-to-actually-handle-them.html"/>
      <id>tag:metaist.com,2010:blog.post-9517b86e8ac3159412b06fc84f0b57b192c79b68</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://newsletter.canopy.is/p/the-5-most-difficult-employees-and&quot;&gt;The 5 Most Difficult Employees (And How To Actually Handle Them)&lt;/a&gt; (Claire Lew). &amp;quot;Most difficult&amp;quot; is probably stretching it, but, yes, all these archetypes exist.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Shape of AI</title>
      <link href="https://metaist.com/blog/2025/03/shape-of-ai.html"/>
      <id>tag:metaist.com,2010:blog.post-90c2f10d9ba40bc66f36fd6fa4f4dfae8aa7403d</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.shapeof.ai/&quot;&gt;Shape of AI&lt;/a&gt; (Emily Campbell). Nice collection of AI interaction patterns.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>“I scratched my own itch” isn’t good enough</title>
      <link href="https://metaist.com/blog/2025/03/i-scratched-my-own-itch-isnt-good-enough.html"/>
      <id>tag:metaist.com,2010:blog.post-ec5f7c09d1e86cf500224ef54779742eb7126b1e</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://longform.asmartbear.com/scratched-my-own-itch/&quot;&gt;“I scratched my own itch” isn’t good enough&lt;/a&gt; (Jason Cohen). And a point-by-point breakdown of the implications.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How to simplify complex decisions by cleaving the facts</title>
      <link href="https://metaist.com/blog/2025/03/how-to-simplify-complex-decisions-by-cleaving-the-facts.html"/>
      <id>tag:metaist.com,2010:blog.post-9e9af7410e09e91efa52319fc51d2b5284adfc60</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://longform.asmartbear.com/complex-decisions/&quot;&gt;How to simplify complex decisions by cleaving the facts&lt;/a&gt; (Jason Cohen). Self-recommending.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Here’s how I use LLMs to help me write code</title>
      <link href="https://metaist.com/blog/2025/03/heres-how-i-use-llms-to-help-me-write-code.html"/>
      <id>tag:metaist.com,2010:blog.post-5849765a21379dc73b750739942055457787d774</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://simonwillison.net/2025/Mar/11/using-llms-for-code/&quot;&gt;Here’s how I use LLMs to help me write code&lt;/a&gt; (Simon Willison). Excellent explanation for what it takes to actually get good results from LLMs when generating code.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Great software design looks underwhelming</title>
      <link href="https://metaist.com/blog/2025/03/great-software-design-looks-underwhelming.html"/>
      <id>tag:metaist.com,2010:blog.post-35cb6dd2d88d925355cd945c0c32174f7f1fe7be</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.seangoedecke.com/great-software-design/&quot;&gt;Great software design looks underwhelming&lt;/a&gt; (Sean Goedecke). Unsophisticated &amp;amp; battle tested is certainly a reasonable place to start from.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Discoverability of AI Features: Learn from Amazon’s Mistakes</title>
      <link href="https://metaist.com/blog/2025/03/discoverability-of-ai-features-learn-from-amazons-mistakes.html"/>
      <id>tag:metaist.com,2010:blog.post-1bf222b06d5d229aba89735f3a9282ea7e1e5978</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.nngroup.com/articles/discoverability-ai-amazon/&quot;&gt;Discoverability of AI Features: Learn from Amazon’s Mistakes&lt;/a&gt; (Kate Moran &amp;amp; Feifei Liu). Did you ever use Amazon Rufus for anything? Did you know Amazon Rufus was a thing? What kind of thing do you think it is?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Dear Student: Yes, AI is here, you&#39;re screwed unless you take action...</title>
      <link href="https://metaist.com/blog/2025/03/dear-student-yes-ai-is-here-you-re-screwed-unless-you-take-action.html"/>
      <id>tag:metaist.com,2010:blog.post-27eed64a4e51a525591b35ccbc84a1e3604a110a</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://ghuntley.com/screwed/&quot;&gt;Dear Student: Yes, AI is here, you&#39;re screwed unless you take action...&lt;/a&gt; (Geoffrey Huntley). The initial story from the student is a good contrast to Simon&#39;s article above. Tons of advice, but kinda all over the place.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Childhood and Education #9: School is Hell</title>
      <link href="https://metaist.com/blog/2025/03/childhood-and-education-9-school-is-hell.html"/>
      <id>tag:metaist.com,2010:blog.post-774257e7fc3f8bc42548c53e185b1489bb4f7261</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thezvi.wordpress.com/2025/03/07/childhood-and-education-9-school-is-hell/&quot;&gt;Childhood and Education #9: School is Hell&lt;/a&gt; (Zvi Mowshowitz). A mostly depressing, but sometimes funny, compendium of links about education.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Causal Emergence 2.0: Quantifying emergent complexity</title>
      <link href="https://metaist.com/blog/2025/03/causal-emergence-2-0-quantifying-emergent-complexity.html"/>
      <id>tag:metaist.com,2010:blog.post-16ca0a317fcddcd6338ddf1e57d8a35a5947c424</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📄 &lt;a href=&quot;https://arxiv.org/abs/2503.13395&quot;&gt;Causal Emergence 2.0: Quantifying emergent complexity&lt;/a&gt; by Erik Hoel. Interesting update; &lt;a href=&quot;https://www.theintrinsicperspective.com/p/now-published-my-new-theory-of-emergence&quot;&gt;the blog post&lt;/a&gt; gives a good summary.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Building a Life Worth Living</title>
      <link href="https://metaist.com/blog/2025/03/building-a-life-worth-living.html"/>
      <id>tag:metaist.com,2010:blog.post-5e470a857de344505b147a81caa7d15e1c08e8f9</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Building-Life-Worth-Living-Memoir-ebook/dp/B07QFN6GFJ&quot;&gt;Building a Life Worth Living&lt;/a&gt; by Marsha M. Linehan (2020; via &lt;strong&gt;Jacqueline Novikov&lt;/strong&gt;). The origin story of Dialectical Behavior Therapy (DBT).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Build: An Unorthodox Guide to Making Things Worth Making</title>
      <link href="https://metaist.com/blog/2025/03/build-an-unorthodox-guide-to-making-things-worth-making.html"/>
      <id>tag:metaist.com,2010:blog.post-94b76afada63e4dc48f023aa183d55832bc0b34c</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Build-Unorthodox-Guide-Making-Things-ebook/dp/B09BNJ6GBV&quot;&gt;Build: An Unorthodox Guide to Making Things Worth Making&lt;/a&gt; by Tony Fadell (2022; via Tim Ferriss &amp;amp; Lex Fridman). Lots of interesting stories and, occasionally, some reasonable advice.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>An essay in which my friend feels stuck and I suggest relaxing some constraints</title>
      <link href="https://metaist.com/blog/2025/03/an-essay-in-which-my-friend-feels-stuck-and-i-suggest-relaxing-some-constraints.html"/>
      <id>tag:metaist.com,2010:blog.post-1549d5baa69fff1b249060a81e47224bc42f12dc</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.henrikkarlsson.xyz/p/constraints&quot;&gt;An essay in which my friend feels stuck and I suggest relaxing some constraints&lt;/a&gt; (Henrik Karlsson). It is hard to become aware that many constraints are imagined.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A Post Mortem on the Gino Case</title>
      <link href="https://metaist.com/blog/2025/03/a-post-mortem-on-the-gino-case.html"/>
      <id>tag:metaist.com,2010:blog.post-56b1282e904ab7504e39be04f01936913e32f057</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.theorgplumber.com/posts/statement/&quot;&gt;A Post Mortem on the Gino Case&lt;/a&gt; (Zoé Ziani; via &lt;a href=&quot;https://statmodeling.stat.columbia.edu/2025/03/08/a-post-mortem-on-the-gino-case-committing-fraud-is-right-now-a-viable-career-strategy-that-can-propel-you-at-the-top-of-the-academic-world/&quot;&gt;Andrew Gelman&lt;/a&gt;). Somehow the story just gets worse.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A Field Guide to Rapidly Improving AI Products</title>
      <link href="https://metaist.com/blog/2025/03/a-field-guide-to-rapidly-improving-ai-products.html"/>
      <id>tag:metaist.com,2010:blog.post-fc13269fdc3816f5956e8db96e2e051a65261b23</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://hamel.dev/blog/posts/field-guide/&quot;&gt;A Field Guide to Rapidly Improving AI Products&lt;/a&gt; (Hamel Husain). &amp;quot;Can you show me how you’re measuring if any of this actually works?&amp;quot;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A Category Theory-Inspired BBN</title>
      <link href="https://metaist.com/blog/2025/03/a-category-theory-inspired-bbn.html"/>
      <id>tag:metaist.com,2010:blog.post-5da2075d0079026bd47eff5d2703a8a483284161</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.freaktakes.com/p/a-category-theory-inspired-bbn&quot;&gt;A Category Theory-Inspired BBN&lt;/a&gt; (Eric Gilliam). Interview about &lt;a href=&quot;https://topos.institute/&quot;&gt;Topos Institute&lt;/a&gt; with a goal of &amp;quot;building technologies to enable scientists and engineers from adjacent fields to more effectively combine and reason with overlapping models from distinct domains.&amp;quot;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>50 Thoughts on DOGE</title>
      <link href="https://metaist.com/blog/2025/03/50-thoughts-on-doge.html"/>
      <id>tag:metaist.com,2010:blog.post-07ddf6b512435bc5f981898229bb29f247589fcb</id>
      <published>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Mar 31 2025 18:36:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.statecraft.pub/p/50-thoughts-on-doge&quot;&gt;50 Thoughts on DOGE&lt;/a&gt; (Santi Ruiz). They are certainly thoughts.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Trying Caddy</title>
      <link href="https://metaist.com/blog/2025/03/trying-caddy.html"/>
      <id>tag:metaist.com,2010:blog.post-56ad1e60c447ddc6ace24b1a50eea41ce1e2698d</id>
      <published>Tue Mar 25 2025 13:32:19 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Mar 25 2025 13:32:19 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;I accidentally blew away my server (with several websites), so today was a good a day as any to try &lt;a href=&quot;https://caddyserver.com/&quot;&gt;&lt;code&gt;caddy&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On Ubuntu, I was able to get a server up and running quickly.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; debian-keyring debian-archive-keyring apt-transport-https &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1sLf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; gpg &lt;span class=&quot;token parameter variable&quot;&gt;--dearmor&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; /usr/share/keyrings/caddy-stable-archive-keyring.gpg
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1sLf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/caddy-stable.list
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; caddy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I updated &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;import *.caddy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then created a bunch of &lt;code&gt;.caddy&lt;/code&gt; files for each of the websites. I have three kinds of sites I support: simple static HTML sites, legacy PHP (usually WordPress), and python (uWSGI).&lt;/p&gt;
&lt;p&gt;Static sites are super simple with Caddy:&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;example.org {
	root * /var/www/example.org/site
	file_server
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PHP isn&#39;t too bad either:&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;example.com {
	root * /var/www/example.com/site
	php_fastcgi unix//run/php/php8.1-fpm.sock
	file_server
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;uWSGI took some playing around, but is even simpler once you realize that you can&#39;t use &lt;code&gt;/tmp&lt;/code&gt; for security reasons and you need to use &lt;code&gt;http-socket&lt;/code&gt; instead of &lt;code&gt;socket&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;example.com {
	reverse_proxy * unix//run/uwsgi/example.sock
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The only other major feature I thought I needed was URL rewriting which looked really easy. It actually took me more time to realize when I didn&#39;t need it. For example, on this blog you can get the RSS feed from &lt;code&gt;/blog/feed&lt;/code&gt; which, previously, redirected to &lt;code&gt;/blog/feed/index.xml&lt;/code&gt;. In Caddy you can just say:&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;	file_server {
		index index.html index.xml
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The other place I rewrite is to go from &lt;code&gt;/&lt;/code&gt; to &lt;code&gt;/blog/index.html&lt;/code&gt; (until such day that I have a better cover page for this site). I tried a few things ChatGPT suggested like:&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;  rewrite / /blog/index.html # =&gt; 404
  rewrite ^/$ /blog/index.html # =&gt; 404&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But only it&#39;s final suggestion worked:&lt;/p&gt;
&lt;pre class=&quot;language-caddy&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-caddy&quot;&gt;	@root {
		path /
	}
	rewrite @root /blog/index.html&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This created a named matcher &lt;code&gt;@root&lt;/code&gt; that matches the exact path of &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I highly recommend reading through the &lt;a href=&quot;https://caddyserver.com/docs/caddyfile/concepts&quot;&gt;concepts&lt;/a&gt; and skimming the list of &lt;a href=&quot;https://caddyserver.com/docs/caddyfile/directives&quot;&gt;directives&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Caddy is looking like a drop-in replacement for &lt;code&gt;nginx&lt;/code&gt; + &lt;code&gt;certbot&lt;/code&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Widowhood</title>
      <link href="https://metaist.com/blog/2025/02/widowhood.html"/>
      <id>tag:metaist.com,2010:blog.post-e74d4c8653c7b3916af3f0293a7235eb5306408d</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://pieandchaimagazine.com/widowhood/&quot;&gt;Widowhood&lt;/a&gt; (Amy Satterthwaite Pappas / Pie &amp;amp; Chai). I should have realized that &amp;quot;Chai&amp;quot; here means tea and not the Hebrew word for &amp;quot;life&amp;quot;. Still interesting.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>VALIS</title>
      <link href="https://metaist.com/blog/2025/02/valis.html"/>
      <id>tag:metaist.com,2010:blog.post-8e95f87b1c421a817e12b08250e2d5e16e17611b</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/VALIS-Trilogy-Book-1-ebook/dp/B005LVQZ98&quot;&gt;VALIS&lt;/a&gt; by Philip K. Dick (2011; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). Randomly autobiographical with a schizophrenic version of Philip K. Dick. Satellites beaming laser images into people&#39;s brains. Par for the course for this sort of thing.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Unbundling the University</title>
      <link href="https://metaist.com/blog/2025/02/unbundling-the-university.html"/>
      <id>tag:metaist.com,2010:blog.post-b9b9501bf20830778343d97a871d4520f3acdf90</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.unbundle-the-university.com/&quot;&gt;Unbundling the University&lt;/a&gt; (Ben Reinhardt). A very long discussion about the history of how tech transfer came into the university and why we should create new types of labs.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>TypeScript types can run DOOM</title>
      <link href="https://metaist.com/blog/2025/02/typescript-types-can-run-doom.html"/>
      <id>tag:metaist.com,2010:blog.post-e97331fc0042d559fe88172045db8855d7e5f699</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;▶️ &lt;a href=&quot;https://youtu.be/0mCsluv5FXA&quot;&gt;TypeScript types can run DOOM&lt;/a&gt; (Michigan TypeScript; via &lt;a href=&quot;https://simonwillison.net/2025/Feb/27/typescript-types-can-run-doom/&quot;&gt;Simon Willison&lt;/a&gt;). Because of course it can. Amazing video.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Training Small R1-like Reasoning Models</title>
      <link href="https://metaist.com/blog/2025/02/training-small-r1-like-reasoning-models.html"/>
      <id>tag:metaist.com,2010:blog.post-d6c6ba36f70fac94f96f74885fbf29a9cc081e62</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.stephendiehl.com/posts/small_reasoning_models/&quot;&gt;Training Small R1-like Reasoning Models&lt;/a&gt; (Stephen Diehl). Fascinating.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Truth About The Moon Landings</title>
      <link href="https://metaist.com/blog/2025/02/the-truth-about-the-moon-landings.html"/>
      <id>tag:metaist.com,2010:blog.post-9a686f13c7e96bfc0689f6a1a460f6c8746dce60</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;▶️ &lt;a href=&quot;https://youtu.be/fMHLvoWZfqQ&quot;&gt;The Truth About The Moon Landings&lt;/a&gt; (Everyday Astronaut). Long, but incredible. Careful walkthrough of lots of details.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Startup Drake Equation</title>
      <link href="https://metaist.com/blog/2025/02/the-startup-drake-equation.html"/>
      <id>tag:metaist.com,2010:blog.post-2cab3e2e9b5afe1e48b4095ac12577414415162c</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://longform.asmartbear.com/startup-drake-equation/&quot;&gt;The Startup Drake Equation&lt;/a&gt; (Jason Cohen). Seems to have more factors than the original Drake Equation, but fair points nonetheless.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Art of the Start 2.0</title>
      <link href="https://metaist.com/blog/2025/02/the-art-of-the-start-2-0.html"/>
      <id>tag:metaist.com,2010:blog.post-b182c00f8ac3ebbd1d2db5985d82a469a611ebfa</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Art-Start-2-0-Time-Tested-Battle-Hardened-ebook/dp/B00MNNAOX0&quot;&gt;The Art of the Start 2.0&lt;/a&gt; by Guy Kawasaki (via Iridescent Learning). Some nice exercises, but not as exciting as I thought.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>solve for distribution</title>
      <link href="https://metaist.com/blog/2025/02/solve-for-distribution.html"/>
      <id>tag:metaist.com,2010:blog.post-165fcaaf7c14415dc76df490fe586bcfc216919d</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://visakanv.com/marketing/solve-for-distribution/&quot;&gt;solve for distribution&lt;/a&gt; (Visakan Veerasamy). Basically means figure out marketing first.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Slashing my &quot;.bashrc&quot; in half</title>
      <link href="https://metaist.com/blog/2025/02/slashing-my-bashrc-in-half.html"/>
      <id>tag:metaist.com,2010:blog.post-a755422aff86e82c8ce5780d6695806655e60027</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.bitecode.dev/p/slashing-my-bashrc-in-half&quot;&gt;Slashing my &amp;quot;.bashrc&amp;quot; in half&lt;/a&gt; (Bite Code!). I&#39;ve got a bunch of tabs open to check out some of these tools.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Reasons of State: Why Didn&#39;t Denmark Sell Greenland?</title>
      <link href="https://metaist.com/blog/2025/02/reasons-of-state-why-didnt-denmark-sell-greenland.html"/>
      <id>tag:metaist.com,2010:blog.post-a31d5a7bf0a386a5dec6aa499d51eb82acc8f225</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://gwern.net/greenland&quot;&gt;Reasons of State: Why Didn&#39;t Denmark Sell Greenland?&lt;/a&gt; (Gwern Branwen). Why&#39;d you leave the keys upon the table?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>On Emergent Misalignment</title>
      <link href="https://metaist.com/blog/2025/02/on-emergent-misalignment.html"/>
      <id>tag:metaist.com,2010:blog.post-9afa9acf67fa0a79498b37e7553f2f4980a41c51</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://thezvi.wordpress.com/2025/02/28/on-emergent-misalignment/&quot;&gt;On Emergent Misalignment&lt;/a&gt; (Zvi Mowshowitz). Some of the best coverage of one of the more interesting LLM training papers to drop this past week.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Newton and the Counterfeiter: The Unknown Detective Career of the World&#39;s Greatest Scientist</title>
      <link href="https://metaist.com/blog/2025/02/newton-and-the-counterfeiter-the-unknown-detective-career-of-the-world-s-greatest-scientist.html"/>
      <id>tag:metaist.com,2010:blog.post-782d16747a26cd1f7e6957a767c7379bad37ef1d</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Newton-Counterfeiter-Detective-Greatest-Scientist-ebook/dp/B003K16PAA&quot;&gt;Newton and the Counterfeiter: The Unknown Detective Career of the World&#39;s Greatest Scientist&lt;/a&gt; by Thomas Levenson (2010). Why isn&#39;t there a movie about this!? Action-packed (warning: book starts off slow), crazy borderline unethical interrogations, law enforcement becoming criminals, criminals becoming informants, a brilliant nemesis, exacting calculations, fierce guarding of coinage. Now that we have the historical account, you could do a whole historical fictional series of about this.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>New Proofs Probe the Limits of Mathematical Truth</title>
      <link href="https://metaist.com/blog/2025/02/new-proofs-probe-the-limits-of-mathematical-truth.html"/>
      <id>tag:metaist.com,2010:blog.post-7c1a11be2ebf657e031038ca9c699e7eb304e15d</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.quantamagazine.org/new-proofs-probe-the-limits-of-mathematical-truth-20250203/&quot;&gt;New Proofs Probe the Limits of Mathematical Truth&lt;/a&gt; (Joseph Howlett / Quanta). Consistently impressed by Quanta Magazine&#39;s ability to give accessible history of these mathematical ideas.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Never Eat Alone, Expanded and Updated</title>
      <link href="https://metaist.com/blog/2025/02/never-eat-alone-expanded-and-updated.html"/>
      <id>tag:metaist.com,2010:blog.post-4a8ad90ffab8abde62a1b730bd5936790b23e075</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Never-Eat-Alone-Expanded-Updated-ebook/dp/B00H6JBFOS&quot;&gt;Never Eat Alone, Expanded and Updated&lt;/a&gt; by Keith Ferrazzi &amp;amp; Tahl Raz (2014). Some interesting stories, I guess.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>My Promised Land: The Triumph and Tragedy of Israel</title>
      <link href="https://metaist.com/blog/2025/02/my-promised-land-the-triumph-and-tragedy-of-israel.html"/>
      <id>tag:metaist.com,2010:blog.post-8fafc12b790c0539dc95d28a10ce69e087f6b0db</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/My-Promised-Land-Triumph-Tragedy-ebook/dp/B009QJMXI8&quot;&gt;My Promised Land: The Triumph and Tragedy of Israel&lt;/a&gt; by Ari Shavit (2013; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). This was a hard read. I expect a future version will have much to say about Oct 7, 2023.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>My LLM codegen workflow atm</title>
      <link href="https://metaist.com/blog/2025/02/my-llm-codegen-workflow-atm.html"/>
      <id>tag:metaist.com,2010:blog.post-65c58d37df574010c944abd87eb99e78ae42aa3a</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/&quot;&gt;My LLM codegen workflow atm&lt;/a&gt; (Harper Reed; via &lt;a href=&quot;https://simonwillison.net/2025/Feb/21/my-llm-codegen-workflow-atm/&quot;&gt;Simon Willison&lt;/a&gt;). Makes sense. (Tangent: Can&#39;t believe I&#39;ve been following Simon Willison&#39;s &lt;code&gt;llm&lt;/code&gt; tool for many months and it wasn&#39;t until Wednesday that I actually installed it. Having an LLM available in the command line is a lot of fun.)&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>In Search of Excellence: Lessons from America&#39;s Best-Run Companies</title>
      <link href="https://metaist.com/blog/2025/02/in-search-of-excellence-lessons-from-america-s-best-run-companies.html"/>
      <id>tag:metaist.com,2010:blog.post-4bbdcf41310fa6788dff7db47c9399666afaf30e</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Search-Excellence-Americas-Companies-Essentials-ebook/dp/B009YM9VOQ&quot;&gt;In Search of Excellence: Lessons from America&#39;s Best-Run Companies&lt;/a&gt; by Tom Peters &amp;amp; Robert H. Waterman (2012; via Reed Hastings &amp;amp; Reid Hoffman). Originally published in 1982, many of the examples no longer hold up, except for maybe McDonalds &amp;amp; Disney. Most of the &amp;quot;be authentic&amp;quot; advice has become a hallmark of random holiday-card-from-your-dentist-spam.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How to write a good design document</title>
      <link href="https://metaist.com/blog/2025/02/how-to-write-a-good-design-document.html"/>
      <id>tag:metaist.com,2010:blog.post-16a0da9b98db47da6d3490f0816bac51ec1dbb43</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://grantslatton.com/how-to-design-document&quot;&gt;How to write a good design document&lt;/a&gt; (Grant Slatton). When I saw the headline, I thought this was about UX, but it&#39;s about design documents for dealing with technical constraints. The writing advice is actually good for many forms of writing.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How Core Git Developers Configure Git</title>
      <link href="https://metaist.com/blog/2025/02/how-core-git-developers-configure-git.html"/>
      <id>tag:metaist.com,2010:blog.post-37c2943b9478a9fef12090136e41872b1437b9fb</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://blog.gitbutler.com/how-git-core-devs-configure-git/&quot;&gt;How Core Git Developers Configure Git&lt;/a&gt; (Scott Chacon; via &lt;strong&gt;Patrick Kage&lt;/strong&gt;). I like that they made all the core developers re-experience the defaults.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Halakhic Positions of Rabbi Joseph B. Soloveitchik: Volume 5</title>
      <link href="https://metaist.com/blog/2025/02/halakhic-positions-of-rabbi-joseph-b-soloveitchik-volume-5.html"/>
      <id>tag:metaist.com,2010:blog.post-1b2e18096967b6a02e961568f7f7cfa458f5b00a</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Halakhic-Positions-Rabbi-Joseph-Soloveitchik/dp/1602801290&quot;&gt;Halakhic Positions of Rabbi Joseph B. Soloveitchik: Volume 5&lt;/a&gt; by Aharon Ziegler (1998). Episode 5: The Rav Strikes Back.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Getting a handle on your goals and big life changes</title>
      <link href="https://metaist.com/blog/2025/02/getting-a-handle-on-your-goals-and-big-life-changes.html"/>
      <id>tag:metaist.com,2010:blog.post-c583a804a44ae6c8a033187acc5064d61150d0c2</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🎙️ &lt;a href=&quot;https://podcast.clearerthinking.org/episode/250/tee-barnett-getting-a-handle-on-your-goals-and-big-life-changes&quot;&gt;Getting a handle on your goals and big life changes&lt;/a&gt; (Spencer Greenberg &amp;amp; Tee Barnett). There were bits of &amp;quot;manifesting&amp;quot; that I couldn&#39;t totally stomach, but the discussion about burnout was quite good.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Funding science is actually a badass thing to do</title>
      <link href="https://metaist.com/blog/2025/02/funding-science-is-actually-a-badass-thing-to-do.html"/>
      <id>tag:metaist.com,2010:blog.post-2d7a0d11d4eb7bf22b5a45f31187b7158757fdc7</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.experimental-history.com/p/funding-science-is-actually-a-badass&quot;&gt;Funding science is actually a badass thing to do&lt;/a&gt; (Adam Mastroianni). Yep.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Eight Sleep mattress found out to include an SSH backdoor, allowing access to the user&#39;s entire network</title>
      <link href="https://metaist.com/blog/2025/02/eight-sleep-mattress-found-out-to-include-an-ssh-backdoor-allowing-access-to-the-user-s-entire-network.html"/>
      <id>tag:metaist.com,2010:blog.post-4f835d330b28f93509184ea628321eb4d5172231</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://linustechtips.com/topic/1602968-eight-sleep-mattress-found-out-to-include-an-ssh-backdoor-allowing-access-to-the-users-entire-network/&quot;&gt;Eight Sleep mattress found out to include an SSH backdoor, allowing access to the user&#39;s entire network&lt;/a&gt; (ToasterPC / Linus Tech Tips). Forget hoverboards, in this future we can ssh into our mattress covers.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>disabling cert checks: we have not learned much</title>
      <link href="https://metaist.com/blog/2025/02/disabling-cert-checks-we-have-not-learned-much.html"/>
      <id>tag:metaist.com,2010:blog.post-e7c02f7c4eb29565bf48ad935e042f63dd8df3af</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://daniel.haxx.se/blog/2025/02/11/disabling-cert-checks-we-have-not-learned-much/&quot;&gt;disabling cert checks: we have not learned much&lt;/a&gt; (Daniel Stenberg). You see, it&#39;s easier to &lt;em&gt;not.&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Destined For War: Can America and China Escape Thucydides&#39;s Trap?</title>
      <link href="https://metaist.com/blog/2025/02/destined-for-war-can-america-and-china-escape-thucydides-s-trap.html"/>
      <id>tag:metaist.com,2010:blog.post-eae5f297e97bdf66913dc418d7b4be2970091422</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Destined-War-America-Escape-Thucydidess-ebook/dp/B01IAS9FZY&quot;&gt;Destined For War: Can America and China Escape Thucydides&#39;s Trap?&lt;/a&gt; by Graham Allison (via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). Spoiler: Probably not.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Crossing the Chasm, 3rd Edition: Marketing and Selling Disruptive Products to Mainstream Customers</title>
      <link href="https://metaist.com/blog/2025/02/crossing-the-chasm-3rd-edition-marketing-and-selling-disruptive-products-to-mainstream-customers.html"/>
      <id>tag:metaist.com,2010:blog.post-a09cbc857770c8c813b56391090dd8a48eb1cd51</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Crossing-Chasm-3rd-Disruptive-Mainstream-ebook/dp/B00DB3D81G&quot;&gt;Crossing the Chasm, 3rd Edition: Marketing and Selling Disruptive Products to Mainstream Customers&lt;/a&gt; by Geoffrey A. Moore (2014; via Drew Houston). I wonder if the 4th edition will address apps.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Automating Math</title>
      <link href="https://metaist.com/blog/2025/02/automating-math.html"/>
      <id>tag:metaist.com,2010:blog.post-b10b2b3a40387ef4e88593eb5f8d1b0528d9c3b6</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/09/automating-math&quot;&gt;Automating Math&lt;/a&gt; (Adam Marblestone). I&#39;ve been learning more about formal methods.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Algorithms are breaking how we think</title>
      <link href="https://metaist.com/blog/2025/02/algorithms-are-breaking-how-we-think.html"/>
      <id>tag:metaist.com,2010:blog.post-70935d15aba5e09ef77e6988fa303052f54d9145</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;▶️ &lt;a href=&quot;https://youtu.be/QEJpZjg8GuA&quot;&gt;Algorithms are breaking how we think&lt;/a&gt; (Technology Connections). Illustrative example of how our search behavior has changed.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>AI software I&#39;m surprised doesn&#39;t exist yet</title>
      <link href="https://metaist.com/blog/2025/02/ai-software-i-m-surprised-doesn-t-exist-yet.html"/>
      <id>tag:metaist.com,2010:blog.post-d5465e2ef7c2112caa1d1ee3570b4bd8a77edbc0</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://grantslatton.com/ai-software-nonexistence&quot;&gt;AI software I&#39;m surprised doesn&#39;t exist yet&lt;/a&gt; (Grant Slatton). Nice list. If I ever do another &amp;quot;30 apps 30 days&amp;quot; kind of thing, these could serve as an inspiration.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A year of uv: pros, cons, and should you migrate</title>
      <link href="https://metaist.com/blog/2025/02/a-year-of-uv-pros-cons-and-should-you-migrate.html"/>
      <id>tag:metaist.com,2010:blog.post-46e6229e1a16e098b332bd56d2a657a9dab71e51</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.bitecode.dev/p/a-year-of-uv-pros-cons-and-should&quot;&gt;A year of uv: pros, cons, and should you migrate&lt;/a&gt; (Bite Code!). My take: Yes, you should.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A Defense of Weird Research</title>
      <link href="https://metaist.com/blog/2025/02/a-defense-of-weird-research.html"/>
      <id>tag:metaist.com,2010:blog.post-af50515c11d96d995857717c3bf951cda6d8ffb9</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://asteriskmag.com/issues/09/a-defense-of-weird-research&quot;&gt;A Defense of Weird Research&lt;/a&gt; (Deena Mousa &amp;amp; Lauren Gilbert / Asterisk).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>50 Years of Travel Tips</title>
      <link href="https://metaist.com/blog/2025/02/50-years-of-travel-tips.html"/>
      <id>tag:metaist.com,2010:blog.post-efed647da8921266a13499e7cad76e46a9be9ce9</id>
      <published>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Feb 28 2025 11:07:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://kk.org/thetechnium/50-years-of-travel-tips/&quot;&gt;50 Years of Travel Tips&lt;/a&gt; (Kevin Kelly; via Tyler Cowen). Feels well-earned.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Your Face Belongs to Us</title>
      <link href="https://metaist.com/blog/2025/01/your-face-belongs-to-us.html"/>
      <id>tag:metaist.com,2010:blog.post-03c179fc10942d2a8f2982b129a9df3326f6ec7b</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Your-Face-Belongs-Us-Secretive-ebook/dp/B0BQLXNKMQ&quot;&gt;Your Face Belongs to Us&lt;/a&gt; by Kashmir Hill (via Mike Masnick). Sure does.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Why Skyscrapers Became Glass Boxes</title>
      <link href="https://metaist.com/blog/2025/01/why-skyscrapers-became-glass-boxes.html"/>
      <id>tag:metaist.com,2010:blog.post-2fae5ad0c7d0cabfbd4e3db7ae3ee29e977a6f78</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.construction-physics.com/p/why-skyscrapers-became-glass-boxes&quot;&gt;Why Skyscrapers Became Glass Boxes&lt;/a&gt; (Brian Potter). Interesting view into how buildings get made.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Who Gets What—and Why: The New Economics of Matchmaking and Market Design</title>
      <link href="https://metaist.com/blog/2025/01/who-gets-what-and-why-the-new-economics-of-matchmaking-and-market-design.html"/>
      <id>tag:metaist.com,2010:blog.post-e102e3470489f1fecd67027263882124c95f4e2d</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Who-Gets-What-Economics-Matchmaking-ebook/dp/B00LZ7GQJQ&quot;&gt;Who Gets What—and Why: The New Economics of Matchmaking and Market Design&lt;/a&gt; by Alvin E. Roth (2015; via Freakonomics). Really enjoyed learning about these non-monetary markets.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What&#39;s Wrong with the Postmodern Military?</title>
      <link href="https://metaist.com/blog/2025/01/whats-wrong-with-the-postmodern-military.html"/>
      <id>tag:metaist.com,2010:blog.post-ab00906eca50065c7803d05c2dcf9c921b88dd73</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://mosaicmagazine.com/essay/israel-zionism/2025/01/whats-wrong-with-the-postmodern-military/&quot;&gt;What&#39;s Wrong with the Postmodern Military?&lt;/a&gt; (Ran Baratz). Quite long, but a different kind of take on military policy.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>What Goes Without Saying</title>
      <link href="https://metaist.com/blog/2025/01/what-goes-without-saying.html"/>
      <id>tag:metaist.com,2010:blog.post-0ffd07be7dda0319971a8c54384e775051f95b28</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.lesswrong.com/posts/sAcPTiN86fAMSA599/what-goes-without-saying&quot;&gt;What Goes Without Saying&lt;/a&gt; (Sarah Constantin). There&#39;s always someone who needs to hear those things that go without saying. Would also add: It&#39;s ok to say &amp;quot;I don&#39;t know.&amp;quot; Not sure why so many people don&#39;t know this.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Too Perfect</title>
      <link href="https://metaist.com/blog/2025/01/too-perfect.html"/>
      <id>tag:metaist.com,2010:blog.post-d664e10966259c985310fc2ce38907299e1af01f</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Too-Perfect-When-Being-Control-ebook/dp/B0054KMKIG&quot;&gt;Too Perfect&lt;/a&gt; by Jeannette De Wyze (2011; via &lt;strong&gt;Chase Barrette&lt;/strong&gt;). Originally published in 1992, it only shows its age occasionally (fax machines!). Pretty sure the latest DSM reclassifies all these things, but a lot of the advice is good.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The World of the Short Story: A 20th Century Collection</title>
      <link href="https://metaist.com/blog/2025/01/the-world-of-the-short-story-a-20th-century-collection.html"/>
      <id>tag:metaist.com,2010:blog.post-5feb8138db6803e751d29c76b889067e2aedd4b8</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/World-Short-Story-Century-Collection/dp/0395368057&quot;&gt;The World of the Short Story: A 20th Century Collection&lt;/a&gt; by Clifton Fadiman (1986; via &lt;strong&gt;Lana Hynes&lt;/strong&gt;). During the pandemic I remembered that in high school I really liked short stories (efficient storytelling!) and I found this book from the Boston Public Library that was checked out back in September 25, 1993. Well after spending 5 years reading this book at a rate of 3-4 pages per month, I&#39;ve come to realize most short stories are more weird than enjoyable. I need to search around for better stories.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Sovereign Child: How a Forgotten Philosophy Can Liberate Kids and Their Parents</title>
      <link href="https://metaist.com/blog/2025/01/the-sovereign-child-how-a-forgotten-philosophy-can-liberate-kids-and-their-parents.html"/>
      <id>tag:metaist.com,2010:blog.post-2ad6f0dbb3f1f3c7e176e59ecf1968f71062c518</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Sovereign-Child-Forgotten-Philosophy-Liberate-ebook/dp/B0DRZ5C3D9&quot;&gt;The Sovereign Child: How a Forgotten Philosophy Can Liberate Kids and Their Parents&lt;/a&gt; by Aaron Stupple (2025; via Alex Tabarrok). In some fields first-principles thinking works great, but in others it leads to terrible behavior. There are a few good examples of trying to take your kids seriously and using abundance to avoid conflicts, but much of the advice felt wildly impractical (e.g., &amp;quot;just homeschool because waking up at particular time is the source of too much conflict&amp;quot;).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Short Case for Nvidia Stock</title>
      <link href="https://metaist.com/blog/2025/01/the-short-case-for-nvidia-stock.html"/>
      <id>tag:metaist.com,2010:blog.post-a05fbbe0649c1c999145b63a7f59808920d1c9a4</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://youtubetranscriptoptimizer.com/blog/05_the_short_case_for_nvda&quot;&gt;The Short Case for Nvidia Stock&lt;/a&gt; (Jeffrey Emanuel). Point &amp;amp; counterpoint.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Selfish Gene</title>
      <link href="https://metaist.com/blog/2025/01/the-selfish-gene.html"/>
      <id>tag:metaist.com,2010:blog.post-ebd9b30fe086dd99153561ab2f34b1e9e9e88f80</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Selfish-Gene-Anniversary-Landmark-Science-ebook/dp/B01GI5F2FS&quot;&gt;The Selfish Gene&lt;/a&gt; by Richard Dawkins (2016; via Fabric of Reality). You have to read this with all the new endnotes which modify and update bits within the book.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Scientific Virtues</title>
      <link href="https://metaist.com/blog/2025/01/the-scientific-virtues.html"/>
      <id>tag:metaist.com,2010:blog.post-f201372174871d64152fcf499e9c1c144985c2a6</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://slimemoldtimemold.com/2022/02/10/the-scientific-virtues/&quot;&gt;The Scientific Virtues&lt;/a&gt; (Slime Mold Time Mold). A bit extreme, but fun.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Power of No</title>
      <link href="https://metaist.com/blog/2025/01/the-power-of-no.html"/>
      <id>tag:metaist.com,2010:blog.post-de696aaab13caaa1153184dda1c333f8e95cb496</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Power-No-James-Altucher-ebook/dp/B00JU5YAKW&quot;&gt;The Power of No&lt;/a&gt; by James Altucher &amp;amp; Claudia Altucher (2014; via Ryan Holiday). Ever since James ghosted everyone on &lt;em&gt;The Pitch&lt;/em&gt; podcast, I was thinking of removing his books from my reading list. This book increased my desire to do so. Waiting for Tim Ferriss&#39; book about &amp;quot;No&amp;quot; coming out soon.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The MANIAC</title>
      <link href="https://metaist.com/blog/2025/01/the-maniac.html"/>
      <id>tag:metaist.com,2010:blog.post-27b51cc0cd851d9b6c67a2f05bb3c184e7763b4c</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/MANIAC-Benjamin-Labatut-ebook/dp/B0BRMK6615&quot;&gt;The MANIAC&lt;/a&gt; by Benjamin Labatut (2023). Historical fiction about scientists. I had to stop at one point to confirm that the story is fictional.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Immortal Life of Henrietta Lacks</title>
      <link href="https://metaist.com/blog/2025/01/the-immortal-life-of-henrietta-lacks.html"/>
      <id>tag:metaist.com,2010:blog.post-930fb41fac2d3e878192ddf67efbc5b0f1490c69</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Immortal-Life-Henrietta-Lacks-ebook/dp/B00338QENI&quot;&gt;The Immortal Life of Henrietta Lacks&lt;/a&gt; by Rebecca Skloot (2010; via &lt;strong&gt;Daniel Bitran&lt;/strong&gt;). HeLa cells are used throughout medical research. This is the story of how they came to be (and the meta-story of writing the story).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Gift of Asher Lev</title>
      <link href="https://metaist.com/blog/2025/01/the-gift-of-asher-lev.html"/>
      <id>tag:metaist.com,2010:blog.post-802e4ab13ff11c484065ec2509544d3a1d5d686c</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Gift-Asher-Lev-Novel-ebook/dp/B0036S4AL8&quot;&gt;The Gift of Asher Lev&lt;/a&gt; by Chaim Potok (2010). The second in the series. The character has grown up, has a family, still an iconoclast.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Culture Code</title>
      <link href="https://metaist.com/blog/2025/01/the-culture-code.html"/>
      <id>tag:metaist.com,2010:blog.post-063a78e500053b7d011dc232911d76ef0fed92ee</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Culture-Code-Secrets-Highly-Successful-ebook/dp/B01MSY1Y6Z&quot;&gt;The Culture Code&lt;/a&gt; by Daniel Coyle (2018; via The Talent Code). My favorite part was the &amp;quot;How to Build Belonging&amp;quot;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Best Product Engineering Org in the World</title>
      <link href="https://metaist.com/blog/2025/01/the-best-product-engineering-org-in-the-world.html"/>
      <id>tag:metaist.com,2010:blog.post-b05e3a01a7c9c7f94dd0aa31cd28a672834b5a4b</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.jamesshore.com/v2/blog/2025/the-best-product-engineering-org-in-the-world&quot;&gt;The Best Product Engineering Org in the World&lt;/a&gt; (James Shore; via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). From first principles.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>SupGen Demo</title>
      <link href="https://metaist.com/blog/2025/01/supgen-demo.html"/>
      <id>tag:metaist.com,2010:blog.post-7ab2942786d5a1264aac0d5fb253f2b531b33fa9</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;🐦 &lt;a href=&quot;https://x.com/VictorTaelin/status/1881392823246729640&quot;&gt;SupGen Demo&lt;/a&gt; (@VictorTaelin). Very fast symbolic proof finder.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Staying Human: A Jewish Theology for the Age of Artificial Intelligence</title>
      <link href="https://metaist.com/blog/2025/01/staying-human-a-jewish-theology-for-the-age-of-artificial-intelligence.html"/>
      <id>tag:metaist.com,2010:blog.post-f1020423e4c3cb6c3eb226b69b43c52c59ce65f7</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Staying-Human-Theology-Artificial-Intelligence-ebook/dp/B09PFC4RQ2&quot;&gt;Staying Human: A Jewish Theology for the Age of Artificial Intelligence&lt;/a&gt; by Harris Bor (2021; via &lt;strong&gt;Jeremy Wertheimer&lt;/strong&gt;). With a title like that I wouldn&#39;t have expected this book to be 95% Spinoza + 5% Heidegger.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Something Incredibly Wonderful Happens: Frank Oppenheimer and His Astonishing Exploratorium</title>
      <link href="https://metaist.com/blog/2025/01/something-incredibly-wonderful-happens-frank-oppenheimer-and-his-astonishing-exploratorium.html"/>
      <id>tag:metaist.com,2010:blog.post-e4dc10fe353390f1beed82147c936115f56c4cdf</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Something-Incredibly-Wonderful-Happens-Exploratorium-ebook/dp/B0092RICNE&quot;&gt;Something Incredibly Wonderful Happens: Frank Oppenheimer and His Astonishing Exploratorium&lt;/a&gt; by K.C. Cole (2012; via Iridescent Learning). I didn&#39;t know that J. Robert Oppenheimer had a brother who, among other things, worked on uranium enrichment and later in life figured out cool ways to teach people things.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Six Thoughts On AI Safety</title>
      <link href="https://metaist.com/blog/2025/01/six-thoughts-on-ai-safety.html"/>
      <id>tag:metaist.com,2010:blog.post-6194b537a060eb154ee4f86b3f04285f2ab06cb0</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://windowsontheory.org/2025/01/24/six-thoughts-on-ai-safety/&quot;&gt;Six Thoughts On AI Safety&lt;/a&gt; (Boaz Barak). Thoughts indeed.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Sick: A Memoir</title>
      <link href="https://metaist.com/blog/2025/01/sick-a-memoir.html"/>
      <id>tag:metaist.com,2010:blog.post-76779a79fb9a70813ca90c858738342ae7a63c22</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Sick-Memoir-Porochista-Khakpour-ebook/dp/B01MTMQYFB&quot;&gt;Sick: A Memoir&lt;/a&gt; by Porochista Khakpour (via Tyler Cowen). Sad story of Lyme diseases, bad life decisions, and bouncing around the medical system.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Rework</title>
      <link href="https://metaist.com/blog/2025/01/rework.html"/>
      <id>tag:metaist.com,2010:blog.post-58c72c089ca5511664ce6aea65ca4df123675069</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Rework-Jason-Fried-ebook/dp/B002MUAJ2A&quot;&gt;Rework&lt;/a&gt; by Jason Fried &amp;amp; David Heinemeier Hansson (via Iridescent Learning). Collection of bite-sized advice.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Profiles in Courage</title>
      <link href="https://metaist.com/blog/2025/01/profiles-in-courage.html"/>
      <id>tag:metaist.com,2010:blog.post-7dbc2b151cdf98ca239a7b5b8993093f24b61d20</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Profiles-Courage-Classic-Perennial-Classics-ebook/dp/B00GR0CJLA&quot;&gt;Profiles in Courage&lt;/a&gt; by John F. Kennedy (via &lt;strong&gt;Boris Novikov&lt;/strong&gt;). Interesting examples of (mostly) senators standing up for their principles and, generally, being hated for it.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Predictions Scorecard, 2025 January 01</title>
      <link href="https://metaist.com/blog/2025/01/predictions-scorecard-2025-january-01.html"/>
      <id>tag:metaist.com,2010:blog.post-71ba2b0b84223d28ea99465c278d62d5b1be10e3</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://rodneybrooks.com/predictions-scorecard-2025-january-01/&quot;&gt;Predictions Scorecard, 2025 January 01&lt;/a&gt; (Rodney Brooks). Keeping up his long streak.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Poisoning the day</title>
      <link href="https://metaist.com/blog/2025/01/poisoning-the-day.html"/>
      <id>tag:metaist.com,2010:blog.post-720f87eb19efd619f0f5641ea5353d9da4604649</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://ashore.io/journal/crossover-creativity/poisoning-the-day&quot;&gt;Poisoning the day&lt;/a&gt; (Aled Maclean-Jones). A fatalistic approach to productivity. But the idea that you should assume that something will go wrong with your &amp;quot;best laid plans&amp;quot; is sound.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Playing to Win</title>
      <link href="https://metaist.com/blog/2025/01/playing-to-win.html"/>
      <id>tag:metaist.com,2010:blog.post-1631eeb06e7b0ffb32389023ea8300d7cdf746e4</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://spiralprogress.com/2024/11/12/playing-to-win/&quot;&gt;Playing to Win&lt;/a&gt; (Spirals of Progress). Simple test of who is playing to win: &amp;quot;Does their effort generate super funny stories?&amp;quot;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Permanent Record</title>
      <link href="https://metaist.com/blog/2025/01/permanent-record.html"/>
      <id>tag:metaist.com,2010:blog.post-36bd74d3fe6b235cce887cfd495307f4f81e7e21</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Permanent-Record-Edward-Snowden-ebook/dp/B07STQPGH6&quot;&gt;Permanent Record&lt;/a&gt; by Edward Snowden (2019). Courts continue (&lt;a href=&quot;https://www.eff.org/deeplinks/2025/01/victory-federal-court-finally-rules-backdoor-searches-702-data-unconstitutional&quot;&gt;even recently&lt;/a&gt;) find that warrantless wiretapping is unconstitutional.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Patient H.M.</title>
      <link href="https://metaist.com/blog/2025/01/patient-h-m.html"/>
      <id>tag:metaist.com,2010:blog.post-232eb78a663e5b9f07ed00a7980a1eded6929906</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Patient-H-M-Memory-Madness-Secrets-ebook/dp/B01208O00K&quot;&gt;Patient H.M.&lt;/a&gt; by Luke Dittrich (2016; via &lt;strong&gt;Daniel Bitran&lt;/strong&gt;). The story of how we learned about where short-term memory happens. Equal parts &amp;quot;horrible&amp;quot; and &amp;quot;fascinating&amp;quot;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Lexicon</title>
      <link href="https://metaist.com/blog/2025/01/lexicon.html"/>
      <id>tag:metaist.com,2010:blog.post-c13213d56ed738844503486bd31b62face8a47c6</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Lexicon-Novel-Max-Barry-ebook/dp/B00AEBETMK&quot;&gt;Lexicon&lt;/a&gt; by Max Barry (2013; via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). Couple of clever narrative techniques.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Ideaflow</title>
      <link href="https://metaist.com/blog/2025/01/ideaflow.html"/>
      <id>tag:metaist.com,2010:blog.post-74c661e12aca77f2c553b4eb4d637be000d5cb16</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Ideaflow-Only-Business-Metric-Matters-ebook/dp/B09R6M3292&quot;&gt;Ideaflow&lt;/a&gt; by Jeremy Utley &amp;amp; Perry Klebahn (2022). A simple idea: maximizing the number of ideas you have.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Hostage</title>
      <link href="https://metaist.com/blog/2025/01/hostage.html"/>
      <id>tag:metaist.com,2010:blog.post-49e9ca2c345f2ff8f9049a3b59cddfb7724ed865</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Hostage-Elie-Wiesel-ebook/dp/B007EED4DA&quot;&gt;Hostage&lt;/a&gt; by Elie Wiesel (via &lt;strong&gt;Ron Arazi&lt;/strong&gt;). Hard to read given current news.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Factory Farming is Better Than Organic Farming</title>
      <link href="https://metaist.com/blog/2025/01/factory-farming-is-better-than-organic-farming.html"/>
      <id>tag:metaist.com,2010:blog.post-a7d7db795d5513f059d05d181cd9d00632622b00</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://theness.com/neurologicablog/__trashed/&quot;&gt;Factory Farming is Better Than Organic Farming&lt;/a&gt; (Steven Novella). Self-recommending.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Ceremony &amp; Celebration: Introduction to the Holidays</title>
      <link href="https://metaist.com/blog/2025/01/ceremony-celebration-introduction-to-the-holidays.html"/>
      <id>tag:metaist.com,2010:blog.post-11a75b51f5e656649e4a0a4ef84324d6bffb1665</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Ceremony-Celebration-Introduction-Jonathan-Sacks-ebook/dp/B075D88F9L&quot;&gt;Ceremony &amp;amp; Celebration: Introduction to the Holidays&lt;/a&gt; by Rabbi Jonathan Sacks (2017; via &lt;strong&gt;Jay &amp;amp; Cheryl Lamport&lt;/strong&gt;). Lovely as always.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Built to Move</title>
      <link href="https://metaist.com/blog/2025/01/built-to-move.html"/>
      <id>tag:metaist.com,2010:blog.post-70508ec7b5f1e59b74489c10926feef87720f43c</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Built-Move-Essential-Habits-Freely-ebook/dp/B0B5STDSC8&quot;&gt;Built to Move&lt;/a&gt; by Kelly Starrett &amp;amp; Juliet Starrett (2023; via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;). Lots of good advice. Requires a bit of work to incorporate it into your life.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Build It Yourself</title>
      <link href="https://metaist.com/blog/2025/01/build-it-yourself.html"/>
      <id>tag:metaist.com,2010:blog.post-01c643289ec821648d410d80fe092bbdd6dfb86f</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://lucumr.pocoo.org/2025/1/24/build-it-yourself/&quot;&gt;Build It Yourself&lt;/a&gt; (Armin Ronacher). I also prefer fewer dependencies; you just need to avoid &amp;quot;not built here&amp;quot; syndrome.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Big Business: A Love Letter to an American Anti-Hero</title>
      <link href="https://metaist.com/blog/2025/01/big-business-a-love-letter-to-an-american-anti-hero.html"/>
      <id>tag:metaist.com,2010:blog.post-6467365f7c398b85f28d6663b12ec1e76005f166</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Big-Business-Letter-American-Anti-Hero-ebook/dp/B07D2B8MLT&quot;&gt;Big Business: A Love Letter to an American Anti-Hero&lt;/a&gt; by Tyler Cowen (2019). A very Tyler Cowen take.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Becoming Trader Joe: How I Did Business My Way and Still Beat the Big Guys</title>
      <link href="https://metaist.com/blog/2025/01/becoming-trader-joe-how-i-did-business-my-way-and-still-beat-the-big-guys.html"/>
      <id>tag:metaist.com,2010:blog.post-46c3b4001a83521d35ac44d488e493ae57e58a55</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Becoming-Trader-Joe-Business-Still-ebook/dp/B08NHXVSV7&quot;&gt;Becoming Trader Joe: How I Did Business My Way and Still Beat the Big Guys&lt;/a&gt; by Patty Civalleri (2021; via Blas Moros). Very cool story about the precursors to Trader Joe&#39;s (2% of all sales used to be bullets!?) to the calculated way they do everything.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>An Economist Gets Lunch</title>
      <link href="https://metaist.com/blog/2025/01/an-economist-gets-lunch.html"/>
      <id>tag:metaist.com,2010:blog.post-6b3d68968220535ebf040ad3603edb7fe9a84d0a</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/Economist-Gets-Lunch-Everyday-Foodies-ebook/dp/B005GSYYQ2&quot;&gt;An Economist Gets Lunch&lt;/a&gt; by Tyler Cowen (2012; via &lt;strong&gt;Rocky Neumann&lt;/strong&gt;). I learned a lot about food and economics and realized I&#39;m most definitely not a foodie.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>America, Compromised</title>
      <link href="https://metaist.com/blog/2025/01/america-compromised.html"/>
      <id>tag:metaist.com,2010:blog.post-a475cbf7f5717b516d2375bab8690b7c6e03c561</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📖 &lt;a href=&quot;https://www.amazon.com/America-Compromised-Lawrence-Lessig-ebook/dp/B07H9HP32S&quot;&gt;America, Compromised&lt;/a&gt; by Lawrence Lessig (2018; via &lt;strong&gt;Jeffrey Klein&lt;/strong&gt;). Nice definition of corruption and how it applies to various institutions.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>A Young Man Used AI to Build A Nuclear Fusor and Now I Must Weep</title>
      <link href="https://metaist.com/blog/2025/01/a-young-man-used-ai-to-build-a-nuclear-fusor-and-now-i-must-weep.html"/>
      <id>tag:metaist.com,2010:blog.post-867a649e2254833e34885ec96d4e1a723a75415f</id>
      <published>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Jan 31 2025 18:59:59 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;📝 &lt;a href=&quot;https://www.corememory.com/p/a-young-man-used-ai-to-build-a-nuclear&quot;&gt;A Young Man Used AI to Build A Nuclear Fusor and Now I Must Weep&lt;/a&gt; (Ashlee Vance). There is something fascinating about seeing someone use a technology that you also use in a very different way.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Migrate and Upgrade GitLab</title>
      <link href="https://metaist.com/blog/2024/09/migrate-gitlab.html"/>
      <id>tag:metaist.com,2010:blog.post-45e9cbe530b0d34d25bbe8efc093aba41c8e124d</id>
      <published>Mon Sep 30 2024 22:13:02 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Sep 30 2024 22:13:02 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Last week while I was innocently trying to run &lt;code&gt;apt dist-upgrade&lt;/code&gt; on my self-hosted GitLab box, I managed to mess up the kernel in a way that I couldn&#39;t recover. The box was hosted with DigitalOcean, but I was thinking of moving it over to Google Cloud anyway, so now I had no excuse.&lt;/p&gt;
&lt;p&gt;After much searching and trying different things, here is the post I wish I had found.&lt;/p&gt;
&lt;h2 id=&quot;recovery-console&quot; tabindex=&quot;-1&quot;&gt;Recovery Console &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/migrate-gitlab.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, I had to use DigitalOcean&#39;s Recovery Console to get access to the system. They give you temporary credentials to the box which you can use to SSH in. Remember you need to remove the host from &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt; because the recovery console will have a different SSH host key than your normal box.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh-keygen &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;~/.ssh/known_hosts&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gitlab.example.com&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; gitlab.example.com&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The existing disk will be mounted at &lt;code&gt;/dev/vda1&lt;/code&gt;. I recommend making symlinks to make it easier to navigate the disk:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /etc
&lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; /dev/vda1/etc/ssh
&lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; /dev/vda1/etc/gitlab

&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /var/opt
&lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; /dev/vda1/var/opt/gitlab&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;install-gitlab&quot; tabindex=&quot;-1&quot;&gt;Install GitLab &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/migrate-gitlab.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&#39;s setup a new GitLab instance. At first, I created a &lt;code&gt;2 vCPU + 2 GB RAM&lt;/code&gt; box, based on the &lt;a href=&quot;https://docs.gitlab.com/ee/install/requirements.html&quot;&gt;system requirements&lt;/a&gt;. Turns out that wasn&#39;t enough so I bumped it up to &lt;code&gt;4 vCPU + 4 GB RAM&lt;/code&gt;. When &lt;em&gt;that&lt;/em&gt; wasn&#39;t enough, I ended up with &lt;code&gt;4 vCPU + 8 GB RAM&lt;/code&gt;. This is one of the reasons I&#39;m looking into migrating to &lt;a href=&quot;https://about.gitea.com/&quot;&gt;Gitea&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To restore GitLab from a backup, you need to have an instance of GitLab running with the &lt;strong&gt;exact same version number&lt;/strong&gt; (down to the last decimal). This turns out to be more difficult than you might expect.&lt;/p&gt;
&lt;p&gt;The last backup I had was running 16.11.8, but if you try installing that version using the &lt;a href=&quot;https://about.gitlab.com/install/#ubuntu&quot;&gt;Ubuntu install instructions&lt;/a&gt;, you&#39;ll see that that package is no longer supported. So you need to find the correct version on https://packages.gitlab.com/gitlab/gitlab-ee/ and manually install it:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;htop&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; openssh-server ca-certificates tzdata perl
&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; --content-disposition https://packages.gitlab.com/gitlab/gitlab-ee/packages/ubuntu/jammy/gitlab-ee_16.11.8-ee.0_amd64.deb/download.deb
&lt;span class=&quot;token assign-left variable&quot;&gt;EXTERNAL_URL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://gitlab.metaist.com&quot;&lt;/span&gt; dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; gitlab-ee_16.11.8-ee.0_amd64.deb&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;migrate-and-restore&quot; tabindex=&quot;-1&quot;&gt;Migrate &amp;amp; Restore &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/migrate-gitlab.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once that server is up and running we can follow the instructions for &lt;a href=&quot;https://docs.gitlab.com/ee/administration/backup_restore/migrate_to_new_server.html&quot;&gt;GitLab migration&lt;/a&gt; and the &lt;a href=&quot;https://docs.gitlab.com/ee/administration/backup_restore/restore_gitlab.html&quot;&gt;GitLab restoration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First, stop the current server and backup the redis dump.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gitlab-ctl stop
&lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; /var/opt/gitlab/redis/dump.rdb /var/opt/gitlab/redis/dump.rdb.backup
&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; root /var/opt/gitlab/redis /var/opt/gitlab/backups&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Copy these files from the old server to the new server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/var/opt/gitlab/backup/xxxxxxxxx_yyyy_mm_dd_16.11.8-ee_gitlab_backup.tar&lt;/code&gt; (the most recent backup)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/var/opt/gitlab/git-data/repositories/&lt;/code&gt; (all the repository data)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/var/opt/gitlab/gitlab-rails/uploads/&lt;/code&gt; (all the uploaded avatars, etc.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/var/opt/gitlab/redis/dump.rdb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/ssh/*_key&lt;/code&gt; (the server SSH keys)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/gitlab/gitlab-secrets.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/gitlab/ssl/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/gitlab/trusted-certs/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the new server, edit &lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt; and add:&lt;/p&gt;
&lt;pre class=&quot;language-ruby&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;nginx&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&#39;custom_gitlab_server_config&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;location = /api/v4/jobs/request {&#92;n deny all;&#92;n return 503;&#92;n }&#92;n&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fix the permissions and restart the server:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; gitlab-redis /var/opt/gitlab/redis
&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; gitlab-redis:gitlab-redis /var/opt/gitlab/redis/dump.rdb
&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; git:root /var/opt/gitlab/backups
&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; git:git /var/opt/gitlab/backups/*.tar
&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; git:git /var/opt/gitlab/git-data/repositories

gitlab-ctl reconfigure
gitlab-ctl start
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
gitlab-ctl status &lt;span class=&quot;token comment&quot;&gt;# verify&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restore from backup (this will delete and re-create the database) and restart:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gitlab-backup restore &lt;span class=&quot;token assign-left variable&quot;&gt;BACKUP&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;xxxxxxxxx_yyyy_mm_dd_16.11.8-ee
gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.gitlab.com/omnibus/settings/database.html#connecting-to-the-postgresql-database&quot;&gt;Connect to the database&lt;/a&gt; and refresh table stats:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gitlab-rails dbconsole &lt;span class=&quot;token parameter variable&quot;&gt;--database&lt;/span&gt; main&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-sql&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; STATEMENT_TIMEOUT&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ANALYZE&lt;/span&gt; VERBOSE&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run checks:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gitlab-rake gitlab:check &lt;span class=&quot;token assign-left variable&quot;&gt;SANITIZE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true
gitlab-rake gitlab:doctor:secrets
gitlab-rake gitlab:artifacts:check
gitlab-rake gitlab:lfs:check
gitlab-rake gitlab:uploads:check &lt;span class=&quot;token assign-left variable&quot;&gt;VERBOSE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Edit &lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt;, remove:&lt;/p&gt;
&lt;pre class=&quot;language-ruby&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;nginx&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&#39;custom_gitlab_server_config&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;location = /api/v4/jobs/request {&#92;n deny all;&#92;n return 503;&#92;n }&#92;n&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gitlab-ctl reconfigure&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;upgrade&quot; tabindex=&quot;-1&quot;&gt;Upgrade &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/migrate-gitlab.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hopefully, you now have a running GitLab instance and we can try to &lt;a href=&quot;https://docs.gitlab.com/ee/update/#upgrading-to-a-new-major-version&quot;&gt;upgrade GitLab&lt;/a&gt;. One thing I didn&#39;t quite appreciate is that to get to the next major version, you need to install every minor version along the &amp;quot;upgrade path&amp;quot;.&lt;/p&gt;
&lt;p&gt;For example, because the server was at 16.11.8, I first had to install the latest 16.11 version (16.11.10). Then the latest 17.3 (17.3.3). And only &lt;strong&gt;then&lt;/strong&gt; could I upgrade to the latest 17.4 (17.4.1).&lt;/p&gt;
&lt;p&gt;Luckily, by now I knew where to get old versions of GitLab:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; --content-disposition https://packages.gitlab.com/gitlab/gitlab-ee/packages/ubuntu/jammy/gitlab-ee_16.11.10-ee.0_amd64.deb/download.deb
&lt;span class=&quot;token assign-left variable&quot;&gt;EXTERNAL_URL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://gitlab.example.com&quot;&lt;/span&gt; dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; gitlab-ee_16.11.10-ee.0_amd64.deb

&lt;span class=&quot;token comment&quot;&gt;# What&#39;s the latest 17.3?&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;apt-cache&lt;/span&gt; madison gitlab-ee &lt;span class=&quot;token comment&quot;&gt;# =&gt; 17.3.3-ee.0&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; gitlab-ee&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;17.3&lt;/span&gt;.3-ee.0

&lt;span class=&quot;token comment&quot;&gt;# now we can update normally&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; upgrade &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; gitlab-ee&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>pythonoid: Emulating the Python CLI in Python</title>
      <link href="https://metaist.com/blog/2024/09/pythonoid.html"/>
      <id>tag:metaist.com,2010:blog.post-c457d98c840cfdea6f06a8f45ef11ca5821c0193</id>
      <published>Mon Sep 30 2024 18:45:06 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Sep 30 2024 18:45:06 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;When I was a kid, I was fascinated with tools that could build themselves (hence, &amp;quot;Metaist&amp;quot;). I once spent an entire week trying to make the QBasic interface (blue screen, menu bars) &lt;em&gt;within&lt;/em&gt; QBasic. Like you&#39;d press &lt;code&gt;F5&lt;/code&gt; to run the program and you&#39;d end up in a blank QBasic editor screen. I learned a lot about drawing on the screen and capturing key presses.&lt;/p&gt;
&lt;p&gt;Recently, while I was adding self-updating to &lt;a href=&quot;https://metaist.com/blog/2024/09/cosmofy-0.1.0.html&quot;&gt;&lt;code&gt;cosmofy&lt;/code&gt;&lt;/a&gt;, I needed to intercept command-line arguments destined for python. The idea is that if you call the Cosmopolitan app with &lt;code&gt;--self-update&lt;/code&gt;, it will check for updates (e.g., on GitHub) and replace itself with the latest version. Otherwise, it should continue as normal.&lt;/p&gt;
&lt;p&gt;But how much of the &lt;a href=&quot;https://docs.python.org/3/using/cmdline.html&quot;&gt;Python Command-Line Interface&lt;/a&gt; can you implement in Python? Turns out, quite a bit.&lt;/p&gt;
&lt;p&gt;Let&#39;s take a look at the usage:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;-bBdEhiIOPqRsSuvVWx?&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;-c &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; module-name &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; script &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; - &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt;: just print the subset of the &lt;code&gt;--help&lt;/code&gt; message that we implement (since it&#39;s not the full thing)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-i&lt;/code&gt;: go into the REPL after &lt;code&gt;-c&lt;/code&gt;, &lt;code&gt;-m&lt;/code&gt;, or &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; using &lt;a href=&quot;https://docs.python.org/3/library/code.html#code.interact&quot;&gt;&lt;code&gt;code.interact&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-q&lt;/code&gt;: don&#39;t print headers in the REPL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-V&lt;/code&gt;: print &lt;code&gt;sys.version&lt;/code&gt; information (also handle &lt;code&gt;-VV&lt;/code&gt; for printing a little bit more version info)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;: run a command using &lt;code&gt;exec&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt;: run a module using &lt;a href=&quot;https://docs.python.org/3/library/runpy.html#runpy.run_module&quot;&gt;&lt;code&gt;runpy.run_module&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;: run a script using &lt;a href=&quot;https://docs.python.org/3/library/runpy.html#runpy.run_path&quot;&gt;&lt;code&gt;runpy.run_path&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&lt;/code&gt;: read from &lt;code&gt;stdin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next tricky bit is emulating &lt;code&gt;locals&lt;/code&gt; to make sure that they look the same as they do with native python:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__builtins__&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        loader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; __builtins__&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;__loader__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# pragma: no cover&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# During testing, __builtins__ is a dict.&lt;/span&gt;
        loader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; __builtins__&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__loader__

    local&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Dict&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;__name__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;__doc__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;__package__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;__loader__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; loader&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;__spec__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;__annotations__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;__builtins__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; __builtins__&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We also manipulate exceptions to make them look the same as they do with the REPL:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;    sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv
    code &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# execute in the context of the locals&lt;/span&gt;
            args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;q &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; local&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; local&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;q &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;
            runpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run_module&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; local&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; alter_sys&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;script&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;q &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;
            local&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;__loader__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SourceFileLoader
            runpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;script&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; local&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        code &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# NOTE: We skip the calling frame to emulate the CLI better.&lt;/span&gt;
        tb &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exc_info&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        tb_next &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tb&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tb_next &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; tb &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; tb
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;traceback&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;format_exception&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__class__&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tb_next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Putting it all together, you get &lt;a href=&quot;https://github.com/metaist/cosmofy/blob/4961e2033953960fa8d67ae814c10125d12bfc75/src/cosmofy/pythonoid.py#L78&quot;&gt;&lt;code&gt;pythonoid.py&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pythonoid&lt;/code&gt; also has some nice functions for compiling python into a &lt;code&gt;bytearray&lt;/code&gt; that &lt;code&gt;cosmofy&lt;/code&gt; can use to write directly into the bundle.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>cosmofy 0.1.0</title>
      <link href="https://metaist.com/blog/2024/09/cosmofy-0.1.0.html"/>
      <id>tag:metaist.com,2010:blog.post-80c1451e1ab40f12a8d00e4b2dcab7d94195fb9e</id>
      <published>Mon Sep 30 2024 18:31:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Sep 30 2024 18:31:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/releases/tag/0.1.0&quot;&gt;&lt;code&gt;cosmofy 0.1.0&lt;/code&gt;&lt;/a&gt; is available. &lt;a href=&quot;https://github.com/Pugio&quot;&gt;Shalev NessAiver&lt;/a&gt; had a great suggestion to turn my post about &lt;a href=&quot;https://metaist.com/blog/2024/08/packaging-python-with-cosmopolitan.html&quot;&gt;bundling python code into Cosmopolitan apps&lt;/a&gt; into a Cosmopolitan app.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;cosmofy&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=~&lt;/span&gt;/.local/bin/cosmofy
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sSz&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dest&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dest&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  https://github.com/metaist/cosmofy/releases/latest/download/cosmofy
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x &lt;span class=&quot;token variable&quot;&gt;$dest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy&quot;&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;release-notes-0-1-0-2024-09-18t18-55-19z&quot; tabindex=&quot;-1&quot;&gt;Release Notes &lt;a href=&quot;https://github.com/metaist/cosmofy/commits/0.1.0&quot;&gt;0.1.0&lt;/a&gt; - 2024-09-18T18:55:19Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/cosmofy-0.1.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;bootstrap&quot; tabindex=&quot;-1&quot;&gt;Bootstrap &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/cosmofy-0.1.0.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/1&quot;&gt;#1&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/4&quot;&gt;#4&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/12&quot;&gt;#12&lt;/a&gt;: bootstrap cosmofy to build itself&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The primary purpose of this initial release is to be able to use &lt;code&gt;cosmofy&lt;/code&gt; to build &lt;code&gt;cosmofy&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;self-updating&quot; tabindex=&quot;-1&quot;&gt;Self-Updating &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/cosmofy-0.1.0.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/2&quot;&gt;#2&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/6&quot;&gt;#6&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/8&quot;&gt;#8&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/9&quot;&gt;#9&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/13&quot;&gt;#13&lt;/a&gt;: JSON receipt and schema&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/3&quot;&gt;#3&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/cosmofy/issues/5&quot;&gt;#5&lt;/a&gt;: &lt;code&gt;--receipt-url&lt;/code&gt;, &lt;code&gt;--release-url&lt;/code&gt;, &lt;code&gt;--release-version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/7&quot;&gt;#7&lt;/a&gt;: &lt;code&gt;--self-update&lt;/code&gt;, &lt;code&gt;--self-update --help&lt;/code&gt;, &lt;code&gt;--self-update --version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The secondary purpose was to make it easy to add self-updating while bundling the app. I have a &lt;a href=&quot;https://metaist.com/blog/2024/09/pythonoid.html&quot;&gt;longer post describing how &lt;code&gt;cosmofy&lt;/code&gt; intercepts python command line arguments&lt;/a&gt; to check if &lt;code&gt;--self-update&lt;/code&gt; is present in &lt;code&gt;sys.argv&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;releases&quot; tabindex=&quot;-1&quot;&gt;Releases &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/cosmofy-0.1.0.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/10&quot;&gt;#10&lt;/a&gt;: release notes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/cosmofy/issues/11&quot;&gt;#11&lt;/a&gt;: auto-upload build artifacts to GitHub Release&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just some clean up to the release notes (which I kept) and having GitHub build the artifacts itself (which I later reverted).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Google Drive Links: Thunar and Finder</title>
      <link href="https://metaist.com/blog/2024/09/google-drive-links-thunar-and-finder.html"/>
      <id>tag:metaist.com,2010:blog.post-9569e8b1b5b0cd0522345e6cbf25da7e31296189</id>
      <published>Mon Sep 30 2024 17:38:36 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Sep 30 2024 17:38:36 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously: &lt;a href=&quot;https://metaist.com/blog/2024/09/google-drive-links-rclone.html&quot;&gt;Google Drive Links: rclone&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now that I have a script that can take paths on the filesystem and return URLs, I want an easy way to copy those URLs to the clipboard so that I can paste them in emails.&lt;/p&gt;
&lt;h2 id=&quot;generic-copy&quot; tabindex=&quot;-1&quot;&gt;Generic Copy &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/google-drive-links-thunar-and-finder.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first step was to create a generic way of copying to the clipboard on both Linux and macOS.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Platform-agnostic copy HTML to the clipboard.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# See: https://askubuntu.com/a/1227729&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# See: https://stackoverflow.com/a/60768487&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; $@&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;utf8&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$html&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/&amp;lt;[^&gt;]*&gt;//g&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; xclip &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&gt;&lt;/span&gt;/dev/null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Linux&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$html&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; xclip &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; text/html &lt;span class=&quot;token parameter variable&quot;&gt;-selection&lt;/span&gt; clipboard
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; osascript &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&gt;&lt;/span&gt;/dev/null&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# MacOS&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;hexd&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$html&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; hexdump &lt;span class=&quot;token parameter variable&quot;&gt;-ve&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;1/1 &quot;%.2x&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;set the clipboard to «data HTML&lt;span class=&quot;token variable&quot;&gt;${hexd}&lt;/span&gt;»&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; osascript -
        &lt;span class=&quot;token builtin class-name&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;set the clipboard to ((the clipboard as record) &amp;amp; {«class utf8»:&lt;span class=&quot;token entity&quot; title=&quot;&#92;&amp;quot;&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$utf8&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&#92;&amp;quot;&quot;&gt;&#92;&quot;&lt;/span&gt;})&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; osascript -
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

main &lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On Linux, we can just use &lt;code&gt;xclip&lt;/code&gt;, but on macOS you actually need to use ActionScript with a hexadecimal encoding of the HTML.&lt;/p&gt;
&lt;h2 id=&quot;thunar&quot; tabindex=&quot;-1&quot;&gt;Thunar &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/google-drive-links-thunar-and-finder.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next, we create context menus. On Linux, I use Thunar which supports &lt;a href=&quot;https://docs.xfce.org/xfce/thunar/custom-actions&quot;&gt;Custom Actions&lt;/a&gt; (&lt;code&gt;Edit &amp;gt; Configure custom actions...&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basic
&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;Copy GDrive Links&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Command: &lt;code&gt;$HOME/bin/,gdrive-id.py --html %F | $HOME/bin/,copy-html.sh; notify-send &amp;quot;GDrive Links Copied (HTML)&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Appearance Conditions
&lt;ul&gt;
&lt;li&gt;File Pattern: &lt;code&gt;*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Appears if selection contains: (I checked all the items)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because it takes a few seconds to retrieve the URLs, I use &lt;code&gt;notify-send&lt;/code&gt; to make a little notification letting me know that the links can be pasted.&lt;/p&gt;
&lt;figure style=&quot;text-align:center&quot;&gt;
&lt;img src=&quot;https://metaist.com/static/img/2024-09-30-gdrive-links-thunar.png&quot; alt=&quot;Thunar context menu showing copying Google Drive URLs&quot;&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;finder&quot; tabindex=&quot;-1&quot;&gt;Finder &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/09/google-drive-links-thunar-and-finder.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On macOS, we can use &lt;a href=&quot;https://support.apple.com/guide/automator/use-quick-action-workflows-aut73234890a/mac&quot;&gt;Quick Action Workflows&lt;/a&gt;. You may need to &lt;a href=&quot;https://stackoverflow.com/a/65106551&quot;&gt;enable permissions for Finder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Open the &lt;code&gt;Automator&lt;/code&gt; app and create a new &amp;quot;Quick Action&amp;quot;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workflow receives current: &lt;code&gt;files or folders&lt;/code&gt; in &lt;code&gt;any application&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run Shell Script: &lt;code&gt;source ~/.zshrc; python $(which ,gdrive-id.py) --html $@ | $(which ,copy-html.sh)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Display Notification: &lt;code&gt;GDrive Links Copied (HTML)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This creates a &lt;code&gt;.workflow&lt;/code&gt; folder in &lt;code&gt;~/Library/Services&lt;/code&gt; and a context menu in Finder.&lt;/p&gt;
&lt;figure style=&quot;text-align:center; max-width: 100%&quot;&gt;
&lt;img src=&quot;https://metaist.com/static/img/2024-09-30-gdrive-links-finder.png&quot; alt=&quot;Finder context menu showing copying Google Drive URLs&quot;&gt;
&lt;/figure&gt;
</content>
    </entry>
    <entry>
      <title>Google Drive Links: rclone</title>
      <link href="https://metaist.com/blog/2024/09/google-drive-links-rclone.html"/>
      <id>tag:metaist.com,2010:blog.post-2dba92a41a19bf4270b73bf604fc32ed1e85b110</id>
      <published>Mon Sep 30 2024 17:38:21 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Sep 30 2024 17:38:21 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously: &lt;a href=&quot;https://metaist.com/blog/2023/07/google-drive-links.html&quot;&gt;Problem: Google Drive Links&lt;/a&gt;, &lt;a href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;Workspace Add-On&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s been over a year since I wrote a &lt;a href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;Google Drive Workspace Add-On to get multiple links from documents&lt;/a&gt;. However, the add-on was rejected because the video I made didn&#39;t meet their requirements. And while I hope to eventually fix the video and resubmit, I ended up with a completely different solution that I&#39;ve been using on Linux and macOS.&lt;/p&gt;
&lt;p&gt;Let me introduce &lt;a href=&quot;https://rclone.org/&quot;&gt;&lt;code&gt;rclone&lt;/code&gt;&lt;/a&gt;: it&#39;s like &lt;code&gt;sftp&lt;/code&gt; but for every cloud provider, including Google Drive.&lt;/p&gt;
&lt;p&gt;After installing you need to run &lt;code&gt;rclone config&lt;/code&gt; to set up a remote name for the Google Drive you want to interact with. Then create a folder to mount the remote into using &lt;code&gt;rclone mount $name: $GDRIVE_ROOT --daemon&lt;/code&gt;. This works like any other &lt;code&gt;mount&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;I wrote a python script that can take one or more locations relative to &lt;code&gt;$GDRIVE_ROOT&lt;/code&gt; and return HTML that can be pasted into an email. I discuss the relevant bits below.&lt;/p&gt;
&lt;p&gt;First, I define a few objects to describe the input files (&lt;code&gt;PathInfo&lt;/code&gt;), the intermediate data retrieved from &lt;code&gt;rclone&lt;/code&gt; (&lt;code&gt;RCloneInfo&lt;/code&gt;), and the output format with information about &lt;code&gt;gdrive&lt;/code&gt; (&lt;code&gt;GDriveInfo&lt;/code&gt;).&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; NamedTuple

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PathInfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;NamedTuple&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Path
    is_dir&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RCloneInfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;NamedTuple&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    Path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    Name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    Size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# MimeType: str&lt;/span&gt;
    ModTime&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    IsDir&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;
    ID&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GDriveInfo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;NamedTuple&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    url&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;

    &lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@staticmethod&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;from_rclone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; RCloneInfo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return a `GDriveInfo` from an `RCloneInfo`.&quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;https://drive.google.com/open?id=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ID&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I learned how to access a Google Drive document directly from &lt;a href=&quot;https://www.labnol.org/internet/direct-links-for-google-drive/28356/&quot;&gt;Amit Agarwal&#39;s great post on Google Drive URL tricks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next, I define some helper functions to deal with local and remote paths.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Dict
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; List

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;is_relative_to&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;other&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return `True` if `other` is relative to `self`.

    See: https://github.com/python/cpython/blob/41756e3960a38249b9e0076412ef5e08625a7acc/Lib/pathlib.py#L736
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;relative_to&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; ValueError&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;group_by_parent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paths&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Dict&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return a mapping of parent paths mapped to a list of children paths.&quot;&quot;&quot;&lt;/span&gt;
    result&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Dict&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; path &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; paths&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        parent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; parent &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;remote_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Convert a path to a remote path.&quot;&quot;&quot;&lt;/span&gt;
    relpath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;relative_to&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;PATH_GDRIVE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    remote &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;relpath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# first slash becomes a colon&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; remote&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        remote &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# if you&#39;re at the top level&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; remote&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, I define functions for fetching information about &lt;code&gt;gdrive&lt;/code&gt; through &lt;code&gt;rclone&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; subprocess &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; run

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rclone_lsjson&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;remote&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;RCloneInfo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return rclone info about `remote`.&quot;&quot;&quot;&lt;/span&gt;
    cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rclone&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lsjson&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; remote&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;--no-modtime&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;--no-mimetype&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    proc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; capture_output&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;RCloneInfo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; data &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;proc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stdout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gdrive_by_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return info by searching for a path.&quot;&quot;&quot;&lt;/span&gt;
    remote &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; remote_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rclone_lsjson&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;remote&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;from_rclone&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gdrive_by_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Dict&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PathInfo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return info by searching for names in a directory.&quot;&quot;&quot;&lt;/span&gt;
    remote &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; remote_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rclone_lsjson&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;remote&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;from_rclone&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; items
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; props &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IsDir &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_dir
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gdrive_info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paths&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return GDrive url and name for several paths.&quot;&quot;&quot;&lt;/span&gt;
    result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; path &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; paths&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; parent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; children &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; group_by_parent&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;paths&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;children&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; children&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_dir&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;# one child, non-directory&lt;/span&gt;
            path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; children&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gdrive_by_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# multiple children or single directory&lt;/span&gt;
            props &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; PathInfo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_dir&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# assumes unique names&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; p &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; children
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gdrive_by_name&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; props&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path
                result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;v &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; v &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Most of the work is being done by &lt;a href=&quot;https://rclone.org/commands/rclone_lsjson/&quot;&gt;&lt;code&gt;rclone lsjson&lt;/code&gt;&lt;/a&gt; which returns JSON information about specific paths. I learned a lot from &lt;a href=&quot;https://forum.rclone.org/t/get-folder-id-for-google-drive-directory/35480&quot;&gt;this forum post about getting the folder id for a Google Drive path&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing that can be surprising about Google Drive is that it is an ID-based file system so it is possible to have multiple files with the exact same name in the same folder. If we set that aside, the main thing we need is to be able to grab the folder our files are contained in so that we can efficiently query Google Drive for multiple files at once and use the single response to construct our output.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;render_html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; List&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;GDriveInfo&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return a list of items as HTML.&quot;&quot;&quot;&lt;/span&gt;
    result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    pre&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; post &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
    many &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; many&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;ul&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        pre&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; post &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;t&amp;lt;li&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/li&gt;&quot;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&#39;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;pre&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;a href=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; many&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/ul&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inspired by &lt;a href=&quot;https://rhodesmill.org/brandon/2009/commands-with-comma/&quot;&gt;Commands with Comma&lt;/a&gt;, I named this &lt;code&gt;,gdrive-id.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;However, that&#39;s not very accessible. I don&#39;t want to have to open a terminal just to get some URLs. In the next part, I describe how I added context menus in Thunar and macOS Finder to make my life easier.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Radiology &amp; AI</title>
      <link href="https://metaist.com/blog/2024/08/radiology-and-ai.html"/>
      <id>tag:metaist.com,2010:blog.post-514c1464b5e1c899dc1c912da1681f1710b3a8e7</id>
      <published>Sat Aug 31 2024 22:20:27 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Aug 31 2024 22:20:27 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;strong&gt;Jenny Melcher&lt;/strong&gt; writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I just attended a lecture about AI in the field of radiology. I was eager for this lecture because as cool as I think radiology is, it is hard for me to believe that the radiology workforce won&#39;t be drastically devalued by AI assistance and specifically computer vision.&lt;/p&gt;
&lt;p&gt;Because the talk was being given by a radiologist, I was feeling somewhat skeptical, but I tried to go into it with an open mind. However, the talk essentially consisted of examples of tasks that AI fails (not related to radiology). For example, we saw this classic example of AI failing to distinguish between blueberry muffins and dog faces, chat GPT citing fake sources, AI not understanding negation in text, etc.&lt;/p&gt;
&lt;p&gt;I thought this was really disappointing because the talk skewed so far towards AI&#39;s failings and assurances that radiology is still a good field to go into. Other arguments that the lecturer made included things like - people have been saying AI is going to take over for years, but it still hasn&#39;t happened.&lt;/p&gt;
&lt;p&gt;When I read about this on my own, it seems like there is a need for more training data and continued oversight of AI in radiology, but that there &lt;strong&gt;is&lt;/strong&gt; potential for AI to take on a lot of the workload in this field.&lt;/p&gt;
&lt;p&gt;I&#39;m curious to hear if you have any thoughts about this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In my response I mentioned a few aphorisms that come to mind:&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;strong&gt;Slowly at first, and then all at once.&lt;/strong&gt;&amp;quot;&lt;br&gt;
AI advances in medical imaging have been coming in fits and starts, but the progress is gradual and increasing.&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;strong&gt;Things are never as bad as we fear nor as good as we hope.&lt;/strong&gt;&amp;quot;&lt;br&gt;
There&#39;s lots of hype and doom around AI, but both are extreme positions that don&#39;t reflect the underlying reality properly. The reality is that there are real improvements, but it&#39;s also not the end of the world.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Roy_Amara#Amara&#39;s_law&quot;&gt;Amara&#39;s Law&lt;/a&gt;: &amp;quot;&lt;strong&gt;We tend to overestimate the effect of a technology in the short run and underestimate the effect in the long run.&lt;/strong&gt;&amp;quot;&lt;br&gt;
In some domains, we&#39;re approaching the limits of human ability; some of those &lt;a href=&quot;https://www.instagram.com/crystalleigh/p/CX69g5FP_Mh/&quot;&gt;blueberry muffin / dog photos&lt;/a&gt; are confusing even for humans. On the other hand, people have been predicting the end of radiologists for a while and it hasn&#39;t materialized in a noticeable way.&lt;/p&gt;
&lt;p&gt;In summary, I think Radiology as a field isn&#39;t quite done yet, but short of union-style regulations that say that only a human can look at the images, it does seem likely that eventually machines will do that work.&lt;/p&gt;
&lt;img src=&quot;https://metaist.com/static/assets/chihuahua-muffin.jpg&quot; alt=&quot;3x8 grid of images of Chihuahuas and blueberry muffins.&quot;&gt;
</content>
    </entry>
    <entry>
      <title>How to package a python project with Cosmopolitan</title>
      <link href="https://metaist.com/blog/2024/08/packaging-python-with-cosmopolitan.html"/>
      <id>tag:metaist.com,2010:blog.post-12ded3f3b82ed7beda06cbd797524736dc57925c</id>
      <published>Sat Aug 31 2024 22:16:07 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Aug 31 2024 22:16:07 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/jart/cosmopolitan&quot;&gt;Cosmopolitan Libc&lt;/a&gt; is a way of building &lt;a href=&quot;https://justine.lol/ape.html&quot;&gt;Actual Portable Executables&lt;/a&gt; which run, unmodified, on Windows, Linux, and macOS and on multiple architectures.&lt;/p&gt;
&lt;p&gt;I first heard about Cosmopolitan from &lt;a href=&quot;https://simonwillison.net/tags/cosmopolitan/&quot;&gt;Simon Willison&lt;/a&gt; in the context of &lt;a href=&quot;https://github.com/Mozilla-Ocho/llamafile&quot;&gt;llamafile&lt;/a&gt;, but it was &lt;a href=&quot;https://github.com/Pugio&quot;&gt;Shalev NessAiver&lt;/a&gt; who showed me how I could package up my python project into a single executable that can run everywhere.&lt;/p&gt;
&lt;p&gt;There are three main things you need to do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Compile the &lt;code&gt;.py&lt;/code&gt; files to &lt;code&gt;.pyc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add them to the &lt;code&gt;python&lt;/code&gt; executable zip file.&lt;/li&gt;
&lt;li&gt;Add a special &lt;code&gt;.args&lt;/code&gt; file that runs your program instead of the python REPL.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&#39;ll illustrate how this works using &lt;code&gt;ds&lt;/code&gt; which I used to build a Cosmopolitan version of itself.&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# inside your pyproject.toml&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;tool.ds.scripts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;_.env.PKG&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ds&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;_.env.DIR_SITE&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dist/cosmo/Lib/site-packages&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;cosmo-clean&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rm -rf $DIR_SITE || true&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;cosmo-setup&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&quot;
  mkdir -p $DIR_SITE;
  cp -r src/$PKG $DIR_SITE;
  printf -- &quot;-m&#92;&#92;n$PKG&#92;&#92;n...&quot; &gt; dist/cosmo/.args;
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;cosmo-fetch.cwd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dist/cosmo&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;cosmo-fetch.shell&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&quot;
  wget -N https://cosmo.zip/pub/cosmos/bin/python;
  chmod +x python;
  cp python $PKG.zip;
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;cosmo-compile&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&quot;
  ./dist/cosmo/python -m compileall -b $DIR_SITE/$PKG;
  find $DIR_SITE/$PKG -name &quot;*.py&quot; -delete -print;
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;cosmo-update.cwd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dist/cosmo&quot;&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;cosmo-update.shell&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&quot;
  zip -r $PKG.zip .args Lib;
  zip -d $PKG.zip &#39;Lib/site-packages/pip*&#39;;
  zip -d $PKG.zip &#39;usr/*&#39;;
  mv $PKG.zip $PKG;
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;cosmo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cosmo-*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We could, of course, do this as a single command (which is how it currently is in &lt;code&gt;ds&lt;/code&gt;), but I think this example illustrates how &lt;code&gt;ds&lt;/code&gt; works in practice.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;_.env&lt;/code&gt; lines at the beginning set some environment variables for all tasks and &lt;code&gt;cosmo&lt;/code&gt; at the end will run all the tasks that start with &lt;code&gt;cosmo-&lt;/code&gt; (in the order in which they appear in the file).&lt;/p&gt;
&lt;p&gt;First, we have &lt;code&gt;cosmo-clean&lt;/code&gt; which deletes any previous compiled code. Next, &lt;code&gt;cosmo-setup&lt;/code&gt; creates all the necessary directories (and their parents, if missing) and the special &lt;code&gt;.args&lt;/code&gt; file which are the arguments to the &lt;code&gt;python&lt;/code&gt; executable to run so that we don&#39;t trigger the REPL.&lt;/p&gt;
&lt;p&gt;Then &lt;code&gt;cosmo-fetch&lt;/code&gt; downloads the latest Cosmopolitan Python which is a fancy zip file. The &lt;code&gt;wget -N&lt;/code&gt; will only download the file if it is newer than the one we already have. We set the executable bit and copy it to a &lt;code&gt;.zip&lt;/code&gt; extension so that the &lt;code&gt;zip&lt;/code&gt; program can operate on it properly. The place I &lt;a href=&quot;https://github.com/tekknolagi/scrapscript/blob/67b74f2d4f20e913cbc4996c1de4341d6457a8da/build-com#L10&quot;&gt;copied this from&lt;/a&gt; did a clever thing of also downloading a Cosmpolitan Zip which runs everywhere.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cosmo-compile&lt;/code&gt; then uses the Cosmopolitan Python executable to compile all the &lt;code&gt;.py&lt;/code&gt; files into &lt;code&gt;.pyc&lt;/code&gt; and delete all the &lt;code&gt;.py&lt;/code&gt; files. We delete them so that they don&#39;t get added to the &lt;code&gt;.zip&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finally, we add the &lt;code&gt;.args&lt;/code&gt; file and &lt;code&gt;Lib&lt;/code&gt; folder to the &lt;code&gt;.zip&lt;/code&gt;. We remove the pre-packaged &lt;code&gt;pip&lt;/code&gt; and &lt;code&gt;usr/&lt;/code&gt; directories to remove about 3.4 MB of files we don&#39;t need packaged with our executable. We rename the &lt;code&gt;.zip&lt;/code&gt; and we&#39;re done.&lt;/p&gt;
&lt;p&gt;We run this whole process with &lt;code&gt;ds cosmo&lt;/code&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>How long do commands run?</title>
      <link href="https://metaist.com/blog/2024/08/command-duration.html"/>
      <id>tag:metaist.com,2010:blog.post-ab80aaefd27bb864d6c56dc872f263458cd21e75</id>
      <published>Fri Aug 30 2024 17:22:42 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Aug 30 2024 17:22:42 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;One of the most remarkable things about &lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt; is just how fast it is. In fact, &lt;a href=&quot;https://x.com/charliermarsh&quot;&gt;Charlie Marsh&lt;/a&gt; and the Astral team have been such an inspiration, that I got curious about how long commands take.&lt;/p&gt;
&lt;p&gt;So I did the natural thing and updated my &lt;code&gt;~/.bashrc&lt;/code&gt; (I&#39;ll update my &lt;code&gt;.zshrc&lt;/code&gt; soon) to change my prompt to display the number of milliseconds the previous command took.&lt;/p&gt;
&lt;p&gt;At the very top of the file, I define a variable to hold the current time in nanoseconds. Putting this here lets me know how long the &lt;code&gt;.bashrc&lt;/code&gt; itself takes to run.&lt;/p&gt;
&lt;p&gt;Then I used &lt;code&gt;preexec()&lt;/code&gt; to record the start time of every command. To make this work properly, you need to download &lt;a href=&quot;https://github.com/rcaloras/bash-preexec&quot;&gt;&lt;code&gt;bash-preexec&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, I used &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; which will get called to produce my prompt. To add a splash of color (i.e. red if the previous command failed), I used &lt;a href=&quot;https://github.com/metaist/brush&quot;&gt;&lt;code&gt;brush&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Putting it all together:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# very top of ~/.bashrc&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;_time_cmd&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +%s%N&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# &amp;lt;snip&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# https://github.com/metaist/brush&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.local/bin/brush

&lt;span class=&quot;token function-name function&quot;&gt;preexec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# record command start time&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;_time_cmd&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt; +%s%N&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;token assign-left variable&quot;&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;__prompt_command
&lt;span class=&quot;token function-name function&quot;&gt;__prompt_command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# must be first line in this function&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;[&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;]0;&#92;w&lt;span class=&quot;token entity&quot; title=&quot;&#92;a&quot;&gt;&#92;a&lt;/span&gt;&#92;]&lt;span class=&quot;token entity&quot; title=&quot;&#92;n&quot;&gt;&#92;n&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# set terminal title&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# &amp;lt;snip&gt;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# add run time of previous command (in red if error)&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;brush reset&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$code&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;brush bgRed&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;date &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;s&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;N&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; $_time_cmd &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt;ms
    &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;brush reset&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# &amp;lt;snip&gt;&lt;/span&gt;

    &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PS1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;&#92;n&quot;&gt;&#92;n&lt;/span&gt;&#92;$ &quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# &amp;lt;snip&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# https://github.com/rcaloras/bash-preexec&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.bash-preexec.sh &lt;span class=&quot;token comment&quot;&gt;# must be last import&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# very bottom&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>Changed My Mind: Lifecycle Events and call-style Tasks</title>
      <link href="https://metaist.com/blog/2024/08/changed-my-mind-lifecycle-and-call.html"/>
      <id>tag:metaist.com,2010:blog.post-74a933caa52599415ab0ea30448c0208a6dc6129</id>
      <published>Fri Aug 30 2024 16:40:06 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Aug 30 2024 16:40:06 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;This is another post about building the &lt;a href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;latest release of &lt;code&gt;ds&lt;/code&gt;&lt;/a&gt;. There were two features that many task runners support that I specifically had chosen to &lt;strong&gt;not support&lt;/strong&gt;: lifecycle events and &lt;code&gt;call&lt;/code&gt;-style tasks. However, the latest release gave me a chance to try two different approaches to supporting these features.&lt;/p&gt;
&lt;h2 id=&quot;lifecycle-events&quot; tabindex=&quot;-1&quot;&gt;Lifecycle Events &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/changed-my-mind-lifecycle-and-call.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many task runners have the concept of pre- and post-task events. Like if you run &lt;code&gt;pnpm publish&lt;/code&gt; it will also call &lt;code&gt;pnpm prepublish&lt;/code&gt; before the task runs and &lt;code&gt;pnpm postpublish&lt;/code&gt; afterwards.&lt;/p&gt;
&lt;p&gt;The main reason I don&#39;t like this feature is that it obscures the relationship between tasks. In &lt;code&gt;ds&lt;/code&gt;, you can be more explicit about the relationship:&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;tool.ds.scripts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;publish&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;prepublish&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;publish-magic-happens-here&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;postpublish&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So in previous version of &lt;code&gt;ds&lt;/code&gt;, I simply said you have to be more explicit. However, I&#39;ve been watching how &lt;code&gt;uv&lt;/code&gt; has been working on experimental features and how they support &lt;strong&gt;explicit opt-in&lt;/strong&gt; for features that they don&#39;t support philosophically. For example, they added &lt;code&gt;--system&lt;/code&gt; as a way of finding the system-level python which goes against their general philosophy of detecting and activating a virtual environment.&lt;/p&gt;
&lt;p&gt;So I decided to add two experimental options &lt;code&gt;--pre&lt;/code&gt; and &lt;code&gt;--post&lt;/code&gt; to let you control whether those tasks run. &lt;code&gt;pnpm&lt;/code&gt; has a very complex mechanism for selecting which pre-/post-tasks run, but I&#39;ll start simple: either you get them all or none.&lt;/p&gt;
&lt;p&gt;I still don&#39;t do any language-specific lifecycle events (e.g., &lt;code&gt;ds install&lt;/code&gt; doesn&#39;t call some magical list of &lt;em&gt;other&lt;/em&gt; tasks).&lt;/p&gt;
&lt;h2 id=&quot;call-style-tasks&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;call&lt;/code&gt;-style tasks &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/changed-my-mind-lifecycle-and-call.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Which brings me to another file &amp;amp; language-specific feature: &lt;code&gt;call&lt;/code&gt; tasks. These usually let you load and invoke a function in an installed package. For example, in &lt;code&gt;pdm&lt;/code&gt; you can write:&lt;/p&gt;
&lt;pre class=&quot;language-toml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;tool.pdm.scripts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;foobar&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token key property&quot;&gt;call&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;foo_package.bar_module:main&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Before I created &lt;a href=&quot;https://github.com/metaist/ds/issues/77&quot;&gt;file-specific parsers&lt;/a&gt;, there were two reasons I didn&#39;t support these kinds of tasks.&lt;/p&gt;
&lt;p&gt;First, &lt;strong&gt;it obscures what actually gets called&lt;/strong&gt;. That example above would be converted into:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &#39;import sys&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;import&lt;/span&gt; foo_package.bar_module as _1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; sys.exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_1.main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And second, how could I know ahead of time which language was being invoked? After all, &lt;code&gt;composer.json&lt;/code&gt; has a similar style for invoking &lt;code&gt;php&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;Switching to file-specific parsers solved this problem. If you use &lt;code&gt;pyproject.toml&lt;/code&gt;, you must want &lt;code&gt;python&lt;/code&gt; and in &lt;code&gt;composer.json&lt;/code&gt; it&#39;s &lt;code&gt;php&lt;/code&gt;. And if you use a generic file like &lt;code&gt;ds.toml&lt;/code&gt;, then I&#39;ll throw a &lt;code&gt;SyntaxError&lt;/code&gt; because it&#39;s unclear what you&#39;re trying to do.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Formatting Bash Commands</title>
      <link href="https://metaist.com/blog/2024/08/formatting-bash.html"/>
      <id>tag:metaist.com,2010:blog.post-f051b4ae5b16034ef75abc6ddd19ba9d76ad44dc</id>
      <published>Fri Aug 30 2024 16:35:29 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Aug 30 2024 16:35:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;While I was working on the &lt;a href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;latest release of &lt;code&gt;ds&lt;/code&gt;&lt;/a&gt;, I thought it would be nice to format the command that is about to be run. This is particularly true in files like &lt;code&gt;package.json&lt;/code&gt; that don&#39;t support multi-line strings. And even those formats that do (e.g., &lt;code&gt;.toml&lt;/code&gt;), escaping the newline also strips leading whitespace of the following line which makes commands hard to format (or you need to escape the slash).&lt;/p&gt;
&lt;p&gt;Here are three examples of actual commands:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1&lt;/strong&gt;: Command with lots of options:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rf&lt;/span&gt; docs&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; docs&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
pdoc &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --output-dir docs &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--config&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;sort_identifiers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;False &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--config&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;show_inherited_members&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;True &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt; src/&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basename&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;$(&lt;/span&gt;pwd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; docs/**/* docs/&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; docs/.nojekyll&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example 2&lt;/strong&gt;: Lots of short commands in a row:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;release: &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; tag &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push --tags&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout main&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; merge --no-ff --no-edit prod&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example 3&lt;/strong&gt;: Chain of &lt;code&gt;pnpm&lt;/code&gt; commands:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run lint:spell &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run lint:tsc &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run lint:format&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So my initial though was to split on &lt;code&gt;;&lt;/code&gt;, remove line continuations, and wrap the command as we went.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wrap_cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;79&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; indent&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; split_on&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Wrap a command-line command.&quot;&quot;&quot;&lt;/span&gt;
    command_continue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &#92;&#92;&#92;n&quot;&lt;/span&gt;

    lines &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;&#92;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    commands &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; c &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;split_on&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    last_idx &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;commands&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; idx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; command &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;commands&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        new_cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; command&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
            check &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; line &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; item
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;check&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; check
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
            new_cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            new_cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; new_cmd&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            lines&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;command_continue&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; indent&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new_cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;split_on &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; idx &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; last_idx &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; command_continue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lines&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&#92;n&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; indent&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem is that example 3 doesn&#39;t have any semicolons. So then I worked on a function where we could specify which tokens prefer breaks (this is some code I had in a scratch pad).&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;NO_CONTINUE &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;;; &amp;amp;&amp;amp; |&amp;amp; || ; &amp;amp; |&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
PREFER_BREAK &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;; &amp;amp;&amp;amp;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
CONTINUE_LINE &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;&#92;&#92;n&quot;&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;peek_end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;haystack&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;needles&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; needle &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; needles&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; haystack&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;needle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; needle
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;


width &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;78&lt;/span&gt;
line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
cmd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cmd3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;CONTINUE_LINE&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
    check &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; line &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; item
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;check&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; check
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; peek_end&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;PREFER_BREAK&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# need new line&lt;/span&gt;
    result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; peek_end&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;NO_CONTINUE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;CONTINUE_LINE&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; peek_end&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;PREFER_BREAK&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# needs indent&lt;/span&gt;
        line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;  &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But then I had problems with indentation. So here&#39;s the solution I&#39;m currently using. It&#39;s far from perfect, but it basically works for most cases I have so far:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; re
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; os &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; get_terminal_size

SHELL_BREAK &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;; &amp;amp;&amp;amp;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Prefer line breaks after these.&quot;&quot;&quot;&lt;/span&gt;

SHELL_CONTINUE &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;&#92;&#92;n&quot;&lt;/span&gt;
&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Line continuation.&quot;&quot;&quot;&lt;/span&gt;

SHELL_TERMINATORS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;;; &amp;amp;&amp;amp; |&amp;amp; || ; &amp;amp; |&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;No line continuation needed after these.&quot;&quot;&quot;&lt;/span&gt;

RE_SPLIT &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;r&quot;&quot;&quot;(
    (?&amp;lt;!&#92;&#92;)             # not preceded by backslash
    (?:
        (?:&#39;[^&#39;]*&#39;)     # single quoted
        |(?:&#92;&quot;[^&#92;&quot;]*&#92;&quot;) # double quoted
        |[&#92;s;&amp;amp;]+        # one or more space, semicolon or ampersand
    ))&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    flags&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;VERBOSE&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Regex for splitting commands.&quot;&quot;&quot;&lt;/span&gt;


DEFAULT_WIDTH &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Default width for wrapping commands.&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    DEFAULT_WIDTH &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; get_terminal_size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;columns &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; OSError&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    DEFAULT_WIDTH &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;peek_end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;haystack&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;needles&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return the first `needle` that ends `haystack`.

    &gt;&gt;&gt; peek_end(&quot;abc&quot;, &quot;a&quot;, &quot;b&quot;, &quot;c&quot;)
    &#39;c&#39;
    &gt;&gt;&gt; peek_end(&quot;abc&quot;, &quot;x&quot;)
    &#39;&#39;
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; needle &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; needles&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; haystack&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;needle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; needle
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wrap_cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; width&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DEFAULT_WIDTH&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Return a nicely wrapped command.&quot;&quot;&quot;&lt;/span&gt;
    result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
    space &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; RE_SPLIT&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SHELL_CONTINUE&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

        check &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; line &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; item
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;;;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            check &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;check&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; width &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; check
            &lt;span class=&quot;token comment&quot;&gt;# Coverage incorrectly thinks this branch is not covered.&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;# See: nedbatchelder.com/blog/202406/coverage_at_a_crossroads.html&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; peek_end&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;SHELL_BREAK&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# pragma: no cover&lt;/span&gt;
                result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# How should we terminate this line?&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; peek_end&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;SHELL_TERMINATORS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# no continuation&lt;/span&gt;
            result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#92;n&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;SHELL_CONTINUE&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# Indent next line?&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; space &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; peek_end&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;SHELL_TERMINATORS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;space&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item  &lt;span class=&quot;token comment&quot;&gt;# next line&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# add last line&lt;/span&gt;
        result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&#92;n&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;space&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>ds 1.3.0</title>
      <link href="https://metaist.com/blog/2024/08/ds-1.3.0.html"/>
      <id>tag:metaist.com,2010:blog.post-505dae64fb3ecc6a8a3d04e26ee2dfed913b266d</id>
      <published>Fri Aug 30 2024 16:35:23 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Aug 30 2024 16:35:23 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ds/releases/tag/1.3.0&quot;&gt;&lt;code&gt;ds 1.3.0&lt;/code&gt;&lt;/a&gt; is available. This release represents a shift from only supporting the overlap of all file formats to specific parsers for each supported format.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;ds&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ds-run

&lt;span class=&quot;token comment&quot;&gt;# or, if you use uv:&lt;/span&gt;
uv tool &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ds-run

&lt;span class=&quot;token comment&quot;&gt;# or, install the standalone version:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-O&lt;/span&gt; ~/.local/bin/ds &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; https://github.com/metaist/ds/releases/latest/download/ds
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x ~/.local/bin/ds&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ds&quot;&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;combined-release-notes-1-1-0-1-2-0-1-3-0-2024-08-29t13-08-58z&quot; tabindex=&quot;-1&quot;&gt;Combined Release Notes &lt;a href=&quot;https://github.com/metaist/ds/compare/1.0.0...1.1.0&quot;&gt;1.1.0&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/ds/compare/1.1.0...1.2.0&quot;&gt;1.2.0&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/ds/compare/1.2.0...1.3.0&quot;&gt;1.3.0&lt;/a&gt; - 2024-08-29T13:08:58Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Unlike the official &lt;a href=&quot;https://github.com/metaist/ds/blob/main/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;, these notes are organized by feature.&lt;/p&gt;
&lt;h3 id=&quot;documentation&quot; tabindex=&quot;-1&quot;&gt;Documentation &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/53&quot;&gt;#53&lt;/a&gt;: changed &lt;code&gt;README.md&lt;/code&gt; to have a quicker start section&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got some feedback from &lt;a href=&quot;https://github.com/Pugio&quot;&gt;Shalev NessAiver&lt;/a&gt; that many HackerNews comments often complain that it takes too long to see real examples, so I tried to illustrate a bunch of salient examples up top.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/69&quot;&gt;#69&lt;/a&gt;: added documentation for why branch coverage is disabled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I often strive to get 100% branch coverage in unit tests, so if I disable branch coverage, I want to remember why (e.g., hard to model catching &lt;code&gt;CTRL+C&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;logging&quot; tabindex=&quot;-1&quot;&gt;Logging &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/76&quot;&gt;#76&lt;/a&gt;: fixed logging in normal and debug modes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/79&quot;&gt;#79&lt;/a&gt;: added more helpful debug messages (e.g., how to enable / disable options)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are three kinds of logging I use:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tracing execution flow: Where did execution reach?&lt;/li&gt;
&lt;li&gt;Reporting changes of state: What is the state of the system?&lt;/li&gt;
&lt;li&gt;Providing information content: What useful things should you know?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One thing I think is interesting is providing some guidance (usually behind a &lt;code&gt;--debug&lt;/code&gt; flag) is providing information about how to enable or disable particular behavior. This is particularly helpful when you wonder about why the program is behaving a certain way.&lt;/p&gt;
&lt;h2 id=&quot;install&quot; tabindex=&quot;-1&quot;&gt;Install &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/14&quot;&gt;#14&lt;/a&gt;: added instructions for using &lt;code&gt;uv&lt;/code&gt; in &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/30&quot;&gt;#30&lt;/a&gt;: added &lt;code&gt;uv&lt;/code&gt;, &lt;code&gt;uvx&lt;/code&gt;, and &lt;code&gt;pipx&lt;/code&gt; instructions to &lt;code&gt;README.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is emerging as the dominant alternative to &lt;code&gt;pip&lt;/code&gt; and all the other python project management tools.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/31&quot;&gt;#31&lt;/a&gt;: added Cosmopolitan Python build; Actually Portable Executable&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/72&quot;&gt;#72&lt;/a&gt;: Cosmopolitan instructions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Pugio&quot;&gt;Shalev NessAiver&lt;/a&gt; helped me figure out the two things I needed to build a truly cross-platform (Linux, macOS, Windows) binary executable (using &lt;a href=&quot;https://github.com/jart/cosmopolitan&quot;&gt;Cosmopolitan&lt;/a&gt;), which is actually just a very carefully crafted zip file:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The special zip commands to add files to the packaged python.&lt;/li&gt;
&lt;li&gt;How to add arguments so that &lt;code&gt;ds&lt;/code&gt; runs instead of the python REPL.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With this release &lt;code&gt;ds&lt;/code&gt; can be installed in three ways: via &lt;code&gt;pip&lt;/code&gt;, as a &lt;code&gt;uv tool&lt;/code&gt;, and as a standalone binary.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2024/08/packaging-python-with-cosmopolitan.html&quot;&gt;Read more about packaging python projects with Cosmopolitan&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;task-description&quot; tabindex=&quot;-1&quot;&gt;Task Description &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/58&quot;&gt;#58&lt;/a&gt;: added &lt;code&gt;help&lt;/code&gt; task option to display description when using &lt;code&gt;--list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/61&quot;&gt;#61&lt;/a&gt;: improved command wrapping for &lt;code&gt;--list&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;help&lt;/code&gt; is inspired by &lt;code&gt;pdm&lt;/code&gt;; adding the command wrapping made it somewhat nicer to look at the output of &lt;code&gt;ds&lt;/code&gt; as it&#39;s running. I wrote a &lt;a href=&quot;https://metaist.com/blog/2024/08/formatting-bash.html&quot;&gt;related post on figuring out how to do wrap bash commands&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;task-environment&quot; tabindex=&quot;-1&quot;&gt;Task Environment &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/51&quot;&gt;#51&lt;/a&gt;: added &lt;code&gt;--env&lt;/code&gt; and &lt;code&gt;--env-file&lt;/code&gt; command-line option together with &lt;code&gt;env&lt;/code&gt; and &lt;code&gt;env-file&lt;/code&gt;/&lt;code&gt;env_file&lt;/code&gt; task options for passing environment variables to tasks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/83&quot;&gt;#83&lt;/a&gt;: moved &lt;code&gt;env_file&lt;/code&gt; loading later (during run) instead of earlier (during parsing)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/84&quot;&gt;#84&lt;/a&gt;: changed passing &lt;code&gt;env&lt;/code&gt; values to &lt;code&gt;str&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Moving &lt;code&gt;env_file&lt;/code&gt; loading later lets you generate that file in some task and letting another task read that file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/60&quot;&gt;#60&lt;/a&gt;: added &lt;code&gt;cwd&lt;/code&gt; / &lt;code&gt;working_dir&lt;/code&gt; task option for where tasks should run&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The purpose of this feature is to let you use a config file in one directory and executes the tasks in another directory (i.e. not the directory containing the config file).&lt;/p&gt;
&lt;h2 id=&quot;task-formats&quot; tabindex=&quot;-1&quot;&gt;Task Formats &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/68&quot;&gt;#68&lt;/a&gt;: added support for simplified &lt;code&gt;Makefile&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/72&quot;&gt;#72&lt;/a&gt;: fixed &lt;code&gt;Makefile&lt;/code&gt; links&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jhostyk&quot;&gt;Joe Hostyk&lt;/a&gt; convinced me to support a minimal subset of the &lt;code&gt;Makefile&lt;/code&gt; format. Many people use &lt;code&gt;make&lt;/code&gt; as a way to alias long commands with a short name. I implemented the aliasing and composites and a few other features when they were relatively easy to implement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/71&quot;&gt;#71&lt;/a&gt;: fixed allowing &lt;code&gt;composite&lt;/code&gt; (prerequisites) and &lt;code&gt;shell&lt;/code&gt; (recipe) within a single task&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While I was implementing the &lt;code&gt;Makefile&lt;/code&gt; format, I realized that while I allow both &lt;code&gt;composite&lt;/code&gt; and &lt;code&gt;cmd/shell&lt;/code&gt; properties on tasks when &lt;em&gt;running&lt;/em&gt; the task, I didn&#39;t allow them in the &lt;em&gt;parser&lt;/em&gt;. So I fixed that to more clearly communicate the intent that &lt;code&gt;composite&lt;/code&gt; represents perquisites that run before &lt;code&gt;cmd/shell&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/59&quot;&gt;#59&lt;/a&gt;: added support for &lt;code&gt;pdm&lt;/code&gt;-style &lt;code&gt;{args}&lt;/code&gt; during argument interpolation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This style turned out to be helpful for formats like &lt;code&gt;Makefile&lt;/code&gt; which use &lt;code&gt;$@&lt;/code&gt; to mean something else.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/66&quot;&gt;#66&lt;/a&gt;: added support for &lt;code&gt;uv&lt;/code&gt; workspaces&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inspired by &lt;code&gt;Cargo&lt;/code&gt; and easy to support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/82&quot;&gt;#82&lt;/a&gt;: added support for &lt;code&gt;poetry&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;poetry&lt;/code&gt; only really supports a single version of the python &lt;code&gt;call&lt;/code&gt; format. Previously, I was was against supporting &lt;code&gt;call&lt;/code&gt;-type tasks because they are language-specific and I had a universal parser for all the file formats. However, once I implemented &lt;a href=&quot;https://github.com/metaist/ds/issues/77&quot;&gt;#77&lt;/a&gt; and every file format got its own parser, I could reintroduce the concept of language-specific features, and so I added &lt;code&gt;poetry&lt;/code&gt; back in.&lt;/p&gt;
&lt;h2 id=&quot;task-runner&quot; tabindex=&quot;-1&quot;&gt;Task Runner &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.3.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/24&quot;&gt;#24&lt;/a&gt;: added &lt;code&gt;--pre&lt;/code&gt; and &lt;code&gt;--post&lt;/code&gt; options to run pre-/post- tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several of the formats support some kind of lifecycle event. I was reluctant to add support for these because they obscure the flow of execution. However, I ended up deciding that I could have people explicitly opt-in to running additional tasks with command-line options. See my &lt;a href=&quot;https://metaist.com/blog/2024/08/changed-my-mind-lifecycle-and-call.html&quot;&gt;separate post on how I changed my mind about lifecycle events&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/55&quot;&gt;#55&lt;/a&gt;: added &lt;code&gt;--dry-run&lt;/code&gt; command-line option to show which tasks would be run&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unlike &lt;code&gt;--list&lt;/code&gt;, &lt;code&gt;--dry-run&lt;/code&gt; will show you the actual command that is about to run (will full argument interpolation, etc.).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/57&quot;&gt;#57&lt;/a&gt;: added support for glob-like task selector from the command line and in composite tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I really didn&#39;t like &lt;code&gt;pnpm&lt;/code&gt;&#39;s solution to use a regex to specify which tasks to run and using globs has felt very natural.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/64&quot;&gt;#64&lt;/a&gt;: changed allowing shell commands directly when calling ds, e.g., &lt;code&gt;ds &#39;echo hello&#39;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Originally, I thought this was a weird thing to allow and had a special flag to disable it. But now with &lt;a href=&quot;https://github.com/metaist/ds/issues/73&quot;&gt;#73&lt;/a&gt; and &lt;a href=&quot;https://github.com/metaist/ds/issues/74&quot;&gt;#74&lt;/a&gt;, I routinely just want to execute a command in the context of the project (e.g., &lt;code&gt;ds &#39;echo $PATH&#39;&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/65&quot;&gt;#65&lt;/a&gt;: &lt;code&gt;ds&lt;/code&gt; now respects the value of the &lt;code&gt;SHELL&lt;/code&gt; environment variable when running tasks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/65&quot;&gt;#65&lt;/a&gt;: tried to detect current &lt;code&gt;SHELL&lt;/code&gt; on Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Detecting the &lt;code&gt;SHELL&lt;/code&gt; turned out to be surprisingly easy for POSIX machines and hilariously difficult on Windows. I&#39;ve kept the Windows code as &amp;quot;EXPERIMENTAL&amp;quot; because I don&#39;t have a good way of testing it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/73&quot;&gt;#73&lt;/a&gt;: added search for nearby &lt;code&gt;node_modules/.bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/74&quot;&gt;#74&lt;/a&gt;, &lt;a href=&quot;https://github.com/metaist/ds/issues/78&quot;&gt;#78&lt;/a&gt;: added search for nearby &lt;code&gt;venv&lt;/code&gt; if &lt;code&gt;VIRTUAL_ENV&lt;/code&gt; is not set&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/75&quot;&gt;#75&lt;/a&gt;: added &lt;code&gt;--no-project&lt;/code&gt; option to suppress searching project dependencies&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/87&quot;&gt;#87&lt;/a&gt;: moved project detection (&lt;code&gt;venv&lt;/code&gt;, &lt;code&gt;node_modules/.bin&lt;/code&gt;) earlier (right before top-level task run) instead of later (right before command run)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Pugio&quot;&gt;Shalev NessAiver&lt;/a&gt; provided some feedback to the &lt;a href=&quot;https://github.com/metaist/ds/compare/1.1.0...1.2.0&quot;&gt;1.2.0&lt;/a&gt; release suggesting that the project-specific folders should be on the &lt;code&gt;PATH&lt;/code&gt; without having to activate or otherwise specify them. Currently only project folders for &lt;code&gt;node&lt;/code&gt; and &lt;code&gt;python&lt;/code&gt; are supported, but this could easily extend to &lt;code&gt;php&lt;/code&gt;. One question that is still somewhat open is under which conditions the searches should take place. I&#39;d also like a way to move the logic of the search into the respective file formats, but I don&#39;t have a clean way to do that yet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/77&quot;&gt;#77&lt;/a&gt;: refactored parsers, runner; each file format now has its own parser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was the most significant bit of work for this release that barely added any new features. The main goal was to try and parse each file format as strictly as possible while supporting the general goal. A few features that got added were &lt;code&gt;call&lt;/code&gt; for &lt;code&gt;pdm&lt;/code&gt;/&lt;code&gt;rye&lt;/code&gt;/&lt;code&gt;composer&lt;/code&gt; and argument sharing from &lt;code&gt;pdm&lt;/code&gt;. I wrote a post about &lt;a href=&quot;https://metaist.com/blog/2024/08/changed-my-mind-lifecycle-and-call.html&quot;&gt;how I changed my mind about &lt;code&gt;call&lt;/code&gt;-style tasks&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/75&quot;&gt;#75&lt;/a&gt;: added &lt;code&gt;--no-config&lt;/code&gt; option to suppress searching for config files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/77&quot;&gt;#77&lt;/a&gt;: removed &lt;code&gt;.ds.toml&lt;/code&gt; as a supported file format name&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/80&quot;&gt;#80&lt;/a&gt;: changed config file search order&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During work on &lt;a href=&quot;https://github.com/metaist/ds/issues/77&quot;&gt;#77&lt;/a&gt;, I cleaned up the search order and removed the never-used &lt;code&gt;.ds.toml&lt;/code&gt; file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/81&quot;&gt;#81&lt;/a&gt;: renamed environment variable &lt;code&gt;_DS_CURRENT_FILE&lt;/code&gt; to &lt;code&gt;DS_INTERNAL__FILE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While reading bits of the &lt;code&gt;uv&lt;/code&gt; codebase, I saw this naming convention and decided to switch to it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/67&quot;&gt;#67&lt;/a&gt;: added &lt;code&gt;uv run&lt;/code&gt; command that runs tests against all supported Python versions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This became the topic of my &lt;a href=&quot;https://x.com/TheMetaist/status/1826262711971520861&quot;&gt;most-liked tweet&lt;/a&gt;. The point isn&#39;t to run this all the time, but to simulate what GitHub Actions does when running all my tests on every supported version of python.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I know you&amp;#39;re supposed to use `nox` to run your unit tests on multiple versions of python, but I just tried using `uv run` and it works! (2 min for 5 versions of python) Now the bottleneck is pytest (and mypy/pyright, but ruff will eventually do this, right &lt;a href=&quot;https://twitter.com/charliermarsh?ref_src=twsrc%5Etfw&quot;&gt;@charliermarsh&lt;/a&gt;?) &lt;a href=&quot;https://t.co/koFzxoyLQp&quot;&gt;pic.twitter.com/koFzxoyLQp&lt;/a&gt;&lt;/p&gt;&amp;mdash; Metaist (@TheMetaist) &lt;a href=&quot;https://twitter.com/TheMetaist/status/1826262711971520861?ref_src=twsrc%5Etfw&quot;&gt;August 21, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/70&quot;&gt;#70&lt;/a&gt;: simplified &lt;code&gt;CI.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just some clean up.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>ds 1.0.0</title>
      <link href="https://metaist.com/blog/2024/08/ds-1.0.0.html"/>
      <id>tag:metaist.com,2010:blog.post-8f622d26d1ad67db9d75260c447d3f97df41edd4</id>
      <published>Thu Aug 08 2024 15:31:28 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Aug 08 2024 15:31:28 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ds/releases/tag/1.0.0&quot;&gt;&lt;code&gt;ds 1.0.0&lt;/code&gt;&lt;/a&gt; is now published. The biggest changes are supporting more formats and workspaces.&lt;/p&gt;
&lt;p&gt;I&#39;ve been using &lt;code&gt;ds&lt;/code&gt; extensively while building &lt;code&gt;ds&lt;/code&gt; and it now accounts for about 43% of my last 1,000 terminal commands.&lt;/p&gt;
&lt;p&gt;To install &lt;code&gt;ds&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ds-run&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ds&quot;&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;release-notes-1-0-0-2024-08-08t16-25-40z&quot; tabindex=&quot;-1&quot;&gt;Release Notes &lt;a href=&quot;https://github.com/metaist/ds/compare/0.1.3...1.0.0&quot;&gt;1.0.0&lt;/a&gt; - 2024-08-08T16:25:40Z &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/08/ds-1.0.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/38&quot;&gt;#38&lt;/a&gt;: &lt;code&gt;CHANGELOG&lt;/code&gt; typo&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/42&quot;&gt;#42&lt;/a&gt;: pypi badges&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/48&quot;&gt;#48&lt;/a&gt;: missing docstring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/17&quot;&gt;#17&lt;/a&gt;: config loading now looks for specific keys and tries more files if the key is not found&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/47&quot;&gt;#47&lt;/a&gt;: error suppression prefix string changed from hyphen (&lt;code&gt;-&lt;/code&gt;) to plus (&lt;code&gt;+&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/22&quot;&gt;#22&lt;/a&gt;: error suppression from the command-line&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/28&quot;&gt;#28&lt;/a&gt;: argument interpolation now accepts defaults&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/30&quot;&gt;#30&lt;/a&gt;: &lt;code&gt;__main__.py&lt;/code&gt; to make &lt;code&gt;ds&lt;/code&gt; executable as a package&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/41&quot;&gt;#41&lt;/a&gt;: &lt;code&gt;composer.json&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/45&quot;&gt;#45&lt;/a&gt;: support for workspaces&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/49&quot;&gt;#49&lt;/a&gt;: tasks that call &lt;code&gt;ds&lt;/code&gt; have an implied default to use the same configuration file they were called from (via &lt;code&gt;_DS_CURRENT_CONFIG&lt;/code&gt; environment variable).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/50&quot;&gt;#50&lt;/a&gt;: support for &lt;code&gt;rye&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/32&quot;&gt;#32&lt;/a&gt;: unused python &lt;code&gt;call&lt;/code&gt; format string&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>ds 0.1.3</title>
      <link href="https://metaist.com/blog/2024/07/ds-0.1.3.html"/>
      <id>tag:metaist.com,2010:blog.post-6777c0f691b3382d7b53ef1557b9eaa12aa01690</id>
      <published>Fri Jul 26 2024 17:26:28 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Jul 26 2024 17:26:28 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ds/releases/tag/0.1.3&quot;&gt;&lt;code&gt;ds 0.1.3&lt;/code&gt;&lt;/a&gt; is now published. I had to make 4 separate releases because PyPI really messed me up with name violations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ds&quot;&gt;&lt;code&gt;ds&lt;/code&gt;&lt;/a&gt; is a very simple task runner (like &lt;code&gt;npm run&lt;/code&gt; or a much simpler &lt;code&gt;make&lt;/code&gt;) that tries to use the standard project configuration files in many popular languages.&lt;/p&gt;
&lt;p&gt;The combined release notes provide enough initial functionality that I&#39;ve started using &lt;code&gt;ds&lt;/code&gt; in all my projects to run my usual dev commands.&lt;/p&gt;
&lt;p&gt;Install it:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ds-run&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ds&quot;&gt;Read more&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;release-notes-0-1-0-0-1-3&quot; tabindex=&quot;-1&quot;&gt;Release Notes (0.1.0 - 0.1.3) &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2024/07/ds-0.1.3.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Initial release.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fixed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/7&quot;&gt;#7&lt;/a&gt;: conditional import for &lt;code&gt;tomli&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/19&quot;&gt;#19&lt;/a&gt;: double-quotes in f-string&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/25&quot;&gt;#25&lt;/a&gt;: &lt;code&gt;shell&lt;/code&gt; and &lt;code&gt;cmd&lt;/code&gt; &lt;a href=&quot;https://github.com/metaist/ds#error-suppression&quot;&gt;error suppression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/29&quot;&gt;#29&lt;/a&gt;: running the same task twice (switch to detecting cycles)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/35&quot;&gt;#35&lt;/a&gt;: py3.8 graphlib-backport missing types&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/36&quot;&gt;#36&lt;/a&gt;: self-referential dependency&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/40&quot;&gt;#40&lt;/a&gt;: renamed PyPI package to &lt;code&gt;ds-run&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/15&quot;&gt;#15&lt;/a&gt;: generic parser to handle multiple file types&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/16&quot;&gt;#16&lt;/a&gt;: refactored &lt;code&gt;Task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/18&quot;&gt;#18&lt;/a&gt;: moved &lt;code&gt;ds.toml&lt;/code&gt; configuration into &lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/39&quot;&gt;#39&lt;/a&gt;: moved &lt;code&gt;src/ds.py&lt;/code&gt; into &lt;code&gt;src/ds/__init__.py&lt;/code&gt; in the hope this will fix the PyPI publishing error&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Working with arguments:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/4&quot;&gt;#4&lt;/a&gt;: command-line task arguments&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/20&quot;&gt;#20&lt;/a&gt;: &lt;code&gt;composite&lt;/code&gt; task arguments&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/23&quot;&gt;#23&lt;/a&gt;: parsing colon at end of task name on command-line&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/21&quot;&gt;#21&lt;/a&gt;: &lt;a href=&quot;https://github.com/metaist/ds#argument-interpolation&quot;&gt;argument interpolation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/33&quot;&gt;#33&lt;/a&gt;: error if missing argument during interpolation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/34&quot;&gt;#34&lt;/a&gt;: &lt;code&gt;$@&lt;/code&gt; to refer to &amp;quot;remaining&amp;quot; arguments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;New file formats:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/2&quot;&gt;#2&lt;/a&gt;: &lt;code&gt;ds.toml&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/5&quot;&gt;#5&lt;/a&gt;: &lt;code&gt;package.json&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/8&quot;&gt;#8&lt;/a&gt;: &lt;code&gt;pyproject.toml&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/12&quot;&gt;#12&lt;/a&gt;: &lt;code&gt;Cargo.toml&lt;/code&gt; support&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;New CLI options
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/2&quot;&gt;#3&lt;/a&gt;: &lt;code&gt;--list&lt;/code&gt; to list tasks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/10&quot;&gt;#10&lt;/a&gt;: &lt;code&gt;--file&lt;/code&gt; to specify a config file&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/11&quot;&gt;#11&lt;/a&gt;: &lt;code&gt;--cwd&lt;/code&gt; to specify current working directory&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Other
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/1&quot;&gt;#1&lt;/a&gt;: setup repo&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/13&quot;&gt;#13&lt;/a&gt;: &lt;a href=&quot;https://github.com/metaist/ds#inspirations&quot;&gt;inspirations to README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/37&quot;&gt;#37&lt;/a&gt;: release task&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/38&quot;&gt;#38&lt;/a&gt;: typo in &lt;code&gt;CHANGELOG.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/6&quot;&gt;#6&lt;/a&gt;: &lt;code&gt;pdm&lt;/code&gt; dependency&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ds/issues/32&quot;&gt;#32&lt;/a&gt;: &lt;code&gt;pdm&lt;/code&gt;-style &lt;code&gt;call&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Stop Hiding Python Dev Dependencies</title>
      <link href="https://metaist.com/blog/2024/07/python-dev-deps.html"/>
      <id>tag:metaist.com,2010:blog.post-af576f1ebc7a7ebc215167529ad28e1cf07f63c7</id>
      <published>Fri Jul 26 2024 17:15:14 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Jul 30 2024 17:11:40 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; (2024-07-29): Thanks to &lt;strong&gt;Shalev NessAiver&lt;/strong&gt; who suggested a much better title for this article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; (2025-12-04): There&#39;s finally a &lt;a href=&quot;https://metaist.com/blog/2025/12/dependency-groups.html&quot;&gt;standard place and I like it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Both &lt;a href=&quot;https://peps.python.org/pep-0621/&quot;&gt;PEP 621&lt;/a&gt; and the newer &lt;a href=&quot;https://packaging.python.org/en/latest/specifications/pyproject-toml/&quot;&gt;&lt;code&gt;pyproject.toml&lt;/code&gt; Specification&lt;/a&gt; describe how a Python project should specify its &lt;code&gt;dependencies&lt;/code&gt; which are required to run the project. They also describe &lt;code&gt;optional-dependencies&lt;/code&gt; which are &amp;quot;extra&amp;quot; to the project and can be added for additional features. Groups of &lt;code&gt;optional-dependencies&lt;/code&gt; are grouped under a common name.&lt;/p&gt;
&lt;p&gt;There&#39;s another class of dependencies that are not discussed in the aforementioned standards and these are known as &lt;code&gt;dev-dependencies&lt;/code&gt;: those packages which you need during &lt;em&gt;development&lt;/em&gt; of the project, but not to &lt;em&gt;use&lt;/em&gt; the project itself.&lt;/p&gt;
&lt;p&gt;This is probably a flaw in the specification; compare that with &lt;a href=&quot;https://docs.npmjs.com/cli/v10/configuring-npm/package-json#devdependencies&quot;&gt;&lt;code&gt;package.json&lt;/code&gt; which has &lt;code&gt;devDependencies&lt;/code&gt;&lt;/a&gt; and therefore the tools in the &lt;code&gt;node&lt;/code&gt; ecosystem know where to put packages you add with &lt;code&gt;--save-dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I generally concur with &lt;a href=&quot;https://www.reddit.com/r/Frontend/comments/fhgdd8/comment/fkbbtd7/&quot;&gt;this comment about dependencies&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why am I pointing this out? Because adding an actual dependency to my code is something I take very seriously. Importing lodash or react or whatever is a serious decision that I feel should be taken with extreme caution. Dependencies can lead to bloated code, exploits and bugs that are out of your control. If everything is on &amp;quot;devDependencies&amp;quot; or &amp;quot;dependencies&amp;quot;, it&#39;s really hard to see how many of these dangerous imports a project has.&lt;/p&gt;
&lt;p&gt;I tend to make it a personal goal to have as few dependencies as possible, but I couldn&#39;t care less for devDependencies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I also make it a personal goal to reduce the number of dependencies my projects use. But I &lt;em&gt;also&lt;/em&gt; care about my dev dependencies. These are the tools that make my projects possible and I care if they&#39;re slow or fast or have security issues. I take adding new dev dependencies seriously because it&#39;s overhead for anyone who wants to be so kind to work on my projects (usually some future version of myself). But I agree that it&#39;s a little bit different than a core dependency.&lt;/p&gt;
&lt;p&gt;Back to Python. Because &lt;code&gt;dev-dependencies&lt;/code&gt; are not part of the &lt;code&gt;pyproject.toml&lt;/code&gt; specification, popular tools like &lt;code&gt;pdm&lt;/code&gt; and &lt;code&gt;poetry&lt;/code&gt; need to specify custom configuration to store this metadata.&lt;/p&gt;
&lt;p&gt;But why? We could just treat &lt;code&gt;dev-dependencies&lt;/code&gt; as &lt;code&gt;optional-dependencies&lt;/code&gt; with the convention of calling the group &lt;code&gt;dev&lt;/code&gt; (&lt;a href=&quot;https://github.com/metaist/ds/blob/5ef9c44fc05542dad2b599d2bb100f8f4b144519/pyproject.toml#L39&quot;&gt;example&lt;/a&gt;). Then you&#39;d be able to install them like:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; pkg&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;dev&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# or, if you use uv&lt;/span&gt;
uv pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; pkg&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;dev&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/pdm-project/pdm/discussions/304&quot;&gt;this lengthy discussion on &lt;code&gt;pdm&lt;/code&gt;&lt;/a&gt;, people seem to be worried about having the dev metadata published on PyPI. But again why? Are you worried Dependabot is going to tell you about security vulnerabilities in your dev dependencies? (Wait, that&#39;s a good thing.) Are you worried people will think your project is bloated? (They&#39;d have to install your package with &lt;code&gt;[dev]&lt;/code&gt; to notice.)&lt;/p&gt;
&lt;p&gt;Sure it would have probably been better for &lt;code&gt;pyproject.toml&lt;/code&gt; to have defined a &lt;code&gt;dev-dependencies&lt;/code&gt; section. But until it&#39;s defined, why not use the standard mechanism for optional dependencies to define dev dependencies?&lt;/p&gt;
&lt;p&gt;I can be convinced otherwise, but my current policy is to put dev dependencies in &lt;code&gt;project.optional-dependencies.dev&lt;/code&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>2024-07-05 Weeknotes</title>
      <link href="https://metaist.com/blog/2024/07/2024-07-05-weeknotes.html"/>
      <id>tag:metaist.com,2010:blog.post-06f29933f8eb6ec710ab19b1856fc1809832c8db</id>
      <published>Fri Jul 05 2024 13:14:57 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Jul 05 2024 13:14:57 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;No major releases of public packages, but I did make some improvements to the blog. More details are in the accompanying posts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/metaist.com/issues/7&quot;&gt;#7&lt;/a&gt; Added a simple search box using &lt;code&gt;pagefind&lt;/code&gt; (&lt;a href=&quot;https://metaist.com/blog/2024/07/trying-pagefind.html&quot;&gt;read more&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/metaist.com/issues/8&quot;&gt;#8&lt;/a&gt; Cleaned up the list of posts to show thumbnails when present.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/metaist.com/issues/9&quot;&gt;#9&lt;/a&gt; Cleaned up the post layout to display an &lt;a href=&quot;https://en.wikipedia.org/wiki/ISO_8601&quot;&gt;ISO-8601 date&lt;/a&gt; and cleaned up the header.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/metaist.com/issues/10&quot;&gt;#10&lt;/a&gt; Fixed post sort order for (rare) days when I have more than one post per day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/metaist.com/issues/11&quot;&gt;#11&lt;/a&gt; Added &lt;a href=&quot;https://ogp.me/&quot;&gt;OpenGraph tags&lt;/a&gt; for post thumbnail and description.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/metaist.com/issues/12&quot;&gt;#12&lt;/a&gt; Added automatic page screenshots for pages without thumbnails as a preview of the page you&#39;re about to click on (&lt;a href=&quot;https://metaist.com/blog/2024/07/screenshot-thumbnails.html&quot;&gt;read more&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/metaist.com/issues/13&quot;&gt;#13&lt;/a&gt; I tried a simple card layout for the homepage, but it ended up looking gross, so I abandoned it. I did add any description, when present, to the list of posts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Screenshot Thumbnails</title>
      <link href="https://metaist.com/blog/2024/07/screenshot-thumbnails.html"/>
      <id>tag:metaist.com,2010:blog.post-8c5c70168305b77d9832ec84be53a9508952d1a0</id>
      <published>Fri Jul 05 2024 13:10:20 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Jul 05 2024 13:10:20 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously: &lt;a href=&quot;https://metaist.com/blog/2024/07/trying-pagefind.html&quot;&gt;Trying pagefind&lt;/a&gt;, &lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Adventures in Eleventy&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the difficulties I described in &lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Adventures with Eleventy&lt;/a&gt; is having to find a catchy thumbnail for each post. Part of the problem is that I wanted it to look a certain way and another part is that I wanted images that were appropriately licensed. That&#39;s why I&#39;ve largely not had thumbnails for any posts since the most recent reboot in May 2023.&lt;/p&gt;
&lt;p&gt;However, I wanted to start pushing my posts out to &lt;a href=&quot;https://twitter.com/TheMetaist&quot;&gt;twitter&lt;/a&gt; (and now &lt;a href=&quot;https://bsky.app/profile/metaist.com&quot;&gt;bluesky&lt;/a&gt;) and the lack of a thumbnail was bugging me. A simple solution would be to just automatically take a screenshot of the post and use that as the thumbnail.&lt;/p&gt;
&lt;p&gt;At first, I thought I&#39;d use Simon Willison&#39;s &lt;a href=&quot;https://github.com/simonw/shot-scraper&quot;&gt;&lt;code&gt;shot-scraper&lt;/code&gt;&lt;/a&gt;, but I didn&#39;t want to install &lt;a href=&quot;https://pptr.dev/&quot;&gt;&lt;code&gt;puppeteer&lt;/code&gt;&lt;/a&gt; and a whole separate browser just to take screenshots.&lt;/p&gt;
&lt;p&gt;But because I recently &lt;a href=&quot;https://metaist.com/blog/2024/06/trying-firefox.html&quot;&gt;switched back to Firefox&lt;/a&gt; after many years, I decided to try out it&#39;s screenshot capabilities. Turns out they&#39;re pretty great! The only caveat is that you can&#39;t have Firefox open and take a screenshot at the same time-- unless you use a different profile. So I went to &lt;code&gt;about:profiles&lt;/code&gt; and made profile called &lt;code&gt;screenshot&lt;/code&gt;. Now I can take screenshots from the command-line:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Usage: firefox -P &amp;lt;profile&gt; --screenshot &amp;lt;output&gt; &amp;lt;url&gt;&lt;/span&gt;
firefox &lt;span class=&quot;token parameter variable&quot;&gt;-P&lt;/span&gt; screenshot &lt;span class=&quot;token parameter variable&quot;&gt;--screenshot&lt;/span&gt; metaist.png &lt;span class=&quot;token string&quot;&gt;&quot;https://metaist.com/&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;According to ChatGPT, the ideal OpenGraph thumbnail should be 1200x630. Using &lt;a href=&quot;https://imagemagick.org/index.php&quot;&gt;ImageMagick&lt;/a&gt;, I decided to also crop the top banner to focus on the main text.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Usage: convert &amp;lt;input&gt; -gravity north -crop 1200x630+0+100 +repage &amp;lt;output&gt;&lt;/span&gt;
convert metaist.png &lt;span class=&quot;token parameter variable&quot;&gt;-gravity&lt;/span&gt; north &lt;span class=&quot;token parameter variable&quot;&gt;-crop&lt;/span&gt; 1200x630+0+100 +repage metaist.png&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I put it all together using &lt;a href=&quot;https://bun.sh/&quot;&gt;&lt;code&gt;bun&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://www.npmjs.com/package/docopt&quot;&gt;&lt;code&gt;docopt&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token hashbang comment&quot;&gt;#!/usr/bin/env bun&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; $ &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bun&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; docopt &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;docopt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; resolve &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bun:path&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; unlinkSync &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node:fs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; doc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#92;
Take cropped screenshots of URLs using Firefox.

Usage: ./screenshots.js
  [--help] [--version] [--debug]
  [--force] [--crop=&amp;lt;size&gt;]
  [&amp;lt;slug&gt;...]

Options:
  -h, --help        show this message and exit
  --version         show program version and exit
  --debug           show debug messages

  -f, --force       delete existing screenshot
  --crop=&amp;lt;size&gt;     crop dimensions [default: 1200x630+0+100]
  &amp;lt;slug&gt;            blog slug to screenshot
&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Convert a slug to a local URL. */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;slug2url&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;http://localhost:8080/blog/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.html&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Return an absolute path to an image. */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;slug2img&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;./content/static/img/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;slug&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.png&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Take a screenshot of a URL and save it to a path. */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;screenshot&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  $&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;firefox -P screenshot --screenshot &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;path&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Crop an image. */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; crop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1200x630+0+100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  $&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;convert &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;path&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; -gravity north -crop &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;size&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; +repage &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;path&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Get list of slugs from a file.  */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getSlugs&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Bun&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;result&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; line&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * Return a valid javascript variable name from a docopt flag.
 * @param {string} name variable name
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;optvar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; special &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string-property property&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stdin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-property property&quot;&gt;&quot;--&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;special&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; special&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// special cases handled&lt;/span&gt;

  result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// leading hyphens removed&lt;/span&gt;

  result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replaceAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replaceAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replaceAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// hyphens become underscore; angle brackets removed&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Parse docopt vars into a javascript-friendly format. */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parse_docopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;optvar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; val&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/** Main entry point. */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parse_docopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docopt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;doc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getSlugs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./screenshots.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Found: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1200x630+0+100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; slug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;slug2url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; img &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;slug2img&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;slug&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Bun&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exists&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;[found] &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;img&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;force&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;[delete] &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;img&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;unlinkSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;[shot] &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;url&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;screenshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; exists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Bun&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        exists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; Bun&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exists&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;[crop] &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;img&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;crop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>Trying pagefind</title>
      <link href="https://metaist.com/blog/2024/07/trying-pagefind.html"/>
      <id>tag:metaist.com,2010:blog.post-351ec92dd39a5af8247beb2805da598907abbc2e</id>
      <published>Thu Jul 04 2024 20:05:57 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 04 2024 21:39:22 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously: &lt;a href=&quot;https://metaist.com/blog/2023/05/adding-a-toc.html&quot;&gt;Adding a table of contents&lt;/a&gt;, &lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Adventures in Eleventy&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve gotten several positive comments about how minimal this website is. But one thing that&#39;s missing is a simple search box.&lt;/p&gt;
&lt;p&gt;In the past I&#39;ve used &lt;a href=&quot;https://en.wikipedia.org/wiki/Google_Programmable_Search_Engine&quot;&gt;Google Custom Search&lt;/a&gt; which is now called &amp;quot;Google Programmable Search Engine&amp;quot;. But this time I want to try something more in the spirit of this website: I want something static and local.&lt;/p&gt;
&lt;p&gt;It took me so long to write down my thoughts on this that I actually solve this problem for a different website using &lt;a href=&quot;https://pagefind.app/&quot;&gt;&lt;code&gt;pagefind&lt;/code&gt;&lt;/a&gt; which generates a static index &lt;em&gt;after&lt;/em&gt; you&#39;ve built your site.&lt;/p&gt;
&lt;p&gt;The actual changes are recorded in issue &lt;a href=&quot;https://github.com/metaist/metaist.com/issues/7&quot;&gt;#7&lt;/a&gt;, but all it took was:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; --save-dev pagefind&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// eleventy.config.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; exec &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;child_process&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;eleventy.after&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;[pagefind] building index&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;pagefind --site &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dir&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- in _includes/base.njk --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;search&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/pagefind/pagefind-ui.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/pagefind/pagefind-ui.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;DOMContentLoaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PagefindUI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#search&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;showSubResults&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    </entry>
    <entry>
      <title>Generating Audiobooks</title>
      <link href="https://metaist.com/blog/2024/06/generating-audiobooks.html"/>
      <id>tag:metaist.com,2010:blog.post-861c02ae84d629c57eb6796cf3e7c6873b223311</id>
      <published>Thu Jun 27 2024 14:58:45 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jun 27 2024 15:19:49 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;When I was in high school I used to use &lt;a href=&quot;https://en.wikipedia.org/wiki/Microsoft_Agent&quot;&gt;Microsoft Agent&lt;/a&gt; to read books from &lt;a href=&quot;https://www.gutenberg.org/&quot;&gt;Project Gutenberg&lt;/a&gt;. Nowadays, I use &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.hyperionics.avar&amp;amp;hl=en_US&quot;&gt;@Voice Aloud Reader&lt;/a&gt; on Android to listen to &lt;code&gt;.epub&lt;/code&gt; files.&lt;/p&gt;
&lt;p&gt;One of my sons got an old-school MP3 player and he wants to fill it with audiobooks. The &lt;a href=&quot;https://archive.org/details/audio_bookspoetry&quot;&gt;Internet Archive has a large collection of audiobooks&lt;/a&gt;, but some of the books only come in text form.&lt;/p&gt;
&lt;p&gt;On my wife&#39;s recommendation, I decided to try an make an audiobook out of the E.L. Konigsburg book &lt;a href=&quot;https://archive.org/details/FromTheMixedUpFilesOfMrsBasilEFrankweiler&quot;&gt;From The Mixed Up Files Of Mrs Basil E. Frankweiler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First, I downloaded the &lt;a href=&quot;https://archive.org/stream/FromTheMixedUpFilesOfMrsBasilEFrankweiler/From_the_Mixed_up_Files_of_Mrs_Basil_E_Frankweiler_djvu.txt&quot;&gt;text file&lt;/a&gt; and manually cut it up into chapters, one file per chapter.&lt;/p&gt;
&lt;p&gt;Next, I converted all paragraphs into single lines.&lt;/p&gt;
&lt;p&gt;Then I setup a python project using &lt;code&gt;rye&lt;/code&gt; and &lt;code&gt;uv&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sSf&lt;/span&gt; https://rye.astral.sh/get &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
rye config --set-bool behavior.use-uv&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true
rye init
rye pin &lt;span class=&quot;token number&quot;&gt;3.11&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# TTS doesn&#39;t support 3.12&lt;/span&gt;
rye &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; attrbox tts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox&quot;&gt;&lt;code&gt;attrbox&lt;/code&gt;&lt;/a&gt; is my library for doing things like processing command-line arguments.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tts&lt;/code&gt; is the &lt;a href=&quot;https://github.com/coqui-ai/TTS&quot;&gt;Coqui.ai repository&lt;/a&gt; for doing text-to-speech. However, I just discovered that &lt;strong&gt;Coqui.ai, the company behind the project &lt;a href=&quot;https://twitter.com/_josh_meyer_/status/1742522906041635166&quot;&gt;is shutting down&lt;/a&gt;&lt;/strong&gt;, so I don&#39;t know how well this package will be maintained in the future.&lt;/p&gt;
&lt;p&gt;Wrote up a quick script:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Convert a text file to an MP3.

Usage: txt_tts
    [--help | --version][--debug]
    &amp;lt;input&gt; [--output PATH]
    [--model PATH]

Options:
    -h, --help                  show this message and exit
    --version                   show program version and exit
    --debug                     show debug messages

    &amp;lt;input&gt;                     input file
    -o PATH, --output PATH      output file

    --model PATH                model path [default: tts_models/en/ljspeech/tacotron2-DDC_ph]
&quot;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# std&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path

&lt;span class=&quot;token comment&quot;&gt;# lib&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; attrbox &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; parse_docopt

__version__ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt;
__pubdate__ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-06-27T18:58:45Z&quot;&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Main entry point.&quot;&quot;&quot;&lt;/span&gt;
    args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; parse_docopt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__doc__&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; version&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;__version__&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;__pubdate__&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; FileNotFoundError&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;with_suffix&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.wav&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; TTS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;api &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; TTS

    tts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; TTS&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    tts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tts_to_file&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file_path&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At first, I tried &lt;code&gt;tts_models/en/ljspeech/tacotron2-DDC&lt;/code&gt; based on the examples I saw online. However, it had trouble with names and words that weren&#39;t part of its lexicon. The &lt;code&gt;_ph&lt;/code&gt; version works on a phonetic level and has better performance while not being too slow. It takes about 3 minutes per chapter. (I did try &lt;a href=&quot;https://github.com/neonbjb/tortoise-tts&quot;&gt;TortoiseTTS&lt;/a&gt;, but it was &lt;em&gt;extremely&lt;/em&gt; slow and the output wasn&#39;t that much better.)&lt;/p&gt;
&lt;p&gt;The trickiest bit is making sure there aren&#39;t any empty sentences when the chapter gets split up. This can happen when you have a sentence at the end of a paragraph that ends with &lt;code&gt;.&amp;quot;&lt;/code&gt; and the quote mark ends up by itself. To fix this, I replaced those instances with &lt;code&gt;&amp;quot;.&lt;/code&gt; which worked great.&lt;/p&gt;
&lt;p&gt;I ran the script on each chapter which produced a &lt;code&gt;.wav&lt;/code&gt; file which I ran through &lt;code&gt;ffmpeg&lt;/code&gt; to convert them to MP3.&lt;/p&gt;
&lt;p&gt;As a final touch, I used &lt;a href=&quot;https://kid3.kde.org/&quot;&gt;&lt;code&gt;kid3&lt;/code&gt;&lt;/a&gt; to fix all the tags so that the files would get sorted by album/track (i.e. book/chapter).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Maximum He HaShe&#39;elah</title>
      <link href="https://metaist.com/blog/2024/06/he-hasheila.html"/>
      <id>tag:metaist.com,2010:blog.post-5152b7627587e9d6be23c5a9732fd07011dad67b</id>
      <published>Sun Jun 23 2024 16:30:51 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Jun 23 2024 16:30:51 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously: &lt;a href=&quot;https://metaist.com/blog/2023/09/consecutive-mappiq-he.html&quot;&gt;Consecutive Mappiq He&lt;/a&gt;, &lt;a href=&quot;https://metaist.com/blog/2023/09/non-consecutive-mappiq-he.html&quot;&gt;Non-Consecutive Mappiq He&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Harold Zazula&lt;/strong&gt; asks: What is the largest number of &lt;em&gt;He HaShe&#39;elah&lt;/em&gt; (&lt;a href=&quot;https://en.wikipedia.org/wiki/Prefixes_in_Hebrew#Interrogative&quot;&gt;interrogative prefix&lt;/a&gt;) in a pasuk or parsha?&lt;/p&gt;
&lt;p&gt;Both Harold and Wikipedia helpfully tell us that the vowel under an interrogative prefix is &lt;em&gt;chataf patach&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;First, let&#39;s see how many verses have more than two words that start with a &lt;em&gt;He&lt;/em&gt; and a &lt;em&gt;chataf patach&lt;/em&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; bs4 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BeautifulSoup

URL_SEFARIA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://www.sefaria.org/{book}.{chap}.{verse}&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;| count | ref |&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;|-------|-----|&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; path &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;glob&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;*.xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# ignore extraneous files&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.DH&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Index&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# load the xml file; require lxml library&lt;/span&gt;
    soup &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; verse &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; soup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_all&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;v&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        count &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;הֲ&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; word &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; verse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_all&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; count &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            book &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stem
            chap_num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; verse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            verse_num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; verse&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            ref &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;chap_num&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;verse_num&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; URL_SEFARIA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;book&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; chap&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;chap_num&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; verse&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;verse_num&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;|&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;|[&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ref&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)|&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;count&lt;/th&gt;
&lt;th&gt;ref&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.5.19&quot;&gt;Daniel 5:19&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ecclesiastes.1.2&quot;&gt;Ecclesiastes 1:2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.40.21&quot;&gt;Isaiah 40:21&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.58.5&quot;&gt;Isaiah 58:5&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/I_Kings.20.33&quot;&gt;I Kings 20:33&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/II_Kings.4.26&quot;&gt;II Kings 4:26&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Psalms.94.9&quot;&gt;Psalms 94:9&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Let&#39;s take a look at each of these results.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.5.19&quot;&gt;Daniel 5:19&lt;/a&gt; is in Aramaic. But it does indicate that having a &lt;a href=&quot;https://en.wikipedia.org/wiki/Hebrew_punctuation#Hyphen_and_maqaf&quot;&gt;&lt;em&gt;maqaf&lt;/em&gt;&lt;/a&gt; immediately before this word should maybe disqualify the current word.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sefaria.org/Ecclesiastes.1.2&quot;&gt;Ecclesiastes 1:2&lt;/a&gt; the word הֲבֵל
is getting picked up. Maybe I should just exclude that word.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.40.21&quot;&gt;Isaiah 40:21&lt;/a&gt; has the word הֲלוֹא four times which is an appropriate match.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.58.5&quot;&gt;Isaiah 58:5&lt;/a&gt; has the words הֲכָזֶה, הֲלָכֹף
, and הֲלָזֶה which are all appropriate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sefaria.org/I_Kings.20.33&quot;&gt;I Kings 20:33&lt;/a&gt; has words that are all weird or not a match: הֲמִמֶּנּוּ and הֲדַד (twice, but after a &lt;em&gt;maqaf&lt;/em&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sefaria.org/II_Kings.4.26&quot;&gt;II Kings 4:26&lt;/a&gt; has הֲשָׁלוֹם three times which is an appropriate match.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sefaria.org/Psalms.94.9&quot;&gt;Psalms 94:9&lt;/a&gt; has הֲנֹטַע and הֲלֹא (twice) which are both appropriate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In our next experiments we can try out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ignore words preceded by a &lt;em&gt;maqaf&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Most consecutive verses with a &lt;em&gt;He HaShe&#39;elah&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Chapter with the most verses containing a &lt;em&gt;He HaShe&#39;elah&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Parsha with the most verses containing a &lt;em&gt;He HaShe&#39;elah&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Trying Firefox</title>
      <link href="https://metaist.com/blog/2024/06/trying-firefox.html"/>
      <id>tag:metaist.com,2010:blog.post-2b8c3cd0fb849acedb12bf73ef37dcbb09bf9742</id>
      <published>Sun Jun 23 2024 15:01:15 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Jun 23 2024 15:01:15 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;After 15 years of using Google Chrome as my primary browser, I&#39;m back to using Firefox. Firefox was better than Mozilla and certainly better than Internet Explorer, but it had memory leak issues which caused to slow down quite a bit. Chrome was snappy and auto-updated and it was fun to develop for.&lt;/p&gt;
&lt;p&gt;But for the last two weeks, despite Chrome releasing several updates, I haven&#39;t been able to load Gmail in any of the non-default profiles.&lt;/p&gt;
&lt;p&gt;So I&#39;m trying out Firefox again. Much to my delight, the handful of extensions I use are all supported thanks to the Manifest v3 spec:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tab Modifier: change favicons to match URL patterns&lt;/li&gt;
&lt;li&gt;uBlock Origin: ad blocker&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Videos&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SponsorBlock: skipping within YouTube&lt;/li&gt;
&lt;li&gt;Video Speed Controller: control video speed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Work-related&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bitwarden: credential management&lt;/li&gt;
&lt;li&gt;Toggl Track: time tracking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I prefer Chrome&#39;s profile switching and tab groups, but thanks to &lt;strong&gt;Patrick Kage&lt;/strong&gt;&#39;s recommendations, I&#39;m trying out &lt;a href=&quot;https://github.com/mbnuqw/sidebery&quot;&gt;Sideberry&lt;/a&gt; and setting up a custom &lt;code&gt;userChrome.css&lt;/code&gt; to hide the tab bar. It&#39;s a little disconcerting to have all the tabs in the sidebar rather than up top, but I&#39;ll try it out for a few weeks to see how it goes.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Sharing NFS Between GCP Projects</title>
      <link href="https://metaist.com/blog/2024/04/sharing-nfs-between-gcp-projects.html"/>
      <id>tag:metaist.com,2010:blog.post-157cef320327baac803adc30df72ef4b79e67093</id>
      <published>Fri Apr 26 2024 15:28:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Apr 26 2024 15:28:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;One of the parts of Google Cloud that I haven&#39;t fully explored yet is their networking stack. However, I got a nice first taste yesterday while trying to share a Google Filestore (NFS) between two Google Cloud projects.&lt;/p&gt;
&lt;p&gt;Now that I&#39;ve figured it out, here&#39;s the simplest solution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the project that has the NFS (the &amp;quot;host&amp;quot; project), go to:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VPC network&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Shared VPC&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Attached Projects&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Attach Projects&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Select the other project (the &amp;quot;service&amp;quot; project).
&lt;ul&gt;
&lt;li&gt;Check &lt;code&gt;All subnets&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Save&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In the service project, create a new VM:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Compute Engine&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VM instances&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Create Instance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Make sure you select a region that is the same or close to the NFS.&lt;/li&gt;
&lt;li&gt;Expand &lt;code&gt;Advanced Options&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Expand &lt;code&gt;Networking&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Expand the &lt;code&gt;default&lt;/code&gt; network interface.
&lt;ul&gt;
&lt;li&gt;Select &lt;code&gt;Networks shared with me&lt;/code&gt; and select &lt;code&gt;default&lt;/code&gt; (assuming that was the network that was shared).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that VM can see the NFS because its on the same subnet.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>castfit 0.1.0</title>
      <link href="https://metaist.com/blog/2023/12/castfit-0.1.0.html"/>
      <id>tag:metaist.com,2010:blog.post-59919bbea1aefe4928a8c15c97863f9777f8ccc1</id>
      <published>Fri Dec 15 2023 13:13:15 GMT-0500 (Eastern Standard Time)</published>
      <updated>Fri Dec 15 2023 13:13:15 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2023/11/how-to-get-type-hints-in-python.html&quot;&gt;Access type hints in python&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/castfit/releases/tag/0.1.0&quot;&gt;&lt;code&gt;castfit 0.1.0&lt;/code&gt;&lt;/a&gt; is now published.&lt;/p&gt;
&lt;p&gt;This initial version supports basic types (&lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt;, etc.) and &lt;code&gt;typing&lt;/code&gt; types (&lt;code&gt;Any&lt;/code&gt;, &lt;code&gt;Literal&lt;/code&gt;, &lt;code&gt;Union&lt;/code&gt;, etc.).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>freshlinks 1.0.0</title>
      <link href="https://metaist.com/blog/2023/11/freshlinks-1.0.0.html"/>
      <id>tag:metaist.com,2010:blog.post-c85d3aa3a1880c285cf304693506fc438b3a51f7</id>
      <published>Thu Nov 30 2023 21:39:24 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Nov 30 2023 21:39:24 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/freshlinks/releases/tag/1.0.0&quot;&gt;&lt;code&gt;freshlinks 1.0.0&lt;/code&gt;&lt;/a&gt; is now published.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I wrote my &lt;a href=&quot;https://metaist.com/blog/2023/09/freshlinks&quot;&gt;first approach to this problem back in September&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since then I added &lt;a href=&quot;https://github.com/metaist/freshlinks/blob/1.0.0/src/freshlinks/__main__.py&quot;&gt;command-line arguments&lt;/a&gt; and a basic &lt;a href=&quot;https://github.com/metaist/freshlinks/blob/1.0.0/src/freshlinks/cache.py&quot;&gt;file-based cache&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Access type hints in python</title>
      <link href="https://metaist.com/blog/2023/11/how-to-get-type-hints-in-python.html"/>
      <id>tag:metaist.com,2010:blog.post-e694f8079f93c3aad075ffed62bd25a4b181990b</id>
      <published>Thu Nov 30 2023 08:52:23 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Nov 30 2023 08:52:23 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;While working on &lt;a href=&quot;https://github.com/metaist/freshlinks&quot;&gt;freshlinks&lt;/a&gt;, I got frustrated with not having my arguments typed correctly when coming from &lt;code&gt;docopt&lt;/code&gt;. I know there&#39;s &lt;a href=&quot;https://pypi.org/project/type-docopt/&quot;&gt;&lt;code&gt;type-docopt&lt;/code&gt;&lt;/a&gt;, but that introduces a new syntax and I haven&#39;t fully evaluated that library yet.&lt;/p&gt;
&lt;p&gt;In the meantime, I wanted to see if I could implement a minimal approach, but first I need to be able to get the type hints from a class definition.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; get_type_hints
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Optional

&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Reticulate the splines from the command-line.

  Usage: ./reticulate.py
    [--help | --version]
    [--debug] [--path PATH] [-n INT]
  &quot;&quot;&quot;&lt;/span&gt;

  &lt;span class=&quot;token builtin&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
  &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;`-h, --help`   show the help message and exit&quot;&quot;&quot;&lt;/span&gt;

  version&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
  &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;`--version`    show the program version and exit&quot;&quot;&quot;&lt;/span&gt;

  debug&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
  &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;`--debug`      show debug messages&quot;&quot;&quot;&lt;/span&gt;

  path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Optional&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
  &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;`--path PATH`  path to splines&quot;&quot;&quot;&lt;/span&gt;

  n&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;
  &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;`-n INT`       number of splines to reticulate&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;get_type_hints&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &#39;help&#39;: &amp;lt;class &#39;bool&#39;&gt;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &#39;version&#39;: &amp;lt;class &#39;bool&#39;&gt;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &#39;debug&#39;: &amp;lt;class &#39;bool&#39;&gt;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &#39;path&#39;: typing.Union[pathlib.Path, NoneType],&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &#39;n&#39;: &amp;lt;class &#39;int&#39;&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I thought it might be easy, but I didn&#39;t think it would be &lt;em&gt;this&lt;/em&gt; easy.&lt;/p&gt;
&lt;p&gt;Now I just need to think about how to handle those &lt;code&gt;Optional&lt;/code&gt; vs &lt;code&gt;Union&lt;/code&gt; types.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>DALL-E: Reel-to-Reel</title>
      <link href="https://metaist.com/blog/2023/10/dall-e-reel-to-reel.html"/>
      <id>tag:metaist.com,2010:blog.post-813de4286ec314a9344a76e0704deb319cf59444</id>
      <published>Wed Nov 01 2023 11:20:30 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Nov 01 2023 11:20:30 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: Please draw a simple line-art drawing based on the following paragraphs: There&#39;s a ▶️ montage in Real Genius (that we often reference at work) where a lecture hall with students gradually chooses to leave a tape recorder to record the lecture instead of attending. Eventually, the professor chooses to leave a reel-to-reel player to recite the lecture to the room full of recorders. &lt;/p&gt;
&lt;p&gt;That&#39;s what a recent article on EdSurge reminded me of: 📝 As AI Chatbots Rise, More Educators Look to Oral Exams — With High-Tech Twist. Spoiler: The &amp;quot;twist&amp;quot; is that the teachers are using AI to administer the oral exams. Combine that with the ongoing joke that people are using ChatGPT to expand their five-bullet ideas into lengthy emails which are then summarized on the receiving end by ChatGPT and I anticipate we&#39;ll see all kinds of new forms of &amp;quot;lost in translation&amp;quot; and &amp;quot;broken telephone on steroids&amp;quot;.&lt;/p&gt;
&lt;p&gt;But eventually we&#39;ll probably adapt to the tools as we always have and those instances will become rare or signals of low status (or fodder for stand-up comedians). Perhaps &amp;quot;Written with ChatGPT&amp;quot; will replace the ubiquitous &amp;quot;Please excuse any typos&amp;quot; in email signatures and &amp;quot;Damn autocorrect!&amp;quot; will be replaced by &amp;quot;Damn autocompose!&amp;quot; It&#39;ll be interesting to see how it plays out.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: To capture the essence of the provided paragraphs, I&#39;ll craft two detailed descriptions for the drawing:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Photo&lt;/strong&gt;: In a lecture hall, rows of desks are filled with various types of tape recorders, while at the front, a reel-to-reel player stands at the lecturer&#39;s podium. On the chalkboard behind, there&#39;s a drawing of a chatbot icon and the words &amp;quot;Oral Exams&amp;quot;. In the foreground, a person reads an email on a computer, with the footer of the email saying &amp;quot;Written with ChatGPT&amp;quot;. Next to the person, another individual is laughing, holding a microphone, implying they are a stand-up comedian referencing the scene.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Illustration&lt;/strong&gt;: A split scene. On the left, a classroom with tape recorders on desks, facing a reel-to-reel player on the teacher&#39;s desk. Above this scene, a cloud bubble shows a chatbot administering an oral exam. On the right, a person typing on a computer with a ChatGPT logo on the screen, sending an email. The receiving end shows another person, with a smaller ChatGPT logo, summarizing the email. Both sides have comic-style captions: &amp;quot;Lost in Translation&amp;quot; on the left and &amp;quot;Broken Telephone on Steroids&amp;quot; on the right.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sending these descriptions to generate the images.&lt;/p&gt;
&lt;p&gt;I apologize for the inconvenience, but I was unable to generate images based on the provided descriptions due to content policy constraints. If you have any other requests or if you&#39;d like to provide a different description, I&#39;d be happy to assist further.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: Let&#39;s just do the lecture hall with a reel-to-reel player on a desk playing to seats with tape recorders recording.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: Sure, I&#39;ll create two detailed descriptions for the drawing based on your request:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Photo&lt;/strong&gt;: A well-lit, spacious lecture hall is depicted. Rows of wooden desks extend from the foreground to the background, each with a tape recorder placed neatly on its surface. All tape recorders are in recording mode, their reels spinning. In the front center of the hall, on a raised platform, a vintage reel-to-reel player occupies the position of the lecturer, playing audibly. The atmosphere conveys a sense of automated education, where machines are both the teachers and the students.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Illustration&lt;/strong&gt;: In a stylized lecture hall, angular wooden desks are arranged in a semicircular formation. On each desk rests a tape recorder, their designs ranging from retro to modern, all actively recording. The focal point of the scene is a prominent reel-to-reel player, placed at the lecturer&#39;s podium. Its reels rotate smoothly, suggesting it&#39;s currently playing a lecture. Shadows and highlights give depth to the scene, emphasizing the eerie silence except for the mechanical sounds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sending these descriptions to generate the images.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/blog/2023/10/2023-10-31-dall-e-reel-to-reel/dall-e-1.png&quot; alt=&quot;DALL-E Image 1&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
Photo: In a well-lit, spacious lecture hall, rows of wooden desks fill the scene from foreground to background. Each desk has a tape recorder of various models, all in recording mode with reels spinning actively. At the front, on a raised wooden platform, stands a vintage reel-to-reel player. It&#39;s in the playing mode, and its reels rotate indicating it&#39;s delivering a lecture to the room full of tape recorders. The atmosphere is serene, suggesting a futuristic setting where machines play the role of both educators and learners.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/blog/2023/10/2023-10-31-dall-e-reel-to-reel/dall-e-2.png&quot; alt=&quot;DALL-E Image 1&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
Illustration: A stylized lecture hall is shown with angular wooden desks arranged in a neat semicircular pattern. Each desk features a tape recorder, with designs spanning from retro to modern, all reels actively capturing sound. The centerpiece of the scene is a large reel-to-reel player positioned at the lecturer&#39;s podium. Its reels move smoothly, signifying an ongoing lecture. The illustration uses a palette of muted colors, and strategic shadows and highlights add depth, emphasizing the quiet ambiance broken only by the hum of machinery.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here are the images based on the descriptions provided:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The first image is a photo representation of the lecture hall with rows of wooden desks, each with a tape recorder. In the front, you can see the reel-to-reel player on a raised platform.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The second image is a stylized illustration of a similar scene, where the tape recorders on the desks have a mix of retro and modern designs, and the reel-to-reel player stands prominently at the front.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hope these images capture the essence of the scenario you described. Let me know if there&#39;s anything else you&#39;d like assistance with!&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>LLMs for Tip-of-the-Tongue Search</title>
      <link href="https://metaist.com/blog/2023/10/llm-search-for-tip-of-the-tongue-search.html"/>
      <id>tag:metaist.com,2010:blog.post-208fba42e87dae68fdf9dd408e7accf1a138e92d</id>
      <published>Fri Oct 27 2023 08:51:21 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 27 2023 08:51:21 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Although I&#39;ve been playing with ChatGPT for a while, today marks the first time I actually used it to remember the name of a piece of software that was on the tip of my tongue, but Google searches didn&#39;t help.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: What is the name of the very fast http server written in rust or maybe in golang that has a standalone executable, very simple configuration, maybe starts with a &amp;quot;C&amp;quot;?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: The HTTP server you are referring to is likely Caddy. It&#39;s written in Go and is known for its simplicity and ease of use, including automatic HTTPS setup. It provides a standalone executable and has a very straightforward configuration syntax.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Transcript: ChatGPT with DALL-E</title>
      <link href="https://metaist.com/blog/2023/10/transcript-chatgpt-with-dall-e.html"/>
      <id>tag:metaist.com,2010:blog.post-bf0e2dea425fea71f339bc6fe4288130b7b71dec</id>
      <published>Fri Oct 20 2023 14:23:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Fri Oct 20 2023 14:23:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: I would like a 1950&#39;s themed image that captures the essential quality of the following paragraphs: Apologies for the delay of this email. Originally this email was going to be a couple of days late because of the holiday of Sukkot spanned the end of September and start of October. But then as the holiday ended and news from Israel started flooding in, I (like many of you) got into a spiral of watching my phone constantly and trying to find out how family and friends were doing and what developments were being reported.&lt;/p&gt;
&lt;p&gt;Then as the days passed, I kept pushing off writing this email because I wasn&#39;t sure what to write. Most of my thoughts have been articulated better by others. I almost wanted to email a blank sheet of paper in the style of that Russian political joke-- everyone knows what the paper is supposed to say.&lt;/p&gt;
&lt;p&gt;Except that it would appear that, no, one cannot assume such things at all. It&#39;s as if the chattering classes actually need kindergarten lessons such as: &amp;quot;Why Capricious Murder is Evil&amp;quot;; &amp;quot;Strong Convictions Don&#39;t Imply Correctness&amp;quot;; and &amp;quot;Less Power Doesn&#39;t Mean More Moral&amp;quot;. Some folks have woken up to the reality of the situation on the ground while others seem blithely clueless about the implications for the larger Western world.&lt;/p&gt;
&lt;p&gt;The real cost in lives; the high tensions with real stakes; the twittersphere of non-stop commentary of various and dubious quality; the absurdist knee-jerk reactions-- it&#39;s all overwhelming. I guess I figured out what I should write.&lt;/p&gt;
&lt;p&gt;Hope you&#39;re all safe and doing well.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: Given the provided paragraphs, we can infer several key themes and emotions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Delay and Distraction&lt;/strong&gt;: The writer had to delay sending the email due to personal commitments and the troubling events unfolding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concern and Anxiety&lt;/strong&gt;: The writer was deeply concerned about the safety and well-being of family and friends in Israel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uncertainty&lt;/strong&gt;: There was hesitation about what to write and how to convey emotions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Awareness vs. Ignorance&lt;/strong&gt;: The writer notes the disparity in understanding and awareness about the situation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Overwhelming Nature of Media&lt;/strong&gt;: The non-stop flow of information, much of which might be of questionable quality or reactionary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wish for Well-being&lt;/strong&gt;: A desire for safety and well-being for the recipients.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With these themes in mind, let&#39;s create a set of image descriptions to capture the essence of the paragraphs with a 1950&#39;s theme:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Photo of a 1950&#39;s desk&lt;/strong&gt;: On it, an old-fashioned typewriter with a blank sheet of paper, symbolizing the struggle to find words. A desk lamp illuminates an open envelope and a calendar showing the end of September and start of October. Nearby, a vintage radio broadcasts news, with a small family photo next to it, capturing the concern for loved ones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Illustration in a 1950&#39;s cartoon style&lt;/strong&gt;: A classroom with &amp;quot;chattering classes&amp;quot; as adults sitting on small kindergarten chairs. The chalkboard displays lessons like &amp;quot;Why Capricious Murder is Evil&amp;quot;. The teacher, looking exasperated, tries to explain while some students eagerly listen and others are distracted, capturing the disparity in understanding.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Photo of a 1950&#39;s living room&lt;/strong&gt;: A family sits anxiously around a vintage television broadcasting news about Israel. The room&#39;s ambiance is tense, with a clock ticking loudly, representing the passing time and the writer&#39;s delay in composing the email.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Illustration of a 1950&#39;s city street&lt;/strong&gt;: People are walking around, some holding newspapers with headlines about the situation in Israel, while others seem clueless and are laughing or chatting. Above, the sky is filled with thought bubbles containing tweets, comments, and reactions, representing the overwhelming nature of media.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, let&#39;s generate these images.&lt;/p&gt;
&lt;!-- test 5 --&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/blog/2023/10/2023-10-20-transcript-chatgpt-with-dall-e/dall-e-1.png&quot; alt=&quot;DALL-E Image 1&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
Photo of a 1950&#39;s desk: An old-fashioned typewriter sits with a blank sheet of paper, symbolizing the challenge to find words. A desk lamp casts light on an open envelope and a calendar displaying the end of September and start of October. Nearby, a vintage radio broadcasts news, with a small family photo placed beside it, emphasizing concern for loved ones.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/blog/2023/10/2023-10-20-transcript-chatgpt-with-dall-e/dall-e-2.png&quot; alt=&quot;DALL-E Image 2&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
Photo of a 1950&#39;s living room: A family gathers around an old television set broadcasting news about Israel. The atmosphere in the room is palpable with tension. A prominently audible clock ticks in the background, hinting at the passage of time and the delay in communication.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/blog/2023/10/2023-10-20-transcript-chatgpt-with-dall-e/dall-e-3.png&quot; alt=&quot;DALL-E Image 3&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
Illustration of a 1950&#39;s city street: Pedestrians walk about, some holding newspapers with bold headlines about Israel, while others seem blissfully unaware, laughing or chatting. Above them, the sky is crowded with thought bubbles filled with tweets, comments, and various reactions, capturing the overwhelming nature of media and public opinion.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I apologize, but one of the images based on the descriptions provided couldn&#39;t be generated due to our content policy. However, the other images that align with the 1950&#39;s theme and capture the essence of the paragraphs you provided are now displayed. Please let me know if there are any modifications or additional requests you&#39;d like to make.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: I like the idea of the typewriter with a blank page. Drop the calendar and photo on the desk.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: Understood. I&#39;ll modify the image description to focus on the typewriter with a blank page, removing the calendar and family photo elements. Here&#39;s the revised description:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Photo of a 1950&#39;s desk&lt;/strong&gt;: An old-fashioned typewriter sits with a blank sheet of paper, symbolizing the challenge to find words. A desk lamp casts light on the scene, and nearby, a vintage radio broadcasts news, highlighting the backdrop of unfolding events.&lt;/p&gt;
&lt;p&gt;Let&#39;s generate this image.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/blog/2023/10/2023-10-20-transcript-chatgpt-with-dall-e/dall-e-4.png&quot; alt=&quot;DALL-E Image 4&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
Photo of a 1950&#39;s desk: An old-fashioned typewriter with a blank sheet of paper, symbolizing the struggle to find words. A desk lamp illuminates the scene, and a vintage radio nearby broadcasts news, capturing the backdrop of current events.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: Remove the radio on the right and the mouse. Make the pencil more pencil-like.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt;: Got it. I&#39;ll make the following adjustments to the image description:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Photo of a 1950&#39;s desk&lt;/strong&gt;: An old-fashioned typewriter sits with a blank sheet of paper, symbolizing the challenge to find words. A desk lamp casts light on the scene. Nearby, a distinctly pencil-like pencil rests on the desk, emphasizing the traditional tools of writing.&lt;/p&gt;
&lt;p&gt;Let&#39;s generate this revised image.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/blog/2023/10/2023-10-20-transcript-chatgpt-with-dall-e/dall-e-5.png&quot; alt=&quot;DALL-E Image 5&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
Photo of a 1950&#39;s desk: An old-fashioned typewriter with a blank sheet of paper, representing the challenge to find words. A desk lamp shines over the scene. A distinct, traditional pencil rests on the desk, emphasizing classic writing tools.
&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
    </entry>
    <entry>
      <title>Why I prefer pnpm over npm</title>
      <link href="https://metaist.com/blog/2023/09/pnpm-over-npm.html"/>
      <id>tag:metaist.com,2010:blog.post-cf29778add6504e41b0bfc8911d0a039ee6e44fd</id>
      <published>Wed Sep 06 2023 18:04:15 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Sep 06 2023 18:04:15 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Yesterday I had a conversation with &lt;strong&gt;Joe Hostyk&lt;/strong&gt; who pointed out that I hadn&#39;t been publishing blog posts in the quick-and-dirty-throwaway manner I had suggested I would be doing. The barrier for publishing had been creeping up again and I didn&#39;t publish anything in August at all.&lt;/p&gt;
&lt;p&gt;Part of my reluctance to publish is I don&#39;t want to start flame wars, but I do want a public record of my preferences so that I can compile them into guidance for my team.&lt;/p&gt;
&lt;p&gt;So below are some of my reasons for why I like &lt;a href=&quot;https://pnpm.io/&quot;&gt;&lt;code&gt;pnpm&lt;/code&gt;&lt;/a&gt; more than &lt;a href=&quot;https://www.npmjs.com/&quot;&gt;&lt;code&gt;npm&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It&#39;s fast.&lt;/strong&gt; &lt;code&gt;npm&lt;/code&gt; has gotten a lot faster in recent years, but &lt;code&gt;pnpm&lt;/code&gt; still feels snappier. Speed is a huge factor in the way I pick tools, especially tools that I use very frequently. It&#39;s why I tried out &lt;a href=&quot;https://yarnpkg.com/&quot;&gt;&lt;code&gt;yarn&lt;/code&gt;&lt;/a&gt; when it first came out. Although there are other stronger reasons, speed is one reason I prefer &lt;a href=&quot;https://github.com/psf/black&quot;&gt;&lt;code&gt;black&lt;/code&gt;&lt;/a&gt; over &lt;a href=&quot;https://github.com/pylint-dev/pylint&quot;&gt;&lt;code&gt;pylint&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It makes it easy to run scripts.&lt;/strong&gt; Even though I still need to get used to typing that first &lt;code&gt;p&lt;/code&gt;, I like &lt;code&gt;pnpm dev&lt;/code&gt; much more than &lt;code&gt;npm run dev&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It resolves packages properly.&lt;/strong&gt; Not sure why &lt;code&gt;npm&lt;/code&gt; has such a hard time resolving packages. It&#39;s not as bad as &lt;a href=&quot;https://pipenv.pypa.io/en/latest/&quot;&gt;&lt;code&gt;pipenv&lt;/code&gt;&lt;/a&gt;, but still occasionally gets stuck. (This was the other reason I tried &lt;code&gt;yarn&lt;/code&gt;.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It&#39;s hard to import something you didn&#39;t install.&lt;/strong&gt; This is one of the gotchas of &lt;code&gt;node_modules&lt;/code&gt; with &lt;code&gt;npm&lt;/code&gt;: if your dependency has a dependency, you can reference it even though it&#39;s not your direct dependency. Depending on something implicitly is asking for trouble.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Eventually, I should compile all these principles somewhere where I track my current set of preferred tools.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Problem: Infinite Mail Logs</title>
      <link href="https://metaist.com/blog/2023/09/infinite-mail-logs.html"/>
      <id>tag:metaist.com,2010:blog.post-2f49bdfa9a94aac77680d2e06f07d93d436e8d52</id>
      <published>Tue Sep 05 2023 11:35:38 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 05 2023 11:35:38 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Every so often (usually when the root disk runs out of space) I have to clear mail logs and I still, despite much Googling and ChatGPT&#39;ing, haven&#39;t figured out how to resolve this in a permanent way. Eventually, the root disk runs out of space.&lt;/p&gt;
&lt;p&gt;One day I&#39;ll figure this out and reference this post.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Preventing link rot</title>
      <link href="https://metaist.com/blog/2023/09/freshlinks.html"/>
      <id>tag:metaist.com,2010:blog.post-4681428a6e86b154e6e8d4d5a40672ccdb049f17</id>
      <published>Tue Sep 05 2023 11:28:16 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Nov 30 2023 21:39:24 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Rebooting the blog reminded me that one worry I often have is dealing with &lt;a href=&quot;https://en.wikipedia.org/wiki/Link_rot&quot;&gt;link rot&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;rough-idea&quot; tabindex=&quot;-1&quot;&gt;Rough Idea &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fetch the content of a link.
&lt;ul&gt;
&lt;li&gt;If the link does not come back:
&lt;ul&gt;
&lt;li&gt;note the kind of error (404, 4xx, 5xx)&lt;/li&gt;
&lt;li&gt;move on to the next link&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If the link comes back:
&lt;ul&gt;
&lt;li&gt;record the success&lt;/li&gt;
&lt;li&gt;if domain of the link is different than the target domain: move on to next link&lt;/li&gt;
&lt;li&gt;look for references to other resources and add them to the queue
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;* href=&amp;quot;$URL&amp;quot;&amp;gt;&lt;/code&gt; - a, area, base, link&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;* src=&amp;quot;$URL&amp;quot;&amp;gt;&lt;/code&gt; - audio, embed, iframe, img, input, script, source, track, video&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;attempt-1-naive-approach&quot; tabindex=&quot;-1&quot;&gt;Attempt 1: Naive Approach &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&#39;s get this working in the most straightforward way first.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# lib&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; bs4 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BeautifulSoup
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; requests

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    BASE_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:8080&quot;&lt;/span&gt;
    target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:8080/blog&quot;&lt;/span&gt;

    todo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# link is new&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ERR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;ERR &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# link is good&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# link should be scraped&lt;/span&gt;

        soup &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;html.parser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; tag &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; soup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;select&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[src],[href]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# ignore fragments&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;next_link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;

            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next_link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This takes about 6 minutes to run on my locally-hosted version of my blog. Kinda slow, but a fine start. I also discover that &lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;my port to &lt;code&gt;eleventy&lt;/code&gt; missed an important variable&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;attempt-2-naive-parallel&quot; tabindex=&quot;-1&quot;&gt;Attempt 2: Naive Parallel &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Normally, I&#39;d reach for &lt;code&gt;ezq&lt;/code&gt; to do this processing in parallel except that &lt;code&gt;todo&lt;/code&gt; grows as you scrape, so there&#39;s not obvious place to send the &lt;code&gt;END_MSG&lt;/code&gt;. Who should notify workers they are done?&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# lib&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; bs4 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BeautifulSoup
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; multiprocess &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Manager
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ezq
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; requests

BASE_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:8080&quot;&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;is_alive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            ok &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        ok &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
        done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ERR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;ERR &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add_links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    soup &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;html.parser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; tag &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; soup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;select&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[src],[href]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# ignore fragments&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;next_link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next_link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# link is new&lt;/span&gt;

        ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_alive&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; ok&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# link is good&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# link should be scraped&lt;/span&gt;

        add_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; Manager&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        todo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_alive&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/blog&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        add_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; w &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ezq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;worker&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ezq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;NUM_CPUS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This takes about 40 seconds. I do find the &lt;code&gt;ezq&lt;/code&gt; wrappers are still nicer than creating &lt;code&gt;Process&lt;/code&gt; objects, but now there are a few race conditions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;checking if a link was processed may return &lt;code&gt;False&lt;/code&gt; to two workers&lt;/li&gt;
&lt;li&gt;adding links to &lt;code&gt;todo&lt;/code&gt; may take too long and workers may start shutting down prematurely&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;approach-3-parallel-with-sleeps&quot; tabindex=&quot;-1&quot;&gt;Approach 3: Parallel with Sleeps &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So now we protect (a little bit) against &lt;code&gt;.pop&lt;/code&gt; from an empty list and from a worker ending early by adding &lt;code&gt;sleep&lt;/code&gt; to the top and bottom of the &lt;code&gt;for&lt;/code&gt; loop. We also restructure the &lt;code&gt;continue&lt;/code&gt; statements so that we don&#39;t accidentally end too early.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# native&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; time &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sleep

&lt;span class=&quot;token comment&quot;&gt;# lib&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; bs4 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BeautifulSoup
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; multiprocess &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Manager
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ezq
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; requests

BASE_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:8080&quot;&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;is_alive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            ok &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        ok &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
        done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ERR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;ERR &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add_links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    soup &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;html.parser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; tag &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; soup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;select&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[src],[href]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# ignore fragments&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            next_link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;next_link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; next_link&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; next_link


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

        link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# new link&lt;/span&gt;
            done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# prevent other workers&lt;/span&gt;
            ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_alive&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ok &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# scrape this link&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; add_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# only add new links&lt;/span&gt;
                        todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# maybe we&#39;re all done&lt;/span&gt;
            sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; Manager&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        todo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_alive&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/blog&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; add_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; w &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ezq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;worker&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ezq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;NUM_CPUS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This also takes about 40 seconds but with fewer differences in output from the initial naive version.&lt;/p&gt;
&lt;h2 id=&quot;approach-4-process-the-content-type&quot; tabindex=&quot;-1&quot;&gt;Approach 4: Process the content type &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that I&#39;ve set up the skeleton, I&#39;m noticing that there are bunch of content errors including trying to parse XML (Atom Feed) and getting lots of &lt;code&gt;403&lt;/code&gt; responses. We can do a little better by processing the content-type.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# native&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; time &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sleep
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; re

&lt;span class=&quot;token comment&quot;&gt;# lib&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; bs4 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BeautifulSoup
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; multiprocess &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Manager
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ezq
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; requests

BASE_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:8080&quot;&lt;/span&gt;

HEADERS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;User-Agent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

RE_CSS_IMPORT &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token triple-quoted-string string&quot;&gt;r&quot;&quot;&quot;@import [&quot;&#39;]([^&quot;&#39;]+)&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MULTILINE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
RE_CSS_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;url&#92;s*&#92;(&#92;s*([^)]+)&#92;s*&#92;)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MULTILINE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;is_alive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; headers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;HEADERS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status_code &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            ok &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        ok &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
        done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ERR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;ERR &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_css_links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; pattern &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;RE_CSS_IMPORT&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; RE_CSS_URL&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; pattern&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;findall&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; link


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_xhtml_links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;soup&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; tag &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; soup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;select&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[src],[href]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attrs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; tag&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add_links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ctype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;headers&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ctype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;text/css&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.css&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; get_css_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; ctype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;text/xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; get_xhtml_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; get_xhtml_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;html.parser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; links&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# fragment&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mailto:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# email&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;data:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# base64-encoded data&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# TODO: add relative links&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; link


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

        link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# new link&lt;/span&gt;
            done&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# prevent other workers&lt;/span&gt;
            ok&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_alive&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ok &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# scrape this link&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; add_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# only add new links&lt;/span&gt;
                        todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# maybe we&#39;re all done&lt;/span&gt;
            sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; Manager&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        todo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; manager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; req &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_alive&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/blog&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; add_links&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;req&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            todo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; w &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ezq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;worker&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; done&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ezq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;NUM_CPUS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;open-tasks&quot; tabindex=&quot;-1&quot;&gt;Open Tasks &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; get links from XML (&lt;code&gt;[href]&lt;/code&gt;)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; get links from CSS (&lt;code&gt;@import&lt;/code&gt;)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; ignore &lt;code&gt;data:&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; ignore &lt;code&gt;mailto:&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; add cache&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; add args&lt;/label&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28-1&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-12-01T02:39:24Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/freshlinks.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/freshlinks/releases/tag/1.0.0&quot;&gt;&lt;code&gt;freshlinks 1.0.0&lt;/code&gt;&lt;/a&gt; is now published.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Non-Consecutive Mappiq He</title>
      <link href="https://metaist.com/blog/2023/09/non-consecutive-mappiq-he.html"/>
      <id>tag:metaist.com,2010:blog.post-7d2b1238065d4cbdd0d4fb31eb7cc4e426cb1f7c</id>
      <published>Mon Sep 04 2023 17:08:52 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously: &lt;a href=&quot;https://metaist.com/blog/2023/09/consecutive-mappiq-he.html&quot;&gt;Consecutive Mappiq He&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A natural follow-up question to yesterday&#39;s post is: What is the maximum number of mappiq he in any one verse?&lt;/p&gt;
&lt;p&gt;In some ways this is a simpler question because we just need to look verse-by-verse and we don&#39;t care about streaks.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; bs4 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BeautifulSoup

URL_SEFARIA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://www.sefaria.org/{book}.{chap}.{verse}&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;| count | ref |&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;|-------|-----|&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; path &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;glob&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;*.xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.DH&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Index&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
    soup &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; verse &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; soup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_all&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;v&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        count &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;הּ&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; word &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; verse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_all&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; count &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            book &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stem
            chap_num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; verse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            verse_num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; verse&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            ref &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;chap_num&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;verse_num&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; URL_SEFARIA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;book&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; chap&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;chap_num&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; verse&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;verse_num&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;|&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;count&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;|[&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ref&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)|&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;count&lt;/th&gt;
&lt;th&gt;ref&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.4.9&quot;&gt;Daniel 4:9&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.5.20&quot;&gt;Daniel 5:20&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.5.21&quot;&gt;Daniel 5:21&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.6.11&quot;&gt;Daniel 6:11&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.7.14&quot;&gt;Daniel 7:14&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.7.20&quot;&gt;Daniel 7:20&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.21.14&quot;&gt;Deuteronomy 21:14&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.24.1&quot;&gt;Deuteronomy 24:1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.24.3&quot;&gt;Deuteronomy 24:3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.28.56&quot;&gt;Deuteronomy 28:56&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Exodus.21.8&quot;&gt;Exodus 21:8&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ezekiel.24.11&quot;&gt;Ezekiel 24:11&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Hosea.2.13&quot;&gt;Hosea 2:13&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.5.14&quot;&gt;Isaiah 5:14&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.45.18&quot;&gt;Isaiah 45:18&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Job.28.27&quot;&gt;Job 28:27&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Joshua.8.2&quot;&gt;Joshua 8:2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Joshua.10.30&quot;&gt;Joshua 10:30&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Joshua.10.37&quot;&gt;Joshua 10:37&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Joshua.10.39&quot;&gt;Joshua 10:39&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Joshua.19.47&quot;&gt;Joshua 19:47&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/II_Kings.4.27&quot;&gt;Kings_2 4:27&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/II_Kings.8.5&quot;&gt;Kings_2 8:5&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Lamentations.1.2&quot;&gt;Lamentations 1:2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.2.2&quot;&gt;Leviticus 2:2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.2.16&quot;&gt;Leviticus 2:16&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.15.19&quot;&gt;Leviticus 15:19&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.15.25&quot;&gt;Leviticus 15:25&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.15.26&quot;&gt;Leviticus 15:26&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.18.17&quot;&gt;Leviticus 18:17&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.5.27&quot;&gt;Numbers 5:27&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.13.32&quot;&gt;Numbers 13:32&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.19.5&quot;&gt;Numbers 19:5&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.30.5&quot;&gt;Numbers 30:5&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.30.6&quot;&gt;Numbers 30:6&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.30.9&quot;&gt;Numbers 30:9&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.30.12&quot;&gt;Numbers 30:12&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.30.13&quot;&gt;Numbers 30:13&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/I_Samuel.1.23&quot;&gt;I_Samuel 1:23&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Zechariah.4.2&quot;&gt;Zechariah 4:2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Lots of fours and fives, but there are &lt;strong&gt;six&lt;/strong&gt; in &lt;a href=&quot;https://www.sefaria.org/Numbers.5.27&quot;&gt;Numbers 5:27&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/non-consecutive-mappiq-he.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/non-consecutive-mappiq-he.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Consecutive Mappiq He</title>
      <link href="https://metaist.com/blog/2023/09/consecutive-mappiq-he.html"/>
      <id>tag:metaist.com,2010:blog.post-dc6176f02bcb553dd156c2b82e3e75984741b1fa</id>
      <published>Sun Sep 03 2023 11:09:28 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;strong&gt;Harold Zazula&lt;/strong&gt; asks: What is the longest consecutive string of words with a &lt;a href=&quot;https://en.wikipedia.org/wiki/Mappiq&quot;&gt;mappiq he&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;To figure this out, let&#39;s use the &lt;a href=&quot;https://tanach.us/Books/Tanach.xml.zip&quot;&gt;Leningrad Codex&lt;/a&gt; which has a nice XML representation of all of Tanach. You need to download this bit manually to avoid 403 errors.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;unzip&lt;/span&gt; Tanach.xml.zip
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; Books
python&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pathlib &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Path
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; bs4 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BeautifulSoup

URL_SEFARIA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://www.sefaria.org/{book}.{chap}.{verse}&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;| count | ref | words |&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;|-------|-----|-------|&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# iterate over each xml file alphabetically (to keep things deterministic)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; path &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;glob&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;*.xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# ignore extraneous files&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.DH&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Index&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# load the xml file; require lxml library&lt;/span&gt;
    soup &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BeautifulSoup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;xml&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    words &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; soup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_all&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# get all the words&lt;/span&gt;
    streak &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# reset our streak of found words&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; word &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;הּ&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# if this word has a mappiq-he&lt;/span&gt;
            streak&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# add it to the streak&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; streak&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# otherwise, we&#39;ll need to reset the streak&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;streak&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# we should print streaks longer than 1 word&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# save a reference to chapter:verse&lt;/span&gt;
                book &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stem
                chap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; streak&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                verse &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; streak&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                seq &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; w &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; streak&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                ref &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;chap&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;verse&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; URL_SEFARIA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;book&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; chap&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;chap&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; verse&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;verse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;|&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;streak&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;|[&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ref&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)|&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;seq&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;|&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            streak &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# reset the streak&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;!-- cspell:disable --&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;count&lt;/th&gt;
&lt;th&gt;ref&lt;/th&gt;
&lt;th&gt;words&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.2.48&quot;&gt;Daniel 2:48&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לֵ֔הּ, וְהַ֨שְׁלְטֵ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.4.29&quot;&gt;Daniel 4:29&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יִתְּנִנַּֽהּ׃, בַּהּ־&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.5.2&quot;&gt;Daniel 5:2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;שֵׁגְלָתֵ֖הּ, וּלְחֵנָתֵֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.5.3&quot;&gt;Daniel 5:3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;שֵׁגְלָתֵ֖הּ, וּלְחֵנָתֵֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.5.20&quot;&gt;Daniel 5:20&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לִבְבֵ֔הּ, וְרוּחֵ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.6.11&quot;&gt;Daniel 6:11&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לֵהּ֙, בְּעִלִּיתֵ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.7.23&quot;&gt;Daniel 7:23&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וּתְדוּשִׁנַּ֖הּ, וְתַדְּקִנַּֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Daniel.11.6&quot;&gt;Daniel 11:6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וְהַיֹּ֣לְדָ֔הּ, וּמַחֲזִקָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.21.14&quot;&gt;Deuteronomy 21:14&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בָּ֗הּ, וְשִׁלַּחְתָּהּ֙, לְנַפְשָׁ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.24.1&quot;&gt;Deuteronomy 24:1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בְּיָדָ֔הּ, וְשִׁלְּחָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.24.3&quot;&gt;Deuteronomy 24:3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בְּיָדָ֔הּ, וְשִׁלְּחָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Deuteronomy.28.56&quot;&gt;Deuteronomy 28:56&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;חֵיקָ֔הּ, וּבִבְנָ֖הּ, וּבְבִתָּֽהּ׃, וּֽבְשִׁלְיָתָ֞הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Esther.2.7&quot;&gt;Esther 2:7&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וְאִמָּ֔הּ, לְקָחָ֧הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Exodus.21.8&quot;&gt;Exodus 21:8&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יְעָדָ֖הּ, וְהֶפְדָּ֑הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Exodus.21.10&quot;&gt;Exodus 21:10&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;שְׁאֵרָ֛הּ, כְּסוּתָ֥הּ, וְעֹנָתָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Exodus.25.31&quot;&gt;Exodus 25:31&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יְרֵכָ֣הּ, וְקָנָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Exodus.37.17&quot;&gt;Exodus 37:17&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יְרֵכָ֣הּ, וְקָנָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ezekiel.12.19&quot;&gt;Ezekiel 12:19&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;אַרְצָהּ֙, מִמְּלֹאָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ezekiel.24.6&quot;&gt;Ezekiel 24:6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בָ֔הּ, וְחֶ֨לְאָתָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ezekiel.24.7&quot;&gt;Ezekiel 24:7&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;דָמָהּ֙, בְּתוֹכָ֣הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ezekiel.24.11&quot;&gt;Ezekiel 24:11&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בְתוֹכָהּ֙, טֻמְאָתָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ezekiel.30.21&quot;&gt;Ezekiel 30:21&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לְחָבְשָׁ֥הּ, לְחָזְקָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Genesis.2.15&quot;&gt;Genesis 2:15&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לְעָבְדָ֖הּ, וּלְשָׁמְרָֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Genesis.3.6&quot;&gt;Genesis 3:6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לְאִישָׁ֛הּ, עִמָּ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Genesis.13.17&quot;&gt;Genesis 13:17&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לְאָרְכָּ֖הּ, וּלְרָחְבָּ֑הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Genesis.19.33&quot;&gt;Genesis 19:33&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בְּשִׁכְבָ֖הּ, וּבְקוּׄמָֽהּ׃4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Genesis.19.35&quot;&gt;Genesis 19:35&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בְּשִׁכְבָ֖הּ, וּבְקֻמָֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Genesis.35.17&quot;&gt;Genesis 35:17&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בְהַקְשֹׁתָ֖הּ, בְּלִדְתָּ֑הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Hosea.2.13&quot;&gt;Hosea 2:13&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;מְשׂוֹשָׂ֔הּ, חַגָּ֖הּ, חָדְשָׁ֣הּ, וְשַׁבַּתָּ֑הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Hosea.2.14&quot;&gt;Hosea 2:14&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;גַּפְנָהּ֙, וּתְאֵ֣נָתָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Hosea.2.15&quot;&gt;Hosea 2:15&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;נִזְמָהּ֙, וְחֶלְיָתָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.5.14&quot;&gt;Isaiah 5:14&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;הֲדָרָ֧הּ, וַהֲמוֹנָ֛הּ, וּשְׁאוֹנָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.9.6&quot;&gt;Isaiah 9:6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;אֹתָהּ֙, וּֽלְסַעֲדָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.23.18&quot;&gt;Isaiah 23:18&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;סַחְרָ֜הּ, וְאֶתְנַנָּ֗הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.28.4&quot;&gt;Isaiah 28:4&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;אוֹתָ֔הּ, בְּעוֹדָ֥הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.30.13&quot;&gt;Isaiah 30:13&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;שִׁבְרָֽהּ׃, וּ֠שְׁבָרָהּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.38.11&quot;&gt;Isaiah 38:11&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יָ֔הּ, יָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.55.10&quot;&gt;Isaiah 55:10&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וְהוֹלִידָ֖הּ, וְהִצְמִיחָ֑הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Isaiah.62.1&quot;&gt;Isaiah 62:1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;כַנֹּ֙גַהּ֙, צִדְקָ֔הּ, וִישׁוּעָתָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Jeremiah.2.7&quot;&gt;Jeremiah 2:7&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;פִּרְיָ֖הּ, וְטוּבָ֑הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Jeremiah.15.9&quot;&gt;Jeremiah 15:9&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;נַפְשָׁ֛הּ, שִׁמְשָׁ֛הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Jeremiah.33.2&quot;&gt;Jeremiah 33:2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;אוֹתָ֛הּ, לַהֲכִינָ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Jeremiah.50.29&quot;&gt;Jeremiah 50:29&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לָ֣הּ, כְּפָעֳלָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Job.22.12&quot;&gt;Job 22:12&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;אֱ֭לוֹהַּ, גֹּ֣בַהּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Job.28.27&quot;&gt;Job 28:27&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;רָ֭אָהּ, וַֽיְסַפְּרָ֑הּ, הֱ֝כִינָ֗הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Job.39.17&quot;&gt;Job 39:17&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;הִשָּׁ֣הּ, אֱל֣וֹהַּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Joshua.8.2&quot;&gt;Joshua 8:2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;שְׁלָלָ֥הּ, וּבְהֶמְתָּ֖הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/II_Kings.4.14&quot;&gt;Kings_2 4:14&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לָ֖הּ, וְאִישָׁ֥הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.2.2&quot;&gt;Leviticus 2:2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;מִסָּלְתָּהּ֙, וּמִשַּׁמְנָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.2.16&quot;&gt;Leviticus 2:16&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;אַזְכָּרָתָ֗הּ, מִגִּרְשָׂהּ֙, וּמִשַּׁמְנָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Leviticus.15.19&quot;&gt;Leviticus 15:19&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;זֹבָ֖הּ, בִּבְשָׂרָ֑הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.29.16&quot;&gt;Numbers 29:16&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;מִנְחָתָ֖הּ, וְנִסְכָּֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.29.22&quot;&gt;Numbers 29:22&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וּמִנְחָתָ֖הּ, וְנִסְכָּֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.29.25&quot;&gt;Numbers 29:25&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;מִנְחָתָ֖הּ, וְנִסְכָּֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.29.28&quot;&gt;Numbers 29:28&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וּמִנְחָתָ֖הּ, וְנִסְכָּֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.29.34&quot;&gt;Numbers 29:34&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;מִנְחָתָ֖הּ, וְנִסְכָּֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.29.38&quot;&gt;Numbers 29:38&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וּמִנְחָתָ֖הּ, וְנִסְכָּֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.30.5&quot;&gt;Numbers 30:5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;נִדְרָ֗הּ, וֽ͏ֶאֱסָרָהּ֙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Numbers.30.15&quot;&gt;Numbers 30:15&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לָ֥הּ, אִישָׁהּ֮&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Proverbs.3.16&quot;&gt;Proverbs 3:16&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בִּֽימִינָ֑הּ, בִּ֝שְׂמֹאולָ֗הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Proverbs.5.3&quot;&gt;Proverbs 5:3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;חִכָּֽהּ׃, וְֽ֭אַחֲרִיתָהּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Proverbs.31.28&quot;&gt;Proverbs 31:28&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בַּ֝עְלָ֗הּ, וַֽיְהַֽלְלָהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Psalms.105.45&quot;&gt;Psalms 105:45&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יָֽהּ׃, הַֽלְלְויָ֨הּc ׀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Psalms.148.14&quot;&gt;Psalms 148:14&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יָֽהּ׃, הַ֥לְלוּיָ֨הּ ׀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Psalms.149.9&quot;&gt;Psalms 149:9&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;יָֽהּ׃, הַ֥לְלוּיָ֨הּ ׀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ruth.1.22&quot;&gt;Ruth 1:22&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;כַלָּתָהּ֙, עִמָּ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Ruth.2.19&quot;&gt;Ruth 2:19&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;לָ֨הּ, חֲמוֹתָ֜הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/I_Samuel.17.51&quot;&gt;I_Samuel 17:51&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וַֽיִּשְׁלְפָ֤הּ, מִתַּעְרָהּ֙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/II_Samuel.3.16&quot;&gt;II_Samuel 3:16&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;אִתָּ֜הּ, אִישָׁ֗הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/II_Samuel.10.3&quot;&gt;II_Samuel 10:3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;וּלְרַגְּלָ֣הּ, וּלְהָפְכָ֔הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/II_Samuel.12.29&quot;&gt;II_Samuel 12:29&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;בָּ֖הּ, וַֽיִּלְכְּדָֽהּ׃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sefaria.org/Zechariah.4.2&quot;&gt;Zechariah 4:2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;כֻּלָּ֜הּ, וְגֻלָּ֣הּ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;!-- cspell:enable --&gt;
&lt;p&gt;Luckily there aren&#39;t that many results, so by visual inspection we can see that the maximum number of consecutive words with a mappiq he is 4 in &lt;a href=&quot;https://www.sefaria.org/Deuteronomy.28.56&quot;&gt;Deuteronomy 28:56&lt;/a&gt; (with one word in the next verse) and &lt;a href=&quot;https://www.sefaria.org/Hosea.2.13&quot;&gt;Hosea 2:13&lt;/a&gt; (all in one verse with another mappiq-he two words later).&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/consecutive-mappiq-he.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/09/consecutive-mappiq-he.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Google Drive Links: Workspace Add-on</title>
      <link href="https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html"/>
      <id>tag:metaist.com,2010:blog.post-2f886973055b73b169e7e4eabe14aaec65da4938</id>
      <published>Thu Jul 27 2023 16:07:41 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jul 27 2023 16:07:41 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2023/07/google-drive-links.html&quot;&gt;Problem: Google Drive Links&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My first approach was to create a &lt;a href=&quot;https://workspace.google.com/products/add-ons/&quot;&gt;Google Workspace Addon&lt;/a&gt; for Google Drive so that I could select some documents and get the links.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/workspace/add-ons/reference&quot;&gt;Google&#39;s documentation&lt;/a&gt; is not super-helpful, so I tried asking ChatGPT which kept suggesting that I use Google Sheets to make the add on (also not helpful).&lt;/p&gt;
&lt;p&gt;It turns out you &lt;em&gt;can&lt;/em&gt; make a sidebar for Google Drive, but it has some very particular limitations.&lt;/p&gt;
&lt;h2 id=&quot;demo&quot; tabindex=&quot;-1&quot;&gt;Demo &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; class=&quot;video&quot; src=&quot;https://www.youtube.com/embed/UjGhMYDLOS4&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/gdrive-links/tree/main/gscript&quot;&gt;Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt; (&lt;em&gt;coming soon, hopefully&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cardservice-api&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;CardService&lt;/code&gt; API &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, you must use the &lt;a href=&quot;https://developers.google.com/workspace/add-ons/reference/rpc/google.apps.card.v1&quot;&gt;&lt;code&gt;Card&lt;/code&gt; API&lt;/a&gt; to build up your UI. I&#39;m not surprised that Google has an entirely different way to build up widgets from any of the other ways there are to build up widgets, but I kept looking for a way to just use HTML. After reading &lt;a href=&quot;https://kcl.hashnode.dev/managing-google-drive-with-google-apps-script&quot;&gt;this helpful tutorial&lt;/a&gt;, I finally figured out how to get started and later discovered Google&#39;s &lt;a href=&quot;https://developers.google.com/apps-script/add-ons/concepts/card-interfaces&quot;&gt;Card-based interfaces&lt;/a&gt; for a better intro. Much later, I also found &lt;a href=&quot;https://developers.google.com/apps-script/add-ons/cats-quickstart&quot;&gt;this add-ons intro&lt;/a&gt; that really helps clarify how to make an add-on that works in multiple contexts (I may revisit this later).&lt;/p&gt;
&lt;p&gt;Second, you need to understand the difference between &amp;quot;non-contextual&amp;quot; (before you click on stuff) and &amp;quot;contextual&amp;quot; (after you click) modes. The entire UI is rebuilt every time something changes and it depends on whether the user has clicked on stuff or not. Because every click redraws the entire UI be careful about expensive function calls in the UI-drawing.&lt;/p&gt;
&lt;p&gt;Third, you may use &lt;a href=&quot;https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting&quot;&gt;basic HTML in some of the text widgets&lt;/a&gt;. But &amp;quot;basic&amp;quot; here is more basic that I imagined:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; elements.&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;style&lt;/code&gt; attributes.&lt;/li&gt;
&lt;li&gt;No wrapping of &lt;code&gt;&amp;lt;a href&amp;gt;&lt;/code&gt; in &lt;code&gt;&amp;lt;font color&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img alt=&quot;Inventing Anna: You look poor.&quot; src=&quot;https://metaist.com/static/assets/inventing-anna-poor.gif&quot;&gt;
&lt;p&gt;Finally, because the whole thing takes place in a pretty standard Google Apps Script environment, there&#39;s no access to the clipboard. I had hoped the new &lt;code&gt;ctrl+c, ctrl+v&lt;/code&gt; in Google Drive would mean that there&#39;s some way to copy stuff to the clipboard, but nope. Luckily for me, you can copy the generated HTML from the sidebar and paste (the non-underlined-and-weirdly-bright, but still blue) items into Gmail.&lt;/p&gt;
&lt;h2 id=&quot;home-screen&quot; tabindex=&quot;-1&quot;&gt;Home Screen &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first step is to create a &lt;a href=&quot;https://script.google.com/home&quot;&gt;Google App Script&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The home screen for this sidebar will simply have some text saying to click on things:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;onHomepage&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; card &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; CardService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newCardBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; section &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; CardService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newCardSection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; CardService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newTextParagraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Select some files to view links.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  section&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addWidget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addSection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;section&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pretty verbose, but meh.&lt;/p&gt;
&lt;h2 id=&quot;selected-items-screen&quot; tabindex=&quot;-1&quot;&gt;Selected Items Screen &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When the user selects one or more items in Google Drive, we&#39;re going to show them a list of links. Unfortunately, we&#39;re limited to using &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getLink&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;a href=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;DriveApp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFileById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;onDriveItemsSelected&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; card &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; CardService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newCardBuilder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; section &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; CardService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newCardSection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; links &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;drive&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;selectedItems&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;getLink&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  section&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addWidget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;CardService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newTextParagraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;links&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;br&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addSection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;section&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;exposing-the-screens&quot; tabindex=&quot;-1&quot;&gt;Exposing the Screens &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To make these screens appear at the appropriate times, we need to update the script metadata.&lt;/p&gt;
&lt;p&gt;Click on the &lt;code&gt;Project Settings&lt;/code&gt; gear on the left-hand side and ensure &lt;code&gt;Show &amp;quot;appsscript.json&amp;quot; manifest file in editor&lt;/code&gt; is enabled. We&#39;ll come back here before publishing to enable the Google Cloud Project platform.&lt;/p&gt;
&lt;p&gt;Switch back to the &lt;code&gt;Editor&lt;/code&gt; and look at &lt;code&gt;appsscript.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;timeZone&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;America/New_York&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;exceptionLogging&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;STACKDRIVER&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;runtimeVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;V8&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s add the OAuth scope for reading metadata and the additional bits we need for the add-on:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;timeZone&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;America/New_York&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;exceptionLogging&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;STACKDRIVER&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;runtimeVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;V8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;oauthScopes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;https://www.googleapis.com/auth/drive.addons.metadata.readonly&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;https://www.googleapis.com/auth/drive.readonly&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;addOns&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;common&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Copy Links&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;logoUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://github.com/metaist/gdrive-links/blob/main/icons/gdrive-links.png?raw=true&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;homepageTrigger&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;runFunction&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;onHomepage&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;drive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;onItemsSelectedTrigger&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;runFunction&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;onDriveItemsSelected&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;google-cloud-project&quot; tabindex=&quot;-1&quot;&gt;Google Cloud Project &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In order to deploy the Workspace Add-on, you need a Google Cloud Project.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://console.cloud.google.com/projectcreate&quot;&gt;Create a new Google Cloud Console project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://console.cloud.google.com/apis/credentials/consent&quot;&gt;Configure the OAuth consent screen&lt;/a&gt;. Choose &lt;code&gt;External&lt;/code&gt; if you want to let anyone use this add-on. The &lt;code&gt;App name&lt;/code&gt;, &lt;code&gt;User support email&lt;/code&gt; are required. &lt;code&gt;Logo file to upload&lt;/code&gt; is recommended.&lt;/li&gt;
&lt;li&gt;If you want to &lt;em&gt;publish&lt;/em&gt; this app to the Marketplace, you&#39;re going to need to provide a &lt;code&gt;Privacy Policy&lt;/code&gt;, a YouTube video showing how you use the data, and a written explanation of why you need access to sensitive and/or restricted user data.&lt;/li&gt;
&lt;li&gt;Manually add the OAuth scopes: &lt;code&gt;https://www.googleapis.com/auth/drive.readonly&lt;/code&gt;, &lt;code&gt;https://www.googleapis.com/auth/drive.addons.metadata.readonly&lt;/code&gt;, click &lt;code&gt;Add to table&lt;/code&gt;, and then &lt;code&gt;Update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add yourself as a test user and click &lt;code&gt;Add&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://console.cloud.google.com/apis/dashboard&quot;&gt;APIs &amp;amp; Services&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Enable APIs and Services&lt;/code&gt;, search for &lt;code&gt;Drive&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;code&gt;Google Drive API&lt;/code&gt; and then &lt;code&gt;Enable&lt;/code&gt;. If you don&#39;t do this, you&#39;ll get a cryptic error message like &lt;code&gt;Exception: We&#39;re sorry, a server error occurred. Please wait a bit and try again.&lt;/code&gt; when you try to test your add-on.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;test-deploy&quot; tabindex=&quot;-1&quot;&gt;Test Deploy &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;On the Google Cloud Console upper-right hand corner, click the three dots and then &lt;code&gt;Project settings&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy the &lt;code&gt;Project number&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Go back to the Google Apps Script &lt;code&gt;Project Settings&lt;/code&gt; and click &lt;code&gt;Change project&lt;/code&gt; under the &lt;code&gt;Google Cloud Platform (GCP) Project&lt;/code&gt; heading. Paste the project number into the box and click &lt;code&gt;Set project&lt;/code&gt;. If you get any errors, follow the instructions.&lt;/li&gt;
&lt;li&gt;Go to the &lt;code&gt;Editor&lt;/code&gt; and click &lt;code&gt;Run&lt;/code&gt; in the toolbar. In the popup, click &lt;code&gt;Review permissions&lt;/code&gt;, choose your account and click &lt;code&gt;Allow&lt;/code&gt;. Ignore any errors; the goal was just to give the code permission to run.&lt;/li&gt;
&lt;li&gt;In the upper-right &lt;code&gt;Deploy&lt;/code&gt; menu, click &lt;code&gt;Test deployments&lt;/code&gt;, &lt;code&gt;Install&lt;/code&gt;, and then &lt;code&gt;Done&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open a Google Drive folder and click on an item. In the sidebar, open the Copy Links and select &lt;code&gt;Authorize Access&lt;/code&gt;. You should now see a link to the item you selected.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;full-deploy&quot; tabindex=&quot;-1&quot;&gt;Full Deploy &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/07/google-drive-links-workspace-add-on.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now it&#39;s time to &lt;a href=&quot;https://developers.google.com/workspace/marketplace/how-to-publish&quot;&gt;publish an app&lt;/a&gt;. Which then requires you to &lt;a href=&quot;https://developers.google.com/workspace/marketplace/enable-configure-sdk&quot;&gt;configure your app in Google Workspace Marketplace SDK&lt;/a&gt;. The primary things this involves are having &lt;a href=&quot;https://metaist.com/terms&quot;&gt;Terms of Service&lt;/a&gt;, &lt;a href=&quot;https://metaist.com/privacy&quot;&gt;Privacy Policy&lt;/a&gt;, and a &lt;a href=&quot;https://www.youtube.com/watch?v=UjGhMYDLOS4&quot;&gt;video demo of the add-on&lt;/a&gt;. I&#39;m also going to need some kind of written description, but I&#39;m hoping this blog post is sufficient.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Google Clasp</title>
      <link href="https://metaist.com/blog/2023/07/google-clasp.html"/>
      <id>tag:metaist.com,2010:blog.post-aa685f044a00e4c15e87ea043d9cb6ff939e4b2a</id>
      <published>Wed Jul 26 2023 17:23:07 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Jul 26 2023 17:23:07 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;I&#39;ve been writing Google Apps Scripts for a while, but only recently discovered that Google has a command-line tool called &lt;a href=&quot;https://github.com/google/clasp&quot;&gt;&lt;code&gt;clasp&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&#39;s a &lt;code&gt;node&lt;/code&gt;-based tool and is generally pretty slow, but it makes it much easier to write code in a local IDE and then &lt;code&gt;clasp push&lt;/code&gt; it to Google Drive. It has some weird semantics (i.e. it&#39;s not version controlled) and is tied to a global login. It also won&#39;t let you push anything with a syntax error in it which is similar to the web-based version.&lt;/p&gt;
&lt;p&gt;The error messages are generally pretty good, but one thing you need to remember to do is to &lt;a href=&quot;https://script.google.com/home/usersettings&quot;&gt;enable Google Apps Script API&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Problem: Google Drive Links</title>
      <link href="https://metaist.com/blog/2023/07/google-drive-links.html"/>
      <id>tag:metaist.com,2010:blog.post-c1da2b44b69c1d5e92902baff9fecfd04299a77d</id>
      <published>Wed Jul 26 2023 11:13:12 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Jul 26 2023 17:39:14 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Several times a day I need to send emails with links to Google Drive documents. However, I do not like the default &amp;quot;Insert File from Google Drive&amp;quot; formatting in Gmail and Google Docs; I just want plain links with the title of the document as the link text.&lt;/p&gt;
&lt;p&gt;Here is my usual workflow using keyboard shortcuts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ctrl + tab&lt;/code&gt;: Open Gmail.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c&lt;/code&gt;: Create a draft email.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + shift + 8&lt;/code&gt;: Create a bulleted list, if I&#39;m going to be sending multiple documents.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + tab, click&lt;/code&gt;: Switch to Google Drive, click on a document.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n, ctrl + c, esc&lt;/code&gt;: Open the &amp;quot;Rename&amp;quot; modal, copy the name, close the modal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + shift + tab&lt;/code&gt;: Switch back to Gmail.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + v&lt;/code&gt;: Paste the document name.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + tab&lt;/code&gt;: Switch back to Google Drive.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a, down, down, down, down, right, down, enter&lt;/code&gt;: Copy the link to the document. Often I will just click the &amp;quot;Copy Link&amp;quot; button in the toolbar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + shift + tab&lt;/code&gt;: Switch back to Gmail.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + shift + left&lt;/code&gt;: Select the name of the document.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + k, ctrl + v, enter&lt;/code&gt;: Open the &amp;quot;Edit Link&amp;quot; modal, paste the link, close the modal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now repeat everything from the third step down for each additional document.&lt;/p&gt;
&lt;img src=&quot;https://metaist.com/static/assets/inventing-anna-no-time.gif&quot; alt=&quot;Inventing Anna: ... I really don&#39;t have time for this!&quot;&gt;
&lt;p&gt;For a single document, this is bad, but not terrible. When I have multiple documents, this gets very painful. In the next few posts, I&#39;ll describe various solutions I&#39;ve been working on.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Add a non-boot disk</title>
      <link href="https://metaist.com/blog/2023/06/gcp-add-disk.html"/>
      <id>tag:metaist.com,2010:blog.post-03dbe3a89b7e97301ad114114fe45ac5c834ee6b</id>
      <published>Thu Jun 15 2023 11:56:18 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jun 15 2023 11:56:18 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;I always have to lookup &lt;a href=&quot;https://cloud.google.com/compute/docs/disks/format-mount-disk-linux&quot;&gt;how to add and format a disk to the cloud boxes&lt;/a&gt;. So I &lt;a href=&quot;https://gist.github.com/metaist/c727dc3946880c4d31de2b571801f534&quot;&gt;wrote a little script to make my life easier&lt;/a&gt;.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/metaist/c727dc3946880c4d31de2b571801f534.js&quot;&gt;&lt;/script&gt;
</content>
    </entry>
    <entry>
      <title>2023-06-06 Weeknotes</title>
      <link href="https://metaist.com/blog/2023/06/2023-06-06-weeknotes.html"/>
      <id>tag:metaist.com,2010:blog.post-c3fe7dcd46e3ce73fbf0f23de1ea0300776f7353</id>
      <published>Tue Jun 06 2023 16:31:41 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Jun 06 2023 16:31:45 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Going forward, I&#39;m going to start calling these &amp;quot;weeknotes&amp;quot; following the apparent convention for this kind of thing.&lt;/p&gt;
&lt;h2 id=&quot;releases&quot; tabindex=&quot;-1&quot;&gt;Releases &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/2023-06-06-weeknotes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/releases/tag/0.1.2&quot;&gt;&lt;code&gt;attrbox&lt;/code&gt; 0.1.2&lt;/a&gt;; &lt;a href=&quot;https://metaist.com/blog/2023/06/attrbox-0.1.2.html&quot;&gt;my brief notes&lt;/a&gt;. Because of annoying &lt;code&gt;py.typed&lt;/code&gt; and &lt;code&gt;PyPI&lt;/code&gt; issues, I eventually had to release &lt;a href=&quot;https://github.com/metaist/attrbox/releases/tag/0.1.5&quot;&gt;&lt;code&gt;attrbox&lt;/code&gt; 0.1.5&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/pdfmerge/releases/tag/1.0.0&quot;&gt;&lt;code&gt;pdfmerge&lt;/code&gt; 1.0.0&lt;/a&gt;; &lt;a href=&quot;https://metaist.com/blog/2023/06/pdfmerge-1.0.0.html&quot;&gt;my brief notes&lt;/a&gt;. I use this about once a week and not having to keep around python 2 feels like a huge relief.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ezq/releases/tag/3.0.4&quot;&gt;&lt;code&gt;ezq&lt;/code&gt; 3.0.4&lt;/a&gt; just to make it &lt;code&gt;py.typed&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/visual-schedule/releases/tag/0.1.0&quot;&gt;&lt;code&gt;visual-schedule&lt;/code&gt; 0.1.0&lt;/a&gt;. This was the inaugural project for &lt;a href=&quot;https://metaist.com/blog/tag/design-lab/&quot;&gt;Design Lab&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/metaist/b10433ccc6795d4ed82ef42e0b70a209&quot;&gt;&lt;code&gt;srt2txt.py&lt;/code&gt;&lt;/a&gt; a quick gist to aggregate subtitle file by speaker.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;posts&quot; tabindex=&quot;-1&quot;&gt;Posts &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/2023-06-06-weeknotes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/fun-with-python-mapping.html&quot;&gt;Fun with Python Mapping&lt;/a&gt;: I learned more about the python type system than I expected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/pep-8-thoughts.html&quot;&gt;PEP 8 Thoughts&lt;/a&gt;: I re-read &lt;a href=&quot;https://peps.python.org/pep-0008&quot;&gt;PEP 8&lt;/a&gt; for the first time in a long time and found a few bits I didn&#39;t agree with anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2023/06/apt-segfault.html&quot;&gt;&lt;code&gt;apt&lt;/code&gt; segfault&lt;/a&gt;: partially resolved a segfault in &lt;code&gt;apt&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;1 hour to make a visual schedule (Design Lab #1)&lt;/a&gt;: This was a lot of fun to make. I&#39;m trying to keep the amount of work low&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2023/06/trying-whisperx.html&quot;&gt;Trying whisperX&lt;/a&gt;: Trying to generate subtitles and transcript from a video file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Trying whisperX</title>
      <link href="https://metaist.com/blog/2023/06/trying-whisperx.html"/>
      <id>tag:metaist.com,2010:blog.post-027b8d31c62c60d2106c61aad3b629296dec4943</id>
      <published>Tue Jun 06 2023 16:31:34 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Jun 06 2023 16:31:35 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;As part of making the &lt;a href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;first episode&lt;/a&gt; of &lt;a href=&quot;https://metaist.com/blog/tag/design-lab/&quot;&gt;&lt;em&gt;Design Lab&lt;/em&gt;&lt;/a&gt;, I needed two assets: subtitles and a transcript.&lt;/p&gt;
&lt;h2 id=&quot;problem&quot; tabindex=&quot;-1&quot;&gt;Problem &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/trying-whisperx.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The entire episode was recorded with Google Meet (video + transcript), but the resulting Google Doc was not that great. YouTube&#39;s automatic captions weren&#39;t that great either.&lt;/p&gt;
&lt;h2 id=&quot;possible-solution&quot; tabindex=&quot;-1&quot;&gt;Possible Solution &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/trying-whisperx.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Shalev NessAiver&lt;/strong&gt; pointed me at &lt;a href=&quot;https://github.com/m-bain/whisperX&quot;&gt;whisperX&lt;/a&gt; which can do all kinds of transcription tasks. He had warned me that &lt;a href=&quot;https://en.wikipedia.org/wiki/Speaker_diarisation&quot;&gt;&lt;strong&gt;speaker diarization&lt;/strong&gt;&lt;/a&gt; (figuring out who is speaking) was super slow. So I figured I could run the process over night to try it out.&lt;/p&gt;
&lt;h2 id=&quot;setup&quot; tabindex=&quot;-1&quot;&gt;Setup &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/trying-whisperx.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, I had to &lt;a href=&quot;https://huggingface.co/settings/tokens&quot;&gt;get a HuggingFace token&lt;/a&gt; and &lt;a href=&quot;https://github.com/m-bain/whisperX#speaker-diarization&quot;&gt;agree to a bunch of user agreements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then, I was able to get it running on my M1 pretty easily:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/m-bain/whisperX.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; whisperX
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; torch torchvision torchaudio
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
whisperx &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I extracted the audio from the recording:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; video.mp4 audio.mp3&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;running&quot; tabindex=&quot;-1&quot;&gt;Running &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/trying-whisperx.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Then I made a little wrapper around &lt;code&gt;whisperx&lt;/code&gt; in a file called &lt;code&gt;run.sh&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;time&lt;/span&gt; whisperx &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--model&lt;/span&gt; large-v2 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--compute_type&lt;/span&gt; float32 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--language&lt;/span&gt; en &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--diarize&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--min_speakers&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--max_speakers&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--threads&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--hf_token&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;REMOVED&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I ran &lt;code&gt;run.sh audio.mp3&lt;/code&gt; which ran for many hours. I added the &lt;code&gt;time&lt;/code&gt; command afterwards because I realized I didn&#39;t know how long it actually took. Certainly over 3 hours for an hour-long audio.&lt;/p&gt;
&lt;h2 id=&quot;clean-up&quot; tabindex=&quot;-1&quot;&gt;Clean up &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/trying-whisperx.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;whisperx&lt;/code&gt; produces several formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.json&lt;/code&gt;: very detailed word-level segment information including the speaker and a score&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.srt&lt;/code&gt;: a subtitle file. This is the main thing I cleaned up&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.tsv&lt;/code&gt;: start, end, and text in a tab-delimited format&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.txt&lt;/code&gt;: all the text without speaker or time information&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.vtt&lt;/code&gt;: similar to the &lt;code&gt;.srt&lt;/code&gt;, but starts with &lt;code&gt;WEBVTT&lt;/code&gt; (not sure how else its different)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There were only a few places where I needed to clean up the &lt;code&gt;.srt&lt;/code&gt;. Transcription was really good and only picked the wrong word when I was mumbling or using technical jargon (e.g., &lt;code&gt;document.createElement&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Diarization was remarkably good, but it turned out that &lt;code&gt;--max-speakers&lt;/code&gt; was &lt;em&gt;technically false&lt;/em&gt; because there was a very short bit where my niece chimed in. It didn&#39;t mess things up too much. There were maybe a handful of places where the speaker was incorrectly selected or not indicated at all.&lt;/p&gt;
&lt;p&gt;Overall, I was able to watch the video at &lt;code&gt;1.6x&lt;/code&gt; and comfortably read the subtitles along and make edits which was great. I uploaded the new &lt;code&gt;.srt&lt;/code&gt; file to YouTube and was glad when it accepted the result without complaint.&lt;/p&gt;
&lt;h2 id=&quot;transcript&quot; tabindex=&quot;-1&quot;&gt;Transcript &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/trying-whisperx.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The last bit was to create a transcript from the &lt;code&gt;.srt&lt;/code&gt; file. My initial idea was to merge adjacent subtitles if they had the same speaker. I published &lt;a href=&quot;https://gist.github.com/metaist/b10433ccc6795d4ed82ef42e0b70a209&quot;&gt;&lt;code&gt;srt2txt.py&lt;/code&gt;&lt;/a&gt; as a small gist to try it out.&lt;/p&gt;
&lt;p&gt;The walls of text are ugly, but it &lt;a href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html#introduction&quot;&gt;made a reasonable transcript&lt;/a&gt; which is great for a first pass. The whole thing made me realize how inarticulate one seems when transcribing their thought process.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>1 hour to make a visual schedule (Design Lab #1)</title>
      <link href="https://metaist.com/blog/2023/06/design-lab-1.html"/>
      <id>tag:metaist.com,2010:blog.post-4f2df90d8f0468e1e1f7d1d8fa9cfaba8925356f</id>
      <published>Tue Jun 06 2023 15:36:40 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Jun 06 2023 22:08:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;This is the pilot episode of &lt;em&gt;Design Lab&lt;/em&gt; which I recorded with my sister-in-law,
&lt;strong&gt;Victoria Lupia&lt;/strong&gt;.&lt;/p&gt;
&lt;iframe class=&quot;video&quot; src=&quot;https://www.youtube.com/embed/BO6mYwF5atw&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://metaist.github.io/visual-schedule/&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/visual-schedule/&quot;&gt;Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1ntLaVHmTnRbHH1BuD-bVAiY6oc2Dc5Djhk0Z6vNojWQ/edit?usp=sharing&quot;&gt;Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;References &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://lesscss.org/&quot;&gt;LessCSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://soshace.com/the-ultimate-guide-to-drag-and-drop-image-uploading-with-pure-javascript/&quot;&gt;Drag &amp;amp; Drop Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/snippets/css/a-guide-to-flexbox/&quot;&gt;Complete Guide to Flexbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shopify.github.io/draggable/examples/multiple-containers.html&quot;&gt;Shopify Draggable / Sortable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;introduction&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=0s&quot;&gt;Introduction&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right.
Welcome to the first episode of what I&#39;m calling Design Lab, where I invite guests to come tell me about their problems, and then we try to design something in an hour to see what we can do.
Today&#39;s guest is Victoria Lupia, who is a mother of two and art conservator from Oklahoma.
Hi, Victoria.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Hi, Lev.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Victoria, fun fact, is also my sister-in-law.
Thanks for agreeing to be the inaugural guinea pig for this program.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Well, thanks for helping me with my problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Glad to help.
So the way we&#39;re going to do this is we&#39;re going to start with talking about what the problem is.
You had sent me some photos of your current solution.
And then we&#39;ll do a little bit of design.
And then we&#39;ll try to build something in an hour.
I&#39;ve done very minimal prep.
So a lot of this is going to be kind of on the fly.
And you&#39;ll get to see a little bit of the process.
But I&#39;m hoping that you&#39;ll be able to constrain the problem to exactly what you need.
So why don&#39;t we start with the problem?&lt;/p&gt;
&lt;h2 id=&quot;problem&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=72s&quot;&gt;Problem&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Well, one of my children has special needs and does very well with a visual schedule.
So a strip of paper with a series of pictures that explain what she&#39;s going to do that day or that morning or, um, for most of the day.
And it helps her feel better, uh, more in control and have some, you know, sense of time in a way that young children generally don&#39;t.
Um, what I have been doing is going online and finding clip art pictures, um, or, you know, free images of whatever I need, either an activity or a place.
you know, dragging it onto my computer, saving it onto my desktop, and then dragging it into a Word document, and resizing it, and lining them up, and it just takes forever.
And I was thinking there&#39;s just got to be an easier way, you know, where I could create my own bank of images.
and just drag and drop and something would automatically convert everything to the right size so I don&#39;t have to spend, you know, 30 minutes clicking and resizing everything and printing and formatting.
And I thought, surely there&#39;s an easier way to do this.
So I said, hey, Lev, can you help?
Because I&#39;m not a programmer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, that all sounds right.
Is it okay to share those three examples that you shared with me last week?&lt;/p&gt;
&lt;h2 id=&quot;examples&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=175s&quot;&gt;Examples&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Absolutely.
Are you going to share them or do you want... Okay, yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: I&#39;m sharing them right here.
So this is an example you&#39;ve had of like a process to go to the toilet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah, this is a very short visual schedule that says all the steps you need to complete a single task.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Right.
And then here&#39;s another one you sent me, which was just like a series of what the day was going to look like.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah, this is a morning schedule.
So you wake up, you go to the bathroom, you wash your hands, brush your teeth, brush your hair, and get dressed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: And then this is a more complex multi-part one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah, that&#39;s an entire day schedule where we&#39;re going to have breakfast.
You&#39;re going to do some work at a table, going to watch some TV.
We&#39;re going to go clothes shopping.
We&#39;re going to go food shopping.
We&#39;re going to eat lunch.
We&#39;re going to go to the playground.
We&#39;re going to a speech therapist, have a little break to watch TV again while I unload the groceries.
We&#39;re going to get in the car, go pick up big brother, go to a playground again, and then end the day with a Slurpee from 7-Eleven.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Sounds amazing.
All right, cool.
So, the thing that I&#39;m getting from these is, right, it&#39;s like a panel, and each of these is, I don&#39;t know, roughly an inch, right?
It&#39;s like four inches by, right?
What&#39;s the height of this?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Well, it&#39;s an 8 1⁄2 by 11 sheet of paper, and it&#39;s cut into three, so that&#39;s probably about 2 1⁄2 inches, but the pictures are probably only about 1 to 1 1⁄2 inches high.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Perfect.
Let me just write some of this stuff down, right?
Okay, so we&#39;ve got like one to 1.5 inch high images.
Well, the padding is gonna be important also in the way that we set it up. I&#39;ll show you what-&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: What do you mean by padding?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: The white space around and between images is important.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: I think you want to minimize that at the edges, like just at a standard border.
And then just enough space in between that they&#39;re kind of discrete time units or whatever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: We&#39;ll get into that as we get into the design more closely.
I see that you&#39;ve cut these into strips.
Is that just an artifact of printing, or you mix and match them?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Well, that&#39;s an artifact of the way my child reads them.
I want to go left to right.
And I&#39;m not necessarily sure right now if she knows to drop to the next line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: I see.
I see.
So you present them one at a time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: So, yeah, exactly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Got it.
And then, OK, so this one had one, two, three, four, five, six.
How important are the captions part of the thing or is that a thing that you know,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: I think in an ideal world, I would like to be able to add the caption and perhaps change a caption as needed, for example. You know,
Let&#39;s see from the picture.
I mean, that&#39;s fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Okay, so there&#39;s a picture and then the caption and is the height of this significant or that just how it turned out?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: No, well, I think that says like how to go to the toilet in that one.
That was something that I didn&#39;t make.
I only changed, I changed one picture as you can see with some scotch tape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: That just tells what task, you know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Got it.
OK.
All right.
I see.
So most of them don&#39;t have any kind of title or any kind of text.
Here, we&#39;ve got the heading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: But I think it would be good to help with some sight words.&lt;/p&gt;
&lt;h2 id=&quot;design&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=409s&quot;&gt;Design&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: For sure.
All right.
We&#39;ll focus on the core problem first, and then we&#39;ll expand out.
So why don&#39;t I, here&#39;s what I&#39;m going to do.
I&#39;m going to create a little place for us to design.
And we&#39;re going to use this super complicated tool called Slides.
I didn&#39;t do anything crazy fancy.
This is going to be just a brand new Google slide.
And I&#39;m just going to drop all this.
I&#39;m just going to drop a picture of what we&#39;re going to build.
OK, so ideal world, there&#39;s some heading thing here.
But that&#39;s going to be secondary to the main bit.
Then I think what we&#39;ll do is we&#39;ll make a little box.
And this box will have a little plus sign in it.
And that plus sign will be like, hey, you can add images by clicking the plus, or you can just drag and drop a bunch of images into this area.
And then what we&#39;ll do is, oh, here&#39;s an idea.
This may be a little out there.
This is not gonna be the first thing I&#39;m gonna build, but an idea that I just had was maybe we let you just like add a row.
Right, so yes, and then that way I don&#39;t have to say like what the format is.
It&#39;s just sort of you drag your you add an image at another image at more images.
Drag a bunch of images.
They&#39;ll just upload into one row, but you can also say add another row.
And that will.
sort of create another one of these boxes that you can drag and drop images into.
And then once you have some images, this kind of symbol.
It&#39;s not super pretty, but close enough.
Those pretend that that&#39;s an image, right?
So every time you add an image, you&#39;ll always have that little plus this little plus box where you can just drag and drop more stuff.
Yeah, you could do one at a time or you could do them all at once.
And the idea would be that.
I guess afterwards I&#39;ll need to add some kind of way to delete stuff too, so maybe some kind of little button.
Little delete button over here.
That&#39;s just kind of like an X.
And this isn&#39;t super fancy.
This is just kind of helping me plan out my thoughts about what features we need to build.
And we said maybe a little caption, maybe a little place to add a caption.
Okay.
Right.
So once you add them, you can add a caption.
Oh, and then we also want to be able to drag these things around.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah.
Can you, yeah.
So which position and have to maintain their little formatting row.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yep.
Yep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: alignment, I guess is the word.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Exactly, exactly.
So we&#39;re going to do that.
So we&#39;ll add a little handle here or some, it&#39;s gonna be some some way that I&#39;m denoting with this little double bar at the moment, but it&#39;s probably could just grab the whole thing as long as you don&#39;t click on the X to just sort of grab it and drag it and drop it.
Okay, so, so far, so the features we have are
Add a heading, drag and drop images.
Actually, that&#39;s two different things.
That&#39;s like rearrange images.
And before that, there&#39;s drag and drop images from the computer, right, to display them.
And we also have a way of removing an image.
add a row and probably I guess we&#39;ll have to add some kind of if you want to delete the whole row.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Okay, anything that&#39;s obviously... Can you link the caption and the image once you&#39;ve...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, we&#39;re assuming this is like one... This is like one item, so when you drag it, you&#39;re dragging the image and the caption.
This is going to be one unit.
Is there any obvious thing that&#39;s missing?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Nope.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: OK, cool.
All right, this is going to be the first thing we&#39;re going to work on, dragging and dropping images.
That&#39;s the hardest and probably the most important thing.
Everything else, rearranging is probably going to be the next thing, just to get it to have some kind of basic functionality.
Headings and captions I&#39;ll work on last.
Removing them is, we have add and remove, we have add and remove for an individual item, then adding another row is going to be not too bad.
And then, oh, actually, one thing we really need that&#39;s not
Not something that&#39;s here, but we need to lay out.
We actually need to be able to print these things.&lt;/p&gt;
&lt;h2 id=&quot;drag-and-drop-images&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=737s&quot;&gt;Drag &amp;amp; drop images&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: OK.
All right.
Let&#39;s start with dragging and dropping the images.
OK.
So I&#39;m going to move this out of the way.
I&#39;m going to start by making a new file.
I&#39;m going to make an HTML file.
For those who are watching, you might be surprised that I&#39;m not using any kind of framework or any kind of anything.
I&#39;m going to try to do this as light as possible so that we can just get started.
And later on, maybe this becomes a much more complicated thing.
But now, how do you write that thing?
Doesn&#39;t it start with a?
All right, whatever.
Why is everything so weird?
Nunjucks, this is not Nunjucks?
There we go.
All right.
All right, so in order to do this, I think what we&#39;re going to do is... And we&#39;re going to need...
We&#39;re going to need some kind of area.
Let&#39;s make the main area the area where we&#39;re dragging stuff around.
This has got to be.
OK.
All right.
And in here, we&#39;re going to start with something where we can drag and drop images.
Now, I actually did do a little bit of prep.
It&#39;s one of the two things that I actually looked into, which was,
There&#39;s a nice little, there&#39;s a couple of things.
First one is, there&#39;s this nice guide and all the links will be in the show notes, which I&#39;ll have to make, but which is, this is like a much more complicated guide of like, let&#39;s say we were uploading something to a website and right, so this is like dragging a bunch of images and uploading them.
We&#39;re going to just yank out all the stuff that has to do with uploading stuff places, and we&#39;re just going to do the very basic drag and drop images just locally sourced.
So that way, you don&#39;t have to worry about setting up a server or anything like that.
OK, so let&#39;s take a look.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Thank you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, yeah, yeah.
Well, you or anyone else who wants to make something like this.
OK.
What they do is they make a fake input, which is where you&#39;re going to drop things and then make a drop region, open the file selection, clicked.
Okay.
This all sounds good.
Let&#39;s take that too.
So what do they actually have here?
Some body thing.
Then they have this drop region.
Then they have a message that says like drop images.
Okay, good.
Right.
So let me get this going here.
I&#39;m going to run a little local server just so that I can look at my beautiful page, which is currently empty.
Excellent.
And now I&#39;m going to start adding little things.
And actually, I also have to make a quick file.
So this file is going to be where we&#39;re going to put all style information.
I&#39;m just directly linking LESS over here like this, so that way we can write our style sheet over here on the right and the HTML on the left.
And this will let us do a little bit of styling.
OK, so in the main, we&#39;re going to start with a row, which I&#39;ll just call a row.
And in the row, there will always be, at the very end of the row, there&#39;s going to be a box.
And I&#39;m going to call the drop images.
and the drop target will say nice make it look like a background color so a little bit of gray background color and maybe the border is like
pixels, dashed, or something like that.
Okay, yep.
A little gross at the moment, but it&#39;s fine.
Around it.
and maybe let&#39;s make the border radius five.
Okay, a little better.
We&#39;ll work on fonts and things later.
Okay, so that&#39;s gonna be the place where we&#39;re gonna drop the images onto.
Okay, fine.
And oh, right, let&#39;s start making this fake input thing.
So what they&#39;re doing is image preview.
All right.
Right, OK, so we don&#39;t care.
We just want any kind of image that you have.
While this is going, Victoria, can you email me a few of your clip arts that you use?
And that way I can try practice using them.
OK, so what happens is there&#39;s eight things that can happen.
You can drag a thing in, you can drag it out, and then you can drop it.
Fine.
This all sounds pretty simple.
Add event listener, drop region.
Then we handle the drop event.
Fine.
We don&#39;t actually have to transfer the files because we&#39;re not sending them anywhere.
This only works if the files are derived from local filesystem.
Perfect.
That&#39;s all we ever care about.
Although, it&#39;s nice that they have a handle.
Like, if you drop an image from a different tab onto here, it will also work.
All right.
That&#39;s fine.
We can keep that.
Preview, preview.
This all looks good.
and they don&#39;t actually care about the uploading.
There&#39;s the complete thing, additional improvements.
This isn&#39;t so important.
Fine, let&#39;s grab all their photos.
I&#39;m just gonna grab all of this.
And let&#39;s stick it in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: How many pictures do you want?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Like three.
Yeah, nothing too crazy.
All right, let&#39;s take a look at all that stuff.
Okay, we don&#39;t actually have to do any of the upload stuff.
We&#39;ll grab all that, make all that go away.
But drop region, we do have a drop region.
And image preview, that wasn&#39;t in their thing.
What&#39;s that?
Oh, image preview is this.
And an image preview also.
And a target, oh, the drop region.
That&#39;s the whole thing.
I&#39;m just gonna try to get, you know, get it to work in a very basic way.
If I can get it to work in a very basic way, then we can focus on trying to get this to work better.
Okay, so this actually is not super necessary.
Preview, progress, read, waveform data, upload location&#39;s not really important.
And we&#39;re gonna do none of this.
None of this.
Okay.
And we don&#39;t even have to read that image.
No, that&#39;s not true.
We do have to read the image because we have to get the source.
Everything else is going to be....
All right.
Let&#39;s see.
Did you send me those things?
Yep.
Okay, cool.
Let me just check my email.
Got it?
Cool.
I see the problem that you&#39;re having, because these images are all kinds of different sizes.
Let&#39;s download these to this folder.
Let&#39;s make a quick folder.
Hopefully, this is not too boring.
You know, it&#39;s just me moving stuff around.
All right.
What is this?
This is like... And then washing hands.
And washing hands, let&#39;s do one more.
This is the speech pathologist, speech therapist.
Great, as now we have a PNG, a JPEG, and we have a couple of different types, so that&#39;s great.
All right, let&#39;s see if we can get this to work.
So if I refresh this, I should be able to, let&#39;s see, maybe that doesn&#39;t work from this context.
Maybe it will work from here.
Nope, that did not work.
Oh, well, that would be a problem.
Let&#39;s resolve that problem.
So what&#39;s the problem?
Line 11.
Line 11, dropRegion, getElementById dropRegion.
I made a new element called dropRegion.
Oh, that would be a problem.
Hard refresh.
Nope, that also didn&#39;t help.
Okay, let&#39;s sanity check this.
What am I missing?
Oh, well, I know what&#39;s wrong.
The script is running before anything else has loaded.
Nothing missed at the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Over here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right, now everybody&#39;s happy.
Good.
So now let&#39;s take a kids table picture.
Okay, cool.
And if I add a speech therapy picture, great.
Okay.
I mean, obviously this looks terrible, but the point is the basic concept is, right?
The basic premise is somewhat justified.
Okay, cool.
All right.
So it was able, and if I refresh, all those pictures go away.
All right, fine.&lt;/p&gt;
&lt;h2 id=&quot;flexbox-layout&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=1563s&quot;&gt;Flexbox layout&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Now let&#39;s move on to, so that was great.
That&#39;s super helpful.
That&#39;s how we add images.
Fine.
Let me just add another image and see what kind of CSS does it add around this.
Does it do anything to this?
Oh, I see.
Image preview, image view, and then that&#39;s the drop target.
OK.
OK.
So what I want to do is I want to switch these around.
And I&#39;m going to say, let me use Flexbox for this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Alexa has just come in to join us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Hi, Alexa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexa&lt;/strong&gt;: Cash?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Who is that?
Who do you hear?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexa&lt;/strong&gt;: Uncle?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Almost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexa&lt;/strong&gt;: Uncle Lev.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: That&#39;s right, Uncle Lev.
Exactly.
OK, so now if I take this in here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: No, we&#39;re just listening right now.
He&#39;s helping me make your schedule.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right, this is what we want.
So we want to display flex and a flex direction is going to be in the row direction.
So display flex and help this row, but just in case it isn&#39;t, we&#39;ll make it flex direction, the row direction, because we&#39;re making a little row.
And what we&#39;ll do is we will not do any wrap.
Although wrapping is not terrible, right?
You could just keep adding images.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: I think wrapping is good, yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: So why don&#39;t we just do, you know, just keep adding pictures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: If you have too many pictures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, yeah, just keep going.
We don&#39;t even need the concept of rows at that point.
You just, yeah.
Okay, that kind of keeps things simple.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexa&lt;/strong&gt;: Okay, mom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Okay, and I think we&#39;ll do space evenly for justified content.
Oh, it&#39;s kind of just really spaced thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: I think, can I...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, please.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: So then I think if you have fewer than fit in a row, you&#39;d want them all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Oh, you want them kind of like ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: the top the top line. Yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: flex-start.
Okay.
Yeah, no problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexa&lt;/strong&gt;: I&#39;ll make a hat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right.
And then do you care about top alignment?
Um, central line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Oh, I want them all the same size.
Does that make sense?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, I know you do.
And we&#39;ll try it.
We&#39;ll try it as well.
Let&#39;s see.
We could just say, well, why don&#39;t we wait and see how it goes?
We&#39;ll come back.
We don&#39;t have to pick all of these things now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Probably bottom alignment is if you want the words all, the captions in a row.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Ah, that&#39;s a good idea.
Although the captions are going to be... Underneath.
Yeah, they&#39;re going to be slightly different.
We&#39;ll deal with that later.
I mean, just if there&#39;s anything else that&#39;s particularly painful, we&#39;ll deal with all these gaps.
Not worried about that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: We&#39;re tying it in with, like, how to read from left to right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yes, yes.
That makes sense.
All right.
So let&#39;s see if I grab three pictures all at once.
That work?
No, that didn&#39;t work.
Oh, because I didn&#39;t drop it in the drop area.
If I drop it in the drop area?
Yes.
OK, cool.
Now I need to do something for the individual items.
So the individual items in here are gonna be with, let&#39;s look at how this, what does this actually do?
Image view.
Okay, so each image view, it&#39;s actually not the drop region, it&#39;s the,
Image preview is got the flex and going.
Preview and inside that there&#39;s an image view and that image view we&#39;re going to say its max height.
See OK, so the images are different sizes and what we could do is we could say that we control their like you could either control their width and then have their height be automatic or you could control their height and make their width automatic.
Right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: So which is the thing that matters more visually?
My gut is that if you made the heights the same and one takes up more space width wise, that&#39;s okay.
Right?
But if you had them all the same width and then the heights are all kind of weird.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yes, I think that&#39;s correct.
My one caveat is that sometimes I, or yeah, let&#39;s go with this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Okay, so what&#39;s the width that we&#39;re going to force on all of the images?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Let&#39;s go with one and a half inches.
Is that reasonable?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yep, that&#39;s fine.
And we&#39;ll say the height is auto.
And let&#39;s make a little border.
just so we can see.
We&#39;ll pick solid black.
We&#39;ll be able to see where the border of them is.
And we have to make the image that&#39;s inside this image view have a height of 100% and a width of 100%.
Let&#39;s just do width as 100% and the height as auto.
This is for the image that&#39;s inside the little thing that contains the image.
I know it&#39;s confusing.
All right, let&#39;s refresh this and try that.
That didn&#39;t happen at all.
What&#39;s going on?
Okay, so it&#39;s got the image.
It&#39;s got little image views.
These are all great.
How come they don&#39;t have any styles?
Oh, I know why.
Because the LESS they get reloaded.
No, now I&#39;m really confused.
Image view.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah, that&#39;s a picture of Janet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Drop region is not this drop region.
This is called this.
Okay.
Let&#39;s just do this for the preview part.
Let&#39;s try those images again.
Okay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Oh, that looks good.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right.
We&#39;re getting there.
We&#39;re getting there.
Okay.
So we&#39;ve got the, got a little bit of,
We&#39;ve got some basic thing going here, which is great.
Now, let&#39;s grab one of these images.
OK, so one of the things we could do with this image view is we could add a little padding to the right.
Actually, let&#39;s make that margin and not padding.
We can make that a little smaller, let&#39;s put five.
I can turn off this border.
So it&#39;s just the, you know, it&#39;s just the pictures as you want them, but I&#39;m keeping the border so I can see that the images are happening the way that we want.
Okay.
And what I might do is if I refresh this and then drop one image.
So if I do the first image, okay, that&#39;s the kids, the kids table and then speech therapy.
Okay, it adds it right after.
Cool.
All right, so did you want a little, do you think that little padding is good or?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: I think, yeah, I think we need a little padding in between.
Yep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Cool.
All right.
So let&#39;s just do that.
So we&#39;ll say that, um, yeah.
All right, cool.
All right, so now little things show up.
Excellent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: And- Do they have a box around them?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: I am putting that little box around me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Okay, yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: I can remove that box.
I&#39;m putting it, I&#39;m just having it there for now so we can see where the boundaries are.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Okay, cool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right.
All right, so then let&#39;s make this drop target thing.
I could deal with this later.
Drop target is not,
Like, ideally, what I would like is the entire page to be a drop target, right?
You can just drop the images anywhere on the page.
And I might do that, but not at this second.
Right now, we&#39;re just, we got the first, got the first little thing done, right?
Which was, we can drop images in here and they automatically get sized to the right, to the right size.
Okay.
The next thing that we want to do is,&lt;/p&gt;
&lt;h2 id=&quot;rearrange-images&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=2165s&quot;&gt;Rearrange images&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: So we got drag and drop images from the computer.
All right, let&#39;s do rearrange, rearrange images.
It&#39;s okay, so you&#39;ve got them, but now you could just, you could drag them, drop them back onto itself multiple times because, right, you can take an image from anywhere, right?
You could take,
Let&#39;s just find an image.
Here&#39;s an image.
If I drag it onto here, well, guess what?
Now it&#39;s, right, you could take an image from anywhere and just drag it onto this page, onto this box, and it will show up.
So that&#39;s all great.
Now let&#39;s do step three, or item three, drag and drop images, but rearrange them.
Okay, so to rearrange images, we&#39;re gonna use this little tool.
Shopify had a long time ago put out a tool called Draggable.
What this lets you do is swap images.
I don&#39;t know if I need them to be swapped or if it&#39;s just sortable.
Let&#39;s see.
Yeah, that might work.
I don&#39;t care about this particular thing.
I just want this behavior.
Zebra.
Yeah, that&#39;s fine.
Multiple containers.
I don&#39;t really need multiple containers.
I just want it to work.
Oh my goodness.
What?
Surely there is a simpler way to get started on this.
No longer maintained.
Beautiful.
All right.
Yep.
Let&#39;s just take their entire bundle.
I don&#39;t care.
We&#39;ll figure out all, which if we need fewer pieces, we&#39;ll use fewer pieces and won&#39;t make it so big.
But at the moment, it&#39;s important to just get it to work.
So step one, make it work.
Step two, make it clean.
All right, fine.
So now I have all the things.
What was this sortable?
Okay, sortable.
There we go, that&#39;s a little more understandable.
Sortable is a new draggable sortable, and then you say which thing can be sortable and what&#39;s draggable inside that thing.
Okay, that&#39;s trivially straightforward.
Oh, I wonder if this will work if I add more things or if I have to do some kind of refresh when I add more stuff.
Let&#39;s try it.
Let&#39;s see what happens.
So somewhere at the top, I&#39;m going to say, great, a new selector, query selector all.
So that&#39;s the unordered list.
And these are the list items inside that unordered list.
So we&#39;re going to say,
In the image preview, the draggable is the image view is draggable inside that thing.
And there&#39;s going to have to be some kind of way to update this when you drag new images in.
So this is likely to not work the very first time I try it.
What happened? 404.
Oh, shucks.
OK, OK.
I just get a version of.
Whatever you give me, I&#39;m not going to complain.
and stuff.
NPM.
Oh, it&#39;s a different version.
Okay.
That&#39;s fine.
That&#39;s fine.
Let&#39;s just do that.
And at this point, I&#39;m not worried about like, Oh, do I have the latest version of that thing?
I just want something that works.
It&#39;s not a constructor.
Oh, boy.
The URL was guess and it it might not be correct.
Okay.
Let&#39;s try.
It&#39;s weird that this...
Okay, that works fine.
So now I drop this in here and I drop speech therapy in here.
Boom.
Look at that.
See that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: I see it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Okay.
All right, so now you can rearrange and add as many.
Oh, I see, but now you can&#39;t drop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Can you copy and paste?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Can you copy?
I mean, you could just update.
You could just drag the image from your computer again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: OK, again.
That&#39;s fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, you could do that as many times as you want, right?
So I could take all these things and just drop them a bunch of times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Perfect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: and then I can rearrange them however I want.
Okay, so that takes care of that item.&lt;/p&gt;
&lt;h2 id=&quot;print-layout&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=2587s&quot;&gt;Print layout&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;:
Okay, so now let&#39;s just quickly jump down to print layout.
Let&#39;s make sure that when this prints, that it actually looks reasonable.
It&#39;s gonna look terrible, right?
Okay, that&#39;s what I thought.
Okay, so to make this print properly,
Well, first of all, we want to hide this drag and drop images thing.
So what I&#39;m going to do is maybe now&#39;s a good time to make the drop region could be the entire page could be the drop region.
There&#39;s really no reason why you couldn&#39;t do that to everything.
I&#39;m just going to do really simple.
Let the images go.
I&#39;m actually gonna drop target.
Do I even need the drop target?
So let&#39;s just get rid of it.
Super simple.
That&#39;s number one.
First thing is, it&#39;s really simple.
I&#39;ll add a little thing.
Nope.
What&#39;s the problem?
Ah, the body is not that big.
Okay.
Having something inside of it.
I see.
Okay, fine.
So.
This is fine.
Why is it that big?
I don&#39;t know.
Alright I&#39;ll clean that up later but I think now is the body the right size?
No it isn&#39;t.
Why isn&#39;t it display:block?
Why is the body not the right size?
Oh.
Yeah, OK.
I don&#39;t think that&#39;s what I&#39;m saying.
Could help in many cases.
That sounds pretty scary.
Nope.
Hmm.
I feel like there&#39;s a way that I do this normally that takes care of this problem, but okay, I&#39;m not gonna deal with that right now.
Because I think as long as I drop it somewhere in the vicinity of this thing, okay, that&#39;s fine.
I will fix that, but not this second.
Okay, let&#39;s make a print layout.
How do you say this?
How do you say this?
blah, blah, blah, blah, blah.
No, it is how you say it, media print.
Great.
So empty...
That thing will get hidden.
What else do we need?
We don&#39;t need that much else.
Actually, let&#39;s make this just for testing.
Drop the images there.
It&#39;s a little bit of
Okay, I see the problem.
I need to add like two pixels of padding inside the image so that all around the border of the box is visible.
There we go.
All right, so that&#39;s our print layout.
What else?
Captions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Do we need space between rows?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Space between rows.
Yes.
Here&#39;s what&#39;s going to happen.
Let me just add this a bunch of times.
So if we do this, yeah.
So I don&#39;t need this anymore.
This could help.
So this has to do with how you
Align the content.
Space around looks like the right thing.
Just go space around.
Items evenly distributed with equal space around each line.
Yeah.
So align content.
space around.
That&#39;s for this thing.
And do this and this now, and it gave me a thing that I wanted.
Hmm.
I could just add, that&#39;s not enough to wrap, okay.
Okay, I will add the same padding that we have here on the right.
I&#39;m just gonna add that to the bottom.
And that&#39;ll take care of that.
So.
We have a margin right.
I&#39;m going to do this.
I&#39;m going to say, add.
Like that.
Does that work?
Victoria?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Sorry, you didn&#39;t hear that.
I think that works unless we&#39;re adding a caption and you lose some space from that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: It&#39;s okay.
It&#39;s okay.
We&#39;ll add the caption and move the padding to the bottom.
Yeah.
Alright, so&lt;/p&gt;
&lt;h2 id=&quot;add-a-caption&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=3098s&quot;&gt;Add a caption&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: We&#39;ll deal with that alignment thing in a second.
So I think captions are probably more important than heading of the entire thing, right?
Okay, so let&#39;s start with that.
That&#39;s our next item.
And we&#39;re getting close to the hour, but if you&#39;re okay to keep going, I&#39;m okay to keep going.
Let&#39;s add captions.
Oh, I didn&#39;t make a way to remove images.
And I guess this is no longer necessary.
Adding rows and removing rows is not necessary, but removing an image will be necessary.
We&#39;ll deal with that later.
Let&#39;s add a caption.
So how can we add a caption?
Well, what we could do is we could have a little bit of space from here to here that always has just like a blank caption, just a blank, you know, outside the box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah, space, just typable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: That&#39;s typable, yeah.
So what could we do for that?
All right.
So the easiest thing to do there is that we wrap the image.
Let&#39;s see.
So I&#39;m just reading their code.
OK, so what they&#39;re doing right here, this is where it actually happens.
So they create an image, and they create a div, and then they read the file.
And then when it&#39;s done, they create this little source thing, which then goes in to this image preview.
They append that to image view, which is image preview, append the child of the image view.
So what we&#39;re going to do is we&#39;re also going to append, let&#39;s make the border be around the image.
And we&#39;ll add some padding for this thing too.
And then we&#39;ll have another thing that we&#39;re going to add to the
image view, that&#39;s going to be a little text box.
And it&#39;s going to look horrible at first, but we&#39;ll make it better very quickly.
So we&#39;ll say, let inputBox equal document.createElement input.
And we&#39;re going to say, imageView.appendChild inputBox.
This is gonna be a place where you could put the caption.
So let&#39;s see how that looks.
Okay, so there&#39;s a little spot right there.
Cool, okay.
Couple of things that we need to fix, but that&#39;s okay for here.
So this is gonna be the caption.
Mm-hmm.
All right.
So first thing we need to do is make that caption fit within the bounds of the box so that we don&#39;t have this kind of thing going.
That&#39;s number one.
So inside the image view, there&#39;s an image and there&#39;s an input.
And the max width of this thing is going to be 99% of its container.
And.
And when you print...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: We don&#39;t want to border on the yeah, very good.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: So.
Yeah, yeah, yeah.
I think that should make sense.
And we&#39;ll have to deal with the vertical alignment to the second, but let&#39;s just see if we can get this.
Okay.
So, okay.
So they&#39;re all the same width, but then we want to do that thing with the vertical alignment being on the bottom.
So this was what we were talking about.
This align-items, flex-end.
So that&#39;s over here, align-items, flex-end. That will give us...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Looks great.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Now the border around the image though feels a little weird.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Okay.
Right. You notice that they&#39;re somewhere smaller.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: It would probably look better if-
Right, exactly.
So if we just kind of cut that out for a second.
And I think we&#39;re getting pretty close.
So here, okay, so then you drop your images here.
Great, you got all your pictures.
You say what they are.
I have to turn off this thing.
Okay, so the way it&#39;s set up right now, it&#39;s if you click anywhere, it will automatically try to say like upload an image.
So you could do this like on a mobile browser.
I&#39;m gonna turn that off.
But, like, totally unnecessary.
That&#39;s not the situation.
That&#39;s, like, not really the situation you&#39;re going to be dealing with.
So, I think it&#39;s only.
OK.
Right.
I don&#39;t want you to do anything.
Let&#39;s upload images.
OK.
And then, oh, let&#39;s just.
Oh, cool.
I managed to crash it.
Give me a second.
Technical difficulties.
Bam.
All right.
So now, if I bring this in here and I say, one, two, three.
print.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Can we center those?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yeah, we can. Let me do that right now.
I think this should work.
Okay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right.
Obviously you can leave these blank.
There&#39;s nothing.
Oh, right.
You wanted to know if, right.
So I told you that the caption would move with the thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yes.
Looks good, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: It looks great.
One problem is it&#39;s very hard to like since the.
I need to.
I need to tell draggable to not like I can&#39;t select the text in here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: OK.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: You can click in there and you can type, but it&#39;s very hard to select because it&#39;s using that as a drag handle.
So let&#39;s quickly see if there&#39;s a.
a little option of like a thing, like don&#39;t drag on this thing, you know, disable the drag handle.
There&#39;s probably like thousands of options that are, yeah, draggable options, right?
There&#39;s tons of stuff.
Handle.
Specify CSS selector for a handle element if you don&#39;t want to allow drag on the entire element.
There we go.
So the handle is going to be
the image, you could drag the image, but not the text box.
So let&#39;s see if that works.
Um, is image.
That probably would work even if I did, even if I specified it incorrectly.
Right.
That lets you think, but here you could type and you perfect.
Okay.
So the images lets you rearrange them to fancy, but the caption is here.
All right, what else do we have?&lt;/p&gt;
&lt;h2 id=&quot;remove-an-image&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=3644s&quot;&gt;Remove an image&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oh yeah, we should make it, you should be able to remove the image.
Let&#39;s see, what can I do?
I can add a little tiny little button like in the upper right-hand corner of the image that lets you remove the image.
that&#39;s only visible when you hover over the image or something like that.
So what we should do is over here, we should remove button, a little button, and removeButton.click.
It&#39;s gonna be a function that when you click on that button,
it will remove this image view.
Image view removed.
That&#39;s a hilarious way of doing this, but that&#39;s okay.
And then you&#39;re gonna, image view removed.
We should probably put something on that image.
It should have some sort of...
This should be... Okay.
Oh, look, again, terrible.
Okay, so there&#39;s the X. If you click the X, nothing happens, okay?
All right, why? Why does nothing happen?
This button.
Click.
No.
Click.
Okay, maybe a bit more traditional way.
addEventListener, fine.
Let&#39;s add addEventListener.
Click.
Function.
If that doesn&#39;t work.
I can&#39;t refer to this.
Okay, that looks fine.
So now let&#39;s make this look less horrible.
One way to do that would be to sort of... And...
Absolute right of zero.
Oh, no, no, no.
Position relative?
Position fixed? Nope.
Fine, forget position.
We&#39;ll do it by saying that it&#39;s flat&#39;d to the right.
And like red, some kind of light red.
Let&#39;s do it.
What if I put it after the image?
Let me see.
Alright.
Okay, that looks less terrible.
Okay, so that&#39;s gonna be for our button.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Will that disappear during printing?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Yes.
So what we&#39;re gonna do over here in the print thing is we&#39;re gonna say, well, it&#39;s actually by default, is what we&#39;re gonna do.
By default, it&#39;s gonna need to know this.
But when you,
Hover over the image.
What will happen now is.
When you.
It jumps a little bit because, but so now by default you can&#39;t see it.
You hover over it.
Okay, so you know what, let&#39;s make it so that for printing no matter what, the display is none.
Input border is none.
And the button.
Now, even if you had
hovered over an image and you hit print, one.
Oh, I know why.
This is very, very specific.
So in the image view, a button is going to be not visible, absolutely super important, override, override.
OK, now, OK.
Perfect.
All right.
All right, so that&#39;s done.&lt;/p&gt;
&lt;h2 id=&quot;add-a-heading&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=4062s&quot;&gt;Add a heading&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: And now we just have a heading, which we could do pretty similar.
It&#39;s a little bit easier, because it could be something like that.
And let&#39;s see.
that this font size.
I don&#39;t know, what&#39;s the font size? Should we use 16 point?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Sure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: And the width is 100%.
Or, yeah, I&#39;m sure.
100%.
Center.
We can make it.
Where is it?
Where&#39;d it go?
Did I not save that?
Oh, I didn&#39;t save it.
Okay, my fault.
That&#39;s not width of 100%.
That&#39;s more what I was expecting.
Oh, header heading, whoops.
Like.
Okay, so, well, no, that&#39;s gonna look terrible.
This has to be, this has to be.
Why is it?
Oh, because I have the width.
There we go.
I&#39;ll put width, and then it makes sense.
OK.
So Today&#39;s Schedule.
It should be supported.
Great.
And oh.
What happened to the... Oh, well, it&#39;s not on.
Okay.
Okay, now I probably don&#39;t need to write, yeah.
Okay, so I need to add a margin.
I think there, and then this would be my main content.
And I definitely don&#39;t need this anymore.
Well.
Okay, so.
Let&#39;s make it.
It&#39;s going to be.
I think.
Okay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: That&#39;s better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: So then this is the schedule.
A, B, C.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Yeah, looks great.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: And let&#39;s just try out putting lots more pictures.
How&#39;s that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: That looks great.&lt;/p&gt;
&lt;h2 id=&quot;thank-you&quot; tabindex=&quot;-1&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BO6mYwF5atw&amp;amp;t=4435s&quot;&gt;Thank you&lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/design-lab-1.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: All right.
All right, so we&#39;ll be open sourcing all this code and you&#39;ll see the links will all be in the show notes.
Thank you to all of you who&#39;ve been joining.
Thank you, Victoria.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Thank you.
I can&#39;t wait to use it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Excellent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: You just gave me a whole bunch of time back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: I&#39;m very glad to help.
All right.
Take care.
Thank you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Victoria Lupia&lt;/strong&gt;: Bye bye.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lev Novikov&lt;/strong&gt;: Bye bye.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>apt segfault</title>
      <link href="https://metaist.com/blog/2023/06/apt-segfault.html"/>
      <id>tag:metaist.com,2010:blog.post-07c1640d2c69af556e101e2903c6bd0da1707da6</id>
      <published>Mon Jun 05 2023 10:13:10 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 05 2023 10:13:10 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;Tried doing a &lt;code&gt;apt upgrade -y&lt;/code&gt; and got:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
[...]
Segmentation fault&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s try to figure out how to fix this.&lt;/p&gt;
&lt;h2 id=&quot;maybe-it-s-the-lock-cache&quot; tabindex=&quot;-1&quot;&gt;Maybe it&#39;s the lock/cache &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/apt-segfault.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.opstree.com/2019/04/02/resolving-segmentation-fault-core-dumped-in-ubuntu/&quot;&gt;This article&lt;/a&gt; suggests removing lock files and cleaning your cache. Worth trying.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rf&lt;/span&gt; /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; clean all&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That worked!&lt;/p&gt;
&lt;h2 id=&quot;autoremove-brings-the-segfault-back&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;autoremove&lt;/code&gt; brings the segfault back &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/06/apt-segfault.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;About once a month, I run &lt;code&gt;sudo apt autoremove&lt;/code&gt; to get rid of old kernels and things that have accumulated. But now I notice that running that gets me a segfault which then causes all other &lt;code&gt;apt-get&lt;/code&gt; commands to segfault too.&lt;/p&gt;
&lt;p&gt;Just running &lt;code&gt;sudo apt-get clean all&lt;/code&gt; restores the other &lt;code&gt;apt-get&lt;/code&gt; commands.&lt;/p&gt;
&lt;p&gt;Weird.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>pdfmerge 1.0.0</title>
      <link href="https://metaist.com/blog/2023/06/pdfmerge-1.0.0.html"/>
      <id>tag:metaist.com,2010:blog.post-a9619c1deea534d2da0008c8e2b6ce22035cb707</id>
      <published>Mon Jun 05 2023 08:03:55 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jun 05 2023 08:03:55 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/pdfmerge/releases/tag/1.0.0&quot;&gt;&lt;code&gt;pdfmerge 1.0.0&lt;/code&gt;&lt;/a&gt; is now published.&lt;/p&gt;
&lt;p&gt;Following the principle of &amp;quot;make it easy&amp;quot;, I dropped requirements for Windows and upgraded everything to python 3.&lt;/p&gt;
&lt;p&gt;In the process of rebuilding &lt;code&gt;pdfmerge&lt;/code&gt;, I discovered that they type-checker really doesn&#39;t like &lt;code&gt;AttrDict&lt;/code&gt; properties because they can be &lt;code&gt;Any&lt;/code&gt; or &lt;code&gt;None&lt;/code&gt;, but my functions typically need a &lt;em&gt;specific&lt;/em&gt; type. I had to &lt;a href=&quot;https://github.com/metaist/pdfmerge/blob/f93dcd20bd7767c6abaf2fdf61179153c864732e/src/pdfmerge/__main__.py#L84&quot;&gt;resort to calling &lt;code&gt;cast()&lt;/code&gt;&lt;/a&gt; which felt a little gross.&lt;/p&gt;
&lt;p&gt;I also realized that while &lt;code&gt;docopt&lt;/code&gt;-style is great for CLI argument parsing, it&#39;s less pretty as markdown documentation, so I had to &lt;a href=&quot;https://github.com/metaist/pdfmerge/blob/main/src/pdfmerge/__main__.py#L26&quot;&gt;add some markdown into the help text&lt;/a&gt; which, again, felt a little gross, but it&#39;s not the worst thing in the world. Maybe in some future version I&#39;ll use &lt;a href=&quot;https://github.com/Textualize/rich&quot;&gt;&lt;code&gt;rich&lt;/code&gt;&lt;/a&gt; to render the help text so that it gets a nice markdown treatment.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>attrbox 0.1.2</title>
      <link href="https://metaist.com/blog/2023/06/attrbox-0.1.2.html"/>
      <id>tag:metaist.com,2010:blog.post-2cde132f87b3d9ed7903d6b2bda732f4e9eb37cb</id>
      <published>Thu Jun 01 2023 01:14:09 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jun 01 2023 01:14:09 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/releases/tag/0.1.2&quot;&gt;&lt;code&gt;attrbox 0.1.2&lt;/code&gt;&lt;/a&gt; is now published.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I learned a lot about python types, &lt;a href=&quot;https://metaist.com/blog/2023/05/fun-with-python-mapping.html&quot;&gt;especially &lt;code&gt;Mapping&lt;/code&gt;&lt;/a&gt;, and I &lt;a href=&quot;https://metaist.com/blog/2023/05/pep-8-thoughts.html&quot;&gt;revisited the PEP 8 style guide&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The main new features are loading &lt;a href=&quot;https://github.com/metaist/attrbox/blob/9ac72549726e25448dbf5228405a12dea6a65fe5/src/attrbox/env.py&quot;&gt;environment files&lt;/a&gt; and &lt;a href=&quot;https://github.com/metaist/attrbox/blob/9ac72549726e25448dbf5228405a12dea6a65fe5/src/attrbox/config.py&quot;&gt;configuration files / CLI arguments&lt;/a&gt;. The &lt;code&gt;doctopt&lt;/code&gt; parsing is especially helpful for making little CLI programs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>PEP 8 Thoughts (2023)</title>
      <link href="https://metaist.com/blog/2023/05/pep-8-thoughts.html"/>
      <id>tag:metaist.com,2010:blog.post-860b828259087cd67e568b511d093764a357c07d</id>
      <published>Wed May 31 2023 10:54:03 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 31 2023 10:54:03 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;It&#39;s been a little while since I read &lt;a href=&quot;https://peps.python.org/pep-0008/&quot;&gt;PEP 8 – Style Guide for Python Code&lt;/a&gt;, but I was &lt;a href=&quot;https://github.com/metaist/attrbox/issues/7#issuecomment-1570237330&quot;&gt;recently prompted to read it by ChatGPT&lt;/a&gt; which made me realize I don&#39;t agree with all of the guidance.&lt;/p&gt;
&lt;h2 id=&quot;formatting&quot; tabindex=&quot;-1&quot;&gt;Formatting &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/pep-8-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;m not even going to read this section carefully, because I use &lt;a href=&quot;https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html&quot;&gt;&lt;code&gt;black&lt;/code&gt;&lt;/a&gt;, so I don&#39;t have to argue about formatting. I don&#39;t agree with all of it&#39;s opinions (e.g., I used to prefer single quotes to double quotes because they take up less visual space), but I love not having to think about them.&lt;/p&gt;
&lt;h2 id=&quot;imports&quot; tabindex=&quot;-1&quot;&gt;Imports &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/pep-8-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0008/#imports&quot;&gt;PEP 8 - Imports&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s okay to say this though:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Correct:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; subprocess &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Popen&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PIPE&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Two weeks ago, I started writing every import on its own line, even when importing from the same package. During prototyping I&#39;m constantly importing lots of things from &lt;code&gt;typing&lt;/code&gt; as I figure out which types to use to pass around to functions. But then &lt;code&gt;mypy&lt;/code&gt; complains when there are unused imports. It&#39;s much easier to comment / uncomment lines than to deal with a comma-separated list.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Except for those times when you need to avoid circular imports. I used to encounter this all the time, but somehow it&#39;s become less of an issue more recently.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imports should be grouped in the following order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Standard library imports.&lt;/li&gt;
&lt;li&gt;Related third party imports.&lt;/li&gt;
&lt;li&gt;Local application/library specific imports.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&#39;m a little obsessive about this and even mark these sections &lt;code&gt;# native&lt;/code&gt;, &lt;code&gt;# lib&lt;/code&gt;, and &lt;code&gt;# pkg&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;module-level-dunder-names&quot; tabindex=&quot;-1&quot;&gt;Module Level Dunder Names &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/pep-8-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0008/#module-level-dunder-names&quot;&gt;PEP 8 - Module Level Dunder Names&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Module level “dunders” (i.e. names with two leading and two trailing underscores) such as &lt;strong&gt;all&lt;/strong&gt;, &lt;strong&gt;author&lt;/strong&gt;, &lt;strong&gt;version&lt;/strong&gt;, etc. should be placed after the module docstring but before any import statements except from &lt;strong&gt;future&lt;/strong&gt; imports. Python mandates that future-imports must appear in the module before any other code except docstrings: [...]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Strongly disagree for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;__future__&lt;/code&gt; imports have to come first anyway, so do all your imports like usual and then declare your constants like usual. These should just be constants you declare earlier than others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a package&#39;s &lt;code&gt;__init__.py&lt;/code&gt; you often import a bunch of things and then enumerate them in your &lt;code&gt;__all__&lt;/code&gt; to &amp;quot;export&amp;quot; them out to the world. If you don&#39;t &lt;code&gt;ruff&lt;/code&gt; will complain that you have an unused import. Therefore, it logically makes more sense to declare all your imports and &lt;em&gt;then&lt;/em&gt; use them, like you normally do.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I don&#39;t see any advantage to putting these constants before the imports.&lt;/p&gt;
&lt;h2 id=&quot;lambdas&quot; tabindex=&quot;-1&quot;&gt;Lambdas &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/pep-8-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0008/#programming-recommendations&quot;&gt;PEP 8 - Programming Recommendations&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Correct:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;x
&lt;span class=&quot;token comment&quot;&gt;# Wrong:&lt;/span&gt;
f &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;lambda&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;x&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first form means that the name of the resulting function object is specifically ‘f’ instead of the generic ‘&lt;lambda&gt;’. This is more useful for tracebacks and string representations in general. The use of the assignment statement eliminates the sole benefit a lambda expression can offer over an explicit def statement (i.e. that it can be embedded inside a larger expression)&lt;/lambda&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I get it, but I&#39;m annoyed by this. I can&#39;t quite put my finger on why. Maybe it&#39;s something about &lt;code&gt;lambda&lt;/code&gt; being almost useless in python (unfortunately) and this is just another place where it&#39;s use is removed.&lt;/p&gt;
&lt;h2 id=&quot;checking-prefixes-and-suffixes&quot; tabindex=&quot;-1&quot;&gt;Checking Prefixes and Suffixes &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/pep-8-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0008/#programming-recommendations&quot;&gt;PEP 8 - Programming Recommendations&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use &#39;&#39;.startswith() and &#39;&#39;.endswith() instead of string slicing to check for prefixes or suffixes.
startswith() and endswith() are cleaner and less error prone:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Correct:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; foo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;bar&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Wrong:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; foo&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;bar&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even for a single character? Hm. Not sure I agree. Let&#39;s try out some recent use cases from last night.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/blob/16cd8732bc62739e347bf9b7c8ac1843ff098aa3/src/attrbox/env.py#L98&quot;&gt;Removing braces&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# current&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# proposed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That might work, although I think I&#39;d still want to check &lt;code&gt;len&lt;/code&gt; to make sure I didn&#39;t end up with an empty &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/blob/16cd8732bc62739e347bf9b7c8ac1843ff098aa3/src/attrbox/env.py#L186&quot;&gt;Removing single quotes&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# current&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# unquote key&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# proposed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# unquote key&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not terrible. I keep thinking the function calls are expensive, but they&#39;re probably not.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/attrbox/blob/16cd8732bc62739e347bf9b7c8ac1843ff098aa3/src/attrbox/env.py#L192&quot;&gt;Removing single or double quotes&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# current&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;&quot;&#39;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;&quot;&#39;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# unquote value&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# proposed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;endswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# unquote value&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s actually pretty readable. I would have to add the &lt;code&gt;len&lt;/code&gt; check to make sure a single &lt;code&gt;&amp;quot;&lt;/code&gt; (which starts and ends with &lt;code&gt;&amp;quot;&lt;/code&gt;) doesn&#39;t get counted.&lt;/p&gt;
&lt;p&gt;Ok. I guess I agree with this guidance.&lt;/p&gt;
&lt;p&gt;Nothing else in PEP 8 stood out to me as something I had strong opinions on (for now).&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Fun with Python Mapping</title>
      <link href="https://metaist.com/blog/2023/05/fun-with-python-mapping.html"/>
      <id>tag:metaist.com,2010:blog.post-2ca7210cb576252296a198d2877df053ebd95574</id>
      <published>Thu May 25 2023 19:10:50 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 25 2023 19:10:51 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://mypy-lang.org/&quot;&gt;&lt;code&gt;mypy&lt;/code&gt;&lt;/a&gt; is a static type-checking tool. It&#39;s like a very pedantic linter and I have a personal goal to try and satisfy it&#39;s &lt;code&gt;--strict&lt;/code&gt; mode demands.&lt;/p&gt;
&lt;p&gt;It took me a while to get the hang of TypeScript types, so I thought I kinda got all the practical type theory I&#39;d need, but alas I didn&#39;t. Turns out python&#39;s types are just different.&lt;/p&gt;
&lt;h2 id=&quot;unsupported-target-for-indexed-assignment&quot; tabindex=&quot;-1&quot;&gt;Unsupported target for indexed assignment &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/fun-with-python-mapping.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Usually when &lt;code&gt;mypy&lt;/code&gt; complains about something, I basically know what the problem is and how to fix it. Here&#39;s a minimal example of my first real head-scratcher:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Mapping

box&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;this&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fail&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# =&gt; error: Unsupported target for indexed assignment&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# (&quot;Mapping[str, Any]&quot;)  [index]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why doesn&#39;t this work? Well, it turns out that &lt;a href=&quot;https://stackoverflow.com/a/60457779&quot;&gt;&lt;code&gt;Mapping&lt;/code&gt; is intended to represent a &lt;strong&gt;read-only&lt;/strong&gt; structure&lt;/a&gt;. &lt;em&gt;That&#39;s&lt;/em&gt; why there&#39;s a &lt;code&gt;MutableMapping&lt;/code&gt; (I always wondered). Ok, so I switched to &lt;code&gt;MutableMapping&lt;/code&gt;. Here&#39;s another minimal example of the next problem:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MutableMapping

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cls&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; MutableMapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    cls&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# =&gt; error: &quot;MutableMapping[Any, Any]&quot; not&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# callable  [operator]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why not!? Because I didn&#39;t specify that I want the &lt;em&gt;class&lt;/em&gt; of this type, not a concrete instance of this type.&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MutableMapping&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Type

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cls&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Type&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;MutableMapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    cls&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This works! Ok, on to the next problem:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SupportsIndex&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Union

general&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Union&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SupportsIndex&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
specific&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

general &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; specific
&lt;span class=&quot;token comment&quot;&gt;# =&gt; error: Incompatible types in assignment&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# (expression has type &quot;Mapping[str, Any]&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# variable has type &quot;Mapping[Union[str,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# SupportsIndex, slice], Any]&quot;)  [assignment]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As an aside, why am I using &lt;code&gt;SupportsIndex&lt;/code&gt; instead of &lt;code&gt;int&lt;/code&gt;? Because I&#39;m working on a version of a &lt;code&gt;Mapping&lt;/code&gt; that supports the same signature as &lt;code&gt;list.__getitem__&lt;/code&gt; and that&#39;s what it expects for it&#39;s index.&lt;/p&gt;
&lt;p&gt;So why is &lt;code&gt;str&lt;/code&gt; not compatible with &lt;code&gt;Union[str, ...]&lt;/code&gt;? Maybe because I don&#39;t have a &lt;code&gt;Union&lt;/code&gt; for the &lt;code&gt;specific&lt;/code&gt; type?&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;general&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Union&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SupportsIndex&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
specific&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Union&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
general &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; specific
&lt;span class=&quot;token comment&quot;&gt;# =&gt; error: Incompatible types in assignment&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# (expression has type &quot;Mapping[Union[str, int], Any]&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# variable has type &quot;Mapping[Union[str,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# SupportsIndex, slice], Any]&quot;)  [assignment]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nope. Turns out &lt;a href=&quot;https://stackoverflow.com/a/64484841&quot;&gt;&lt;code&gt;Mapping&lt;/code&gt; is &amp;quot;invariant in its key type&amp;quot;&lt;/a&gt;. Reading &lt;a href=&quot;https://mypy.readthedocs.io/en/latest/common_issues.html#invariance-vs-covariance&quot;&gt;the relevant mypy docs&lt;/a&gt; and the &lt;a href=&quot;https://github.com/python/typing/pull/273&quot;&gt;long python github thread&lt;/a&gt; there is some real complexity in trying to use python&#39;s type system to describe how &lt;code&gt;Mapping&lt;/code&gt; should work.&lt;/p&gt;
&lt;p&gt;I don&#39;t &lt;em&gt;totally&lt;/em&gt; understand the discussion, but I&#39;m guessing this means something like &amp;quot;the type of the key cannot change&amp;quot; and so this isn&#39;t going to be remedied soon. Therefore, I&#39;m going to have to go back to my trusted solution:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;general&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Any&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
specific&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Mapping&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Union&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Any&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
general &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; specific&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This works.&lt;/p&gt;
&lt;img src=&quot;https://metaist.com/static/img/2023-05-25-fun-with-python-mapping.jpg&quot; style=&quot;max-width: 100%;&quot;&gt;
</content>
    </entry>
    <entry>
      <title>2023-05-21 Weekend Notes</title>
      <link href="https://metaist.com/blog/2023/05/2023-05-21-weekend-notes.html"/>
      <id>tag:metaist.com,2010:blog.post-366fd0361f542f1b72daf458050281e85f558dd1</id>
      <published>Sun May 21 2023 23:03:24 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun May 21 2023 23:03:26 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;releases&quot; tabindex=&quot;-1&quot;&gt;Releases &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/2023-05-21-weekend-notes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/metaist/ezq/releases/tag/3.0.0&quot;&gt;&lt;code&gt;ezq&lt;/code&gt; 3.0.0&lt;/a&gt;; &lt;a href=&quot;https://metaist.com/blog/2023/05/ezq-3.0.0.html&quot;&gt;my brief notes&lt;/a&gt;. I then released &lt;a href=&quot;https://github.com/metaist/ezq/releases/tag/3.0.3&quot;&gt;&lt;code&gt;ezq&lt;/code&gt; 3.0.3&lt;/a&gt; to fix a dependency issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;posts&quot; tabindex=&quot;-1&quot;&gt;Posts &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/2023-05-21-weekend-notes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A major reason I rebooted the blog is I want to lower the bar for publishing my thoughts and process. One major project I&#39;m working on is recording and building my preferred tools and stack for software development. It&#39;s been evolving over the past two decades, so I want to capture what I have now and the kinds of changes I&#39;m considering.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Adventures in Eleventy&lt;/a&gt;: A &lt;a href=&quot;https://metaist.com/blog/tag/trace&quot;&gt;trace&lt;/a&gt; of porting my blog from &lt;code&gt;blogit&lt;/code&gt; to &lt;code&gt;eleventy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adding-a-toc.html&quot;&gt;Adding a Table of Contents&lt;/a&gt;: Long posts need &#39;em.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;SSH on Airplane WiFi&lt;/a&gt;: failed attempt to get SSH to work on a plane&#39;s WiFi.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>ezq 3.0.0</title>
      <link href="https://metaist.com/blog/2023/05/ezq-3.0.0.html"/>
      <id>tag:metaist.com,2010:blog.post-379ef4fc0f35754fe1aa5ffbd08332fedd3dd270</id>
      <published>Thu May 18 2023 06:16:25 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 18 2023 06:16:25 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/metaist/ezq/releases/tag/3.0.0&quot;&gt;&lt;code&gt;ezq&lt;/code&gt; 3.0.0&lt;/a&gt; is now published.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It is a major version bump because it removes all &lt;code&gt;@deprecated&lt;/code&gt; functions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Worker&lt;/code&gt; vs &lt;code&gt;Task&lt;/code&gt; vs &lt;code&gt;Context&lt;/code&gt;: GPT-4 has some good advice about &lt;a href=&quot;https://github.com/metaist/ezq/issues/5#issuecomment-1551971894&quot;&gt;choosing a good name for the execution context&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had a &lt;a href=&quot;https://github.com/metaist/ezq/issues/9&quot;&gt;hard time getting tests to pass on MacOS&lt;/a&gt;. I ultimately switched from &lt;a href=&quot;https://docs.python.org/3/library/multiprocessing.html&quot;&gt;&lt;code&gt;multiprocessing&lt;/code&gt;&lt;/a&gt; to &lt;a href=&quot;https://github.com/uqfoundation/multiprocess&quot;&gt;&lt;code&gt;multiprocess&lt;/code&gt;&lt;/a&gt;. Surprisingly, this did not destroy everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not directly related, but I tried to figure out &lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;how to use &lt;code&gt;ssh&lt;/code&gt; on airplane wifi&lt;/a&gt; while making the release.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/ezq-3.0.0.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2023-05-21: I had some trouble adding the new dependency correctly, so there were a few additional point releases to fix that. The latest version is &lt;a href=&quot;https://github.com/metaist/ezq/releases/tag/3.0.3&quot;&gt;3.0.3&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>SSH on Airplane WiFi</title>
      <link href="https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html"/>
      <id>tag:metaist.com,2010:blog.post-56733bae4beb48e5a44b31aef90160a30409f906</id>
      <published>Thu May 18 2023 05:41:41 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 18 2023 05:41:41 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;
&lt;nav class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;Goal &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;git push hangs &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;ssh -T hangs &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;Maybe port 22 is blocked? &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;Plane Landed &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;Trying port 443 again &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/nav&gt;&lt;h2 id=&quot;goal&quot; tabindex=&quot;-1&quot;&gt;Goal &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To release &lt;a href=&quot;https://metaist.com/blog/2023/05/ezq-3.0.0.html&quot;&gt;&lt;code&gt;ezq 3.0.0&lt;/code&gt;&lt;/a&gt; while I&#39;m traveling on a plane.&lt;/p&gt;
&lt;h2 id=&quot;git-push-hangs&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;git push&lt;/code&gt; hangs &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first problem I notice is that &lt;code&gt;git push&lt;/code&gt; hangs:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push
&lt;span class=&quot;token comment&quot;&gt;# hangs&lt;/span&gt;

$ &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push &lt;span class=&quot;token parameter variable&quot;&gt;-vvv&lt;/span&gt;
Pushing to github.com:metaist/ezq.git
&lt;span class=&quot;token comment&quot;&gt;# hangs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ssh-t-hangs&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;ssh -T&lt;/code&gt; hangs &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&#39;s do some simple sanity checking:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-T&lt;/span&gt; git@github.com
&lt;span class=&quot;token comment&quot;&gt;# hangs&lt;/span&gt;

$ &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-T&lt;/span&gt; git@github.com &lt;span class=&quot;token parameter variable&quot;&gt;-vvvv&lt;/span&gt;
OpenSSH_9.0p1, LibreSSL &lt;span class=&quot;token number&quot;&gt;3.3&lt;/span&gt;.6
debug1: Reading configuration data ~/.ssh/config
debug1: ~/.ssh/config line &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;: Applying options &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; github.com
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line &lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;: include /etc/ssh/ssh_config.d/* matched no files
debug1: /etc/ssh/ssh_config line &lt;span class=&quot;token number&quot;&gt;54&lt;/span&gt;: Applying options &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; *
debug3: expanded UserKnownHostsFile &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts&#39;&lt;/span&gt; -&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts&#39;&lt;/span&gt;
debug3: expanded UserKnownHostsFile &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts2&#39;&lt;/span&gt; -&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts2&#39;&lt;/span&gt;
debug1: Authenticator provider &lt;span class=&quot;token variable&quot;&gt;$SSH_SK_PROVIDER&lt;/span&gt; did not resolve&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; disabling
debug1: Connecting to github.com port &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;.
debug1: Connection established.
debug1: identity &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/keys/github.com/id_rsa &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
debug1: identity &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/keys/github.com/id_rsa-cert &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt;
debug1: Local version string SSH-2.0-OpenSSH_9.0
debug1: Remote protocol version &lt;span class=&quot;token number&quot;&gt;2.0&lt;/span&gt;, remote software version babeld-fc59fe75
debug1: compat_banner: no match: babeld-fc59fe75
debug3: fd &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; is O_NONBLOCK
debug1: Authenticating to github.com:22 as &lt;span class=&quot;token string&quot;&gt;&#39;git&#39;&lt;/span&gt;
debug3: record_hostkey: found key &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; ED25519 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/known_hosts:64
debug3: record_hostkey: found key &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; ECDSA &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/known_hosts:65
debug3: record_hostkey: found key &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; RSA &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/known_hosts:67
debug3: load_hostkeys_file: loaded &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; keys from github.com
debug1: load_hostkeys: fopen ~/.ssh/known_hosts2: No such &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; or directory
debug3: order_hostkeyalgs: have matching best-preference key &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; ssh-ed25519-cert-v01@openssh.com, using HostkeyAlgorithms verbatim
debug3: send packet: &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
debug1: SSH2_MSG_KEXINIT sent
&lt;span class=&quot;token comment&quot;&gt;# hangs&lt;/span&gt;
Connection reset by &lt;span class=&quot;token number&quot;&gt;140.82&lt;/span&gt;.114.3 port &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;maybe-port-22-is-blocked&quot; tabindex=&quot;-1&quot;&gt;Maybe &lt;code&gt;port 22&lt;/code&gt; is blocked? &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/7953806/github-ssh-via-public-wifi-port-22-blocked&quot;&gt;Some nice advice here suggests we could try using &lt;code&gt;port 443&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# .ssh/config&lt;/span&gt;
Host github.com
    Hostname ssh.github.com
    Port &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;plane-landed&quot; tabindex=&quot;-1&quot;&gt;Plane Landed &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Alas this doesn&#39;t work either and it&#39;s already time to land. I may try again on the return flight.&lt;/p&gt;
&lt;h2 id=&quot;trying-port-443-again&quot; tabindex=&quot;-1&quot;&gt;Trying &lt;code&gt;port 443&lt;/code&gt; again &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/ssh-on-airplane-wifi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After confirming that &lt;code&gt;ssh.github.com:443&lt;/code&gt; worked correctly on a normal connection, it still doesn&#39;t work on the airplane wifi.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;% &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-vvvv&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-T&lt;/span&gt; git@github.com
OpenSSH_9.0p1, LibreSSL &lt;span class=&quot;token number&quot;&gt;3.3&lt;/span&gt;.6
debug1: Reading configuration data ~/.ssh/config
debug1: ~/.ssh/config line &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;: Applying options &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; github.com
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line &lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;: include /etc/ssh/ssh_config.d/* matched no files
debug1: /etc/ssh/ssh_config line &lt;span class=&quot;token number&quot;&gt;54&lt;/span&gt;: Applying options &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; *
debug3: expanded UserKnownHostsFile &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts&#39;&lt;/span&gt; -&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts&#39;&lt;/span&gt;
debug3: expanded UserKnownHostsFile &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts2&#39;&lt;/span&gt; -&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;~/.ssh/known_hosts2&#39;&lt;/span&gt;
debug1: Authenticator provider &lt;span class=&quot;token variable&quot;&gt;$SSH_SK_PROVIDER&lt;/span&gt; did not resolve&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; disabling
debug1: Connecting to ssh.github.com port &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;.
debug1: Connection established.
debug1: identity &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/keys/github.com/id_rsa &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
debug1: identity &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/keys/github.com/id_rsa-cert &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt;
debug1: Local version string SSH-2.0-OpenSSH_9.0
debug1: Remote protocol version &lt;span class=&quot;token number&quot;&gt;2.0&lt;/span&gt;, remote software version babeld-fc59fe75
debug1: compat_banner: no match: babeld-fc59fe75
debug3: fd &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; is O_NONBLOCK
debug1: Authenticating to ssh.github.com:443 as &lt;span class=&quot;token string&quot;&gt;&#39;git&#39;&lt;/span&gt;
debug3: put_host_port: &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ssh.github.com&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;:443
debug3: record_hostkey: found key &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; ED25519 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; ~/.ssh/known_hosts:68
debug3: load_hostkeys_file: loaded &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; keys from &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ssh.github.com&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;:443
debug1: load_hostkeys: fopen ~/.ssh/known_hosts2: No such &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts: No such &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; or directory
debug1: load_hostkeys: fopen /etc/ssh/ssh_known_hosts2: No such &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; or directory
debug3: order_hostkeyalgs: have matching best-preference key &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; ssh-ed25519-cert-v01@openssh.com, using HostkeyAlgorithms verbatim
debug3: send packet: &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
debug1: SSH2_MSG_KEXINIT sent&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then it hangs. Maybe I&#39;ll &lt;a href=&quot;https://gist.github.com/guillochon/eeaa54b328952d260472c14c559f698a&quot;&gt;revisit the proxy idea&lt;/a&gt; sometime.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Adding a table of contents</title>
      <link href="https://metaist.com/blog/2023/05/adding-a-toc.html"/>
      <id>tag:metaist.com,2010:blog.post-e5c1d3c8e55d5e43a68b884e4188f8a32dc628ad</id>
      <published>Thu May 18 2023 05:04:10 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 18 2023 05:04:10 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;
&lt;nav class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adding-a-toc.html&quot;&gt;Goal &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adding-a-toc.html&quot;&gt;Which library should I pick? &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/nav&gt;&lt;h2 id=&quot;goal&quot; tabindex=&quot;-1&quot;&gt;Goal &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adding-a-toc.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To easily add a table of contents for longer posts especially &lt;a href=&quot;https://metaist.com/blog/tag/trace/&quot;&gt;traces&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;pick-a-lib&quot; tabindex=&quot;-1&quot;&gt;Which library should I pick? &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adding-a-toc.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;So there are a lot of &lt;a href=&quot;https://www.npmjs.com/search?q=table%20of%20contents%20markdown-it&quot;&gt;table of contents &lt;code&gt;markdown-it&lt;/code&gt; plugins&lt;/a&gt; (26 at the time of writing).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let&#39;s try: &lt;a href=&quot;https://github.com/GerHobbelt/markdown-it-toc-done-right&quot;&gt;&lt;code&gt;markdown-it-toc-done-right&lt;/code&gt;&lt;/a&gt;. The pitch includes security, HTML5 semantic correctness. A bit pedantic, but probably the right kind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ah, looks like you should also get &lt;code&gt;markdown-it-anchor&lt;/code&gt; (turns out I already did). Then I should also get &lt;code&gt;markdown-it-attrs&lt;/code&gt; so I can override the heading id (might also be useful for lots of other little bits).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --save-dev markdown-it-toc-done-right markdown-it-attrs&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// eleventy.config.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; markdownItAttrs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;markdown-it-attrs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; markdownItTOC &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;markdown-it-toc-done-right&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;amendLibrary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;md&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;mdLib&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    mdLib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;markdownItAttrs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    mdLib&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;markdownItTOC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;listType&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ul&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then just slap a &lt;code&gt;[[toc]]&lt;/code&gt; tag in the markdown and we&#39;re good to go.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>2023-05-14 Weekend Notes</title>
      <link href="https://metaist.com/blog/2023/05/2023-05-14-weekend-notes.html"/>
      <id>tag:metaist.com,2010:blog.post-34740608859efdee400e6b73927d3541eb4cdc4e</id>
      <published>Thu May 18 2023 01:55:38 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;releases&quot; tabindex=&quot;-1&quot;&gt;Releases &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/2023-05-14-weekend-notes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I released &lt;a href=&quot;https://github.com/metaist/ezq/releases/tag/2.0.3&quot;&gt;ezq 2.0.3&lt;/a&gt; which adds a new class-based API for interacting with a &lt;code&gt;Queue&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;experiments&quot; tabindex=&quot;-1&quot;&gt;Experiments &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/2023-05-14-weekend-notes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/charliermarsh/ruff&quot;&gt;&lt;code&gt;ruff&lt;/code&gt;&lt;/a&gt; (via &lt;strong&gt;Shalev NessAiver&lt;/strong&gt;): I tried this python linter during my recent builds of &lt;code&gt;ezq&lt;/code&gt; and it was very fast and the no-config version generally catches the things I care about. &lt;code&gt;pylint&lt;/code&gt; does catches a few things I care about, but it&#39;s so slow and obnoxious about things I &lt;strong&gt;don&#39;t&lt;/strong&gt; care about it, that I&#39;m probably going to drop it going forward. I&#39;ll probably drop &lt;code&gt;flake8&lt;/code&gt; too because it doesn&#39;t add anything beyond &lt;code&gt;ruff&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shalev NessAiver and I tried to get ChatGPT v4 to help us build a Svelte component to interact with a Jupyter notebook. Unfortunately, it pointed us at a bunch of outdated libraries, but it was definitely better than Bard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ChatGPT v4 kinda helped me figure out what I needed to do to make the &lt;code&gt;/pypi/pyversions&lt;/code&gt; endpoint at &lt;a href=&quot;https://shields.io/badges/py-pi-python-version&quot;&gt;shields.io&lt;/a&gt; display supported python versions for my packages. At first, it kept pointing me to the &lt;code&gt;python_requires&lt;/code&gt; field in &lt;code&gt;setup.py&lt;/code&gt;, but then it told me to look at the PyPI JSON endpoint, and finally I got it to tell me about the &lt;a href=&quot;https://github.com/badges/shields/blob/23c0406bedfc6930735e8f5ea75dfe34faf1f290/services/pypi/pypi-python-versions.service.js&quot;&gt;shields.io github repository&lt;/a&gt; where &lt;a href=&quot;https://github.com/badges/shields/blob/23c0406bedfc6930735e8f5ea75dfe34faf1f290/services/pypi/pypi-helpers.spec.js#L10&quot;&gt;I finally discovered&lt;/a&gt; that it uses the classifiers like &lt;code&gt;&amp;quot;Programming Language :: Python :: 3.8&amp;quot;&lt;/code&gt; from &lt;code&gt;setup.py&lt;/code&gt; to build up its list of supported versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/&quot;&gt;&lt;code&gt;eleventy&lt;/code&gt;&lt;/a&gt;: I watched &lt;a href=&quot;https://www.youtube.com/watch?v=kzf9A9tkkl4&quot;&gt;this video&lt;/a&gt; which helped me set up this blog.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/2023-05-14-weekend-notes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/2023-05-14-weekend-notes.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Adventures in Eleventy</title>
      <link href="https://metaist.com/blog/2023/05/adventures-in-eleventy.html"/>
      <id>tag:metaist.com,2010:blog.post-55dc3d2332ed1aec840642a551fa64a1018f3e3f</id>
      <published>Sun May 14 2023 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 18 2023 05:07:53 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;Previously&lt;/em&gt;: &lt;a href=&quot;https://metaist.com/blog/2023/05/2023-05-14-weekend-notes.html&quot;&gt;2023-05-14 Weekend Notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contents&lt;/strong&gt;&lt;/p&gt;
&lt;nav class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Goal &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Background &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;.markdown vs .md &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;YAML front-matter &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Permalinks &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Thumbnails &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Markdown in HTML &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;RSS &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;LESS &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Highlighting? &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Using a Starter Repo &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Migration Take 2 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;Updates &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;2023-05-18 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/nav&gt;&lt;h2 id=&quot;goal&quot; tabindex=&quot;-1&quot;&gt;Goal &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To migrate my old blog posts to &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;&lt;code&gt;eleventy&lt;/code&gt;&lt;/a&gt;. If that doesn&#39;t work, my next goal is to simply have a basic site with posts, tags, and RSS feed.&lt;/p&gt;
&lt;h2 id=&quot;background&quot; tabindex=&quot;-1&quot;&gt;Background &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started this blog in 2004 on &lt;a href=&quot;https://www.blogger.com/&quot;&gt;blogger&lt;/a&gt; as part of an school assignment. In 2009, I deleted all the posts and started again as a place for my thoughts. In 2011, I decided to move all my content over to my own domain and I built a backwards-compatible version of the site using PHP (&lt;a href=&quot;https://metaist.com/blog/2011/09/metaist-now-with-more-metaist.html&quot;&gt;here&#39;s my post at the time&lt;/a&gt;). Then at the end of 2012, I wrote my own python static site generator called &lt;a href=&quot;https://github.com/metaist/blogit/&quot;&gt;&lt;code&gt;blogit&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Writing consistently has been difficult for me. I kept setting the bar too high. Each blog post needed a catchy thumbnail. I&#39;d obsess and reword all the text hundreds of times and change the tags obsessively (even now I&#39;m rewording this paragraph quite a bit). I&#39;ve mitigated it a bit by having a monthly newsletter, but my public output has dropped to near-zero.&lt;/p&gt;
&lt;p&gt;Also: &lt;code&gt;blogit&lt;/code&gt; was kinda &lt;em&gt;slow&lt;/em&gt;. I started thinking about ways I could cache the data to generate the website faster. But this was all dumb. I should have just used &lt;code&gt;jekyll&lt;/code&gt; or &lt;code&gt;hyde&lt;/code&gt; and been happy. But I was stubborn.&lt;/p&gt;
&lt;p&gt;Fast-forward a decade and building my own static site generator seems like a poor use of my time (no matter how clever). &lt;strong&gt;Shalev NessAiver&lt;/strong&gt; recently pointed me at &lt;a href=&quot;https://simonwillison.net/&quot;&gt;Simon Willison’s Weblog&lt;/a&gt; and his style of posts inspired me to try again and over this past the weekend, I discovered &lt;code&gt;eleventy&lt;/code&gt; which looks like it has sensible defaults and fast build times. I&#39;m game.&lt;/p&gt;
&lt;h2 id=&quot;markdown-vs-md&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;.markdown&lt;/code&gt; vs &lt;code&gt;.md&lt;/code&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Usually I like shorter file extensions, but a decade ago it seems like &lt;code&gt;.markdown&lt;/code&gt; was unambiguous and more popular. Nowadays &lt;code&gt;.md&lt;/code&gt; is dominant and &lt;code&gt;eleventy&lt;/code&gt; assumes as much. I don&#39;t mind the opinionated approach, I just have to rename the files. Ah, but in &lt;code&gt;blogit&lt;/code&gt; I had made the file modification time be the post&#39;s updated time. If I rename all the files, I need to preserve the modification time.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; *.markdown&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$f&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# preserve times&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$f&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Update (Take 2)&lt;/strong&gt;: At first, I kept the &lt;code&gt;.markdown&lt;/code&gt; file name so that I can use it as a different template format. I&#39;ll deal with the &lt;code&gt;&amp;lt;published&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;updated&amp;gt;&lt;/code&gt; fields another time.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// eleventy.config.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; showdown &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;showdown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; showdownConverter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;showdown&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Converter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;showdownRender&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; showdownConverter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;makeHtml&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTemplateFormats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;outputFileExtension&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;inputContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;showdownRender&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inputContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But then, after I figured out how to fix markdown in HTML (see below), I just made &lt;code&gt;.markdown&lt;/code&gt; and alias for &lt;code&gt;.md&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;md&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;yaml-front-matter&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;YAML&lt;/code&gt; front-matter &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first problem is that back when I wrote &lt;code&gt;blogit&lt;/code&gt;, YAML front-matter didn&#39;t have a clear second delimiter. You could use &lt;code&gt;---&lt;/code&gt; to start a new document or &lt;code&gt;...&lt;/code&gt; to continue the stream. Looks like I chose wrong; everyone seems to have settled on &lt;code&gt;---&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Fine, what if I add configuration parameters to &lt;code&gt;.eleventy.js&lt;/code&gt; to change the delimiters:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setFrontMatterParsingOptions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;delims&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;---&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So that works for the old documents, but what about the new ones? Ok, forget it; I&#39;ll update all the old posts to use the &lt;code&gt;---&lt;/code&gt; delimiter too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (Take 2)&lt;/strong&gt;: Indeed, I did end up using &lt;code&gt;---&lt;/code&gt; delimiters.&lt;/p&gt;
&lt;h2 id=&quot;permalinks&quot; tabindex=&quot;-1&quot;&gt;Permalinks &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In &lt;code&gt;blogit&lt;/code&gt;, I used &lt;code&gt;{year}/{month}/{slug}.html&lt;/code&gt;, but I kinda like the &lt;code&gt;eleventy&lt;/code&gt; approach of making permalinks customizable. The default is pretty sensible and abstracts away the mapping. I can just put the date in the file name if I want it there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (Take 2)&lt;/strong&gt;: This was fairly straightforward:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// blog.11tydata.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;node:path&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;makePermalink&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basename&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; yearMonth &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;fileDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;fileDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; slug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;slug &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fileSlug&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/blog/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;yearMonth&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;slug&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.html&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; makePermalink&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;thumbnails&quot; tabindex=&quot;-1&quot;&gt;Thumbnails &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In &lt;code&gt;blogit&lt;/code&gt;, I had a convention of using the post file name with a &lt;code&gt;.jpg&lt;/code&gt; or &lt;code&gt;.png&lt;/code&gt; extension to automatically map thumbnails to posts. I actually figured out how to get this to work, kinda, but then realized that the images weren&#39;t displaying because the images were in markdown inside of a &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; element (see next section).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (Take 2)&lt;/strong&gt;: I added another pair of curly braces around &lt;code&gt;{thumbnail}&lt;/code&gt; and added a computed data property:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// blog.11tydata.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; glob &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;glob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;findThumbnail&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; search &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputPath
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^&#92;.&#92;/content&#92;/blog&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./content/static/img&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&#92;.markdown$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; files &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;glob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;search&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; files&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; files&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^content&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;thumbnail&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; findThumbnail&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;markdown-in-html&quot; tabindex=&quot;-1&quot;&gt;Markdown in HTML &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back in the day, you could put markdown inside of an HTML block and simply add &lt;code&gt;markdown=&amp;quot;1&amp;quot;&lt;/code&gt; to get it rendered. This was part of &lt;a href=&quot;https://michelf.ca/projects/php-markdown/extra/#markdown-attr&quot;&gt;PHP Markdown Extra&lt;/a&gt; and &lt;a href=&quot;https://python-markdown.github.io/extensions/md_in_html/&quot;&gt;Python-Markdown&lt;/a&gt;. But it seems like you&#39;d have to overwrite the default markdown parser to get this to work with a &lt;em&gt;different&lt;/em&gt; parser.&lt;/p&gt;
&lt;p&gt;At this point I abandoned the idea of trying to port my old posts. Time to start fresh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (Take 2)&lt;/strong&gt;: I tried to use &lt;a href=&quot;https://showdownjs.com/&quot;&gt;&lt;code&gt;showdown&lt;/code&gt;&lt;/a&gt; to re-render the markdown.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; EleventyRenderPlugin &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@11ty/eleventy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; showdown &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;showdown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; showdownConverter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;showdown&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Converter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;ghCompatibleHeaderId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;tasklists&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;showdownRender&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; showdownConverter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;makeHtml&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTemplateFormats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;outputFileExtension&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;inputContent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; inputPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; njk &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; EleventyRenderPlugin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inputContent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;njk&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; njk_rendered &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;njk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; md &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; EleventyRenderPlugin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;njk_rendered&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;md&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; md_rendered &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;showdownRender&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;md_rendered&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;[showdown] rendered &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;inputPath&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But the actual solution was simpler: &lt;a href=&quot;https://spec.commonmark.org/0.30/#example-188&quot;&gt;add a blank line after the opening tag&lt;/a&gt; and use the existing parser.&lt;/p&gt;
&lt;h2 id=&quot;rss&quot; tabindex=&quot;-1&quot;&gt;RSS &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Surprise! The &lt;a href=&quot;https://www.11ty.dev/docs/plugins/rss/&quot;&gt;out-of-the-box example of using the RSS plugin&lt;/a&gt; didn&#39;t work. But it seemed so simple! I&#39;ll come back to it later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (Take 2)&lt;/strong&gt;: I got this to work and was able to preserve all the old &lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt; tags:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// blog.11tydata.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;node:path&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; crypto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;node:crypto&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;makeID&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; sha1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; crypto&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createHash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sha1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  sha1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;tag:metaist.com,2010:blog.post-&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;sha1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;digest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hex&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; makeID&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;less&quot; tabindex=&quot;-1&quot;&gt;LESS &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://lesscss.org/&quot;&gt;&lt;code&gt;less&lt;/code&gt;&lt;/a&gt; is still my favorite way to write CSS even after all these years. So I figure I could adapt the &lt;a href=&quot;https://www.11ty.dev/docs/languages/custom/#example-add-sass-support-to-eleventy&quot;&gt;SASS example&lt;/a&gt; to use &lt;code&gt;less&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// eleventy.config.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; less &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;less&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTemplateFormats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;less&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;less&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;outputFileExtension&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;css&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;inputContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; less&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inputContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;css&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This actually kinda worked except that &lt;code&gt;eleventy --serve&lt;/code&gt; only noticed the change in the &lt;code&gt;.less&lt;/code&gt; files, but didn&#39;t re-render them unless I touched the &lt;code&gt;.eleventy.js&lt;/code&gt; file itself.&lt;/p&gt;
&lt;p&gt;Of course this just means I need to follow the &amp;quot;&lt;a href=&quot;https://www.11ty.dev/docs/languages/custom/#registering-dependencies&quot;&gt;Registering Dependencies&lt;/a&gt;&amp;quot; section. Should work easily, right? Not quite. This will probably do the right thing if URLs &lt;em&gt;within&lt;/em&gt; a &lt;code&gt;.less&lt;/code&gt; file change. Meh, will deal with this later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Turns out restarting &lt;code&gt;eleventy&lt;/code&gt; fixed this and now changes to the &lt;code&gt;.less&lt;/code&gt; file automatically re-render the page. Wonderful!&lt;/p&gt;
&lt;h2 id=&quot;highlighting&quot; tabindex=&quot;-1&quot;&gt;Highlighting? &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bit of a reach, but could I &lt;a href=&quot;https://www.11ty.dev/docs/plugins/syntaxhighlight/&quot;&gt;add some basic highlighting&lt;/a&gt;? Worked correctly the first time. Impressive.&lt;/p&gt;
&lt;h2 id=&quot;using-a-starter-repo&quot; tabindex=&quot;-1&quot;&gt;Using a Starter Repo &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So when I decided to start from scratch, I should have actually started from &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;eleventy-base-blog&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Let&#39;s start with the blog &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/main/_data/metadata.js&quot;&gt;metadata&lt;/a&gt;. Now that I know how how the &lt;a href=&quot;https://www.11ty.dev/docs/data-cascade/&quot;&gt;data cascade&lt;/a&gt; works, this all makes sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let&#39;s move on to the &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/tree/main/_includes&quot;&gt;templates&lt;/a&gt;. Looks like there&#39;s a little helper for &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/main/_includes/postslist.njk&quot;&gt;lists of posts&lt;/a&gt;. Might come back to this later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/main/_includes/layouts/base.njk&quot;&gt;base template&lt;/a&gt; looks nice. Let&#39;s crib from here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q&lt;/strong&gt;: How important is it to use the &lt;code&gt;.njk&lt;/code&gt; rather than the default &lt;code&gt;liquid&lt;/code&gt; template language?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update 1&lt;/strong&gt;: I need to change &lt;code&gt;set&lt;/code&gt; to &lt;code&gt;capture&lt;/code&gt;; remove &lt;code&gt;| safe&lt;/code&gt; for content, since it&#39;s already escaped; and convert &lt;code&gt;var1 or var2&lt;/code&gt; expressions to &lt;code&gt;var1 | default: var2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update 2&lt;/strong&gt;: See below, when I change it all back.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/_includes/layouts/base.njk#L10&quot;&gt;Looks like I&#39;ll need to get the RSS plugin working correctly&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/_includes/layouts/base.njk#L16&quot;&gt;So that&#39;s how they do bundling&lt;/a&gt;. Not sure what I make of the claim that &amp;quot;Inlined CSS&amp;quot; has the &amp;quot;fastest site performance in production&amp;quot;. I&#39;ll hold off on this for the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/_includes/layouts/base.njk#L42&quot;&gt;navigation code&lt;/a&gt; took me a second to process. I had to noticed that &lt;code&gt;collections.all&lt;/code&gt; (every page on the site) was being piped through an &lt;code&gt;eleventyNavigation&lt;/code&gt; filter. This seems... &lt;em&gt;wasteful&lt;/em&gt;? But maybe it&#39;s super fast? I&#39;ll need to remember to add the navigation plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updating the templates breaks things, so I&#39;m going to jump to the &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/eleventy.config.js&quot;&gt;plugins and get that setup&lt;/a&gt;. I&#39;m surprised they&#39;re using &lt;code&gt;eleventy.config.js&lt;/code&gt; instead of &lt;code&gt;.eleventy.js&lt;/code&gt;. Not sure it makes a difference. Gonna need a bunch of packages.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --save-dev &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  luxon markdown-it-anchor &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  @11ty/eleventy-plugin-rss &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  @11ty/eleventy-plugin-syntaxhighlight &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  @11ty/eleventy-plugin-bundle &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  @11ty/eleventy-navigation &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  @11ty/eleventy-img&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ah, and I&#39;ll get to learn &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/eleventy.config.js#L10&quot;&gt;how to make custom plugins&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, you can &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/eleventy.config.js#L21&quot;&gt;add your own watch targets&lt;/a&gt;. Very slick.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&#39;m not going to include &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/eleventy.config.js#L103&quot;&gt;these changes to the defaults&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update&lt;/strong&gt;: I did end up including some of these.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So my styles are all messed up, so maybe I&#39;ll focus on &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/blob/b85269b1aa2859c1043b79c338079835fa57fb94/public/css/index.css&quot;&gt;how they do styles next&lt;/a&gt;. I&#39;ll need to work on the dark mode stuff later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ah, I see the benefit of &lt;a href=&quot;https://github.com/11ty/eleventy-base-blog/tree/b85269b1aa2859c1043b79c338079835fa57fb94/content&quot;&gt;moving things into a &lt;code&gt;content&lt;/code&gt; folder&lt;/a&gt;. It doesn&#39;t pollute your top-level with unexpected bits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just discovered that &lt;a href=&quot;https://mozilla.github.io/nunjucks/templating.html&quot;&gt;&lt;code&gt;nunjucks&lt;/code&gt; is essentially a port of &lt;code&gt;jinja2&lt;/code&gt;&lt;/a&gt;. I already know and like using &lt;code&gt;jinja2&lt;/code&gt;, so I&#39;m going to switch everything over.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;migration-take-2&quot; tabindex=&quot;-1&quot;&gt;Migration Take 2 &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that I managed to get a basic thing working, let me try, one more time to port my old blog.&lt;/p&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Tasks&lt;/strong&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; YAML front-matter&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; permalinks&lt;/label&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/index.html&lt;/code&gt; (blog home)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/{year}/{month}/{slug}.html&lt;/code&gt; (post)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/archive/index.html&lt;/code&gt; (all posts)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/feed/index.xml&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/tag&lt;/code&gt; (all tags)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/tag/{slug}.html&lt;/code&gt; (posts by tag)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/{year}/index.html&lt;/code&gt; (posts by year)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;/blog/{year}/{month}/index.html&lt;/code&gt; (posts by year + month)&lt;/label&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; heading links&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;{thumbnail}&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;{BASE_URL}&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;{BLOG_URL}&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;{IMG_URL}&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;{video}&lt;/code&gt;&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; markdown in html&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; LESS&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; syntax highlighting&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;hentry&lt;/code&gt; microformat (not sure this was used)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; RSS&lt;/label&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;id&lt;/code&gt; (should be a metadata field)&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;code&gt;&amp;lt;published&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;updated&amp;gt;&lt;/code&gt; should use post metadata with a backup to the file&lt;/label&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wish List&lt;/strong&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; dark mode&lt;/label&gt;&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;label&gt;&lt;input class=&quot;task-list-item-checkbox&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; mobile view&lt;/label&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-05-18&quot; tabindex=&quot;-1&quot;&gt;2023-05-18 &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2023/05/adventures-in-eleventy.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2023/05/adding-a-toc.html&quot;&gt;I added table of contents support&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Time is a Box</title>
      <link href="https://metaist.com/blog/2016/01/time-is-a-box.html"/>
      <id>tag:metaist.com,2010:blog.post-9951be5d6ec28621b36657758d9acbb2500e2292</id>
      <published>Thu Dec 31 2015 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2016/01/time-is-a-box.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;When you think of a &lt;a href=&quot;http://www.joelonsoftware.com/items/2007/10/26.html&quot;&gt;schedule as a box of wood blocks&lt;/a&gt;, as Joel Spolsky suggests, it&#39;s easier to reason about what belongs inside.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2016-01-01-time-is-a-box.jpg&quot; alt=&quot;Box&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;I tried to fit 5,362 things in and got 4,917 of them in.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;Image: &lt;a href=&quot;https://web.archive.org/web/20190126002518/https://www.flickr.com/photos/streetpreacher/5465095532/&quot;&gt;Thomas Weidenhaupt&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2016/01/time-is-a-box.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Derek Sivers says that people who are &amp;quot;busy&amp;quot; &lt;a href=&quot;http://fourhourworkweek.com/2015/12/14/derek-sivers-on-developing-confidence-finding-happiness-and-saying-no-to-millions/&quot;&gt;don&#39;t control their time&lt;/a&gt;. This works well with Robert Kegan&#39;s &lt;a href=&quot;http://web.archive.org/web/20151230143627/developmentalobserver.blog.com/2010/06/09/an-overview-of-constructive-developmental-theory-cdt/&quot;&gt;model of adult development&lt;/a&gt; in which a person moves from being impulsive to reasoning about other people&#39;s mental states (more on that later) because it sounds like a typical Stage-3 response: You feel &lt;em&gt;busy&lt;/em&gt; because you&#39;re responding to the greatest current pressure; incoming tasks aren&#39;t prioritized, so there&#39;s no way to reject them.&lt;/p&gt;
&lt;p&gt;Time-boxing and doing &lt;a href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;Pomodoros&lt;/a&gt; help, but that&#39;s on the execution side; you must first avoid falling into the trap of shoving too many things into your box.&lt;/p&gt;
&lt;p&gt;Therefore, consistently remind yourself about the bounded nature of your time. For example, this past year I got about 5,000 tasks done. That&#39;s roughly 13 things per day. Scheduling more than that in a day is asking for &lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;procrastination&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Moreover, Jason Cohen argues that if your &lt;a href=&quot;http://blog.asmartbear.com/utilization.html&quot;&gt;utilization rate is high&lt;/a&gt;, you&#39;re going to have a bad time. Bursts of higher-than-normal utilization happen from time to time, but if your normal state is burning hot, there&#39;s no room to accommodate the increase. Moreover, you&#39;ll feel like you&#39;re working as hard as you can, but accomplishing very little because context-switching and interruptions eat into your productivity.&lt;/p&gt;
&lt;p&gt;So take advantage of the &lt;a href=&quot;http://www.strategy-business.com/article/00266?gko=6c11d&quot;&gt;Fresh Start Effect&lt;/a&gt; and commit to keeping the time-box at appropriate levels of full. If it matters, make space for it, otherwise, recognize that it simply won&#39;t fit in the box.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2016/01/time-is-a-box.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2012/06/parkinsons-law.html&quot;&gt;Parkinson&#39;s Law&lt;/a&gt;&lt;/cite&gt; for our discussion on how work expands to fill the available time.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;Pomodoro Technique&lt;/a&gt;&lt;/cite&gt; for the focused-work approach.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.joelonsoftware.com/items/2007/10/26.html&quot;&gt;Evidence Based Scheduling&lt;/a&gt;&lt;/cite&gt; for Joel Spolsky&#39;s discussion about how to schedule software development tasks.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://blog.asmartbear.com/utilization.html&quot;&gt;Your non-linear problem of 90% utilization&lt;/a&gt;&lt;/cite&gt; for Jason Cohen&#39;s insightful analogy to server utilization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2016/01/time-is-a-box.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2016/01/time-is-a-box.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>3D Printing</title>
      <link href="https://metaist.com/blog/2013/06/3d-printing.html"/>
      <id>tag:metaist.com,2010:blog.post-e62f5743e5cde7148a62200314cfe72c61e00b41</id>
      <published>Sun Jun 16 2013 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Jun 16 2013 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/06/3d-printing.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/3D_printing&quot;&gt;3D Printing&lt;/a&gt; is a production process in which thin layers of an object
are deposited on top of each other to produce a physical object.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/OhYvDS7q_V8?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=OhYvDS7q_V8&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/06/3d-printing.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/3D_printing&quot;&gt;3D Printing&lt;/a&gt;&lt;/cite&gt; at Wikipedia for more information.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Skin Gun</title>
      <link href="https://metaist.com/blog/2013/06/skin-gun.html"/>
      <id>tag:metaist.com,2010:blog.post-487e7ba46734a096a99b3f893c9e8c1a943110e0</id>
      <published>Wed Jun 12 2013 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Jun 12 2013 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/06/skin-gun.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Stem_cell&quot;&gt;Stem cells&lt;/a&gt; are a type of cell that can replicate into different kinds
of cells. A few years ago, National Geographic showcased a fascinating
application of stem cells for regrowing burnt skin.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/eXO_ApjKPaI?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=eXO_ApjKPaI&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/06/skin-gun.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Stem_cell&quot;&gt;Stem Cells&lt;/a&gt;&lt;/cite&gt; at Wikipedia for more information.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Review: Drive</title>
      <link href="https://metaist.com/blog/2013/03/review-drive.html"/>
      <id>tag:metaist.com,2010:blog.post-7ef2229ccc3ad66c9a37ca32c8ca9fc05cee7cdc</id>
      <published>Sun Mar 10 2013 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;figure class=&quot;cover&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1594484805&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2013-03-11-review-drive.jpg&quot; alt=&quot;title&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://www.amazon.com/gp/product/1594484805&quot;&gt;Amazon&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Daniel Pink&#39;s &lt;a href=&quot;http://www.amazon.com/gp/product/1594484805&quot;&gt;Drive&lt;/a&gt; highlights several stark differences between
what motivation science tells us and how businesses and schools operate in the
areas of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;: choosing what you work on, when you work on it and with whom,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mastery&lt;/strong&gt;: working towards bettering yourself in some dimension under
optimal working conditions, and&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: working towards something greater than yourself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2013-03-11-drive-mindmap.png&quot; alt=&quot;Drive MindMap&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;https://metaist.com/static/img/2013-03-11-drive-mindmap.png&quot;&gt;metaist&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While I was surprised by how much of this book I had already covered in
previous posts, there were still a few nuggets I learned along the way.&lt;/p&gt;
&lt;h3 id=&quot;autonomy&quot; tabindex=&quot;-1&quot;&gt;Autonomy &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pink&#39;s arguments for giving people power over tasks, time, and team are cogent.
The much-discussed announcement that Marissa Mayer, Yahoo! new CEO, has
ended the &lt;a href=&quot;http://allthingsd.com/20130222/physically-together-heres-the-internal-yahoo-no-work-from-home-memo-which-extends-beyond-remote-workers/#&quot;&gt;work-from-home policy&lt;/a&gt; only spurs this discussion forward.
By contrast, the &lt;a href=&quot;http://www.valvesoftware.com/company/Valve_Handbook_LowRes.pdf&quot;&gt;work environment of Steam&lt;/a&gt; suggests that high quality
output is entirely possible even when the entire process is in the hands of
employees.&lt;/p&gt;
&lt;h3 id=&quot;mastery&quot; tabindex=&quot;-1&quot;&gt;Mastery &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Much of this section is devoted to explaining the concept of &lt;a href=&quot;http://en.wikipedia.org/wiki/Flow_(psychology)&quot;&gt;flow&lt;/a&gt;
pioneered by &lt;a href=&quot;http://en.wikipedia.org/wiki/Mihaly_Csikszentmihalyi&quot;&gt;Mihaly Csikszentmihalyi&lt;/a&gt;. It is similar to the idea
of a &lt;a href=&quot;https://metaist.com/blog/2012/06/zone-of-proximal-development.html&quot;&gt;Zone of Proximal Development&lt;/a&gt; and consists of keeping people
focused on tasks in which immediate feedback lets them know they are on-track
to achieve something just beyond their current capabilities.&lt;/p&gt;
&lt;h3 id=&quot;purpose&quot; tabindex=&quot;-1&quot;&gt;Purpose &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The desire to sever a purpose or feel useful is not new (just watch a few
of the earlier episodes of &lt;a href=&quot;http://en.wikipedia.org/wiki/Downton_abbey&quot;&gt;Downton Abbey&lt;/a&gt;). However, Pink argues that
the issue of our work serving a higher purpose will come to the fore as
the &lt;a href=&quot;http://en.wikipedia.org/wiki/Baby_boomer&quot;&gt;baby boomer&lt;/a&gt; generation starts to age and face existential
questions of mortality and purpose. While there may be surge in purpose-driven
activities, I expect it to come more from the youth whose naïveté is likely to
drive a desire to make a mark in the world rather than from rich elderly folks
who hope to live out their days in stylish comfort knowing that they made it.&lt;/p&gt;
&lt;p&gt;Especially interesting in this topic was the rise of the so-called
&lt;a href=&quot;http://en.wikipedia.org/wiki/Benefit_corporation&quot;&gt;Benefit corporation&lt;/a&gt; which seeks to use profits as a means to an end
and is equally interested in maximizing social benefit as it is profits.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;Intrinsic &amp;amp; Extrinsic Motivation&lt;/a&gt;&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2012/06/zone-of-proximal-development.html&quot;&gt;Zone of Proximal Development&lt;/a&gt;&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/09/boredom-distraction.html&quot;&gt;Boredom &amp;amp; Distraction&lt;/a&gt;&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2012/01/enjoying-the-process.html&quot;&gt;Enjoying the Process&lt;/a&gt;&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2012/05/inspiring-action.html&quot;&gt;Focus on a Purpose to Inspire Action&lt;/a&gt;&lt;/cite&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Genome Compiler</title>
      <link href="https://metaist.com/blog/2013/03/genome-compiler.html"/>
      <id>tag:metaist.com,2010:blog.post-66f787b04051d5ca7725ea2e5f1641238587a960</id>
      <published>Tue Mar 05 2013 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Genomics&quot;&gt;Genomics&lt;/a&gt; is the study of genetic material. A new tool for editing
genes makes it easier to manufacture synthetic life.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/F8qcDQaY8Mw?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=F8qcDQaY8Mw&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.linkedin.com/pub/omri-amirav-drory/27/727/505&quot;&gt;Omri Amirav-Drory&lt;/a&gt; makes a tantalizing case for comparing genomics
to programming:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;... it&#39;s just software—it&#39;s software that writes it&#39;s own hardware,
but it&#39;s just software.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, programmer shouldn&#39;t expect a smooth transition. There are a few
key differences that I&#39;ve already noticed while playing with the
&lt;a href=&quot;https://web.archive.org/web/20130305123624/http://www.genomecompiler.com/download-page/&quot;&gt;beta Genome Compiler&lt;/a&gt; which need to be alleviated to make tinkering
easier.&lt;/p&gt;
&lt;h3 id=&quot;different-mental-model&quot; tabindex=&quot;-1&quot;&gt;Different Mental Model &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;At it&#39;s core, software is about &lt;a href=&quot;http://en.wikipedia.org/wiki/Computation&quot;&gt;computation&lt;/a&gt; (that&#39;s why they&#39;re
called &lt;em&gt;computers&lt;/em&gt;). The concepts you first learn about are inputs, outputs,
and manipulations. Your first program is something like &lt;code&gt;print &amp;quot;Hello World.&amp;quot;&lt;/code&gt;.
From those small pieces you can build larger and larger structures until you
create a new environment (e.g., an &lt;a href=&quot;http://en.wikipedia.org/wiki/Operating_system&quot;&gt;operating system&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Genetic material, on the other hand, is focused on (re)production. While there
are initialization blocks (I can imagined what the
&lt;code&gt;chromosome replication initiator&lt;/code&gt; might do) and conditional branches for
different parts (a short virus had multiple variants of legs),
most parts of the genome focus on the production of chemicals whose
subsequent effects are the ultimate things of interest to me as a designer.
Barring an understanding of the chemical being produced, I cannot make sense
of what I&#39;m manufacturing.&lt;/p&gt;
&lt;h3 id=&quot;poor-documentation&quot; tabindex=&quot;-1&quot;&gt;Poor Documentation &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To try and make sense of what&#39;s going on, I looked at the reference information
provided when you click on a block. I presume the information is useful
to practitioners, but it is extremely opaque to non-experts (Oh, this block
produces &lt;code&gt;spore peptidoglycan hydrolase&lt;/code&gt;! What&#39;s that do?). Of course, we ought
not neglect how this information was obtained in the first place. The analogy
of giving iPads to cavemen is apt—we&#39;ve had to reverse-engineer this
highly complex entity one piece at a time.&lt;/p&gt;
&lt;p&gt;Nonetheless, for real tinkering to take off, the building blocks need to be
easier to reason about (think &lt;a href=&quot;http://scratch.mit.edu/&quot;&gt;Scratch&lt;/a&gt; for genomes).&lt;/p&gt;
&lt;h3 id=&quot;no-debugging&quot; tabindex=&quot;-1&quot;&gt;No Debugging &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After about an hour of playing around, I ended up splicing a bunch of random
genetic material together from different creatures, but still had no idea what
it would do. Moreover, there wasn&#39;t any way for me to step through my creation
and see the consequence on the environment (even a highly artificial one).&lt;/p&gt;
&lt;p&gt;When programming, being able to stop the program and inspect it&#39;s goings on
gives you an insight which is hard to get when you only look at the finished
product.&lt;/p&gt;
&lt;h3 id=&quot;still-awesome&quot; tabindex=&quot;-1&quot;&gt;Still Awesome &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the kind of development which opens up the possibility of dramatically
expanding our understanding and control of the world at several different
levels.&lt;/p&gt;
&lt;p&gt;First, we can now start talking about actual, mass-produced nano-manufacturing.
The recent finding of a &lt;a href=&quot;http://phys.org/news/2013-03-cicada-wing-bacteria-contact-video.html&quot;&gt;cicada which physically shreds bacteria&lt;/a&gt;
further pushes the idea that we&#39;ll soon be creating materials with tiny
features for productive use.&lt;/p&gt;
&lt;p&gt;Next, we can open up the number of people who can participate in this
once-reclusive field. Open Source biology is a natural consequence.&lt;/p&gt;
&lt;p&gt;Finally, we should expect the field of immunology to explode as safe-guards for
the diabolical creations of the masses need to be manufactured.&lt;/p&gt;
&lt;p&gt;Overall, this is an exciting development, much like the development of early
computing, but with far-reaching consequences for life on the planet.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20130305123624/http://www.genomecompiler.com/download-page/&quot;&gt;Genome Compiler&lt;/a&gt;&lt;/cite&gt; for the genomics tool.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://scratch.mit.edu/&quot;&gt;Scratch&lt;/a&gt;&lt;/cite&gt; for the programming environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2013-06-16&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-06-16T16:37:00-04:00&quot;&gt;2013-06-16&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;http://www.kickstarter.com/projects/antonyevans/glowing-plants-natural-lighting-with-no-electricit&quot;&gt;Glowing Plants: Natural Lighting with no Electricity&lt;/a&gt;&lt;/cite&gt;
for the Kickstarter project to create glowing plants using Genome Compiler.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates-1&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2013/03/genome-compiler.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Environmental Reliability</title>
      <link href="https://metaist.com/blog/2012/12/environmental-reliability.html"/>
      <id>tag:metaist.com,2010:blog.post-1efecfaf303a8e878638d32d5747f5eac2f931d6</id>
      <published>Mon Dec 10 2012 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Dec 10 2012 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/12/environmental-reliability.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;An updated &lt;a href=&quot;http://en.wikipedia.org/wiki/Stanford_marshmallow_experiment&quot;&gt;marshmallow test&lt;/a&gt; reveals that deferred gratification is
heavily influenced by our perception of our environment&#39;s reliability.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/JsQMdECFnUQ?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=JsQMdECFnUQ&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/12/environmental-reliability.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Researchers at the University of Rochester have &lt;a href=&quot;http://www.sciencedirect.com/science/article/pii/S0010027712001849&quot;&gt;published a new study&lt;/a&gt;
that shows that performance on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Stanford_marshmallow_experiment&quot;&gt;classic marshmallow experiment&lt;/a&gt;
is influenced by perceptions of environmental reliability.&lt;/p&gt;
&lt;p&gt;The major impact of this study is that &lt;a href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;deferred gratification&lt;/a&gt; is now
shown to be mediated by the environment instead of being a &amp;quot;personality trait&amp;quot;.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/12/environmental-reliability.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.sciencedirect.com/science/article/pii/S0010027712001849&quot;&gt;Rational snacking: Young children&#39;s decision-making on the marshmallow task is moderated by beliefs about environmental reliability&lt;/a&gt;&lt;/cite&gt;
for the study.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;Deferred Gratification&lt;/a&gt;&lt;/cite&gt;
for our previous discussion of this topic.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Intransitivity</title>
      <link href="https://metaist.com/blog/2012/06/intransitivity.html"/>
      <id>tag:metaist.com,2010:blog.post-eee2b197e1e0e5162d5fa02450def089336cd71f</id>
      <published>Tue Jun 19 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Jun 19 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/intransitivity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;In math, &lt;a href=&quot;http://en.wikipedia.org/wiki/Transitive_relation&quot;&gt;transitivity&lt;/a&gt; is a property of relations
such that if &lt;strong&gt;A&lt;/strong&gt; is related to &lt;strong&gt;B&lt;/strong&gt;, and &lt;strong&gt;B&lt;/strong&gt; is related
to &lt;strong&gt;C&lt;/strong&gt;, then &lt;strong&gt;A&lt;/strong&gt; is related to &lt;strong&gt;C&lt;/strong&gt; in the same way.&lt;/p&gt;
&lt;p&gt;An &lt;a href=&quot;http://en.wikipedia.org/wiki/Intransitivity&quot;&gt;intransitive relation&lt;/a&gt; is one in which this pattern
does not hold.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-20-intransitivity.jpg&quot; alt=&quot;Rock-Paper-Scissors&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;I have a hard time believing that &lt;a href=&quot;http://en.wikipedia.org/wiki/Rock_paper_scissors&quot;&gt;paper beats rock&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Rock_paper_scissors.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/intransitivity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ve often thought that there is a bias towards thinking that most
relations are transitive. But transitivity is actually a rare case.
It makes reasoning simpler (e.g., the &lt;a href=&quot;http://en.wikipedia.org/wiki/FOAF_(software)&quot;&gt;friend of my friend&lt;/a&gt; is my friend),
but is often simply not true: If &lt;strong&gt;Bob&lt;/strong&gt; is friends with &lt;strong&gt;Alice&lt;/strong&gt; and
&lt;strong&gt;Alice&lt;/strong&gt; is friends with &lt;strong&gt;Eve&lt;/strong&gt;, &lt;strong&gt;Bob&lt;/strong&gt; might not actually be friends
with &lt;strong&gt;Eve&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Most preferences are intransitive which is why we have a
&lt;a href=&quot;https://metaist.com/blog/2012/06/review-paradox-of-choice.html&quot;&gt;hard time choosing among multiple options&lt;/a&gt; and
why &lt;a href=&quot;https://metaist.com/blog/2009/12/arrows-impossibility-theorm.html&quot;&gt;voting paradoxes&lt;/a&gt; exist. Moreover, most real options
involve multiple dimensions, so we run the risk of
&lt;a href=&quot;https://metaist.com/blog/2010/01/fmri-false-positives.html&quot;&gt;errors of multiple comparisons&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, you&#39;re trying to pick a movie to watch? (Let&#39;s leave out
other people&#39;s preferences for this example.) Say you prefer
movie &lt;strong&gt;X&lt;/strong&gt; over &lt;strong&gt;Y&lt;/strong&gt; and &lt;strong&gt;Y&lt;/strong&gt; over &lt;strong&gt;Z&lt;/strong&gt;. However, when
you compare &lt;strong&gt;X&lt;/strong&gt; and and &lt;strong&gt;Z&lt;/strong&gt;, you find that you like &lt;strong&gt;Z&lt;/strong&gt; better.
Yep, you&#39;re either comparing different features between the films, or
the &amp;quot;prefer movie X to movie Y&amp;quot; relation is intransitive.&lt;/p&gt;
&lt;p&gt;Keep this in mind next time you catch yourself or others assuming
that a relation is transitive.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/intransitivity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Intransitivity&quot;&gt;Intransitivity&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for a more rigorous definition.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Economics of Dueling</title>
      <link href="https://metaist.com/blog/2012/06/economics-of-dueling.html"/>
      <id>tag:metaist.com,2010:blog.post-526a1c53d74ec2ec649c7982a346c4bac94256a0</id>
      <published>Tue Jun 12 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/economics-of-dueling.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Under certain economics conditions, &lt;a href=&quot;http://en.wikipedia.org/wiki/Duel&quot;&gt;dueling&lt;/a&gt;
to defend your honor is an &lt;a href=&quot;https://web.archive.org/web/20120417100921/http://www3.amherst.edu/~cgkingston/duels.pdf&quot;&gt;expensive, but rational, choice&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-13-economics-of-dueling.jpg&quot; alt=&quot;Duel&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;Oh snap! It&#39;s a &lt;a href=&quot;http://en.wikipedia.org/wiki/Hamilton-Burr_duel&quot;&gt;presidential showdown&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Hamilton-burr-duel.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/economics-of-dueling.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;According to Kingston and Wright (2009), the decline of dueling is correlated
with a highly impersonal and formal &lt;a href=&quot;http://en.wikipedia.org/wiki/Credit_market&quot;&gt;credit market&lt;/a&gt;. However, dueling
persists in those areas where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the credit market is highly personal (e.g., antebellum South, 19th
century Mexico, rural Paraguay today),&lt;/li&gt;
&lt;li&gt;subsistence depends on continuing a line of credit (e.g., Southern farmers,
including Thomas Jefferson, were constantly paying off one lender by borrowing
from another), and&lt;/li&gt;
&lt;li&gt;most of the borrowers assets are not liquid (e.g., property, slaves).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, lenders often make holistic judgments regarding who they will
lend money, and borrowers cannot afford to have their credit standing attacked.
Under such circumstances, defending your honor is less about displays of bravery,
and more of a desire to avoid absolute destitution.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/economics-of-dueling.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20120417100921/http://www3.amherst.edu/~cgkingston/duels.pdf&quot;&gt;The Deadliest of Games: The Institution of Dueling&lt;/a&gt;&lt;/cite&gt;
for the remainder of the discussion of the rational basis of dueling.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/economics-of-dueling.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/economics-of-dueling.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Zone of Proximal Development</title>
      <link href="https://metaist.com/blog/2012/06/zone-of-proximal-development.html"/>
      <id>tag:metaist.com,2010:blog.post-ba5d2758c300ec2b6084e2d0a6ee1071c2d842d4</id>
      <published>Thu Jun 07 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Jun 07 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/zone-of-proximal-development.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Zone_of_proximal_development&quot;&gt;Zone of Proximal Development&lt;/a&gt; (ZPD) is
a theoretical construct for engaging a student above
the level of &lt;a href=&quot;http://en.wikipedia.org/wiki/Boredom&quot;&gt;boredom&lt;/a&gt; and below the level of &lt;a href=&quot;http://en.wikipedia.org/wiki/Anxiety&quot;&gt;anxiety&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-08-zone-of-proximal-development.jpg&quot; alt=&quot;Fluorescent lights&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;At least something&#39;s happening with the lights.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/micahe/370242964/&quot;&gt;Micah Esguerra&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/zone-of-proximal-development.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ZPD relies on &lt;a href=&quot;http://en.wikipedia.org/wiki/Instructional_scaffolding&quot;&gt;instructional scaffolding&lt;/a&gt; to provide support
to a student above his/her level of competence, but below an anxiety-inducing
level. ZPD is widely used in the video game industry to
&lt;a href=&quot;http://researchquest.blogspot.com/2007/09/instructional-design-video-games-zpd.html&quot;&gt;train players on how to play the game&lt;/a&gt;. In usability, ZPD plays a role
in determining how to structure exposure to features in order to build up
confidence and skill.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/zone-of-proximal-development.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/09/boredom-distraction.html&quot;&gt;Boredom &amp;amp; Distraction&lt;/a&gt;&lt;/cite&gt;
and &lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/11/patient-problem-solving.html&quot;&gt;Patient Problem Solving&lt;/a&gt;&lt;/cite&gt;
for our discussion of similar topics.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Endowment Effect</title>
      <link href="https://metaist.com/blog/2012/06/endowment-effect.html"/>
      <id>tag:metaist.com,2010:blog.post-1d4bd3b96292522f5387a5658347e134d83dae86</id>
      <published>Wed Jun 06 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Jun 06 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/endowment-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Once we own something, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Endowment_effect&quot;&gt;endowment effect&lt;/a&gt; describes
the degree to which we don&#39;t want to sell it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://papers.ssrn.com/sol3/papers.cfm?abstract_id=615861&quot;&gt;Or maybe not&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-07-endowment-effect.jpg&quot; alt=&quot;Coconuts&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;Mine is better than yours.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/thienzieyung/5535685219/&quot;&gt;Jason Thien&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/endowment-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is some controversy about whether or not this effect &lt;a href=&quot;http://papers.ssrn.com/sol3/papers.cfm?abstract_id=615861&quot;&gt;actually exists&lt;/a&gt;.
Despite the issues with adequate subject controls, this idea is applied widely
to &lt;a href=&quot;http://en.wikipedia.org/wiki/Hierarchical_organization&quot;&gt;corporate fiefdoms&lt;/a&gt;, &lt;a href=&quot;http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2011403&quot;&gt;artist&#39;s work&lt;/a&gt;, and other areas.&lt;/p&gt;
&lt;p&gt;It&#39;s tempting to think that we think of our own items as having a higher worth
than those of others, but it might not be the case.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/endowment-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Endowment_effect&quot;&gt;Endowment Effect&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for more examples.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://papers.ssrn.com/sol3/papers.cfm?abstract_id=615861&quot;&gt;The Willingness to Pay/Willingness to Accept Gap,
the Endowment Effect, Subject Misconceptions and
Experimental Procedures for Eliciting Valuations&lt;/a&gt;&lt;/cite&gt;
for a discussion of how malleable the endowment effect can be.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2011403&quot;&gt;Valuing Attribution and Publication in Intellectual Property&lt;/a&gt;&lt;/cite&gt;
for a somewhat related study of how artists value their work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Parkinson&#39;s Law</title>
      <link href="https://metaist.com/blog/2012/06/parkinsons-law.html"/>
      <id>tag:metaist.com,2010:blog.post-da9ae821fcbf8cf46cb51de04e438dc61c0f0890</id>
      <published>Tue Jun 05 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/parkinsons-law.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Parkinson%27s_Law&quot;&gt;Parkinson&#39;s Law&lt;/a&gt; states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Work expands so as to fill the time available for its completion.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-06-parkinsons-law.jpg&quot; alt=&quot;Overgrowth&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;Can&#39;t hold me back.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;https://web.archive.org/web/20090312045249/http://www.flickr.com/photos/iversonic/706592121/&quot;&gt;Mark Iverson&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/parkinsons-law.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A circular version of Parkinson&#39;s Law coined by &lt;strong&gt;Jeffrey Klein&lt;/strong&gt; states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bureaucracy expands to accommodate the expanding bureaucracy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The importance of understanding Parkinson&#39;s Law relates to how much
of a resource (such as time) you allocate to tasks, departments, etc.
Every entity—corporate and otherwise—tries to maintain it&#39;s own
survival. This is usually accomplished through signals of growth such as
increases in budgets and personnel.&lt;/p&gt;
&lt;p&gt;For a personal efficiency standpoint, you can sometimes constrain your time
and continue to produce the same level of output (e.g.,
&lt;a href=&quot;http://calnewport.com/blog/2012/05/07/facebooks-coo-works-less-than-you/&quot;&gt;fixed schedule productivity&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/parkinsons-law.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Parkinson%27s_Law&quot;&gt;Parkinson&#39;s Law&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for corollaries and the coefficient of inefficiency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://calnewport.com/blog/2012/05/07/facebooks-coo-works-less-than-you/&quot;&gt;Facebook&#39;s COO Works Less Than You&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Study Hacks&lt;/span&gt;
for a stark example of how fixed schedule productivity works.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/parkinsons-law.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/parkinsons-law.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Future Takes Time</title>
      <link href="https://metaist.com/blog/2012/06/future-takes-time.html"/>
      <id>tag:metaist.com,2010:blog.post-368387c1b4f464c25c74eb0501b6805b86f02e0c</id>
      <published>Mon Jun 04 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;As some parts of society evolve faster than others, we should
remember to be patient with the process.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-05-future-takes-time.jpg&quot; alt=&quot;Hourglass&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/bogenfreund/556656621/&quot;&gt;Alexander Boden&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Some areas of society have changed so rapidly that the &lt;em&gt;lack&lt;/em&gt; of change
in other areas is noticeable. Below are some things that appear to exist
only by virtue of the status quo.&lt;/p&gt;
&lt;h3 id=&quot;education&quot; tabindex=&quot;-1&quot;&gt;Education &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.iwillteachyoutoberich.com/blog/the-invisible-scripts-that-guide-our-lives/&quot;&gt;Invisible Script&lt;/a&gt;: You go to school to become an &lt;code&gt;X&lt;/code&gt;.
From that point on you introduce yourself as an &lt;code&gt;X&lt;/code&gt; and people assume
you&#39;re like those other &lt;code&gt;X&lt;/code&gt; people they know.&lt;/p&gt;
&lt;p&gt;Why do people assume they&#39;ll always have this career? If economic conditions change,
what are you going to do when we don&#39;t need &lt;code&gt;X&lt;/code&gt;&#39;s anymore? Riot? Demand
more jobs? Yeah good luck with that.&lt;/p&gt;
&lt;h3 id=&quot;security-or-any-real-policy&quot; tabindex=&quot;-1&quot;&gt;Security (or any real Policy) &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/blog/2012/06/security-theater.html&quot;&gt;Theater&lt;/a&gt;: We should try to stop &lt;em&gt;all&lt;/em&gt; terrorists. We can do this by
reacting to &lt;em&gt;&lt;a href=&quot;http://www.schneier.com/blog/archives/2012/05/overreacting_to.html&quot;&gt;every attempt&lt;/a&gt;&lt;/em&gt; to scare us.&lt;/p&gt;
&lt;p&gt;Reality Check: The &lt;a href=&quot;http://historymatters.gmu.edu/d/5057/&quot;&gt;only thing we have to fear is fear itself&lt;/a&gt;. What about
some &lt;a href=&quot;http://en.wikipedia.org/wiki/Evidence_based_policy&quot;&gt;evidence-based policy&lt;/a&gt;? Yeah, that&#39;ll lead to
&lt;a href=&quot;http://en.wikipedia.org/wiki/Policy-based_evidence_making&quot;&gt;policy-based evidence making&lt;/a&gt;. We&#39;ll need to be careful about that.&lt;/p&gt;
&lt;h3 id=&quot;corporate-behavior&quot; tabindex=&quot;-1&quot;&gt;Corporate Behavior &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Why do corporations / politicians (&lt;a href=&quot;https://web.archive.org/web/20120806211005/https://www.fastcompany.com/1657030/happiness-culture-zappos-isnt-company-its-mission&quot;&gt;notable exceptions aside&lt;/a&gt;)
behave as though we&#39;re not humans? (I have a theory; more on this later.)&lt;/p&gt;
&lt;p&gt;So people who lost much of their savings are likely to stick around in jobs
longer—together with people who really
&lt;a href=&quot;https://web.archive.org/web/20120605111453/http://onefte.com/2012/03/16/gfc-a-coming-of-age/&quot;&gt;dislike their jobs&lt;/a&gt;. As a result, Dilbert
becomes a &lt;a href=&quot;http://www.freakonomics.com/2012/02/23/the-dilbert-index-a-new-marketplace-podcast/&quot;&gt;passive-aggressive signal of displeasure at work&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;law-especially-intellectual-property&quot; tabindex=&quot;-1&quot;&gt;Law (especially &lt;a href=&quot;http://en.wikipedia.org/wiki/Intellectual_property&quot;&gt;Intellectual Property&lt;/a&gt;) &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20120105074011/https://law.yale.edu/documents/pdf/CDO_Public/cdo-billable_hour.pdf&quot;&gt;Billable hours seems like a crap way to make money&lt;/a&gt;.
That&#39;s just my opinion though. However, it does seem like the legal
profession is ripe for a huge &lt;a href=&quot;http://en.wikipedia.org/wiki/Refactoring&quot;&gt;refactoring&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Regarding intellectual property: the number of legitimate reasons for
claiming to own an idea are dwindling. They are non-zero, but the reality
of society is that we have made it &lt;a href=&quot;http://www.everythingisaremix.info/&quot;&gt;exceedingly easy to share and remix ideas&lt;/a&gt;,
so restricting that behavior results in restricting culture.&lt;/p&gt;
&lt;h3 id=&quot;putting-it-all-together&quot; tabindex=&quot;-1&quot;&gt;Putting it All Together &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Technology is changing faster than the larger society can adapt. There are waves
of adaptation. First, a small community of people engage with a technology and start
to explore its potential (e.g., the Internet and GPS started as military applications).
Next, a group of dedicated folks start to push the limits of the technology. Later,
the technology becomes a commodity. Yet, the social and legal implications are rarely
known at this point. Then, after a protracted incubation period, the social norms
become established. Finally, the legal precedents and rulings are adjusted to make
sense of where we ended up.&lt;/p&gt;
&lt;p&gt;But the process is long and arduous and there&#39;s no guarantee we&#39;ll come out
for the better. And while we should be patient, we should
&lt;a href=&quot;http://www.youtube.com/watch?v=G2VHf5vpBy8&quot;&gt;argue against policies for status quo&#39;s sake&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.iwillteachyoutoberich.com/blog/the-invisible-scripts-that-guide-our-lives/&quot;&gt;The invisible scripts that guide our lives&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;I Will Teach You To Be Rich&lt;/span&gt;
for a different kind of discussion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2012/01/enjoying-the-process.html&quot;&gt;Enjoying the Process&lt;/a&gt;&lt;/cite&gt;
for our discussion of investing in the process rather than the outcome.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/future-takes-time.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Hacking New Senses</title>
      <link href="https://metaist.com/blog/2012/06/hacking-new-senses.html"/>
      <id>tag:metaist.com,2010:blog.post-5ec4d71ee4c0e3ab3149ff2b526e6d1b681010a8</id>
      <published>Sun Jun 03 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Jun 03 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/hacking-new-senses.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Somatosensory_cortex&quot;&gt;sensory cortex&lt;/a&gt; is the main region for processing
tactile senses. Yet, recently, the sense of touch has been
repurposed to provide additional information such as sight,
direction, and other new senses.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-04-hacking-new-senses.jpg&quot; alt=&quot;Compass&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/calsidyrose/4925267732/&quot;&gt;Calsidyrose&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/hacking-new-senses.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hacking the human brain to add new senses seems like only a matter of time.
Sufficient &lt;a href=&quot;http://en.wikipedia.org/wiki/Neuroplasticity&quot;&gt;neuroplasticity&lt;/a&gt; should allow us to add, fuse, repurpose,
and restore sensory experiences. One possible consequence is that people will
have such &lt;a href=&quot;http://en.wikipedia.org/wiki/Umwelt&quot;&gt;drastically different experiences&lt;/a&gt;
(e.g., xkcd&#39;s &amp;quot;&lt;a href=&quot;http://xkcd.com/1037/&quot;&gt;Umwelt&lt;/a&gt;&amp;quot;), that they will increasingly
disassociate from each other.&lt;/p&gt;
&lt;p&gt;On the other, things could be really awesome if we jointly produced a more accurate
description of the world by combining our various sensory information.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/hacking-new-senses.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.wired.com/wired/archive/15.04/esp_pr.html&quot;&gt;Mixed Feelings&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wired&lt;/span&gt;
for a longer discussion.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://web.archive.org/web/20130302153400/http://www.michaeljohngrist.com/2008/10/cyborgization-extra-senses/&quot;&gt;Cyborgization - Extra Senses&lt;/a&gt;&lt;/cite&gt;
for a more detailed explanation.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Security Theater</title>
      <link href="https://metaist.com/blog/2012/06/security-theater.html"/>
      <id>tag:metaist.com,2010:blog.post-f9ccdd47a9e9e5da2c2404e2b646cd9015c6eb5b</id>
      <published>Sat Jun 02 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Jun 02 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/security-theater.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Security_theater&quot;&gt;Security theater&lt;/a&gt; is term coined by &lt;a href=&quot;http://www.schneier.com/&quot;&gt;Bruce Schneier&lt;/a&gt;
to describe security measures that make us &lt;em&gt;feel&lt;/em&gt; more secure rather
than &lt;em&gt;actually improve&lt;/em&gt; our security.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-03-security-theater.png&quot; alt=&quot;Bag Check&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://xkcd.com/651/&quot;&gt;xkcd&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/security-theater.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Security theater is what happens when there is a disconnect between how
we feel about our own security, and what the actual security measures accomplish.
While the cases in which security theater leads to waste are numerous (e.g., &lt;a href=&quot;http://en.wikipedia.org/wiki/Transportation_Security_Administration&quot;&gt;TSA&lt;/a&gt;)
there are some cases in which it is actually helpful. For example, Schneier pointed out
that after the &lt;a href=&quot;http://en.wikipedia.org/wiki/Chicago_Tylenol_murders&quot;&gt;Chicago Tylenol murders&lt;/a&gt;,
&lt;a href=&quot;http://en.wikipedia.org/wiki/Tamper-evident&quot;&gt;tamper-evident&lt;/a&gt; safety-seals were introduced to help make people feel safer.
Yet, those seals are not truly effective against stopping a determined attacker.
Nonetheless, since the &lt;em&gt;actual&lt;/em&gt; risk of death is low (i.e., the murders were a fluke),
using such seals brings our feelings of security in line with the reality.&lt;/p&gt;
&lt;p&gt;One of the reasons that it&#39;s so hard to get rid of security theater stems from the
asymmetric rewards that policy makers have: by making people feel safer, a policy maker
is shielded from accusations that they didn&#39;t do &lt;em&gt;everything possible&lt;/em&gt; to prevent the attack.
Since there is no way to prevent all attacks, the measures continue to increase in response
to every attempted attack in order to further avoid blame. Schneier claims that the only
way to break the cycle is for the &lt;a href=&quot;http://www.schneier.com/blog/archives/2007/12/refuse_to_be_te.html&quot;&gt;population to refuse to be terrorized&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/security-theater.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Security_theater&quot;&gt;Security Theater&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for examples.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.schneier.com/blog/archives/2009/11/beyond_security.html&quot;&gt;Beyond Security Theater&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Schneier on Security&lt;/span&gt;
for an explanation of movie-plots.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Review: Paradox of Choice</title>
      <link href="https://metaist.com/blog/2012/06/review-paradox-of-choice.html"/>
      <id>tag:metaist.com,2010:blog.post-e9a764cd3de0465a68b466e3203327148e5df557</id>
      <published>Thu May 31 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 31 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;figure class=&quot;cover&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0060005696&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-01-review-paradox-of-choice.jpg&quot; alt=&quot;title&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://www.amazon.com/gp/product/0060005696&quot;&gt;Amazon&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/review-paradox-of-choice.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;em&gt;Paradox of Choice&lt;/em&gt; consists of our:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preference for &lt;em&gt;many&lt;/em&gt; (rather than &lt;em&gt;few&lt;/em&gt;) options when making a decision,&lt;/li&gt;
&lt;li&gt;larger likelihood of dissatisfaction when choosing from a large set of options
(rather than a small set).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Barry Schwartz&#39;s &lt;a href=&quot;http://www.amazon.com/gp/product/0060005696&quot;&gt;Paradox of Choice&lt;/a&gt;, he argues that our desire to expand
our available alternatives is actually making us less satisfied with whatever we end
up choosing.
&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-06-01-choice.jpg&quot; alt=&quot;Choice&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.imdb.com/title/tt0310482/quotes?qt=qt0165855&quot;&gt;The choice is your and your alone&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/buttersponge/4955768144/&quot;&gt;Tori Cat&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/review-paradox-of-choice.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Schwartz sees two major strategies for making a choice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maximizer - tries to make &lt;strong&gt;best possible&lt;/strong&gt; choice&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Satisficing&quot;&gt;satisficer&lt;/a&gt; - tries to find &lt;strong&gt;first suitable&lt;/strong&gt; choice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The difference is that a satisficer is operating with a specific set
of criteria in mind. Once the criteria are met, the search is over.
Meanwhile, the maximizer continues to search for the best deal and
can never really be sure that there isn&#39;t a &lt;em&gt;better&lt;/em&gt; deal out there.
As a result, the maximizer suffers from the perception that any defect
in his choice &lt;em&gt;might&lt;/em&gt; have been overcome by some hypothetical other option.&lt;/p&gt;
&lt;p&gt;It&#39;s almost as if for maximizers
&amp;quot;&lt;a href=&quot;http://en.wikiquote.org/wiki/The_Sandman&quot;&gt;it&#39;s not in the last place you look&lt;/a&gt;.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/06/review-paradox-of-choice.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Buyers_remorse&quot;&gt;Buyer&#39;s Remorse&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for a related concept.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Classic Software Development Mistakes</title>
      <link href="https://metaist.com/blog/2012/05/classic-software-development-mistakes.html"/>
      <id>tag:metaist.com,2010:blog.post-eb56c3426870d09df95942d992bebde72f9dbcde</id>
      <published>Wed May 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/classic-software-development-mistakes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Steve McConnell has compiled an excellent list of
&lt;a href=&quot;http://www.stevemcconnell.com/rdenum.htm&quot;&gt;25 classic mistakes&lt;/a&gt; that are made
during &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_development&quot;&gt;software development&lt;/a&gt;—many of which apply to
&lt;a href=&quot;http://en.wikipedia.org/wiki/Project_management&quot;&gt;project management&lt;/a&gt; in general.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-05-31-classic-software-development-mistakes.jpg&quot; alt=&quot;Making a mistake&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;https://web.archive.org/web/20131024005313/http://www.flickr.com/photos/doobybrain/360276843/&quot;&gt;Herman Yung&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/classic-software-development-mistakes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The enumerated mistakes are grouped into four general categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;People&lt;/li&gt;
&lt;li&gt;Process&lt;/li&gt;
&lt;li&gt;Product&lt;/li&gt;
&lt;li&gt;Technology&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first two categories could be describing almost any project. The third
and fourth are more specific to software development. Many cover issues related
to human &lt;a href=&quot;https://metaist.com/blog/2010/02/disease-screening-base-rate-fallacy.html&quot;&gt;assessment of risk&lt;/a&gt; and our poor ability to judge future states
(e.g., &lt;a href=&quot;http://en.wikipedia.org/wiki/Optimism_bias&quot;&gt;optimism bias&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Personally, I&#39;d like to see more &lt;a href=&quot;http://en.wikipedia.org/wiki/Version_control&quot;&gt;version control&lt;/a&gt; on non-software development
projects. Three professionals I think are ripe for using version control:
secretaries, lawyers, and politicians. All three are in the business of moving documents
around. The latter two are more transparent when we see what changes have been made
(more reason for them to dislike this approach). Overall, the amount of back-and-forth
could be dramatically reduced if version control were used (e.g., tumblr
&lt;a href=&quot;https://github.com/tumblr/policy&quot;&gt;posted their policies on GitHub&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/classic-software-development-mistakes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.stevemcconnell.com/rdenum.htm&quot;&gt;Classic Mistakes Enumerated &lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;Steve McConnell&lt;/span&gt;
for the original list.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Rats as Detectors</title>
      <link href="https://metaist.com/blog/2012/05/rats-as-detectors.html"/>
      <id>tag:metaist.com,2010:blog.post-29ff5ed1297650ff7d088358f457babd4ff14006</id>
      <published>Tue May 29 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 29 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/rats-as-detectors.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Rats can be trained to detect &lt;a href=&quot;http://en.wikipedia.org/wiki/Land_mine&quot;&gt;land mines&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Tuberculosis&quot;&gt;tuberculosis&lt;/a&gt;,
and other phenomena.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Enjoy.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/9IRv3TOjE1I?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=9IRv3TOjE1I&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/rats-as-detectors.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/12/vending-machines-for-crows.html&quot;&gt;Vending Machines for Crows&lt;/a&gt;&lt;/cite&gt;
for another example of training animals for useful purposes.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Teaching Creative Thinking</title>
      <link href="https://metaist.com/blog/2012/05/teaching-creative-thinking.html"/>
      <id>tag:metaist.com,2010:blog.post-6d32be9bc1a9ac927d4701aaf52760f862176277</id>
      <published>Mon May 28 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon May 28 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/teaching-creative-thinking.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;There is a common misconception that &lt;a href=&quot;http://en.wikipedia.org/wiki/Creativity&quot;&gt;creativity&lt;/a&gt; and
&lt;a href=&quot;http://en.wikipedia.org/wiki/Innovation&quot;&gt;innovation&lt;/a&gt; are either the result of personal disposition
or the result of &lt;a href=&quot;http://en.wikipedia.org/wiki/Muse&quot;&gt;divine inspiration&lt;/a&gt;. In fact, many
aspects of creativity can be taught and one can improve their
creative output over time—like any other skill.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-05-29-teaching-creative-thinking.jpg&quot; alt=&quot;Muses&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;Yeah, they&#39;re &lt;a href=&quot;http://www.imdb.com/title/tt1001508/&quot;&gt;just not that into you&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Muses_sarcophagus_Louvre_MR880.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/teaching-creative-thinking.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the fascinating things about humans is their ability to learn and adapt.
Creative thinking is not exceptional—like any other skill it can be
improved with (&lt;a href=&quot;https://metaist.com/blog/2011/09/quality-quantity.html&quot;&gt;lots of&lt;/a&gt;) practice. Children are naturally creative
because they make many loose associations which foster the type of non-linear
thinking required for creativity. Unfortunately, during those years when they
should be fostering that ability, most
&lt;a href=&quot;https://metaist.com/blog/2012/04/review-stop-stealing-dreams.html&quot;&gt;schooling systems focus on obedience&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/teaching-creative-thinking.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.edwdebono.com/course/index.htm&quot;&gt;General Thinking Skills Course&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Effective Thinking&lt;/span&gt;
by Edward de Bono for an example of a course on &lt;a href=&quot;http://en.wikipedia.org/wiki/Lateral_thinking&quot;&gt;lateral thinking&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/09/quality-quantity.html&quot;&gt;Quality v. Quantity&lt;/a&gt;&lt;/cite&gt;
and &lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;Intrinsic &amp;amp; Extrinsic Motivation&lt;/a&gt;&lt;/cite&gt;
for our discussions about improving creative output.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Misunderstanding Email</title>
      <link href="https://metaist.com/blog/2012/05/misunderstanding-email.html"/>
      <id>tag:metaist.com,2010:blog.post-1defee50f46b7904c408a559d204cfc88f48aee2</id>
      <published>Thu May 24 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 24 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/misunderstanding-email.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;People tend to misinterpret emotion in written communication
more often than in face-to-face interactions. Yet, they are
more confident of their assessment.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-05-25-misunderstanding-email.jpg&quot; alt=&quot;ALT&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.masalatime.com/?p=852&quot;&gt;MasalaTime&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/misunderstanding-email.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Misunderstandings arise in any form of communication. For example,
when I was in high school, a friend of mine who had missed a Shakespeare
test called me on the phone and asked about some of the topics that were
covered. At one point he asked:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Are there quotes on the test?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Having just taken the test and been surprised at the large number of quotes
I responded (with strong emphasis):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;KNOW quotes!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the context of the conversation, I thought it was perfectly obvious
that I was communicating the idea that one should study the quotes carefully.
But look at that homophone! (Note that constructed languages like
&lt;a href=&quot;http://en.wikipedia.org/wiki/Loglan&quot;&gt;Loglan&lt;/a&gt; try avoid precisely this kind of ambiguity.)
Later, after having taken the test, he came up to me and asked how I
could have said that there weren&#39;t any quotes!? I was shocked,
since I thought I gave him specific direction regarding this exact issue.
Moments later, we realized what happened.&lt;/p&gt;
&lt;p&gt;This episode shaped my understanding of how communication is parsed by
others. More recently, there has been research into the effects of
different modalities on communication. One bias that caught my attention
was the dramatic difference between how well people &lt;em&gt;think&lt;/em&gt; they understand
emotion over email (very well) versus how well they &lt;em&gt;actually&lt;/em&gt; perceive
emotion (very poorly).&lt;/p&gt;
&lt;p&gt;So the next time you think you know how someone feels based on an email from
them, try calling or talking to them in-person.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/misunderstanding-email.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.nytimes.com/2007/10/07/jobs/07pre.html?_r=1&quot;&gt;E-Mail Is Easy to Write (and to Misread)&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The New York Times&lt;/span&gt;
for a related article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.socsci.uci.edu/ssarc/internship/webdocs/Week03/ByronArticle.pdf&quot;&gt;Carrying Too Heavy a Load? The Communication and Miscommunication of Emotion by Email&lt;/a&gt;&lt;/cite&gt;
for related research.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://weisband.faculty.arizona.edu/sites/weisband.faculty.arizona.edu/files/apl844632.pdf&quot;&gt;Evaluating Self and Others in Electronic and Face-to-Face Groups&lt;/a&gt;&lt;/cite&gt;
for somewhat related research.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Reader Question: How do fireworks work?</title>
      <link href="https://metaist.com/blog/2012/05/reader-question-how-do-fireworks-work.html"/>
      <id>tag:metaist.com,2010:blog.post-4c5da732d8133fdd3a4d797a7dcb5694fe179d9a</id>
      <published>Wed May 23 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 23 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is a response to a reader question.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;question&quot; tabindex=&quot;-1&quot;&gt;Question &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/reader-question-how-do-fireworks-work.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;An anonymous six year-old asks: How do fireworks work?&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-05-24-reader-question-how-do-fireworks-work.jpg&quot; alt=&quot;fireworks&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://www.flickr.com/photos/cameraslayer/721512305/in/photostream/&quot;&gt;Camera Slayer&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary-for-a-six-year-old&quot; tabindex=&quot;-1&quot;&gt;Summary (for a six year-old) &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/reader-question-how-do-fireworks-work.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are lots of different kinds of fireworks, but basically
they work by launching a bundle of things into the air which
explodes mid-air.&lt;/p&gt;
&lt;p&gt;The different colors and arrangements that fireworks make is the
result of how the bundle is arranged and the kinds of materials
that are used.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/reader-question-how-do-fireworks-work.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://science.howstuffworks.com/innovation/everyday-innovations/fireworks.htm&quot;&gt;How Fireworks Work&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;HowStuffWorks&lt;/span&gt;
for more information.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Applied Game Theory</title>
      <link href="https://metaist.com/blog/2012/05/applied-game-theory.html"/>
      <id>tag:metaist.com,2010:blog.post-2663963182c3dcf3f910d938c8a9c0220319240d</id>
      <published>Tue May 22 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 22 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/applied-game-theory.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Game_theory&quot;&gt;Game Theory&lt;/a&gt; is the study of decision making using mathematical models.
Despite it&#39;s theoretical-sounding nature, Game Theory is applicable to
many real-life decisions. One of the interesting features of Game Theory is
unexpected (for humans) results given a set of assumptions.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/S0qjK3TWZE8?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=S0qjK3TWZE8&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/applied-game-theory.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If there&#39;s a decision to be made, there&#39;s a game-theoretic model
of that decision. It&#39;s not always easy to compute, but it exists.
Things like the &lt;a href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;Prisoner&#39;s Dilemma&lt;/a&gt; are the result of
game theory analysis.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/applied-game-theory.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the video above, Ibrahim&#39;s decision about whether to choose
&amp;quot;Split&amp;quot; or &amp;quot;Steal&amp;quot; is morphed into a meta-game about whether or not
he wants to get any money at all. While I relish this approach,
it looks like it can only really be used once on this show because
future participants will have to doubt the veracity of the claim
&amp;quot;I&#39;m going to steal, so just choose split.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/applied-game-theory.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.schneier.com/blog/archives/2012/04/amazing_round_o.html&quot;&gt;Amazing Round of &amp;quot;Split or Steal&amp;quot;&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Schneier on Security&lt;/span&gt;
for a longer discussion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20120531075226/https://www.tutor2u.net/blog/index.php/economics/comments/game-show-game-theory&quot;&gt;Game show game theory&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;tutor2u&lt;/span&gt;
for a Game Theory analysis of the game.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.predictioneersgame.com/&quot;&gt;The Predictioneer&#39;s Game&lt;/a&gt;&lt;/cite&gt;
for a site that discusses how game theory can be applied
to make predictions about future political behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Focus on a Purpose to Inspire Action</title>
      <link href="https://metaist.com/blog/2012/05/inspiring-action.html"/>
      <id>tag:metaist.com,2010:blog.post-9abc051ca05ac1729b229adfb19f48bf4450c5cf</id>
      <published>Mon May 21 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon May 21 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/inspiring-action.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Simon_Sinek&quot;&gt;Simon Sinek&lt;/a&gt; argues that companies that organize
themselves around a &lt;em&gt;purpose&lt;/em&gt;—that can answer the almost
&lt;a href=&quot;http://en.wikipedia.org/wiki/Teleology&quot;&gt;teleological&lt;/a&gt; question: &amp;quot;Why do you do what you
do?&amp;quot;—are more successful at inspiring action than
those that merely focus on their &lt;a href=&quot;http://en.wikipedia.org/wiki/Value_proposition&quot;&gt;value proposition&lt;/a&gt; (what you do)
or on their process (how you do things).&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/qp0HIF3SfI4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=qp0HIF3SfI4&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/inspiring-action.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sinek describes a &lt;em&gt;Golden Circle&lt;/em&gt; in which the three
approaches (What, How, Why) map to different regions
of the brain (&lt;a href=&quot;http://en.wikipedia.org/wiki/Neocortex&quot;&gt;neocortex&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Limbic_system&quot;&gt;limbic system&lt;/a&gt;)
and affect people&#39;s perception of trust and loyalty.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;People don&#39;t buy &lt;em&gt;what&lt;/em&gt; you do, they buy &lt;em&gt;why&lt;/em&gt; you do it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I particularly enjoyed the example of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Wright_brothers&quot;&gt;Wright Brothers&lt;/a&gt;
who had neither the capital, the market conditions, nor the expertise
but who doubled down on their purpose and persevered while the best
equipped faltered.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/inspiring-action.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In case folks don&#39;t know, Metaist is driven by a desire
to make people better at achieving their goals. Making people&#39;s
experiences richer and more informed is icing on the cake.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/inspiring-action.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.startwithwhy.com/Home.aspx&quot;&gt;Start With Why&lt;/a&gt;&lt;/cite&gt;
for Simon Sinek&#39;s website for more information about his approach.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Asking the Naive Question</title>
      <link href="https://metaist.com/blog/2012/05/asking-the-naive-question.html"/>
      <id>tag:metaist.com,2010:blog.post-3e653167a234f2f259aebcd2e1ee1823e28c9953</id>
      <published>Sun May 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun May 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/asking-the-naive-question.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Paul_DePodesta&quot;&gt;Paul DePodesta&lt;/a&gt;, who is featured in the book &lt;em&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0393338398&quot;&gt;Moneyball&lt;/a&gt;&lt;/em&gt;,
explains how he started asking the Naive Question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If we weren&#39;t already doing it this way, is this the way we would start?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/spby1JQ8mok?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=spby1JQ8mok&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/asking-the-naive-question.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Probing the origin of a behavior—especially in a corporation—is
one of the keys for improvement. A similar method is &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/5_Whys&quot;&gt;5 Whys&lt;/a&gt;&amp;quot; in which
you probe for root causes (much like a child asking &amp;quot;Why?&amp;quot;).&lt;/p&gt;
&lt;p&gt;However, simply understanding the origin of an issue, or even understanding
how something &lt;em&gt;might&lt;/em&gt; be done differently is rarely sufficient. There are
often major political and social pressures against change (&lt;a href=&quot;http://en.wikipedia.org/wiki/Status_quo_bias&quot;&gt;status quo bias&lt;/a&gt;),
and sometimes the issue is that &lt;a href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;you&#39;re doing the wrong thing&lt;/a&gt; (ineffective rather than
inefficient).&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/05/asking-the-naive-question.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Eight_Disciplines_Problem_Solving&quot;&gt;Eight Disciplines Problem Solving&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for another root-cause technique.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Business_process_reengineering&quot;&gt;Business Process Reengineering&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for another technique to change business practices.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Review: Stop Stealing Dreams</title>
      <link href="https://metaist.com/blog/2012/04/review-stop-stealing-dreams.html"/>
      <id>tag:metaist.com,2010:blog.post-7ca58a9af7f5509e2963530fc673e80d0a10994a</id>
      <published>Sun Apr 01 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Apr 01 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;figure class=&quot;cover&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://metaist.com/static/archive/seths.blog/wp-content/uploads/2019/05/stop-stealing-dreams6print.pdf&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-04-02-review-stop-stealing-dreams.png&quot; alt=&quot;Stop Stealing Dreams&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;https://metaist.com/static/archive/seths.blog/wp-content/uploads/2019/05/stop-stealing-dreams6print.pdf&quot;&gt;Seth Godin&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/04/review-stop-stealing-dreams.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sethgodin.com/&quot;&gt;Seth Godin&lt;/a&gt; recently published &lt;cite&gt;&lt;a href=&quot;https://metaist.com/static/archive/seths.blog/wp-content/uploads/2019/05/stop-stealing-dreams6print.pdf&quot;&gt;Stop Stealing Dreams&lt;/a&gt;&lt;/cite&gt;
which discusses the origins of public education in the United States and how
the 100-year institution no longer serves our needs. He proposes several strategies
with which to reshape mass education.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-04-02-dream-catcher.jpg&quot; alt=&quot;Dreamcatcher&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Recommended &lt;a href=&quot;http://en.wikipedia.org/wiki/Dreamcatcher&quot;&gt;method for avoiding dream theft&lt;/a&gt;. &lt;a href=&quot;http://en.wikipedia.org/wiki/Gotta_catch_%27em_all&quot;&gt;Gotta catch &#39;em all&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;https://web.archive.org/web/20131213172514/http://www.flickr.com/photos/bruce_mcadam/2267957799/&quot;&gt;Bruce McAdam&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/04/review-stop-stealing-dreams.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Godin&#39;s thesis is that the original goals of public education have outlived their
utility (by many years) and that we ought to replace those goals and reinvent education.
Briefly, here are a few interesting points Godin makes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Public education was originally a means of preventing &lt;a href=&quot;http://en.wikipedia.org/wiki/Child_labor&quot;&gt;child labor&lt;/a&gt;.
&lt;a href=&quot;http://en.wikipedia.org/wiki/All_persons_fictitious_disclaimer&quot;&gt;Any resemblance to real education was purely coincidental&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The key goal of public education was obedience—a prerequisite for being
a good worker in an industrial setting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Rote_learning&quot;&gt;Rote memorization&lt;/a&gt; reflects an environment of information scarcity.
This is no longer the case.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the past, kids used to dream of becoming something. Now their aspirations are
so trivial—they dream of becoming assistants to someone famous.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Godin proposes a list of &lt;a href=&quot;https://web.archive.org/web/20120313234812/http://sethgodin.typepad.com/stop_stealing_dreams/2012/03/stop-stealing-dreams-the-entire-manifesto-on-the-web-cleaned-up-html-version.html#section_5&quot;&gt;new attributes that public education should foster&lt;/a&gt;
(e.g., Awareness, Caring, etc.) as well as &lt;a href=&quot;https://web.archive.org/web/20120313234812/http://sethgodin.typepad.com/stop_stealing_dreams/2012/03/stop-stealing-dreams-the-entire-manifesto-on-the-web-cleaned-up-html-version.html#section_106&quot;&gt;new topics that ought to be taught&lt;/a&gt;
(e.g., Leadership, Computer Programming, etc.).&lt;/p&gt;
&lt;p&gt;Overall, the thrust of the book resonated with me and I found it very enjoyable.
However, there are a couple of issues that create the impression that the target
audience for this book are people who already agree with its premise;
it lacks persuasive punch.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The use of anecdotal evidence makes for interesting reading, but when stronger
evidence is available, it undermines the argument (a similar criticism is often
applied to &lt;a href=&quot;http://en.wikipedia.org/wiki/Malcolm_Gladwell&quot;&gt;Malcolm Gladwell&lt;/a&gt;&#39;s writing).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The format of the book is, as Godin explains, a &lt;a href=&quot;https://web.archive.org/web/20120313234812/http://sethgodin.typepad.com/stop_stealing_dreams/2012/03/stop-stealing-dreams-the-entire-manifesto-on-the-web-cleaned-up-html-version.html#section_2&quot;&gt;compilation of blog posts&lt;/a&gt;.
While repetition is understandable, the sheer length of the text becomes a
&lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;psychological barrier&lt;/a&gt; for those who do not already have a strong desire
to read it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Format aside, I only had a few minor points of disagreement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;While we should nurture a child&#39;s dreams, we ought to provide him the means to
&lt;em&gt;execute&lt;/em&gt; on those dreams, not merely dream bigger dreams. Godin ultimately makes
this point, but because of the book&#39;s title and the recurrence of dream-related
references, it is somewhat obscured in the text.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Godin and I clearly have a strong aversion to rote memorization.
However, I believe there are still areas of knowledge (albeit few)
where having immediate access to information—as you&#39;re thinking about it—
allows you to outperform those who need to look it up. (I am told that
&lt;a href=&quot;http://en.wikipedia.org/wiki/Richard_Feynman&quot;&gt;Richard Feynman&lt;/a&gt; mastered mathematics so that he could continue to
think about and solve hard problems without resorting to mere computation.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/04/review-stop-stealing-dreams.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/static/archive/seths.blog/wp-content/uploads/2019/05/stop-stealing-dreams6print.pdf&quot;&gt;Stop Stealing Dreams&lt;/a&gt;&lt;/cite&gt;
for the book by &lt;span class=&quot;vcard org fn&quot;&gt;Seth Godin&lt;/span&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/11/khan-academy.html&quot;&gt;Khan Academy&lt;/a&gt;&lt;/cite&gt;
and &lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/11/patient-problem-solving.html&quot;&gt;Patient Problem Solving&lt;/a&gt;&lt;/cite&gt;
for our discussion of alternative methods for teaching mathematics.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Little Albert</title>
      <link href="https://metaist.com/blog/2012/03/little-albert.html"/>
      <id>tag:metaist.com,2010:blog.post-de4524426c0889fd379e55c3fb33d9f5388957d4</id>
      <published>Thu Mar 22 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Mar 22 2012 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on submission by reader
&lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/daniel-bitran/b/989/ba1&quot;&gt;Professor Daniel Bitran&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/03/little-albert.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Little_albert&quot;&gt;Little Albert&lt;/a&gt; was a child who was part of a famous 1920
&lt;a href=&quot;http://en.wikipedia.org/wiki/Classical_conditioning&quot;&gt;classical conditioning&lt;/a&gt; experiment performed by &lt;a href=&quot;http://en.wikipedia.org/wiki/John_B._Watson&quot;&gt;John Watson&lt;/a&gt;.
Recent evidence calls into question some of the premises of the now-famous experiment.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/Xt0ucxOrPQE?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=Xt0ucxOrPQE&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/03/little-albert.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The original experiment consists of presenting various &amp;quot;neutral&amp;quot; stimuli to a
child (Little Albert) which evoke no reaction from him. Then a stimulus is shown
while a loud bang is sounded, and now the same stimulus evokes a fearful reaction.
While the experiment moved &lt;a href=&quot;http://en.wikipedia.org/wiki/Behaviorism&quot;&gt;Behaviorism&lt;/a&gt; forward, it is now a discussion
point regarding ethics in scientific research.&lt;/p&gt;
&lt;p&gt;In 2009, researchers pieced together census records and Watson&#39;s
personal correspondence to determine that Little Albert was in fact Douglas Merritte
and, despite Watson&#39;s claims to the contrary, suffered from hydrocephalus from birth
(he died very young).&lt;/p&gt;
&lt;p&gt;My original reaction to this information was that perhaps this strengthens,
rather than weakens, the results of the original experiment. However, Dr. Bitran
has pointed out that the study was predicated on a normal child developing a
phobia—a study with a child who has other issues introduces
&lt;a href=&quot;http://en.wikipedia.org/wiki/Confounding&quot;&gt;confounding effects&lt;/a&gt; that are not controlled.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/03/little-albert.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20140305123401/http://www2.macleans.ca/2012/02/22/bad-behaviour/&quot;&gt;Solving the mystery of &#39;Little Albert&#39;&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Maclean&#39;s&lt;/span&gt;
for a summary of the recent findings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20150106011120/http://htpprints.yorku.ca/archive/00000198/01/BHARRIS.HTM/&quot;&gt;Whatever Happened to Little Albert?&lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;Ben Harris&lt;/span&gt; (1979) for a discussion
of the original experiment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20150212140529/http://www.integratedsociopsychology.net/little_albert.html/&quot;&gt;Key Study: Little Albert&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Integrated Sociopsychology&lt;/span&gt;
for a summary of the original experiment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Code Review: metadash</title>
      <link href="https://metaist.com/blog/2012/02/code-review-metadash.html"/>
      <id>tag:metaist.com,2010:blog.post-6901150ffc4cc2c80cfc4baa36ff51667b2babe9</id>
      <published>Sun Feb 19 2012 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun May 21 2023 16:50:29 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on code that was written over a weekend.
Code quality may vary.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/02/code-review-metadash.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;http://en.wikipedia.org/wiki/Code_review&quot;&gt;code review&lt;/a&gt; is a process for finding and fixing mistakes
in software often with peers. &lt;cite&gt;&lt;a href=&quot;http://metaist.com/dash/&quot;&gt;metadash&lt;/a&gt;&lt;/cite&gt; is a
lightweight personal dashboard that uses &lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_cookie&quot;&gt;browser cookies&lt;/a&gt;
to store the list of links.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-02-20-code-review-metadash.png&quot; alt=&quot;metadash&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;https://metaist.com/static/img/2012-02-20-code-review-metadash.png&quot;&gt;Metaist&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;code-review&quot; tabindex=&quot;-1&quot;&gt;Code Review &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/02/code-review-metadash.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Last weekend I created a simple webpage called
&lt;strong&gt;&lt;cite&gt;&lt;a href=&quot;http://metaist.com/dash/&quot;&gt;metadash&lt;/a&gt;&lt;/cite&gt;&lt;/strong&gt; that provides a list of links
that are stored in a cookie. Nothing too remarkable. But it does seem like a
good place to extract and discuss some common
&lt;a href=&quot;http://en.wikipedia.org/wiki/Programming_idiom&quot;&gt;programming idioms&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Best_practice&quot;&gt;best practices&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;html-the-skeleton&quot; tabindex=&quot;-1&quot;&gt;HTML — the skeleton &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/02/code-review-metadash.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Most of my projects start off with a bit of HTML. In general,
I &lt;a href=&quot;http://developer.yahoo.com/performance/rules.html&quot;&gt;follow the recommendation&lt;/a&gt; to put styles up top right before
&lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt; and JavaScript at the end right before &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;. This allows
the browser layout engine to start parsing the stylesheets before the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Document_Object_Model&quot;&gt;DOM elements&lt;/a&gt; to which the styles apply are loaded. Similarly,
the scripts typically operate on the DOM and wait for it to load, so they
might as well be loaded closer to the end when the DOM will be ready.&lt;/p&gt;
&lt;p&gt;So overall, the HTML looks like:&lt;/p&gt;
&lt;figure markdown=&quot;1&quot; class=&quot;code&quot;&gt;
    &lt;!DOCTYPE html&gt;
    &lt;html&gt;&lt;head&gt;
      &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
      &lt;title&gt;metadash (metaist)&lt;/title&gt;
      &lt;!-- stylesheets --&gt;
    &lt;/head&gt;&lt;body&gt;
      &lt;!-- content --&gt;
      &lt;!-- scripts --&gt;
    &lt;/body&gt;&lt;/html&gt;
&lt;figcaption&gt;
Fig 1. General HTML structure
&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Nowadays, I use an &lt;a href=&quot;http://en.wikipedia.org/wiki/HTML5&quot;&gt;HTML5&lt;/a&gt; doctype because it&#39;s good enough for
most browsers. If I really need the HTML5 elements, I&#39;ll also use
&lt;a href=&quot;https://github.com/aFarkas/html5shiv&quot;&gt;HTML5Shiv&lt;/a&gt; so that IE will behave.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&#39;s generally a good idea to declare a &lt;code&gt;charset&lt;/code&gt; for your documents.
If you don&#39;t know anything about Unicode, &lt;a href=&quot;http://www.joelonsoftware.com/articles/Unicode.html&quot;&gt;read this&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While most &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags are fine towards the bottom of the document, some
need to run right away &lt;em&gt;before&lt;/em&gt; the DOM is loaded—like Google Analytics.&lt;/p&gt;
&lt;figure markdown=&quot;1&quot; class=&quot;code&quot;&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
      var _gaq = [[&#39;_setAccount&#39;, &#39;UA-XXXXXXXX-X&#39;],[&#39;_trackPageview&#39;]];
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;https://www.google-analytics.com/ga.js&quot;&gt;&lt;/script&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Fig 2. Loading &lt;a href=&quot;http://google.com/analytics&quot;&gt;Google Analytics&lt;/a&gt;&lt;/p&gt;
&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I make two improvements over the loading code Google provides:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Setting up the &lt;code&gt;_gaq&lt;/code&gt; array directly. I do this because I know I&#39;m not
loading the same script more than once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Loading &lt;code&gt;ga.js&lt;/code&gt; using a &lt;a href=&quot;http://paulirish.com/2010/the-protocol-relative-url/&quot;&gt;protocol-relative URL&lt;/a&gt; (technically
called a &amp;quot;&lt;a href=&quot;http://tools.ietf.org/html/rfc3986#section-4.2&quot;&gt;network-path reference&lt;/a&gt;&amp;quot;) which loads using either
&lt;code&gt;HTTP&lt;/code&gt; or &lt;code&gt;HTTPS&lt;/code&gt; depending on how the page itself was loaded.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Google writes a whole bunch of javascript to accomplish both these things, but
I can only barely fathom the reasons why.&lt;/p&gt;
&lt;p&gt;Other scripts that belong in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; are ones that operate on stylesheets
like &lt;a href=&quot;http://lesscss.org/&quot;&gt;LESS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The main application HTML is in the middle of the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;figure markdown=&quot;1&quot; class=&quot;code&quot;&gt;
    &lt;ul id=&quot;urls&quot;&gt;&lt;/ul&gt;
    &lt;p id=&quot;no-results&quot;&gt;&lt;em&gt;No URLs saved.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;label for=&quot;txt-url&quot;&gt;URL:&lt;/label&gt;
&lt;input id=&quot;txt-url&quot; name=&quot;txt-url&quot; type=&quot;text&quot;&gt;
&lt;button id=&quot;btn-add&quot;&gt;Add&lt;/button&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Fig 3. Main view and controls&lt;/p&gt;
&lt;/figcaption&gt;&lt;/figure&gt;

&lt;h3 id=&quot;css-the-skin&quot; tabindex=&quot;-1&quot;&gt;CSS — the skin &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/02/code-review-metadash.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;metadash&lt;/em&gt; is not the prettiest application in the world, but I wanted to
include rearranging the list which required &lt;a href=&quot;http://jqueryui.com/&quot;&gt;jQuery UI&lt;/a&gt;—
which is most of the CSS.&lt;/p&gt;
&lt;p&gt;Instead of reproducing the entire CSS here are a few interesting snippets.&lt;/p&gt;
&lt;figure markdown=&quot;1&quot; class=&quot;code&quot;&gt;
    .btn-clear {
    	display: inline-block;
    	cursor: pointer;
    	vertical-align: middle;
    }
&lt;p vertical-align:=&quot;&quot; middle;=&quot;&quot;&gt;.url&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Fig 4. Inline-block display &amp;amp; middle vertical alignment&lt;/p&gt;
&lt;/figcaption&gt;&lt;/figure&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;display: inline-block;&lt;/code&gt; is possibly the best finds I&#39;ve had in CSS.
It allows &lt;code&gt;inline&lt;/code&gt; elements (e.g., &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) to behave like
block-level elements (e.g., &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;) so you can set their
&lt;code&gt;width&lt;/code&gt;—without creating a new line.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Until recently, I feel like vertical alignment never worked the way I
expected. (I&#39;m still annoyed that I cannot align text vertically in a
&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; without crazy incantations.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;javascript-the-muscles&quot; tabindex=&quot;-1&quot;&gt;JavaScript — the muscles &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/02/code-review-metadash.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In a &lt;a href=&quot;http://en.wikipedia.org/wiki/Model_view_controller&quot;&gt;model-view-controller&lt;/a&gt; (MVC) paradigm, the view and model
communicate via the controller. While not strictly adhering to the same
paradigm, we might say the HTML is the model/view, CSS styles the view, and
JavaScript acts like a controller. The reality is that the roles are rarely
distinct.&lt;/p&gt;
&lt;p&gt;There&#39;s isn&#39;t much to say about JavaScript, although I did want to highlight
a pattern for creating an anonymous private scope in JavaScript (which makes
due surprisingly well without many of the common object-oriented features).&lt;/p&gt;
&lt;figure markdown=&quot;1&quot; class=&quot;code&quot;&gt;
    (function($) {
      // anonymous, private scope
      var x = &quot;invisible outside of this scope&quot;;
    })(jQuery);
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Fig 5. Anonymous private scope in JavaScript&lt;/p&gt;
&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;The trick here is that the function is defined and then immediately called
without being assigned to a name (hence, anonymous). The result is that any
definitions that are exposed to the outside world are thereby invisible to
everything outside the defined scope.&lt;/p&gt;
&lt;h3 id=&quot;javascript-libraries-steroids&quot; tabindex=&quot;-1&quot;&gt;JavaScript Libraries — steroids &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/02/code-review-metadash.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I make extensive use of &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; and for this project I
made use of &lt;a href=&quot;http://jqueryui.com/&quot;&gt;jQuery UI&lt;/a&gt; to provide sorting,
&lt;a href=&quot;https://github.com/carhartl/jquery-cookie&quot;&gt;jQuery Cookie&lt;/a&gt; to store
the URLs, and &lt;a href=&quot;https://github.com/medialize/URI.js&quot;&gt;URI.js&lt;/a&gt; to normalize
the URLs before storing them.&lt;/p&gt;
&lt;p&gt;The result is a small little personal dashboard that is entirely cookie-based.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/02/code-review-metadash.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://metaist.com/dash/&quot;&gt;metadash&lt;/a&gt;&lt;/cite&gt; for the cookie-based personal dashboard;
get the &lt;a href=&quot;http://metaist.com/dash/dash.zip&quot;&gt;source code here&lt;/a&gt;
(&lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;MIT License&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://developer.yahoo.com/performance/rules.html&quot;&gt;Best Practices for Speeding Up Your Web Site&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Yahoo! Developer Network&lt;/span&gt;
for a list of performance enhancing techniques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.joelonsoftware.com/articles/Unicode.html&quot;&gt;The Absolute Minimum Every Software Developer Absolutely, Positively
Must Know About Unicode and Character Sets (No Excuses!)&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Joel on Software&lt;/span&gt; for a primer on
Unicode.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Enjoying the Process</title>
      <link href="https://metaist.com/blog/2012/01/enjoying-the-process.html"/>
      <id>tag:metaist.com,2010:blog.post-9c42a06f930962b2327ed6d8cfb3b5f6eca850f5</id>
      <published>Mon Jan 02 2012 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 02 2012 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/enjoying-the-process.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;When we invest in a &lt;em&gt;process&lt;/em&gt;, &lt;em&gt;outcomes&lt;/em&gt; become less important
and have less of an impact on our happiness.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;iframe src=&quot;http://arbejdsglaede.23video.com/v.ihtml?token=88a7d7f5e8977d0e22cddaf3f1520e60&amp;photo%5fid=549744&quot; width=&quot;470&quot; height=&quot;352&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://positivesharing.com/2010/01/srikumar-s-rao-at-our-2009-conference/&quot;&gt;The Chief Happiness Officer&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/enjoying-the-process.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the downsides to investing in outcomes is that we drive ourselves to believe
that &lt;em&gt;if&lt;/em&gt; I had X, &lt;em&gt;then&lt;/em&gt; I&#39;d be happy. This causal relationship, however, keeps
us changing the target, so we&#39;re never really satisfied.&lt;/p&gt;
&lt;p&gt;However, by focusing on the process, we accomplish two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We are actually thinking about how to move towards a goal.&lt;/li&gt;
&lt;li&gt;We remove our dependency on the outcome, and are free to actually get there.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am reminded of an interesting perspective on &lt;a href=&quot;http://blogs.hbr.org/cs/2011/10/steve_jobs_solved_the_innovato.html&quot;&gt;Steve Job&#39;s approach&lt;/a&gt; to avoiding
the &lt;a href=&quot;http://en.wikipedia.org/wiki/Disruptive_technology&quot;&gt;Innovator&#39;s Dilemma&lt;/a&gt;: by reducing the focus on profits, Apple was able
to focus on passion—which actually produced higher profits.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/enjoying-the-process.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://blogs.hbr.org/cs/2011/10/steve_jobs_solved_the_innovato.html&quot;&gt;Steve Jobs Solved the Innovator&#39;s Dilemma&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Harvard Business Review&lt;/span&gt;
for a discussion of how focusing on passion increased profits at Apple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/11/patient-problem-solving.html&quot;&gt;Patient Problem Solving&lt;/a&gt;&lt;/cite&gt;
for our discussion about focusing on the process of learning math.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Deferred Gratification</title>
      <link href="https://metaist.com/blog/2012/01/deferred-gratification.html"/>
      <id>tag:metaist.com,2010:blog.post-a587b64d02c372a57f96e33e392c3fad6f6d5549</id>
      <published>Sun Jan 01 2012 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Being able to &lt;a href=&quot;http://en.wikipedia.org/wiki/Deferred_gratification&quot;&gt;defer gratification&lt;/a&gt; means waiting to get what you want.
It is highly correlated with life-success, such as academic and professional
performance.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe src=&quot;http://www.youtube.com/embed/M0yhHKWUa0g?rel=0&quot; width=&quot;420&quot; height=&quot;315&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=M0yhHKWUa0g&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Longitudinal_study&quot;&gt;Longitudinal studies&lt;/a&gt; that have been replicated around the world do
present powerful evidence that controlling one&#39;s impulses has wonderful
benefits.&lt;/p&gt;
&lt;p&gt;However, we should also note that there are many &lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;psychological barriers&lt;/a&gt;
that need to be overcome in order to improve one&#39;s willpower. This is not a
trivial task.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20120813041347/http://duende.uoregon.edu/~hsu/blogfiles/Shoda,Mischel,&amp;amp;Peake(1990).pdf&quot;&gt;Predicting Adolescent Cognitive and Self-Regulatory Competencies
From Preschool Delay of Gratification: Identifying Diagnostic
Conditions&lt;/a&gt;&lt;/cite&gt;
for the original paper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://vimeo.com/5239013&quot;&gt;Oh, The Temptation&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Vimeo&lt;/span&gt;
for another video of kids being tempted by marshmallows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Deferred_gratification&quot;&gt;Deferred gratification&lt;/a&gt;&lt;/cite&gt;
and &lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Stanford_marshmallow_experiment&quot;&gt;Stanford marshmallow experiment&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2012-12-11&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2012-12-11T22:28:00-05:00&quot;&gt;2012-12-11&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;updated marshmallow experiment&lt;/a&gt; suggests that many of these
behaviors are due to environmental factors.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates-1&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/deferred-gratification.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Dark Side of Meta</title>
      <link href="https://metaist.com/blog/2012/01/dark-side-of-meta.html"/>
      <id>tag:metaist.com,2010:blog.post-92237c718281652aafa0275b5c27f228f7c8e995</id>
      <published>Sat Dec 31 2011 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Dec 31 2011 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/dark-side-of-meta.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Finding out that a cherished strategy has a dark side
is like meeting your &lt;a href=&quot;http://en.wikipedia.org/wiki/Doppelganger&quot;&gt;doppelgänger&lt;/a&gt;; you feel impressed
by the similarities, but the differences are terrifying.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2012-01-01-dark-side-of-meta.png&quot; alt=&quot;ALT&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Stranger depictions &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Dark_Side_of_the_Moon&quot;&gt;have been made&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;https://metaist.com/static/img/2012-01-01-dark-side-of-meta.png&quot;&gt;Metaist&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/dark-side-of-meta.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of my favorite approaches to solving a problem is to think about
the meta-problem—and how to solve that larger problem. In some
ways this is similar to &lt;a href=&quot;http://en.wikipedia.org/wiki/Root_cause_analysis&quot;&gt;root-cause analysis&lt;/a&gt;, because both
solve a class of problems larger than the immediate problem given.&lt;/p&gt;
&lt;p&gt;Recently, I discovered an abuse of the meta approach—a dark side
that prevents people from getting any work done. Instead of solving
the meta-problem, it creates meta-work. For example, let&#39;s say we believe we
need to &lt;a href=&quot;http://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality&quot;&gt;paint a bikeshed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My approach is to find out &lt;em&gt;why&lt;/em&gt; we need to paint the bikeshed because
that will drive the decision about whom we hire and what we expect for results.&lt;/p&gt;
&lt;p&gt;The dark side, however, asks us to immediately enumerate criteria for selecting
paint colors—something that expert painters know how to do. The new work
can then be argued &lt;em&gt;ad infinitum&lt;/em&gt; because we can now argue both about which
criteria have been selected, as well as how scores were chosen.&lt;/p&gt;
&lt;p&gt;There is rarely an objective mechanism for selecting among preferences
(that&#39;s what makes them preferences). The result is getting caught in a meta-loop
in which no actual work is done.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2012/01/dark-side-of-meta.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://bikeshed.com/&quot;&gt;Why Should I Care What Color the Bikeshed Is?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Bikeshed.com&lt;/span&gt; for the origin
of the term &amp;quot;bikeshedding&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality&quot;&gt;Parkinson&#39;s Law of Triviality&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Reset to a Known State</title>
      <link href="https://metaist.com/blog/2011/11/reset-to-known-state.html"/>
      <id>tag:metaist.com,2010:blog.post-37c1ec8e7af66eaa34b9d7b729341254d086fe79</id>
      <published>Sun Nov 27 2011 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 27 2011 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/reset-to-known-state.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;http://en.wikipedia.org/wiki/Automaton&quot;&gt;automation&lt;/a&gt;, engineers ensure that the system is a
well-controlled &lt;a href=&quot;http://en.wikipedia.org/wiki/State_(computer_science)&quot;&gt;state&lt;/a&gt;. When there are many variables
in play, and something goes wrong, resetting the system to a known state
is a common tactic to regain predictable behavior.&lt;/p&gt;
&lt;p&gt;It can also help you find your keys.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-11-28-reset-to-known-state.jpg&quot; alt=&quot;Reset button&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.imdb.com/title/tt0119654/quotes?qt=qt0520406&quot;&gt;Push the red button&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/maximilianbarners/5165499847/in/photostream/&quot;&gt;Max Barners&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/reset-to-known-state.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;big&gt;A place for everything, and everything in its place.&lt;/big&gt; &lt;br&gt; &amp;gt; — &lt;em&gt;Benjamin Franklin (&lt;a href=&quot;http://www.phrases.org.uk/meanings/14400.html&quot;&gt;and others&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While resetting large, somewhat unpredictable, systems to a known state is critical,
the lesson can also be applied to daily life.&lt;/p&gt;
&lt;p&gt;When I was in high school I found a small 7.5in. x 4in. wooden box. I had seen stores
sell &lt;a href=&quot;http://www.amazon.com/gp/product/B000HX8692&quot;&gt;valet trays&lt;/a&gt;,
but they looked awkward; for me, this little box was sufficient.&lt;/p&gt;
&lt;p&gt;Victorian notions of propriety aside, the major benefit of putting things away in a
predictable location is the ease with which they are found—and the corresponding
savings in time.&lt;/p&gt;
&lt;p&gt;As the number of virtual places (e.g., file systems, email) we can &amp;quot;put&amp;quot; stuff increases,
this principle becomes more and more relevant.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/reset-to-known-state.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/inbox-zero.html&quot;&gt;Inbox Zero&lt;/a&gt;&lt;/cite&gt;
for a simple technique for organizing email.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When flying, I thought the purpose of resetting the trays and seats during take
takeoff and landing were to put the system in a known state. Apparently, it&#39;s more for
&lt;a href=&quot;https://web.archive.org/web/20170216163621/https://www.faa.gov/about/initiatives/cabin_safety/regs/acob/media/acob209.pdf&quot;&gt;emergency evacuations&lt;/a&gt; and to avoid physical shock.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Anscombe&#39;s Quartet</title>
      <link href="https://metaist.com/blog/2011/11/anscombes-quartet.html"/>
      <id>tag:metaist.com,2010:blog.post-f0c6775f32d041906c03811c7520cc223987d400</id>
      <published>Sun Nov 13 2011 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Nov 13 2011 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/anscombes-quartet.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Anscombe%27s_quartet&quot;&gt;Anscombe&#39;s quartet&lt;/a&gt; was created by &lt;a href=&quot;http://en.wikipedia.org/wiki/Francis_Anscombe&quot;&gt;Francis Anscombe&lt;/a&gt;
to demonstrate the effect of &lt;a href=&quot;http://en.wikipedia.org/wiki/Outlier&quot;&gt;outliers&lt;/a&gt;. All four datasets have
the same &lt;a href=&quot;http://en.wikipedia.org/wiki/Mean&quot;&gt;average&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Variance&quot;&gt;variance&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Correlation_and_dependence&quot;&gt;correlation&lt;/a&gt;,
and &lt;a href=&quot;http://en.wikipedia.org/wiki/Linear_regression&quot;&gt;linear regression&lt;/a&gt;, but look completely different when graphed.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-11-14-anscombes-quartet.png&quot; alt=&quot;Graphs of Anscombe&#39;s quartet&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Lies,_damned_lies,_and_statistics&quot;&gt;Lies, damned lies, and statistics!&lt;/a&gt;&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Anscombe%27s_quartet_3.svg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/anscombes-quartet.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Anscombe&#39;s quartet is a neat example of how even large differences between
datasets can be hidden by outliers. There is a false sense that the sets are
comparable in some way just because they share many statistical properties.&lt;/p&gt;
&lt;p&gt;Luckily, a simple graph of the sets reveals the effect. However, graphs
can deceive in several other ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Captions&lt;/strong&gt; - A graph&#39;s caption can create an expectation that will distort
our perception of the graph (the same applies to &lt;a href=&quot;http://en.wikipedia.org/wiki/2006_Lebanon_War_photographs_controversies#Allegations_of_improper_captioning&quot;&gt;photographs&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Playing with Scales&lt;/strong&gt; - There are several ways this can be accomplished:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A compressed or expanded scale can make changes seem larger or smaller.&lt;/li&gt;
&lt;li&gt;Gaps in the scale can make it harder to make judgments of how large a value is.&lt;/li&gt;
&lt;li&gt;Different scale units or sizes can make direct comparison between two datasets
seem possible—even when it doesn&#39;t make any mathematical sense.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While I&#39;m interested in the best techniques for presenting data,
it&#39;s important to understand that there is more to the experience of reading
graphs than just presenting the information—our choice of presentation
can divert the reader away from the underlying truth about the data.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/anscombes-quartet.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Anscombe%27s_quartet&quot;&gt;Anscombe&#39;s quartet&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Misuse_of_statistics&quot;&gt;Misuse of statistics&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for some other ways that statistics can be misused.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20170829084921/http://dpcdsb-gains.wikispaces.com/file/view/Worst+Graphs+Ever.pdf&quot;&gt;Most Misleading Graphs&lt;/a&gt;&lt;/cite&gt;
for an interesting set of graphs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0393310728&quot;&gt;How to Lie with Statistics&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Amazon&lt;/span&gt;
for a humorous approach.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Patient Problem Solving</title>
      <link href="https://metaist.com/blog/2011/11/patient-problem-solving.html"/>
      <id>tag:metaist.com,2010:blog.post-49d33613ecb5cad755ad9ddf927964fd11dcf3fe</id>
      <published>Sat Nov 12 2011 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Nov 12 2011 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/patient-problem-solving.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.mrmeyer.com/&quot;&gt;Dan Meyer&lt;/a&gt; argues that current math curricula focus
too much on stepping a student through the process without
cultivating a patience for problem-solving.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/NWUFjb8w9Ps?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=NWUFjb8w9Ps&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/patient-problem-solving.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Meyer&#39;s presents a succinct overview of current math education:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Math teachers] sell a product to a market that doesn&#39;t want it, but is forced
by law to buy it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&#39;m sure many students feel that way about education in general, but somehow math
became the favorite subject to hate.&lt;/p&gt;
&lt;p&gt;Meyer separates mathematics into two large chunks: computation (number-crunching)
and math reasoning (applying mathematical concepts). The former, he argues, is easy to
forget, but also easy to re-learn—provided you have mastered the latter.
Math reasoning (related to &lt;a href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;numeracy&lt;/a&gt;) is harder to teach.&lt;/p&gt;
&lt;p&gt;Meyer&#39;s analysis is insightful; he demonstrates how we create a student culture that
expects problems to be simple and well-defined. Textbook examples appear to be completely
disconnected from the real world. His advice points us towards creating problems that are
more realistic and in whose outcomes the students are personally invested. The examples he
brings are wonderful, and could provide the missing component to tools like
&lt;a href=&quot;https://metaist.com/blog/2011/11/khan-academy.html&quot;&gt;Khan Academy&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/patient-problem-solving.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/11/khan-academy.html&quot;&gt;Khan Academy&lt;/a&gt;&lt;/cite&gt; for our discussion
of the popular online self-paced education site.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://blog.mrmeyer.com/&quot;&gt;dy/dan&lt;/a&gt;&lt;/cite&gt;
for &lt;span class=&quot;vcard org fn&quot;&gt;Dan Meyer&lt;/span&gt;&#39;s blog.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Khan Academy</title>
      <link href="https://metaist.com/blog/2011/11/khan-academy.html"/>
      <id>tag:metaist.com,2010:blog.post-29d480904739a763d1df7163e72c57f9f2329701</id>
      <published>Thu Nov 10 2011 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Nov 10 2011 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/khan-academy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.khanacademy.org/&quot;&gt;Khan Academy&lt;/a&gt; is a free online collection of videos and automated exercises
that begins to explore how the use of technology can reshape education.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/gM95HHI4gLk?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=gM95HHI4gLk&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/khan-academy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the brilliant things about Khan Academy is that it allows teachers to
&amp;quot;flip the classroom&amp;quot;—what used to be lecture is now watched at home at
one&#39;s own pace (with freedom to rewind), and former &amp;quot;homework&amp;quot; is now done
in class with the teacher providing assistance.&lt;/p&gt;
&lt;p&gt;In addition to videos covering math (basic addition through pre-calculus),
there are other videos on history, finance, art, and more. Moreover, many of the
math videos are connected to auto-generated problems sets which make it easy to
practice the concepts. For teachers (Khan calls them Coaches), there is detailed
information about students&#39; progress.&lt;/p&gt;
&lt;p&gt;As expected, there are detractors who fear a loss of jobs and who argue about
whether or not drills are the most effective learning tool. My take:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;An inability to cope with change makes for poor teachers. Teachers are students
for life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I tend to advocate a learn-by-doing approach for many subjects. Admittedly
this is difficult in the humanities and arts, but I find that it is a lack
of creativity rather than an inherent obstacle. For math, this involves &lt;em&gt;doing&lt;/em&gt;
a lot of math problems. The more instantaneous the feedback the better because
waiting a week to see if your understanding was correct is absurd.&lt;/p&gt;
&lt;p&gt;I do see merit in expanding &lt;a href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;numeracy education&lt;/a&gt;. However, Khan does
take the time to explain what he is doing and the fact that kids (and adults
who are using Khan as a review tool) are excited about learning (math!) while
demonstrating improvement suggests this approach is working.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/11/khan-academy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.khanacademy.org/&quot;&gt;Khan Academy&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20111111232316/http://www.wired.com/magazine/2011/07/ff_khan/all/1&quot;&gt;How Khan Academy Is Changing the Rules of Education&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wired&lt;/span&gt;
for a length article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;The Importance of Numeracy&lt;/a&gt;&lt;/cite&gt; for our discussion
on numeracy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Quality v. Quantity</title>
      <link href="https://metaist.com/blog/2011/09/quality-quantity.html"/>
      <id>tag:metaist.com,2010:blog.post-b887ca134630ca12b1d0422bfe41fe64c72b21c7</id>
      <published>Tue Sep 27 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Sep 27 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/quality-quantity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Quality_(business)&quot;&gt;Quality&lt;/a&gt; refers to the superiority
of an item over another. &lt;a href=&quot;http://en.wikipedia.org/wiki/Quantity&quot;&gt;Quantity&lt;/a&gt; refers to the
number of items.&lt;/p&gt;
&lt;p&gt;There is a long-standing debate about whether students should focus on quality or
quantity in order to improve their performance.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-09-28-quality-quantity.jpg&quot; alt=&quot;Old pottery&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Quality doesn&#39;t matter if it&#39;s really old.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Pottery.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/quality-quantity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I once heard an interesting anecdote that I later saw repeated by &lt;a href=&quot;https://web.archive.org/web/20110921061803/www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html&quot;&gt;Jeff Atwood&lt;/a&gt;
and attributed to the book &lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0961454733&quot;&gt;Art &amp;amp; Fear&lt;/a&gt;&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Here&#39;s the version I heard (it differs only slightly from the printed version):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On the first day of class, a pottery professor divides his class in two:
The first group will be graded on &lt;strong&gt;quality&lt;/strong&gt;—by the end of the semester,
each person must produce one item which will be judged based on its quality.
The other group will be graded purely on &lt;strong&gt;quantity&lt;/strong&gt;—the total weight
of all the items produced will be weighed with higher numbers given higher grades.&lt;/p&gt;
&lt;p&gt;By the end of the semester, each person in the &lt;strong&gt;quantity&lt;/strong&gt; group had produced
works of higher quality than any of those produced in the &lt;strong&gt;quality&lt;/strong&gt; group.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The second group had the opportunity to experiment and learn while the first
was focused on refining an initial conception. The result seems less surprising
when you think about it that way.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/quality-quantity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0961454733&quot;&gt;Art &amp;amp; Fear&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Amazon&lt;/span&gt;
for a book that contains the anecdote.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20110921061803/www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html&quot;&gt;Quantity Always Trumps Quality&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Coding Horror&lt;/span&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;Jeff Atwood&lt;/span&gt;
for a discussion of how this principle applies to software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;Pretotyping&lt;/a&gt;&lt;/cite&gt;
for our discussion of the broader trend of testing assumptions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Classical Music as a Punishment</title>
      <link href="https://metaist.com/blog/2011/09/classical-music-punishment.html"/>
      <id>tag:metaist.com,2010:blog.post-651edb8d317a30ceba4397492b047b7effc8cd0f</id>
      <published>Mon Sep 26 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Sep 26 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/classical-music-punishment.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;In early 2010, a school in England started a program
to replace 30-minute detentions with a more classical approach.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-09-27-classical-music-punishment.jpg&quot; alt=&quot;Mozart family&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Behave, or you&#39;ll have to listen to me play this classical music!
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Mozart_family_crop.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/classical-music-punishment.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The UK has a long history of trying to curb
&lt;a href=&quot;http://en.wikipedia.org/wiki/Anti-social_behaviour&quot;&gt;anti-social behavior&lt;/a&gt;,
especially among teens. Recent failed attempts include the
oh-so-popular &lt;a href=&quot;http://news.bbc.co.uk/2/hi/7240180.stm&quot;&gt;Mosquito&lt;/a&gt; device aimed at annoying teens with noises
in ranges adults do not hear. Of course, students turned the noise into
a &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Mosquito#Teen_Buzz_ringtone&quot;&gt;ringtone&lt;/a&gt;
to avoid detection of cell phone activity while among adults.&lt;/p&gt;
&lt;p&gt;This more recent attempt claims high success (50% reduction) in
deterring student misbehavior and consists of and hour of listening to
&lt;a href=&quot;http://en.wikipedia.org/wiki/Wolfgang_Amadeus_Mozart&quot;&gt;Mozart&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Giuseppe_Verdi&quot;&gt;Verdi&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/Johann_Sebastian_Bach&quot;&gt;Bach&lt;/a&gt;
in addition to &lt;a href=&quot;http://en.wikipedia.org/wiki/Shame#Shame_campaign&quot;&gt;public shaming&lt;/a&gt;.
Additionally, students have to watch a DVD on mathematics and spend
half and hour writing about what they have learned.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/classical-music-punishment.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This seems like it will have negative consequences for the Arts in the future.
It&#39;s hard enough to &lt;a href=&quot;https://metaist.com/blog/2010/12/dr-tae-on-teaching-and-learning.html&quot;&gt;get people to appreciate classical music&lt;/a&gt;;
this policy just reinforces the notion that classical music is boring or torturous.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/classical-music-punishment.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://reason.com/archives/2010/02/24/weoponizing-mozart/singlepage&quot;&gt;Weaponizing Mozart&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Reason Magazine&lt;/span&gt;
for a longer discussion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20160329011947/http://www.classissima.com/en/news/113683-Bach-to-basics-regime-deters-school-troublemakers/&quot;&gt;Bach to basics regime deters school troublemakers&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Classissima&lt;/span&gt;
for information about the school&#39;s efforts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://news.bbc.co.uk/2/hi/7240180.stm&quot;&gt;Calls to ban &#39;anti-teen&#39; device&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;BBC News&lt;/span&gt;
for a discussion of The Mosquito.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Boredom &amp; Distraction</title>
      <link href="https://metaist.com/blog/2011/09/boredom-distraction.html"/>
      <id>tag:metaist.com,2010:blog.post-ec20a824831e266904f9c2bb2c3b1eed82923761</id>
      <published>Sun Sep 25 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Sep 25 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on submission by &lt;strong&gt;&lt;a href=&quot;https://web.archive.org/web/20110208120916/http://www.jenrohr.com/&quot;&gt;Jennifer Rohr&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/boredom-distraction.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Boredom&quot;&gt;Boredom&lt;/a&gt; is the feeling that
you can&#39;t possibly pay attention to what is going on.&lt;/p&gt;
&lt;p&gt;People who are bored often seek distractions to keep
them occupied, which may lead to fewer opportunities
to integrate your thoughts.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-09-26-boredom-distraction.jpg&quot; alt=&quot;Bored child&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/markolino/5386795444/&quot;&gt;Campanero Rumbero&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/boredom-distraction.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scott Adams (of &lt;a href=&quot;http://en.wikipedia.org/wiki/Dilbert&quot;&gt;Dilbert&lt;/a&gt; fame)
wrote an article in the Wall Street Journal suggesting that
the current trend towards distraction is leading to a
&lt;a href=&quot;http://online.wsj.com/article/SB10001424053111903454504576486412642177904.html&quot;&gt;lack of boredom&lt;/a&gt; and, consequently, to a lack of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Creativity&quot;&gt;creativity&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, proneness to boredom has been
&lt;a href=&quot;http://arts.uwaterloo.ca/~oops/publish/yccog-06-149.pdf&quot;&gt;linked to depression&lt;/a&gt; and other psychological issues, so it
is probably not the fount of creativity. However, opportunities
for introspection and reflection—like those
found during &lt;a href=&quot;http://en.wikipedia.org/wiki/Meditation&quot;&gt;meditation&lt;/a&gt;
or &lt;a href=&quot;http://en.wikipedia.org/wiki/Daydream&quot;&gt;daydreaming&lt;/a&gt; might be
better explanations for creativity in low-stimulation environments.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/boredom-distraction.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://online.wsj.com/article/SB10001424053111903454504576486412642177904.html&quot;&gt;The Heady Thrill of Having Nothing to Do&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The Wall Street Journal&lt;/span&gt;
for the full article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://arts.uwaterloo.ca/~oops/publish/yccog-06-149.pdf&quot;&gt;Everyday attention lapses and memory failures&lt;/a&gt;&lt;/cite&gt;
at the &lt;span class=&quot;vcard org fn&quot;&gt;University of Waterloo&lt;/span&gt;
for research into the link between proneness to boredom and depression.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20110604233314/http://sparkaction.org/content/benefits-boredom&quot;&gt;The Benefits of Boredom&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;SparkAction&lt;/span&gt;
for a discussion about how structured activities for children
can supplant their annual summer boredom.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0300141106&quot;&gt;Boredom - A lively history&lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;Peter Toohey&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Daydream&quot;&gt;Daydream&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Get Paying Customers First</title>
      <link href="https://metaist.com/blog/2011/09/paying-customers-first.html"/>
      <id>tag:metaist.com,2010:blog.post-665ba8c19ddcfc29c42c60726fe46bfdd9d9acca</id>
      <published>Sat Sep 24 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Sep 24 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/paying-customers-first.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.asmartbear.com/&quot;&gt;Jason Cohen&lt;/a&gt; discusses the
importance of having paying customers &lt;em&gt;before&lt;/em&gt; you create
a product or business.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-09-25-paying-customers-first.jpg&quot; alt=&quot;Empty store&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/11375837@N05/2207797099/&quot;&gt;whoohoo120&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/paying-customers-first.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A benefit of &lt;a href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;pretotyping&lt;/a&gt;
is that you start to explore who your potential customers are before
you invest heavily in creating a product.&lt;/p&gt;
&lt;p&gt;Jason Cohen, founder of &lt;a href=&quot;http://smartbear.com/&quot;&gt;Smart Bear Software&lt;/a&gt;,
had the opportunity to listen to hundreds of starts make their pitch
to get &lt;a href=&quot;http://en.wikipedia.org/wiki/Venture_capital&quot;&gt;venture capital&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;He sums up his position with harsh, utterly pragmatic advice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;big&gt;If you can&#39;t find ten people who say they&#39;ll buy it, your company
is bullshit.&lt;/big&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a &lt;a href=&quot;http://blog.asmartbear.com/sb-live-2.html&quot;&gt;later podcast&lt;/a&gt;,
Jason clarified that he&#39;s not talking about a lot of money: $10-$50
to demonstrate their commitment. The important point is that you&#39;re building
something that actually fulfills a need; one for which people are willing
to pay.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/paying-customers-first.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://blog.asmartbear.com/customer-validation.html&quot;&gt;Yes, but who said they&#39;d actually BUY the damn thing?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;A Smart Bear&lt;/span&gt;
for the full brunt of Jason&#39;s wrath.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://blog.asmartbear.com/startup-lesson.html&quot;&gt;5 Lessons from 150 startup pitches&lt;/a&gt;&lt;/cite&gt;
also at &lt;span class=&quot;vcard org fn&quot;&gt;A Smart Bear&lt;/span&gt;
for the most common issues with startup pitches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;Pretotyping&lt;/a&gt;&lt;/cite&gt;
for our discussion on rapidly testing out ideas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Briefcase Technique</title>
      <link href="https://metaist.com/blog/2011/09/briefcase-technique.html"/>
      <id>tag:metaist.com,2010:blog.post-cdb190d3509111cdd3e24917c1b9718ddc7a3992</id>
      <published>Thu Sep 22 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Sep 22 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/briefcase-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Ramit Sethi describes an interesting way to get the
attention of prospective clients or employers.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/68dqa_IPqK8?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=68dqa_IPqK8&quot;&gt;YouTube&lt;/a&gt;
via &lt;a href=&quot;http://www.iwillteachyoutoberich.com/the-briefcase-technique/&quot;&gt;IWillTeachYouToBeRich&lt;/a&gt;)&lt;/p&gt;
  &lt;/address&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/briefcase-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Clearly, the force of this method depends on how well you do your research.
However, it is noteworthy that by overcoming your own
&lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;psychological barriers&lt;/a&gt;,
and doing all the prep work &lt;em&gt;before&lt;/em&gt; you meet the client, you make it
easier for client to overcome their psychological barriers to hiring you.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/briefcase-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.iwillteachyoutoberich.com/the-briefcase-technique/&quot;&gt;The Briefcase Technique – a 2-minute video to help you earn thousands&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;IWillTeachYouToBeRich&lt;/span&gt;
for a list of related case studies.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Pretotyping</title>
      <link href="https://metaist.com/blog/2011/09/pretotyping.html"/>
      <id>tag:metaist.com,2010:blog.post-27f67c801f6c054cebb0a788daaf56e62e918784</id>
      <published>Wed Sep 21 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Sep 21 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.pretotyping.org/&quot;&gt;Pretotyping&lt;/a&gt; is a technique for using the minimum amount of resources to
&lt;a href=&quot;http://en.wikipedia.org/wiki/Vetting&quot;&gt;vet&lt;/a&gt; an idea.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-09-22-pretotyping.jpg&quot; alt=&quot;Heater block prototype&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/hoeken/3301411563/&quot;&gt;Zach Hoeken&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The difference between a pretotype and a &lt;a href=&quot;http://en.wikipedia.org/wiki/Prototype&quot;&gt;prototype&lt;/a&gt;
is that the latter answers the question &amp;quot;&lt;strong&gt;Can&lt;/strong&gt; we build it?&amp;quot; while the former
answers &amp;quot;&lt;strong&gt;Should&lt;/strong&gt; we build it?&amp;quot; Moreover, pretotyping focuses on using the
minimum of resources (time, materials, effort).&lt;/p&gt;
&lt;p&gt;Alberto Savoia has written a little booklet about pretotyping which is,
itself, a pretotype. People told him he should write a book about pretotyping,
so he wrote a booklet (in days, not months) to test out whether there is
sufficient interest in the topic before he spends more time writing about it.&lt;/p&gt;
&lt;p&gt;The booklet covers several different pretotyping techniques such as
&lt;em&gt;The Pinocchio&lt;/em&gt;, &lt;em&gt;The Mechanical Turk&lt;/em&gt;, and the &lt;em&gt;The False Door&lt;/em&gt;.
Some of the others were interesting, but I did not find them nearly
as actionable as these.&lt;/p&gt;
&lt;p&gt;There&#39;s also a rich discussion about how most ideas fail and how to avoid
falling into &lt;em&gt;Thoughtland&lt;/em&gt;—a world in which all ideas are great and where
there&#39;s no evidence to back up any claims.&lt;/p&gt;
&lt;h3 id=&quot;the-pinocchio&quot; tabindex=&quot;-1&quot;&gt;The Pinocchio &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;from a block to a real product&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This technique is best for physical devices and is similar to
&lt;a href=&quot;http://en.wikipedia.org/wiki/Eating_your_own_dog_food&quot;&gt;dogfooding&lt;/a&gt;. It is named
after the &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Adventures_of_Pinocchio&quot;&gt;fairy tale character&lt;/a&gt;
and is based on the story of how the &lt;a href=&quot;http://en.wikipedia.org/wiki/Palm_(PDA)#Initial_development&quot;&gt;Palm Pilot&lt;/a&gt;
was created. One of the inventors &lt;a href=&quot;http://en.wikipedia.org/wiki/Jeff_Hawkins&quot;&gt;Jeff Hawkins&lt;/a&gt;
carried a wooden block and stylus in his shirt pocket and pretended to use it
throughout the day. After some time, he realized that he would use this product,
if it were actually built.&lt;/p&gt;
&lt;h3 id=&quot;the-mechanical-turk&quot; tabindex=&quot;-1&quot;&gt;The Mechanical Turk &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;replacing complex machinery with humans&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The name of this method comes from an &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Turk&quot;&gt;elaborate 1770 hoax&lt;/a&gt;
about a chess-playing machine that was later revealed to be box with a human player concealed
inside. &lt;a href=&quot;http://www.mturk.com/&quot;&gt;Amazon Mechanical Turk&lt;/a&gt; service which facilitates
&lt;a href=&quot;https://metaist.com/blog/2009/12/crowdsourcing-crowd-wisdom.html&quot;&gt;crowdsourcing&lt;/a&gt; is named after this
same device.&lt;/p&gt;
&lt;p&gt;Savoia illustrates this technique with a story from IBM which was considering entering
the voice-to-text market. Since building a working prototype would have been prohibitively
expensive, IBM presented the &lt;em&gt;appearance&lt;/em&gt; of a prototype to prospective customers
(a computer monitor and microphone were on display, but the microphone led to an adjacent
room where a typist converted the voice to text). The initial enthusiasm—on
which IBM considered betting the company—dwindled as people realized the
limitations of such a system (sore throat, lack of confidentiality, etc.)&lt;/p&gt;
&lt;h3 id=&quot;the-false-door&quot; tabindex=&quot;-1&quot;&gt;The False Door &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;measure the frequency of use of an unimplemented feature&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This technique requires a certain amount of care. It is best illustrated in an online
context: create an advertisement for your prospective product which leads people to
a landing page explaining that the product is not finished, but here&#39;s what the price
will be when it is released. Oh, and here&#39;s a place you can sign up to get a discount
when it comes out.&lt;/p&gt;
&lt;p&gt;Now you are equipped with three numbers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how many people saw your ad (impressions)&lt;/li&gt;
&lt;li&gt;how many people clicked on your ad (clicks)&lt;/li&gt;
&lt;li&gt;how many people signed up for your list (sign ups)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the latter numbers are low, there&#39;s little chance your product, as stated
will succeed. Fail fast and try again.&lt;/p&gt;
&lt;p&gt;In some ways, this is similar to Eric Ries&#39;
&lt;a href=&quot;https://venturehacks.com/minimum-viable-product&quot;&gt;Minimum Viable Product&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My favorite part of &lt;cite&gt;&lt;a href=&quot;https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0B0QztbuDlKs_NzBjYWNiOGQtNmQyNi00OWE2LWI2YzktN2Y3YTEzM2VjYTNj&amp;amp;hl=en_US&amp;amp;pli=1&quot;&gt;Pretotype It&lt;/a&gt;&lt;/cite&gt; is the fact that
it is, itself, a pretotype.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0B0QztbuDlKs_NzBjYWNiOGQtNmQyNi00OWE2LWI2YzktN2Y3YTEzM2VjYTNj&amp;amp;hl=en_US&amp;amp;pli=1&quot;&gt;Pretotype It&lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;&lt;a href=&quot;http://pretotyping.blogspot.com/&quot;&gt;Alberto Savoia&lt;/a&gt;&lt;/span&gt;
for the booklet that is itself a pretotype.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.infoq.com/presentations/QCon-Keynote-Innovation-at-Google&quot;&gt;Innovation at Google&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;InfoQ&lt;/span&gt;
for a presentation about pretotyping.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20110430052925/https://www.pretotyping.org/the-pretotyping-manifesto-1&quot;&gt;The Pretotyping Manifesto&lt;/a&gt;&lt;/cite&gt;
for a list of principles modeled after the
&lt;cite&gt;&lt;a href=&quot;http://agilemanifesto.org/&quot;&gt;Agile Manifesto&lt;/a&gt;&lt;/cite&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20110903181319/http://www.iwillteachyoutoberich.com/blog/wednesday-workout-testing-your-assumptions/&quot;&gt;Wednesday Workout: Testing your assumptions&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;IWillTeachYouToBeRich&lt;/span&gt;
where &lt;span class=&quot;vcard fn&quot;&gt;Ramit Sethi&lt;/span&gt; talks about the importance
of actually testing your assumptions which is similar to pretotyping.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2012-02-17&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2012-02-17T13:56:00-05:00&quot;&gt;2012-02-17&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/pretotyping.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Watch &lt;a href=&quot;http://www.youtube.com/watch?v=t4AqxNekecY&quot;&gt;Alberto Savoia speak at Stanford&lt;/a&gt;
about how pretotyping can be used to vet business models.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Metaist, Now with More Metaist</title>
      <link href="https://metaist.com/blog/2011/09/metaist-now-with-more-metaist.html"/>
      <id>tag:metaist.com,2010:blog.post-4b7736f7f7965ec398756571472f7ad918e9941e</id>
      <published>Mon Sep 19 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Sep 19 2011 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/metaist-now-with-more-metaist.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;This blog has a new home at &lt;a href=&quot;https://metaist.com/blog&quot;&gt;metaist.com&lt;/a&gt;. Some things are the same,
but there are few changes you might want to know about.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2011-09-20-metaist-now-with-more-metaist.png&quot; alt=&quot;Screenshot of new metaist archives&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Remember when I used to write stuff?
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;https://metaist.com/static/img/2011-09-20-metaist-now-with-more-metaist.png&quot;&gt;Metaist&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;changes&quot; tabindex=&quot;-1&quot;&gt;Changes &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/metaist-now-with-more-metaist.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Layout&lt;/strong&gt; - The new layout if fluid (images resize if you resize the
browser) and focuses more on content and typography. I was strongly
influenced by Dmitry Fadeyev&#39;s post
&lt;cite&gt;&lt;a href=&quot;http://www.usabilitypost.com/2011/04/15/whats-left/&quot;&gt;What&#39;s Left?&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thumbnails&lt;/strong&gt; - If you click on a &lt;a href=&quot;https://metaist.com/blog/tag&quot;&gt;tag&lt;/a&gt; or an
&lt;a href=&quot;https://metaist.com/blog/archive&quot;&gt;archive&lt;/a&gt; you&#39;ll see thumbnails of the posts which
should make it easier to find things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comments&lt;/strong&gt; - For now, if you want to comment on something,
&lt;a href=&quot;mailto:metaist@metaist.com&quot;&gt;email me&lt;/a&gt;. The existing comments feature was
nice, but most useful content was submitted via email. I was also influenced
by Ted Dziuba&#39;s
&lt;cite&gt;&lt;a href=&quot;http://web.archive.org/web/20120509135926/http://teddziuba.com/2010/04/blog-upgrade.html&quot;&gt;Blog Upgrade&lt;/a&gt;&lt;/cite&gt;
and his irreverent style.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posts&lt;/strong&gt; - A few posts (e.g., &amp;quot;Feedback Friday&amp;quot; posts) were deleted after
moving over because they don&#39;t align with the new direction of Metaist (see
below). Everything else should be pretty much where you expect it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&#39;t intend to remove the old site anytime soon, so it will still be out
there (although I may redirect people here after a while).&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/metaist-now-with-more-metaist.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So why change now?&lt;/p&gt;
&lt;p&gt;Originally, I hadn&#39;t intended to move the blog at all. The purpose of
metaist.com was to host my portfolio of projects—which is still the case.
However, as I was involved in that process, I realized that I could also manage
my blog from the same place, so I decided to write a blogging platform to do
just that.&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/metaist-now-with-more-metaist.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2013-03-07&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-07T17:12:00-05:00&quot;&gt;2013-03-07&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2011/09/metaist-now-with-more-metaist.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added archive link to &lt;a href=&quot;http://web.archive.org/web/20120509135926/http://teddziuba.com/2010/04/blog-upgrade.html&quot;&gt;Ted Dziuba&#39;s discussion about an upgrade&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Dr. Tae on Teaching and Learning</title>
      <link href="https://metaist.com/blog/2010/12/dr-tae-on-teaching-and-learning.html"/>
      <id>tag:metaist.com,2010:blog.post-6b2c1f207760b6e33fe214021b46be52ff735d9a</id>
      <published>Thu Dec 02 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Dec 02 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/dr-tae-on-teaching-and-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://drtae.org/&quot;&gt;Dr. Tae&lt;/a&gt; is a physicist who advocates for cultural changes to the way that schools
operate to make them useful for learning.&lt;/p&gt;
&lt;/div&gt;
&lt;figure class=&quot;video&quot; markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;340&quot; src=&quot;http://player.vimeo.com/video/5513063&quot; allowFullScreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://vimeo.com/5513063&quot;&gt;Vimeo&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/dr-tae-on-teaching-and-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I found myself vigorously agreeing with Dr. Tae&#39;s presentation. I was particularly surprised
by the &lt;a href=&quot;http://www.canada.com/saskatoonstarphoenix/news/story.html?id=6db2474d-8557-48bb-b4df-1fb3eb472da8&quot;&gt;comment by Lawrence Krauss&lt;/a&gt; (emphasis added):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;According to a presentation Krauss delivered to the Canadian Association of
Physicists&#39; Congress Tuesday, &lt;strong&gt;90 per cent&lt;/strong&gt; of U.S. middle school science teachers
have no post-secondary education in science themselves.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of course, a lack of &lt;em&gt;qualifications&lt;/em&gt; is irrelevant when all you need are &lt;em&gt;certifications&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The humanities are &lt;a href=&quot;https://web.archive.org/web/20101203003148/http://genomebiology.com:80/2010/11/10/138&quot;&gt;sidelined as well&lt;/a&gt; (via &lt;strong&gt;Robert&lt;/strong&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I know one of your arguments is that not every place should try to do everything.
Let other institutions have great programs in classics or theater arts, you say;
we will focus on preparing students for jobs in the real world. Well, I hope I&#39;ve
just shown you that the real world is pretty fickle about what it wants. The best way
for people to be prepared for the inevitable shock of change is to be as broadly educated
as possible, because today&#39;s backwater is often tomorrow&#39;s hot field.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the course of my discussions, some people have raised the following objections to
Dr. Tae&#39;s approach. Here are some of the more common reactions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;How did Dr. Tae grade the students from his &amp;quot;workshop&amp;quot; class?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don&#39;t know, but I can ask him.&lt;/p&gt;
&lt;p&gt;I should point out that his experiment was geared at demonstrating a new model of
education—one in which grades are not emphasized because competence and mastery
are the goals. Nonetheless, the question is valid, because we do not have many
institutions that support his proposed model of education (although compare his model to the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Yeshiva&quot;&gt;Yeshiva system&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Isn&#39;t Dr. Tae&#39;s model of education very expensive?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Perhaps the &amp;quot;workshop&amp;quot; aspect, but definitely not the &amp;quot;distributed teaching&amp;quot; aspect.
The latter might reduce the former if &amp;quot;real&amp;quot; teaching and learning were sufficiently commonplace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Don&#39;t some subjects have to be taught in a lecture format?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m not sure why this would be the case. People learn an amazing variety of information and
skills &amp;quot;outside&amp;quot; of the classroom. I say &amp;quot;outside&amp;quot; to highlight the artificial nature of the
boundary of where teaching / learning occurs.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/dr-tae-on-teaching-and-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;m going to contact Dr. Tae in the next few days, so feel free to post questions for him in the
comments below (deadline: Friday, 2010-12-10). I&#39;ll write a separate post if Dr. Tae responds.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/dr-tae-on-teaching-and-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=WObFAvOw830&quot;&gt;Lawrence Krauss Discussion with Richard Dawkins&lt;/a&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for the complete discussion quoted in Dr. Tae&#39;s presentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20101203003148/http://genomebiology.com:80/2010/11/10/138&quot;&gt;A Faustian Bargain&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;GenomeBiology&lt;/span&gt;
for the full text of the open letter to the President of SUNY Albany.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a class=&quot;icon pdf&quot; href=&quot;https://web.archive.org/web/20160203225107/http://www.yctorah.org/component/option,com_docman/task,doc_view/gid,360/&quot;&gt;An
Integrated Vision of Jewish Education&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Yeshivat Chovevei Torah&lt;/span&gt;
for a Talmudic story that exemplifies a teaching and learning culture (in the utmost).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Pi v. Tau</title>
      <link href="https://metaist.com/blog/2010/12/pi-v-tau.html"/>
      <id>tag:metaist.com,2010:blog.post-cf0e6938bcb4e3224db88d73b39b36704289a710</id>
      <published>Wed Dec 01 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 01 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/pi-v-tau.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Archimedes_constant&quot;&gt;Pi&lt;/a&gt; is considered one of the most important mathematical constants.
However, there is a growing movement that suggests that a different constant
may be easier to use and easier to teach.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-12-02-pi-v-tau.jpg&quot; alt=&quot;Circle&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;We&#39;ve already computed &lt;a href=&quot;http://www.numberworld.org/misc_runs/pi-10t/details.html&quot;&gt;trillions of digits of pi&lt;/a&gt;.
Don&#39;t make me restart.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/csb13/2707466298/&quot;&gt;Chris Blakeley&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/pi-v-tau.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The value of &lt;em&gt;pi&lt;/em&gt; is a constant that relates the circumference of a circle
(length around the circle) to its diameter (length through the center).
In 2000, Bob Palais wrote a short article called
&lt;a href=&quot;http://www.math.utah.edu/~palais/pi.pdf&quot;&gt;Pi is Wrong!&lt;/a&gt; where he outlined arguments for a different &lt;em&gt;circle constant&lt;/em&gt;:
one that relates the circumference to the &lt;em&gt;radius&lt;/em&gt; (length from the center to
any point on the circle). In June 2010, Michael Hartl published Palais&#39; arguments
as &lt;a href=&quot;http://tauday.com/&quot;&gt;&lt;em&gt;The Tau Manifesto&lt;/em&gt;&lt;/a&gt; where he suggested that the new circle constant
be represented by the &lt;a href=&quot;http://en.wikipedia.org/wiki/Tau&quot;&gt;Greek letter tau&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The main arguments are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;While &lt;em&gt;pi&lt;/em&gt; appears in many equations, it most frequently appears as
2&lt;em&gt;pi&lt;/em&gt;. All instances of 2&lt;em&gt;pi&lt;/em&gt; can be replaced by &lt;em&gt;tau&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Measuring angles in &lt;a href=&quot;http://en.wikipedia.org/wiki/Radian&quot;&gt;radians&lt;/a&gt; is much more straightforward
because there are &lt;em&gt;tau&lt;/em&gt; radians in a circle (rather than 2&lt;em&gt;pi&lt;/em&gt; radians).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The relationship between the &lt;a href=&quot;http://en.wikipedia.org/wiki/Trigonometric_functions&quot;&gt;trigonometric functions&lt;/a&gt;
and the unit circle is easier to grasp.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Euler&#39;s_identity&quot;&gt;Euler&#39;s identity&lt;/a&gt; ends up sounding even more powerful:
e&lt;sup&gt;&lt;em&gt;it&lt;/em&gt;&lt;/sup&gt; = 1 (Read as: &lt;em&gt;A rotation by one turn in the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Complex_plane&quot;&gt;complex plane&lt;/a&gt; is 1.&lt;/em&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The area of a circle is in quadratic form similar to many other physical
phenomena where two values are proportional to each other.
&lt;a href=&quot;http://tauday.com/#sec:quadratic_forms&quot;&gt;Examples&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Falling in a uniform gravitational field (velocity is proportional to time)&lt;/li&gt;
&lt;li&gt;Potential energy in a linear spring (force is proportional to distance)&lt;/li&gt;
&lt;li&gt;Energy of motion (force is proportional to acceleration)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So now we can add: Area of a circle (area is proportional to radius).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The arguments are persuasive and merit thought, especially for the pedagogical
benefits &lt;em&gt;tau&lt;/em&gt; provides. I suspect it will be some time before anyone adopts this
constant as a matter of course, but I have no problem writing &amp;quot;&lt;em&gt;tau&lt;/em&gt; = 2&lt;em&gt;pi&lt;/em&gt;&amp;quot;
and moving on from there.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/pi-v-tau.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.math.utah.edu/~palais/pi.pdf&quot;&gt;Pi is Wrong!&lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;Bob Palais&lt;/span&gt;
for the original paper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://tauday.com/&quot;&gt;The Tau Manifesto&lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;Michael Hartl&lt;/span&gt;
for why &lt;em&gt;tau&lt;/em&gt; ought to be the new circle constant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Turn_(geometry)&quot;&gt;Turn&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for a historical discussion of using a turn as a unit of rotation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/pi-v-tau.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2013-03-07&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-07T20:07:00-05:00&quot;&gt;2013-03-07&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/12/pi-v-tau.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated link to trillions of digits of pi.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Reader Question: How do geological layers work?</title>
      <link href="https://metaist.com/blog/2010/10/reader-question-how-do-geological.html"/>
      <id>tag:metaist.com,2010:blog.post-1d4e53f1fb2b44cdd40a68f8ea7389bcfe18a7e6</id>
      <published>Mon Oct 11 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Oct 11 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>Richard Lupia</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is a response to a reader question.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;question&quot; tabindex=&quot;-1&quot;&gt;Question &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/10/reader-question-how-do-geological.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Reader &lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/matthew-garland/8/a21/296&quot;&gt;Matthew Garland&lt;/a&gt;&lt;/strong&gt; asks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Where do geological layers come from? If remains of civilizations and eras
are buried, where did the material for the top layers come from? There can&#39;t
be more material now than five thousand or million years ago.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/10/reader-question-how-do-geological.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The answer to this reader question comes from
&lt;strong&gt;&lt;a href=&quot;http://www.ou.edu/cas/botany-micro/faculty/lupia.html&quot;&gt;Richard Lupia&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The formation of geological layers is a continuous process based on the
settling of &lt;a href=&quot;http://en.wikipedia.org/wiki/Sediment&quot;&gt;sediment&lt;/a&gt; and shifts in
&lt;a href=&quot;http://en.wikipedia.org/wiki/Tectonic_plates&quot;&gt;tectonic plates&lt;/a&gt;.&lt;/p&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-10-12-reader-question-how-do-geological.jpg&quot; alt=&quot;Strata&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;A geologic &lt;a href=&quot;http://kosherfood.about.com/od/kosherappetizerrecipes/r/deliroll.htm&quot;&gt;deli roll&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/thearchive/7070893/&quot;&gt;Crinity&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;explanation&quot; tabindex=&quot;-1&quot;&gt;Explanation &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/10/reader-question-how-do-geological.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Geological layers, also called beds or &lt;a href=&quot;http://en.wikipedia.org/wiki/Stratum&quot;&gt;strata&lt;/a&gt;, which contain
buried civilizations are composed for the most part of fragments of rocks that
form when bigger rocks are broken down by water, wind, or even organisms like
plants. Once broken down, the fragments, called &lt;a href=&quot;http://en.wikipedia.org/wiki/Sediment&quot;&gt;sediment&lt;/a&gt;, are
transported by flowing water or blowing wind. Eventually, water stops flowing
or wind stops blowing and the sediment settles, be it on the river bed or on
the ocean bottom, or on floodplains alongside rivers when they flood. The
fossil record is primarily a record of what lived in the oceans and in and
along rivers.&lt;/p&gt;
&lt;p&gt;Inasmuch as humans are dependent on water for sustenance, irrigation, etc., the
bric-a-brac of human civilizations is ideally located to be buried by sediment
when the rivers flood, which many do seasonally. It is worth noting that floods
add new sediment that maintains the fertility of the floodplains for
agriculture which also keeps humans near rivers.&lt;/p&gt;
&lt;p&gt;The Earth does not run out of sediment because mountains constantly form and
grow (slowly) as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Tectonic_plates&quot;&gt;plates&lt;/a&gt;—the 14 or so massively large
blocks Earth&#39;s outer &amp;quot;shell&amp;quot; made of continents and ocean floor—shuffle
around and collide. As mountains go up, there is always more rock to break
down.&lt;/p&gt;
&lt;p&gt;And although adding layer upon layer of sediment does indeed produce an
increasingly thick pile of rock, it need not get higher and higher. There are
two main reasons. First, as old sediment is buried by new sediment, water and
air are squeezed out from the spaces between the sediment, and the old layer
becomes thinner. For example, 10 feet of mud will on average yield a layer of
rock about 1 foot thick. Second, the colliding of plates I mentioned above warps
the ground over a very large area often bending it down to form a
&lt;a href=&quot;http://en.wikipedia.org/wiki/Sedimentary_basin&quot;&gt;basin&lt;/a&gt; which lowers the Earth&#39;s surface.&lt;/p&gt;
&lt;p&gt;Finally, I briefly add that sediment, and the oceanic part of the plates, are
eventually recycled by sinking back into the deeper layers of the Earth. Where
plates sink are called &#39;&lt;a href=&quot;http://en.wikipedia.org/wiki/Subduction&quot;&gt;subduction zones&lt;/a&gt;&#39; and are often
apparent on maps as oceanic trenches (e.g., &lt;a href=&quot;http://en.wikipedia.org/wiki/Mariana_Trench&quot;&gt;Mariana Trench&lt;/a&gt;,
the deepest place on the surface of the Earth). The sinking of plates at
subduction zones initiates the formation and growth of another type of
mountain: volcanos. The ash and debris associated with volcanic eruptions
blanket the surface and frequently bury human structures. The burial of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Pompeii&quot;&gt;Pompeii&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Herculaneum&quot;&gt;Herculaneum&lt;/a&gt; by ash from the
eruption of &lt;a href=&quot;http://en.wikipedia.org/wiki/Mount_Vesuvius&quot;&gt;Mount Vesuvius&lt;/a&gt; in 79 CE is one famous example.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class=&quot;vcard fn&quot;&gt;&lt;a href=&quot;http://www.ou.edu/cas/botany-micro/faculty/lupia.html&quot;&gt;Richard Lupia&lt;/a&gt;&lt;/span&gt; is an Associate
Professor in the &lt;a href=&quot;http://geology.ou.edu/&quot;&gt;School of Geology and Geophysics&lt;/a&gt; at the University
of Oklahoma.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Explanation text licensed under
&lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0 Unported License&lt;/a&gt;.
&lt;br&gt;Additional editing by The Metaist.&lt;/small&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Reader Post: Spicy Food</title>
      <link href="https://metaist.com/blog/2010/10/reader-post-spicy-food.html"/>
      <id>tag:metaist.com,2010:blog.post-501663dd7ec1c2d9afc3b77063ac0ca305fb7be9</id>
      <published>Tue Oct 05 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Oct 05 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>Josh Vogel</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post was submitted by reader &lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/josh-vogel/2/40b/b&quot;&gt;Josh Vogel&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/10/reader-post-spicy-food.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Many of us enjoy &lt;a href=&quot;http://en.wikipedia.org/wiki/Spicy_food&quot;&gt;spicy food&lt;/a&gt;. At the same time, many of us really
don&#39;t like spicy food. According to an
&lt;a href=&quot;http://www.nytimes.com/2010/09/21/science/21peppers.html?hp&quot;&gt;article in The New York Times&lt;/a&gt;, there may be more of a personality
trait to this than one might have originally thought. Additionally, the fact
that any human being likes spicy food might say a lot about the evolution of
our species.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-10-06-reader-post-spicy-food.jpg&quot; alt=&quot;Chili Peppers&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Not to be confused with &lt;a href=&quot;http://en.wikipedia.org/wiki/Melange_(fictional_drug)&quot;&gt;the spice&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/spool32/4996252665/&quot;&gt;Will Clayton&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Researchers at the University of Pennsylvania say that our enjoyment (or
non-enjoyment) of spicy food might have to with the unique human capability of
getting pleasure out of painful experiences: &amp;quot;Humans and only humans get to
enjoy events that are innately negative, that produce emotions or feelings that
we are programmed to avoid when we come to realize that they are actually not
threats,&amp;quot; said &lt;a href=&quot;http://www.psych.upenn.edu/~rozin/&quot;&gt;Dr. Paul Rozin&lt;/a&gt; of University of Pennsylvania, who
calls this trait &amp;quot;&lt;strong&gt;benign masochism&lt;/strong&gt;&amp;quot;. After all, we are the only animal that
likes spicy food, as evidenced by the inclusion of &lt;a href=&quot;http://en.wikipedia.org/wiki/Capsaicin&quot;&gt;Capsaicin&lt;/a&gt;
(the chemical compound that makes chilies spicy) in many animal repellents.&lt;/p&gt;
&lt;p&gt;What this might say about people who do and do not like spicy food is not
covered by the article, but it doesn&#39;t take too much thinking to see if people
who like spicy foods are also ones who have a high
&lt;a href=&quot;http://en.wikipedia.org/wiki/Pain_tolerance&quot;&gt;tolerance for pain&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class=&quot;vcard fn&quot;&gt;&lt;a href=&quot;http://www.linkedin.com/pub/josh-vogel/2/40b/b&quot;&gt;Josh Vogel&lt;/a&gt;&lt;/span&gt; is a Candidate for the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Master_of_Public_Health&quot;&gt;Master of Public Health&lt;/a&gt; at &lt;a href=&quot;http://sph.bu.edu/&quot;&gt;Boston University School of Public Health&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/10/reader-post-spicy-food.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.nytimes.com/2010/09/21/science/21peppers.html?hp&quot;&gt;A Perk of Our Evolution: Pleasure in Pain of Chilies&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The New York Times&lt;/span&gt;
for the article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.sas.upenn.edu/sasalum/newsltr/fall97/rozin.html&quot;&gt;Food for Thought: Paul Rozin&#39;s Research and Teaching at Penn&lt;/a&gt;&lt;/cite&gt;
for a lengthy interview with &lt;span class=&quot;vcard fn&quot;&gt;Paul Rozin&lt;/span&gt; from 1997 where
he discusses many of the aspects of his research.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;small&gt;Commentary text licensed under
&lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0 Unported License&lt;/a&gt;.
&lt;br&gt;Additional editing by The Metaist.&lt;/small&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Nobody Likes a Goody Two-Shoes</title>
      <link href="https://metaist.com/blog/2010/08/nobody-likes-goody-two-shoes.html"/>
      <id>tag:metaist.com,2010:blog.post-d9af729928e83f948bb6a47d430a447a1b15aaad</id>
      <published>Sat Aug 28 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Aug 28 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/nobody-likes-goody-two-shoes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The term &lt;em&gt;goody two-shoes&lt;/em&gt; is based on a children&#39;s story in which a poor
orphan girl (Margery Meanwell) goes through life with only one shoe, but is
eventually rewarded with a pair of shoes earning her the nickname Goody
Two-Shoes. The phrase &amp;quot;goody two-shoes&amp;quot; refers to an excessively or annoyingly
virtuous person, but has now come to include a connotation of insincerity
&lt;small&gt;(Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/The_History_of_Little_Goody_Two-Shoes&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/small&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-08-29-nobody-likes-goody-two-shoes.jpg&quot; alt=&quot;Old Shoes&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Thanks for the offer, but I think I&#39;ll go &lt;a href=&quot;https://metaist.com/blog/2010/02/shoes-gait.html&quot;&gt;barefoot&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/24578558@N03/5085150612/&quot;&gt;Northsky71&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/nobody-likes-goody-two-shoes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A recent set of studies at Washington State University showed that not only are
people who abuse a public good excluded from the group, but so are people who
give too much toward the group, but use very little of that good. The fourth
study in the set suggests that such behavior &amp;quot;is seen by some as establishing
an undesirable behavior standard and by others as a rule breaker&amp;quot;
(Parks &amp;amp; Stone, 2010). Regardless of the perception, people wanted this
unselfish person removed from the group.&lt;/p&gt;
&lt;p&gt;I&#39;m assuming that &amp;quot;establishing an undesirable behavior standard&amp;quot; means
something like &amp;quot;setting the bar too high&amp;quot; or &amp;quot;making me look bad.&amp;quot;
Alternatively, people might assume mixed motives and become wary of such behavior.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/nobody-likes-goody-two-shoes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Do you remember a situation in which you felt someone was being too unselfish?
How did you react? Have you ever noticed you were being excluded after you
behaved unselfishly? What could you do differently?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/nobody-likes-goody-two-shoes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.gutenberg.org/files/13675/13675-h/13675-h.htm&quot;&gt;Goody Two-Shoes&lt;/a&gt;&lt;/cite&gt; at
&lt;span class=&quot;vcard org fn&quot;&gt;Project Gutenberg for the
full text of the 1766 edition of the classic children&#39;s tale.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/The_History_of_Little_Goody_Two-Shoes&quot;&gt;The History of Little Goody Two-Shoes&lt;/a&gt;&lt;/cite&gt; at
&lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.sciencedaily.com/releases/2010/08/100823101110.htm&quot;&gt;Do-Gooders Get Voted Off Island First&lt;/a&gt;&lt;/cite&gt; at
&lt;span class=&quot;vcard org fn&quot;&gt;ScienceDaily&lt;/span&gt; for a longer discussion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Parks, C. D., &amp;amp; Stone, A. B. (2010). The desire to expel unselfish
members from the group. &lt;cite&gt;Journal of Personality and Social
Psychology&lt;/cite&gt;, 99(2), 303-310.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Dry Water</title>
      <link href="https://metaist.com/blog/2010/08/dry-water.html"/>
      <id>tag:metaist.com,2010:blog.post-f6e07d629aa12aa51dcd856c3b3861bb36fcd8ad</id>
      <published>Thu Aug 26 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Aug 26 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/dry-water.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entity-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;strong&gt;Dry water&lt;/strong&gt; is the result of coating small water droplets in silica. It is a
powdery substance like sugar and is composed of 95% water.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-08-27-dry-water.jpg&quot; alt=&quot;Silica&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Dehydrated water crystals. Just add water!&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/knowprose/2167889396/&quot;&gt;Taran Rampersad&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/dry-water.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jokes about dehydrated water crystals aside, this is a pretty impressive
technique for collecting and containing water which has been around since 1968.
In 2006, it was rediscovered as a potential way to absorb carbon gases and a
host of other applications.&lt;/p&gt;
&lt;p&gt;I&#39;ve got to think back to other 8&lt;sup&gt;th&lt;/sup&gt; grade jokes to see what future
technology will bring.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/dry-water.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://portal.acs.org/portal/acs/corg/content?_nfpb=true&amp;amp;_pageLabel=PP_ARTICLEMAIN&amp;amp;node_id=222&amp;amp;content_id=CNBP_025406&amp;amp;use_sec=true&amp;amp;sec_url_var=region1&amp;amp;__uuid=7980a5fb-0466-4fda-96d5-97345b695337&quot;&gt;&amp;quot;Dry water&amp;quot; could make a big splash commercially&lt;/a&gt;&lt;/cite&gt;
at the &lt;span class=&quot;vcard org fn&quot;&gt;American Chemical Society&lt;/span&gt;
where the announcement of this announcement was made at the 240&lt;sup&gt;th&lt;/sup&gt;
meeting in Boston.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.scientificamerican.com/article.cfm?id=scientists-create-dry-wat&quot;&gt;Scientists Create &#39;Dry&#39; Water Droplets&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Scientific American&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100827181409/https://www.telegraph.co.uk/science/science-news/7964109/Scientists-create-dry-water.html&quot;&gt;Scientists create &#39;dry water&#39;&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The Telegraph&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Indigo Children</title>
      <link href="https://metaist.com/blog/2010/08/indigo-children.html"/>
      <id>tag:metaist.com,2010:blog.post-e8e01a64683d0fdb634d883eb0a55e219b35b9b5</id>
      <published>Thu Aug 12 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Aug 12 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a submission by reader
&lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/matthew-garland/8/a21/296&quot;&gt;Matthew Garland&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/indigo-children.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Indigo_children&quot;&gt;Indigo Children&lt;/a&gt; are children with special traits, although the
specifics of those traits ranges from &amp;quot;empathetic&amp;quot;, &amp;quot;confident&amp;quot; to
&amp;quot;mind reader&amp;quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-08-13-indigo-children.jpg&quot; alt=&quot;Indigo&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;It&#39;s almost the color of the &lt;a href=&quot;http://www.blueman.com/&quot;&gt;Blue Man Group&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/kenpower/15040867/&quot;&gt;Ken Power&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/indigo-children.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;According to Lee Carol, co-author of &amp;quot;The Indigo Children&amp;quot;, the term was never
supposed to denote anything paranormal. Rather, Nancy Ann Tappe, who coined the
term, had &lt;a href=&quot;http://en.wikipedia.org/wiki/Synesthesia&quot;&gt;synesthesia&lt;/a&gt; and associated these children with the
color indigo.&lt;/p&gt;
&lt;p&gt;Nonetheless, there is definitely an underlying argument that is completely
unsubstantiated: that these children &amp;quot;represent a higher state of human
evolution&amp;quot;. Of course, if we take &lt;a href=&quot;http://en.wikipedia.org/wiki/Evolutionary_psychology&quot;&gt;evolutionary psychology&lt;/a&gt; to its
extreme, the children &lt;em&gt;do in fact&lt;/em&gt; represent a higher state of human evolution
(just not that much higher; probably not what the indigo folks mean).&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/indigo-children.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Reader &lt;strong&gt;Matthew&lt;/strong&gt; suggests that perhaps a belief in indigo children may be related to the
&lt;a href=&quot;https://metaist.com/blog/2010/08/forer-effect.html&quot;&gt;Forer effect&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Confirmation_bias&quot;&gt;confirmation bias&lt;/a&gt;. What do you
think?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/indigo-children.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Indigo_children&quot;&gt;Indigo children&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for more information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.indigochild.com/wikipedia.html&quot;&gt;Wikipedia Warning!&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The Indigo Children
for a response from &lt;span class=&quot;vcard fn&quot;&gt;Lee Carol&lt;/span&gt;
to the Wikipedia article.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Forer Effect</title>
      <link href="https://metaist.com/blog/2010/08/forer-effect.html"/>
      <id>tag:metaist.com,2010:blog.post-bad6a508d86f8185a76b2877525d70157449682f</id>
      <published>Wed Aug 11 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed Aug 11 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/forer-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Forer_effect&quot;&gt;Forer Effect&lt;/a&gt; refers to the tendency of individuals to believe
that generic personality descriptions are highly accurate when being told that
the descriptions are tailor-made.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-08-12-forer-effect.jpg&quot; alt=&quot;Fortune Cookie&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Sorry, I have a schedule conflict. Could we do next sometime?&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/partiallyblind/&quot;&gt;partiallyblind&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/forer-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Forer famously gave a group of students a personality test. Then he provided
them with an individual &amp;quot;analysis&amp;quot; which the students were supposed to rank
from 0 to 5 (poor to excellent). The analysis read thusly &lt;small&gt;(Thanks
Wikipedia!)&lt;/small&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have a great need for other people to like and admire you. You have a
tendency to be critical of yourself. You have a great deal of unused capacity
which you have not turned to your advantage. While you have some personality
weaknesses, you are generally able to compensate for them. Disciplined and
self-controlled outside, you tend to be worrisome and insecure inside. At
times you have serious doubts as to whether you have made the right decision
or done the right thing. You prefer a certain amount of change and variety
and become dissatisfied when hemmed in by restrictions and limitations. You
pride yourself as an independent thinker and do not accept others&#39; statements
without satisfactory proof. You have found it unwise to be too frank in
revealing yourself to others. At times you are extroverted, affable,
sociable, while at other times you are introverted, wary, reserved. Some of
your aspirations tend to be pretty unrealistic. Security is one of your major
goals in life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The average score was 4.26. It was then that Forer revealed that they all got the same text.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/forer-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Forer_effect&quot;&gt;Forer Effect&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;.
Specifically,
see &lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Forer_effect#Variables_influencing_the_effect&quot;&gt;Variables influencing the effect&lt;/a&gt;&lt;/cite&gt;
for additional criteria.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=QEFndH5KOD0&quot;&gt;Derren Brown - Cold Reading&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for a video of &lt;span class=&quot;vcard fn&quot;&gt;Derren Brown&lt;/span&gt; acting strangely,
but demonstrating the basics of the Forer Effect.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Prisoner&#39;s Dilemma</title>
      <link href="https://metaist.com/blog/2010/08/prisoners-dilemma.html"/>
      <id>tag:metaist.com,2010:blog.post-e524fe3202ac3ad91ef2a0dcfd278ec2fcd8009e</id>
      <published>Tue Aug 10 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Aug 10 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In game theory, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Prisoner&#39;s_dillema&quot;&gt;prisoner&#39;s dilemma&lt;/a&gt; refers to a situation
in which two parties can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;cooperate (each gains a moderate amount),&lt;/li&gt;
&lt;li&gt;defect (each looses a moderate amount), or&lt;/li&gt;
&lt;li&gt;one defects (gains a large amount), the other cooperates (looses a large amount).&lt;/li&gt;
&lt;/ol&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-08-11-prisoners-dilemma.jpg&quot; alt=&quot;Jail Kitty&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Cat got your tongue? If you cooperate, we can get you off on a smaller charge.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/50362297@N07/4673066549/&quot;&gt;phphoto2010&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;I recently had an interesting experience in which I had to play 9 rounds of an
&lt;a href=&quot;http://en.wikipedia.org/wiki/Prisoner&#39;s_dilemma#The_iterated_prisoner.27s_dilemma&quot;&gt;iterated prisoner&#39;s dilemma&lt;/a&gt; as part of a large group.
The process by which my group decided to behave was both enlightening and
disturbing.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;background&quot; tabindex=&quot;-1&quot;&gt;Background &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;During the summer, I took a course on &lt;a href=&quot;http://en.wikipedia.org/wiki/Negotiation&quot;&gt;negotiating&lt;/a&gt;.
On the last day of class, the professor announced we would be doing a
large-scale group negotiation. He split the class into two large groups of 12
people each and provided everyone with the following information:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each group represents a store in a town where
&lt;a href=&quot;http://en.wikipedia.org/wiki/Blue_laws&quot;&gt;commerce is forbidden on Sunday&lt;/a&gt;. For various reasons, the
two stores are now considering being open on Sundays with the following ramifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If both stores are &lt;strong&gt;closed&lt;/strong&gt;, each &lt;strong&gt;makes $20,000&lt;/strong&gt; during the week.&lt;/li&gt;
&lt;li&gt;If both stores are &lt;strong&gt;open&lt;/strong&gt;, the town will &lt;strong&gt;fine each store $20,000&lt;/strong&gt; for that week.&lt;/li&gt;
&lt;li&gt;If only one store is &lt;strong&gt;open&lt;/strong&gt;, that store will &lt;strong&gt;make $40,000&lt;/strong&gt; during the week
and will actually take business away from the other store for a week, so the
the &lt;strong&gt;closed store looses $40,000&lt;/strong&gt; for that week.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;For those of you playing along at home, here is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Normal-form_game&quot;&gt;payoff matrix&lt;/a&gt;:&lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; style=&quot;margin: 0 auto; width: 25em; text-align: center; border: 0.1em solid black&quot;&gt;
  &lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td&gt;(You, Them)&lt;/td&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;They&#39;re Closed&lt;/td&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;They&#39;re Open&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;You&#39;re Open&lt;/td&gt;
    &lt;td&gt;(&lt;span style=&quot;color: green&quot;&gt;+$40k&lt;/span&gt;, &lt;span style=&quot;color: red&quot;&gt;-$40k&lt;/span&gt;)&lt;/td&gt;
    &lt;td&gt;(&lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt;, &lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt;)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;You&#39;re Closed&lt;/td&gt;
    &lt;td&gt;(&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt;, &lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt;)&lt;/td&gt;
    &lt;td&gt;(&lt;span style=&quot;color: red&quot;&gt;-$40k&lt;/span&gt;, &lt;span style=&quot;color: green&quot;&gt;+$40k&lt;/span&gt;)&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;br&gt;
&lt;p&gt;The two group convene in separate classrooms where for each of the next 12
&amp;quot;weeks&amp;quot; a new representative must exit the room with a sign that says
&amp;quot;Open&amp;quot; or &amp;quot;Closed.&amp;quot; The two representatives have the option of negotiating for
up to one minute except after weeks 4 and 8 when they &lt;strong&gt;must&lt;/strong&gt; negotiate. This
is because on weeks 4, 8, and 12, the profits and losses double, triple, and
quadruple, respectively.&lt;/p&gt;
&lt;h2 id=&quot;game-play&quot; tabindex=&quot;-1&quot;&gt;Game Play &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As the twelve members of my group finished reading the assignment I pointed
out that this was, indeed, the classic prisoner&#39;s dilemma game in which we can
maximize our gains by cooperating, although there are short-term gains in
defecting.&lt;/p&gt;
&lt;p&gt;A fellow classmate (let&#39;s call him Bob) responded saying he did not care;
he just wanted to win. I pointed out that there are a few ways of defining
&lt;em&gt;win&lt;/em&gt; in this particular circumstance. Did he mean that we should try to make
as much money as we could? &lt;em&gt;No.&lt;/em&gt; He wanted to make sure we made more money
than the other team. Okay, I said, but let&#39;s focus on the short-term goal here
on figuring out whether or not we should be open for week 1.&lt;/p&gt;
&lt;p&gt;Eventually, we came to a consensus that we should be open week 1 as a
precaution. As the first representative to go out, I displayed our &amp;quot;Open&amp;quot; sign
to the amazement of the other team representative. I made a deal, offering to
be closed for the remaining 11 weeks (as my team had proposed), and the other
representative agreed—provided that they were allowed to open the
following week while we remained closed. Deal.&lt;/p&gt;
&lt;p&gt;When I returned, the discussion picked up on a theme that might be described as
&amp;quot;When Should We Screw Them?&amp;quot; Several people agreed that &amp;quot;we have to screw them
sometime,&amp;quot; but I was at a loss to explain my position that we should &lt;em&gt;not&lt;/em&gt;
screw them. In the meantime, we were being pressed to send out representatives
for the following weeks, and we continued to abide by the agreement laid out in
the first week.&lt;/p&gt;
&lt;p&gt;Both teams remained closed for weeks 2, 3, 4, 5, 6, and 7. Our group became
more passionate. We tried to define what our interests were. While we could not
agree what the expression &amp;quot;maximize your profits&amp;quot; (as written in the
instructions) meant, we did agree on the following two principles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We want to have a positive balance at the end of the game.&lt;/li&gt;
&lt;li&gt;We want to make more money than the other team.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At this point, I raised the issue that I had a very specific interest in
remaining honest. To illustrate my point, I suggested that on week 11 we
&lt;em&gt;tell the other team to be open&lt;/em&gt; week 12. I had forgotten that the losses would
quadruple, for my intent was to prevent &lt;em&gt;anyone&lt;/em&gt; from cheating on week 12 (when
there would be a strong desire to cheat). This idea did not go over well
(&amp;quot;You&#39;re willing to loose money to be honest!?&amp;quot;). I tried to backtrack. Okay,
but now—it&#39;s only week 8—why should we screw them now? Let&#39;s
continue to abide by our agreement. They&#39;ve been abiding by the agreement so
far—let&#39;s just keep going—we&#39;re making money, people!&lt;/p&gt;
&lt;h2 id=&quot;honesty-or-profits&quot; tabindex=&quot;-1&quot;&gt;Honesty or Profits &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Someone calculated that if we screwed them now (week 8), and subsequently
stayed open the remaining weeks (since we assume that they would stay open as
well), we would still be in the black at the end of week 12, while the other
team would be in the red.&lt;/p&gt;
&lt;p&gt;We had been summoned to send a representative out for week 8 (our team was
consistently late in sending someone out as our deliberations slowed us down).
At this point our debate reached a fever pitch. Bob of the &amp;quot;I-want-to-win&amp;quot; camp
asked for a vote; should we choose honesty or profits (his words).&lt;/p&gt;
&lt;p&gt;So I asked each person: &amp;quot;Honesty or profits?&amp;quot;&lt;/p&gt;
&lt;p&gt;Profits. Profits. Profits. Profits. Profits. Profits. Honesty. Profits. Honesty.
Profits. Profits.&lt;/p&gt;
&lt;p&gt;My vote was well known at this point, so I didn&#39;t even bother announcing my
position. Moments later, one of the votes for &amp;quot;honesty&amp;quot; changed her mind and
agreed that week 8 was an opportune time to screw the other team.&lt;/p&gt;
&lt;p&gt;I decided that since Bob was so in favor of screwing the team &amp;quot;at some point,
and it might as well be now&amp;quot; he should be the representative to go and announce
that we were open. As he was walking out the door, I said &amp;quot;This is a stupid
move; you&#39;re firing nukes on Russia—how do you think this is going to
end?&amp;quot; My other classmates asked me &amp;quot;But what if they&#39;re open?&amp;quot;
&amp;quot;If they&#39;re open,&amp;quot; I replied, &amp;quot;then I&#39;m an idiot and I was wrong. But watch,
they are going to abide by the agreement, and from now on, it will just be us
nuking each other.&amp;quot; (I choose the Cold War analogy because we had all watched
&lt;a href=&quot;http://www.amazon.com/Thirteen-Days-Infinifilm-Kevin-Costner/dp/B00005J760&quot;&gt;Thirteen Days&lt;/a&gt; as part of a previous assignment.)&lt;/p&gt;
&lt;p&gt;The other team was closed and they were upset. Since negotiations had to occur, Bob
tried to present the situation as &amp;quot;nothing personal&amp;quot;; that our group was
&amp;quot;chaotic&amp;quot; and that it was &amp;quot;impossible to say how things would proceed&amp;quot;.&lt;/p&gt;
&lt;p&gt;On Week 9, both teams came out &amp;quot;Open&amp;quot;, although the other team&#39;s sign also
depicted a middle finger. Both representatives made it clear that they would
remain open the remaining weeks, so the professor aborted the game and we
convened for a post-session discussion.&lt;/p&gt;
&lt;h2 id=&quot;post-mortem&quot; tabindex=&quot;-1&quot;&gt;Post-mortem &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;During the discussion, it became clear that the other team had plans to screw
us on Week 11 (on the assumption that we would screw them on Week 12). Unlike
our team, they had chosen to make liberal use of the blackboard (we used the
computer screen). Their board clearly showed their train of thought: &amp;quot;Ethics&amp;quot;,
&amp;quot;Honesty Is the Best Policy&amp;quot; were followed up by a large &amp;quot;SCREW THEM!&amp;quot; It was
pointed out that despite being told &amp;quot;it&#39;s just business, nothing personal&amp;quot;
every single person on their team took it &lt;em&gt;very personally&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I raised the issue of how quickly people choose &amp;quot;profits&amp;quot; over &amp;quot;honesty&amp;quot;, but
my fellow teammates objected on the grounds that &amp;quot;they were operating within
the game.&amp;quot; My professor tried to make the point that &amp;quot;in real-life&amp;quot; people tend
to weigh in the consequences more and that they might be less likely to defect.&lt;/p&gt;
&lt;p&gt;Needless to say, I did not find this reassuring.&lt;/p&gt;
&lt;h2 id=&quot;final-score&quot; tabindex=&quot;-1&quot;&gt;Final Score &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Despite my feeling that we had &amp;quot;lost&amp;quot; as we broke our agreement (and, in
retrospect, we lost $140k in potential profits), we did satisfy the two
criteria pinpointed by the group: we were in the black, and we made more money
than the other team. Here is the final score:&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; border=&quot;1&quot; style=&quot;margin: 0 auto; width: 25em; border: 0.1em solid black&quot;&gt;
  &lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td&gt;&amp;nbsp;&lt;/td&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Us&lt;/td&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Them&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 1&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$40k&lt;/span&gt; (Open)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$40k&lt;/span&gt; (Closed)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 2&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$40k&lt;/span&gt; (Closed)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$40k&lt;/span&gt; (Open)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 3&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 4 (double)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$40k&lt;/span&gt; (Closed)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$40k&lt;/span&gt; (Closed)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 5&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 6&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 7&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$20k&lt;/span&gt; (Closed)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 8 (triple)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: green&quot;&gt;+$60k&lt;/span&gt; (Open)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$60k&lt;/span&gt; (Closed)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 9 (game ends)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt; (Open)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt; (Open)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 10&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt; (Open)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt; (Open)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 11&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt; (Open)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$20k&lt;/span&gt; (Open)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Week 12 (quadruple)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$80k&lt;/span&gt; (Open)&lt;/td&gt;
    &lt;td&gt;&lt;span style=&quot;color: red&quot;&gt;-$80k&lt;/span&gt; (Open)&lt;/td&gt;
  &lt;/tr&gt;&lt;tr style=&quot;border: 0.1em solid black&quot;&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;Totals&lt;/td&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;&lt;span style=&quot;color: green&quot;&gt;+$160k&lt;/span&gt;&lt;/td&gt;
    &lt;td style=&quot;font-weight: bold&quot;&gt;&lt;span style=&quot;color: red&quot;&gt;-$160k&lt;/span&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;br&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/08/prisoners-dilemma.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Prisoner&#39;s_dillema&quot;&gt;Prisoner&#39;s Dilemma&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/pareto-efficiency.html&quot;&gt;Pareto Efficiency&lt;/a&gt;&lt;/cite&gt;
for the game-theoretic concept of optimizing gains.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Effective Apologies</title>
      <link href="https://metaist.com/blog/2010/07/effective-apologies.html"/>
      <id>tag:metaist.com,2010:blog.post-525f32a31f9f1f0bc858783957af4a06a8e652e0</id>
      <published>Tue Jul 06 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue Jul 06 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/effective-apologies.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;An apology is an expression of &lt;a href=&quot;http://en.wikipedia.org/wiki/Regret_(emotion)&quot;&gt;regret&lt;/a&gt;. Effective apologies involve the
apologizer taking full responsibility and pledging to prevent repeat offenses.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-07-07-effective-apologies.jpg&quot; alt=&quot;Patched Apple&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;Sorry, Frankenapple. At least you&#39;re alive.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;https://web.archive.org/web/20100128033535/https://www.flickr.com/photos/21560098@N06/4260085365/&quot;&gt;1happysnapper&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/effective-apologies.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When we hear a child say &amp;quot;I&#39;m sorry&amp;quot; when prompted, the insincerity is often
palatable. Similar apologies by politicians and CEOs of recent have illicit
similar reactions. What makes an apology effective?&lt;/p&gt;
&lt;p&gt;Effective apologies should address:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;which norm (personal, social) was violated,&lt;/li&gt;
&lt;li&gt;acceptance of responsibility by the violator, and&lt;/li&gt;
&lt;li&gt;how the violations will be prevented in the future.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If these ideas sound familiar, it may be because that&#39;s what we tell our children.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/effective-apologies.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What apologies have you found to be the most effective?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/effective-apologies.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://scholarship.law.marquette.edu/mulr/vol87/iss4/5/&quot;&gt;The Role of Apology in Negotiation&lt;/a&gt;&lt;/cite&gt;
for a discussion about apologies and their implications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.nytimes.com/2010/07/04/magazine/04fob-wwln-t.html?_r=1&quot;&gt;Why Is It So Hard to Apologize Well?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The New York Times Magazine&lt;/span&gt;
for a longer discussion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Meanness &amp; Executive Pay</title>
      <link href="https://metaist.com/blog/2010/07/meanness-executive-pay.html"/>
      <id>tag:metaist.com,2010:blog.post-9d40d160406444e092a97ea5aab197dacd946302</id>
      <published>Mon Jul 05 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon Jul 05 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a submission by reader &lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/in/phillipvedol&quot;&gt;Phillip Vedol&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/meanness-executive-pay.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;According to a recently published paper
&lt;a href=&quot;https://web.archive.org/web/20100703222711/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1612486&quot;&gt;increases in compensation lead to increases in meanness&lt;/a&gt; among corporate leaders.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-07-06-meanness-executive-pay.jpg&quot; alt=&quot;Manager&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  You talkin&#39; to me?
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/patrick_q/265719387/&quot;&gt;patrick_q&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/meanness-executive-pay.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The study&#39;s posits that &amp;quot;higher income inequality between executives
and ordinary workers&amp;quot; leads to a perception of power that ultimately results in
maltreatment of &amp;quot;rank and file workers&amp;quot; (p. 1). This follows the research on the
&lt;a href=&quot;http://hbr.org/2010/05/defend-your-research-powerful-people-are-better-liars/ar/1&quot;&gt;relationship between power and lying&lt;/a&gt; and reinforces the image of
powerful managers who abuse their position (e.g.,
&lt;a href=&quot;http://en.wikipedia.org/wiki/Emmett_Milbarge#Emmett_Milbarge&quot;&gt;Emmett Milbarage&lt;/a&gt; in &lt;em&gt;Chuck&lt;/em&gt;).&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/meanness-executive-pay.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Have you experienced this sort of behavior? What about the opposite (magnanimous
over-paid managers)?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/meanness-executive-pay.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100703222711/https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1612486&quot;&gt;When Executives Rake in Millions: Meanness in Organizations&lt;/a&gt;&lt;/cite&gt;
for the original paper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://blogs.hbr.org/research/2010/06/executive-compensation-the-mor.html&quot;&gt;Executive Compensation: The More Leaders Make, the Meaner They Get&lt;/a&gt;&lt;/cite&gt;
at the &lt;span class=&quot;vcard org fn&quot;&gt;Harvard Business Review Research Blog&lt;/span&gt;
for a longer discussion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/meanness-executive-pay.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T20:26:06-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/meanness-executive-pay.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;http://online.wsj.com/article/SB10001424052748704407804575425561952689390.html&quot;&gt;The Power Trip&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The Wall Street Journal&lt;/span&gt;
for another discussion.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T21:39:55Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/meanness-executive-pay.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;This paper appears to have been retracted.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Babies &amp; Morality</title>
      <link href="https://metaist.com/blog/2010/07/babies-morality.html"/>
      <id>tag:metaist.com,2010:blog.post-64fe00fc2295cce0ba8caa1a84ae58b8eecee048</id>
      <published>Sun Jul 04 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun Jul 04 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a submission by reader
&lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/daniel-bitran/b/989/ba1&quot;&gt;Professor Daniel Bitran&lt;/a&gt;&lt;/strong&gt;
via &lt;strong&gt;&lt;a href=&quot;http://gvnet.com/profpatt/&quot;&gt;Professor Martin Patt&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/babies-morality.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Researchers at the &lt;a href=&quot;https://web.archive.org/web/20100324223406/https://www.yale.edu/infantlab/Welcome.html&quot;&gt;Infant Cognition Center&lt;/a&gt; at Yale are conducting
&lt;a href=&quot;https://web.archive.org/web/20101015000000*/https://www.yale.edu/infantlab/Our_Studies.html&quot;&gt;studies&lt;/a&gt; to try and assess the capabilities of infants to understand
the world around them.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/HBW5vdhr_PA?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=HBW5vdhr_PA&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/babies-morality.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While I&#39;m hesitant to label this as &amp;quot;&lt;a href=&quot;https://metaist.com/blog/tag/bunk/&quot;&gt;bunk&lt;/a&gt;&amp;quot;, there appear
to be at least two deficiencies in the research methods used &lt;small&gt;(based on
five minutes of film and not much else)&lt;/small&gt;.&lt;/p&gt;
&lt;p&gt;The first, pointed out to me by Professor Bitran, is that the caregivers always
hold the children and may unconsciously influence the result (as in
&lt;a href=&quot;https://metaist.com/blog/2010/07/facilitated-communication.html&quot;&gt;facilitated communication&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Second, the videos seem to show that the researchers who present the option
&lt;em&gt;know&lt;/em&gt; which one is the &amp;quot;good&amp;quot; one. The babies may be responding to the
researcher rather than the choice (similar to
&lt;a href=&quot;https://metaist.com/blog/2010/01/clever-hans-effect.html&quot;&gt;Clever Hans&lt;/a&gt;). Nonetheless, the
results of better controlled studies might show that a basic understanding of cooperation.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/babies-morality.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100324223406/https://www.yale.edu/infantlab/Welcome.html&quot;&gt;Infant Cognition Center&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Yale&lt;/span&gt; for their website.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.nytimes.com/2010/05/09/magazine/09babies-t.html?src=me&amp;amp;ref=general&quot;&gt;Can Babies Tell Right from Wrong?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The New York Times&lt;/span&gt;
for the article related to the video.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Facilitated Communication</title>
      <link href="https://metaist.com/blog/2010/07/facilitated-communication.html"/>
      <id>tag:metaist.com,2010:blog.post-527422101a7187d48d882bdae7f29361904ee71a</id>
      <published>Sat Jul 03 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Jul 03 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a discussion with reader
&lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/daniel-bitran/b/989/ba1&quot;&gt;Professor Daniel Bitran&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/facilitated-communication.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Facilitated_communication&quot;&gt;Facilitated communication&lt;/a&gt; (FC) is a process by which a facilitator
supports the hand or arm of a communicatively impaired individual while using
a keyboard or other devices with the aim of helping the individual to develop
pointing skills and to communicate.
&lt;small&gt;(Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Facilitated_communication&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/5H5AF3URJf4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=5H5AF3URJf4&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/facilitated-communication.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Facilitated communication may be related to the
&lt;a href=&quot;https://metaist.com/blog/2010/06/ideomotor-effect.html&quot;&gt;Ideomotor Effect&lt;/a&gt; or the
&lt;a href=&quot;https://metaist.com/blog/2010/01/clever-hans-effect.html&quot;&gt;Clever Hans Effect&lt;/a&gt;.
This would go a long way to explaining the facilitator&#39;s denial of interference
as well as the subject&#39;s inability to answer questions to which the facilitator
does not know the answer (among other anomalies in this form of communication).&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/facilitated-communication.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=HXw8Ksvyt5Y&quot;&gt;Prisoners of Silence&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Google Video&lt;/span&gt;
for an hour-long &lt;span class=&quot;vcard org fn&quot;&gt;Frontline&lt;/span&gt;
documentary highlighting issues with facilitated communication.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20131015051032/http://www.dbskeptic.com/2009/12/06/facilitated-communication-and-rom-houben/&quot;&gt;Facilitated communication and Rom Houben&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Digital Bits Skeptic&lt;/span&gt;
for a more recent story.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Facilitated_communication&quot;&gt;Facilitated communication&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/facilitated-communication.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2013-03-07&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-07T17:12:00-05:00&quot;&gt;2013-03-07&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/07/facilitated-communication.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated link to &lt;cite&gt;Prisoners of Silence&lt;/cite&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Ideomotor Effect</title>
      <link href="https://metaist.com/blog/2010/06/ideomotor-effect.html"/>
      <id>tag:metaist.com,2010:blog.post-11e6c22415756c4fba3020092257e10ebc550a05</id>
      <published>Mon May 31 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon May 31 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/06/ideomotor-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Ideomotor_Effect&quot;&gt;ideomotor effect&lt;/a&gt; is a phenomenon in which people make unconscious movements.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-06-01-ideomotor-effect.jpg&quot; alt=&quot;Ouija Board&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Most Ouija boards don&#39;t move by themselves.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/scriptingnews/3418293087/&quot;&gt;Dave Winer&lt;/a&gt; at Flickr)&lt;/p&gt;
  &lt;/address&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/06/ideomotor-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The ideomotor effect is the result of &lt;em&gt;unconscious&lt;/em&gt; processing of external
stimuli. While much of the brain&#39;s functioning is unconscious, these reactions
manifest themselves physically (typically in movement).&lt;/p&gt;
&lt;p&gt;This is how &lt;a href=&quot;http://en.wikipedia.org/wiki/Ouija&quot;&gt;Ouija boards&lt;/a&gt; work. Participants touch a
&lt;a href=&quot;http://en.wikipedia.org/wiki/Planchette&quot;&gt;planchette&lt;/a&gt; and their brain, expecting a response (from the
dead, aliens, or Parker Brothers), which forces small (unconscious!) movements until
the piece moves.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More on this later.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/06/ideomotor-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Ideomotor_Effect&quot;&gt;Ideomotor&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for more information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20110526090735/http://www.dbskeptic.com/2009/06/12/the-ideomotor-effect/&quot;&gt;The ideomotor effect&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Digital Bits Skeptic&lt;/span&gt;
for a longer discussion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Take The Metaist 2010 Survey! [Closed]</title>
      <link href="https://metaist.com/blog/2010/05/take-metaist-2010-survey.html"/>
      <id>tag:metaist.com,2010:blog.post-7826013b434db5810d7624a6e36b32febd9d0dc9</id>
      <published>Thu May 27 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 27 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;request-updated-2010-06-11&quot; tabindex=&quot;-1&quot;&gt;Request &lt;small&gt;(Updated 2010-06-11)&lt;/small&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/take-metaist-2010-survey.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;In the past &lt;strong&gt;The Metaist&lt;/strong&gt; had &lt;em&gt;Feedback Friday&lt;/em&gt; as a routine way to get feedback
from you (dear reader). Over time (7 months), this became less of way to
solicit for ideas and more of a way to fill space without providing content, so
it was abandoned.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Nonetheless, getting feedback from the readership is important and following a
suggestion by reader &lt;strong&gt;Jeff Klein&lt;/strong&gt;, I&#39;m providing a small (4 question) survey
to assess our status. It should take less than 3 minutes to complete and will
be open until &lt;strong&gt;June 4th, 2010&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Please take this anonymous survey at your earliest convenience.&lt;/p&gt;
&lt;p&gt;Thanks,&lt;br&gt;
&lt;strong&gt;&lt;em&gt;The Metaist&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/take-metaist-2010-survey.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2010-06-11&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2010-06-11&quot;&gt;2010-06-11&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/take-metaist-2010-survey.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The survey is now closed. Thank you for your participation.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- iframe src=&quot;https://spreadsheets.google.com/embeddedform?formkey=dElkZHJiby1qMjA0U092ZHRsN3RwS0E6MQ&quot;
  width=&quot;450&quot; height=&quot;1100&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot;&gt;Loading...&lt;/iframe --&gt;
</content>
    </entry>
    <entry>
      <title>Reader Story: Circular Learning Management System</title>
      <link href="https://metaist.com/blog/2010/05/reader-story-circular-learning.html"/>
      <id>tag:metaist.com,2010:blog.post-232d3fa172da28d4997683e6ceed00ea955cea3e</id>
      <published>Wed May 26 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Wed May 26 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a submission by reader &lt;strong&gt;Jeffrey Klein&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-story-circular-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;http://en.wikipedia.org/wiki/Learning_management_system&quot;&gt;learning management system&lt;/a&gt; is a system for organizing electronic
delivery of courses. Some are so complicated you need a special course to learn
how to use them.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-05-27-reader-story-circular-learning.txt2pic.png&quot; alt=&quot;Basic Reading Skills&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  It&#39;s about 750 pages of dense single-spaced 12pt text. Reading is so easy!
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;https://metaist.com/static/img/2010-05-27-reader-story-circular-learning.txt2pic.png&quot;&gt;Metaist&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;story&quot; tabindex=&quot;-1&quot;&gt;Story &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-story-circular-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Imagine you are told you have to use a new internal learning management system
to complete your workplace training. Sounds simple enough. Yet, what if the
system was so &lt;a href=&quot;http://en.wikipedia.org/wiki/Usability&quot;&gt;complicated and hard to use&lt;/a&gt; that you needed to take a
course to learn how to use the system? Moreover, what happens when the course
that teaches you how to use the system is managed by the &lt;em&gt;&lt;strong&gt;very same system&lt;/strong&gt;&lt;/em&gt;?
A &lt;a href=&quot;http://en.wikipedia.org/wiki/Circular_reasoning&quot;&gt;logical implosion&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-story-circular-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://itodyaso.files.wordpress.com/2009/06/circular-reasoning-works-because.jpg?w=400&amp;amp;h=376&quot;&gt;Circular reasoning works&lt;/a&gt; because circular reasoning works. What experiences
have you had with trying to explain the issues with circular reasoning?&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Story text written by The Metaist with permission and licensed under
&lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0 Unported License&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-story-circular-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2010-06-18&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2010-06-18T18:43:18-04:00&quot;&gt;2010-06-18&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-story-circular-learning.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Replaced the &lt;code&gt;txt2pic&lt;/code&gt; image with a hand-drawn one.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Reader Question: How is yogurt made?</title>
      <link href="https://metaist.com/blog/2010/05/reader-question-how-is-yogurt-made.html"/>
      <id>tag:metaist.com,2010:blog.post-35ccdd437e9fc09c41dd7a5dd684df7003b47171</id>
      <published>Tue May 25 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Tue May 25 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is a response to a reader question.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;question&quot; tabindex=&quot;-1&quot;&gt;Question &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-question-how-is-yogurt-made.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot;&gt;
An anonymous six-year-old child of a reader asks: How is yogurt made?
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-05-26-reader-question-how-is-yogurt-made.jpg&quot; alt=&quot;Yogurt&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;If you look carefully, you can see an ear, nose, and beard in the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Rorschach_ink_blots&quot;&gt;Rorschach ink blot&lt;/a&gt;.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://en.wikipedia.org/wiki/File:Joghurt.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary-for-an-average-six-year-old&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;small&gt;(for an average six-year-old)&lt;/small&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-question-how-is-yogurt-made.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;small&gt;(Based on: &lt;a href=&quot;http://www.kididdles.com/lyrics/p003.html&quot;&gt;Peanut Butter and Jelly&lt;/a&gt;)&lt;/small&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First you take the milk and you heat it. &lt;em&gt;&lt;small&gt;(You heat it.)&lt;/small&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Then you take the milk and you cool it. &lt;em&gt;&lt;small&gt;(You cool it.)&lt;/small&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Then you take the bacteria and you add it. &lt;em&gt;&lt;small&gt;(You add it.)&lt;/small&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Then it gets &lt;a href=&quot;http://en.wikipedia.org/wiki/Fermentation_(food)&quot;&gt;fermented&lt;/a&gt;.
&lt;em&gt;&lt;small&gt;(Fermented.)&lt;/small&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;For your yogurt... white yogurt... and berries.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;explanation-for-a-smarter-six-year-old&quot; tabindex=&quot;-1&quot;&gt;Explanation &lt;small&gt;(for a smarter six-year-old)&lt;/small&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-question-how-is-yogurt-made.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yogurt is based on the Turkish words for &lt;em&gt;knead&lt;/em&gt; and &lt;em&gt;thick&lt;/em&gt; although in some
regions (e.g., Bulgaria) it is more like
&lt;a href=&quot;http://en.wikipedia.org/wiki/Sour_milk&quot;&gt;sour milk&lt;/a&gt; &lt;small&gt;(which ambiguously
refers to both milk that has soured and
&lt;a href=&quot;http://en.wikipedia.org/wiki/Buttermilk&quot;&gt;buttermilk&lt;/a&gt;)&lt;/small&gt;.&lt;/p&gt;
&lt;p&gt;The bacteria used in the fermentation process are
&lt;a href=&quot;http://en.wikipedia.org/wiki/Lactobacillus_delbrueckii_subsp._bulgaricus&quot;&gt;&lt;em&gt;Lactobacillus delbrueckii&lt;/em&gt; subsp. &lt;em&gt;bulgaricus&lt;/em&gt;&lt;/a&gt;
and &lt;a href=&quot;http://en.wikipedia.org/wiki/Streptococcus_salivarius_subsp._thermophilus&quot;&gt;&lt;em&gt;Streptococcus salivarius&lt;/em&gt; subsp. &lt;em&gt;thermophilus&lt;/em&gt;&lt;/a&gt;
which convert the &lt;a href=&quot;http://en.wikipedia.org/wiki/Lactose&quot;&gt;lactose&lt;/a&gt; into
&lt;a href=&quot;http://en.wikipedia.org/wiki/Lactic_acid&quot;&gt;lactic acid&lt;/a&gt; &lt;small&gt;(which is what
builds up on your muscles when you exercise, but
&lt;a href=&quot;http://en.wikipedia.org/wiki/Lactic_acid#Exercise_and_lactate&quot;&gt;doesn&#39;t degrade performance as previously thought&lt;/a&gt;)&lt;/small&gt;.&lt;/p&gt;
&lt;p&gt;Aside from the that the first summary captures the essence of the process.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-question-how-is-yogurt-made.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Yogurt&quot;&gt;Yogurt&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt; for more information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.hulu.com/watch/59977/burn-notice-jeffrey-donovan-on-yogurt-and-jiu-jitsu&quot;&gt;On Yogurt and Jiu-Jitsu&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Hulu&lt;/span&gt;
for a discussion of the relationship between yogurt and spying.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Cold War Continues in North Korea</title>
      <link href="https://metaist.com/blog/2010/05/cold-war-continues-in-north-korea.html"/>
      <id>tag:metaist.com,2010:blog.post-f72d21b643810a6c4d58ef4e354cf8f00d0c0144</id>
      <published>Mon May 24 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon May 24 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/cold-war-continues-in-north-korea.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/North_korea&quot;&gt;North Korea&lt;/a&gt; is an interesting
country that is largely (socially) isolated from the rest of the world.
&lt;a href=&quot;http://en.wikipedia.org/wiki/VBS.tv&quot;&gt;VBS&lt;/a&gt; Co-Founder Shane Smith managed to get
into the country during their increased allowance for tourists to watch the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Mass_Games&quot;&gt;Mass Games&lt;/a&gt; (the latest one was called
&amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Arirang_Festival&quot;&gt;Arirang&lt;/a&gt;&amp;quot;).&lt;/p&gt;
&lt;p&gt;The videos are long, but fascinating.&lt;br&gt;
Enjoy.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-05-25-cold-war-continues-in-north-korea.png&quot; alt=&quot;North Korea&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;https://www.youtube.com/watch?v=24R8JObNNQ4&quot;&gt;VBS&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;videos&quot; tabindex=&quot;-1&quot;&gt;Videos &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/cold-war-continues-in-north-korea.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=24R8JObNNQ4&quot;&gt;Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xw46Ll-Zy4s&quot;&gt;Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=3HJj85K_7MQ&quot;&gt;Part 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/cold-war-continues-in-north-korea.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-19&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-19T20:48:00-04:00&quot;&gt;2011-09-19 &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/cold-war-continues-in-north-korea.html&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Embedded videos replaced with links due to significantly slow load time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2012-12-05&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2012-12-05T20:59:00-05:00&quot;&gt;2012-12-05 &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/cold-war-continues-in-north-korea.html&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated links to videos.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Reader Review: The Checklist Manifesto</title>
      <link href="https://metaist.com/blog/2010/05/reader-review-checklist-manifesto.html"/>
      <id>tag:metaist.com,2010:blog.post-6e39e19cff5e11499172c476c31fc1e99ce3b215</id>
      <published>Sun May 23 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sun May 23 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>Josh Vogel</name>
      </author>
      <content type="html">&lt;figure class=&quot;cover&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Checklist-Manifesto-How-Things-Right/dp/0805091742&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-05-24-reader-review-checklist-manifesto.jpg&quot; alt=&quot;Checklist Manifesto&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://www.amazon.com/Checklist-Manifesto-How-Things-Right/dp/0805091742&quot;&gt;Amazon&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;This post was submitted by reader &lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/josh-vogel/2/40b/b&quot;&gt;Josh Vogel&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;review&quot; tabindex=&quot;-1&quot;&gt;Review &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/reader-review-checklist-manifesto.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Checklist-Manifesto-How-Things-Right/dp/0805091742&quot;&gt;The Checklist Manifesto&lt;/a&gt;, by &lt;a href=&quot;http://gawande.com/&quot;&gt;Atul Gawande&lt;/a&gt;, is a
manager&#39;s guide to making the professionals under his charge play at the top of
their game. Throughout the book, Gawande stresses that checklists have a place
in every business sector, from aviation, to finance, and, his main emphasis, in
the operating room of a hospital. He goes to great lengths to show the successes
checklist implementation has accomplished in often short periods of time.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Perhaps the most appealing part of this book is the points Gawande makes about
how a checklist is for everyone at every stage of their career. The need for
checklists, Gawande says, is especially true for those who have excelled in
their positions and feel that they are infallible and do not need to rely on
such checks during their normal work routines.&lt;/p&gt;
&lt;p&gt;The book further stress the point
that checklists are an inexpensive tool to implement that can result in large
rewards both physical and financial. Gawande also does an excellent job of
detailing how to correctly implement a checklist in a corporate/hospital
setting, promoting &lt;a href=&quot;http://en.wikipedia.org/wiki/Top-down&quot;&gt;top-down&lt;/a&gt; support of
the project and placing the responsibility for its use in the hands of those
least involved, (i.e. nurses, etc).&lt;/p&gt;
&lt;p&gt;Towards the end of the book, Gawande does become a little redundant in his
message. While he does cover it somewhat, more time could have been spent
reviewing the need for checklists in today&#39;s world, bringing more evidence for
failures that occur as a direct result of not having a checklist in place.
Nevertheless, Gawande&#39;s writing style is easy to read and eloquent, wasting no
words and making his points clear. Gawande is on to something and using his
ideas can produce dramatic results with little cost involved.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.linkedin.com/pub/josh-vogel/2/40b/b&quot;&gt;Josh Vogel&lt;/a&gt; is a Candidate for the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Master_of_Public_Health&quot;&gt;Master of Public Health&lt;/a&gt;
at &lt;a href=&quot;http://sph.bu.edu/&quot;&gt;Boston University School of Public Health&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Review text licensed under &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons Attribution 3.0 Unported License&lt;/a&gt;. Additional editing by The Metaist.&lt;/small&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Google Chrome is Fast</title>
      <link href="https://metaist.com/blog/2010/05/google-chrome-is-fast.html"/>
      <id>tag:metaist.com,2010:blog.post-21f906cf1cac2f96090598de26082dcf70450999</id>
      <published>Thu May 20 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu May 20 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/google-chrome-is-fast.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Google has a nice video demonstrating the speed of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_chrome&quot;&gt;Google Chrome&lt;/a&gt; web browser.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;figure markdown=&quot;1&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;340&quot; src=&quot;http://www.youtube.com/embed/nCgQDjiotG0?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=nCgQDjiotG0&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;And here&#39;s how they made that commercial...&lt;/em&gt;&lt;/p&gt;
&lt;figure markdown=&quot;1&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;340&quot; src=&quot;http://www.youtube.com/embed/_oarMXGq3gI?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=_oarMXGq3gI&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
    </entry>
    <entry>
      <title>Origin: Drink From a Fire Hose</title>
      <link href="https://metaist.com/blog/2010/05/origin-drink-from-fire-hose.html"/>
      <id>tag:metaist.com,2010:blog.post-9f0ba48c9635ce136499d5021d77e1cbd069e161</id>
      <published>Mon May 17 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Mon May 17 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/origin-drink-from-fire-hose.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;In 1991, a group of MIT students attached a fire hose to a water fountain thus
fulfilling former &lt;a href=&quot;http://en.wikipedia.org/wiki/Massachusetts_Institute_of_Technology&quot;&gt;MIT&lt;/a&gt;
President &lt;a href=&quot;http://en.wikipedia.org/wiki/Jerome_Wiesner&quot;&gt;Jerome Wiesner&#39;s&lt;/a&gt; notion
that getting an education from MIT was comparable to getting a drink from a fire
hose.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://hacks.mit.edu/Hacks/by_year/1991/fire_hydrant/&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-05-18-origin-drink-from-fire-hose.png&quot; alt=&quot;Firehose Drinking Fountain&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &quot;Getting an education from MIT is like trying to get a drink from a firehose.&quot;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://hacks.mit.edu/Hacks/by_year/1991/fire_hydrant/&quot;&gt;MIT Hacks&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/05/origin-drink-from-fire-hose.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://hacks.mit.edu/Hacks/by_year/1991/fire_hydrant/&quot;&gt;Fire Hose Drinking Fountain&lt;/a&gt;&lt;/cite&gt;
at MIT&#39;s &lt;cite&gt;Interesting Hacks To Fascinate People&lt;/cite&gt; Gallery
for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=OXc5ltzKq3Y&quot;&gt;Firehose&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for a famous scene in the 1989 film &lt;a href=&quot;http://www.imdb.com/title/tt0098546/&quot;&gt;UHF&lt;/a&gt;
during which &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Richards&quot;&gt;Michael Richards&lt;/a&gt;
provides a drink from a fire hose as a prize on a television show.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Fire_hose&quot;&gt;Fire hose&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for a description of the history and types of fire hoses.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Synthetic Happiness</title>
      <link href="https://metaist.com/blog/2010/04/synthetic-happiness.html"/>
      <id>tag:metaist.com,2010:blog.post-132be5ad28b60551988c97efb1d6e236cfa8dd0c</id>
      <published>Thu Apr 22 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Thu Apr 22 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/synthetic-happiness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.danielgilbert.com/&quot;&gt;Dan Gilbert&lt;/a&gt; has an interesting discussion about
ways in which our &amp;quot;&lt;em&gt;experience simulator&lt;/em&gt;&amp;quot; (aka
&lt;a href=&quot;http://en.wikipedia.org/wiki/Prefrontal_cortex&quot;&gt;prefrontal cortex&lt;/a&gt;) makes
mistakes—particularly in judging our future happiness.&lt;/p&gt;
&lt;/div&gt;
&lt;figure&gt;
&lt;iframe width=&quot;560&quot; height=&quot;340&quot; src=&quot;http://www.youtube.com/embed/LTO_dZUvbJA?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=LTO_dZUvbJA&quot;&gt;YouTube&lt;/a&gt; via TED)&lt;/p&gt;
&lt;/address&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/synthetic-happiness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gilbert highlights the notion of &lt;a href=&quot;http://en.wikipedia.org/wiki/Impact_bias&quot;&gt;Impact Bias&lt;/a&gt;:
&amp;quot;tendency for people to overestimate the length or the intensity of future
feeling states.&amp;quot; Example: both lottery winners and paraplegics feel about the
same level of happiness after a year.&lt;/p&gt;
&lt;p&gt;Why? Here are some reasons &amp;amp; insights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There is a sort of psychological
&lt;a href=&quot;http://en.wikipedia.org/wiki/Immune_system&quot;&gt;immune system&lt;/a&gt; that allows us
to &lt;em&gt;synthesize&lt;/em&gt; happiness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Despite our feeling that &amp;quot;natural happiness&amp;quot; (when we get what we want) is
somehow superior to &amp;quot;synthetic happiness&amp;quot; (when we don&#39;t get what we want)
they are both about the same in quality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Synthetic happiness &lt;em&gt;actually changes&lt;/em&gt; your intrinsic preferences and
outlook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Irreversible conditions promote synthetic happiness. However, people &lt;em&gt;think&lt;/em&gt;
they would prefer reversible decisions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/synthetic-happiness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ever catch yourself synthesizing happiness?&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/synthetic-happiness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2010-07-04&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2010-07-04&quot;&gt;2010-07-04&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/synthetic-happiness.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The idea for this post was incorrectly attributed. It was actually from a
post &lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20091026021840/http://www.getrichslowly.org/blog/2008/12/21/reader-survey-which-personal-finance-books-should-i-review/&quot;&gt;Reader Survey: Which Personal-Finance Books Should I Review?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;GetRichSlowly&lt;/span&gt;. I apologize for the
error.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Seedless Fruit</title>
      <link href="https://metaist.com/blog/2010/04/seedless-fruit.html"/>
      <id>tag:metaist.com,2010:blog.post-d60887db9cf2307265acfa8a50b08ccc745d3920</id>
      <published>Sat Apr 03 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</published>
      <updated>Sat Apr 03 2010 20:00:00 GMT-0400 (Eastern Daylight Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a submission by reader &lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/matthew-garland/8/a21/296&quot;&gt;Matthew Garland&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;fun-fact&quot; tabindex=&quot;-1&quot;&gt;Fun Fact &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/seedless-fruit.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The term &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Seedless_fruit&quot;&gt;seedless fruit&lt;/a&gt;&amp;quot; is a botanical
&lt;a href=&quot;http://en.wikipedia.org/wiki/Oxymoron&quot;&gt;contradiction in terms&lt;/a&gt; because &amp;quot;fruit&amp;quot;
are typically defined as having seeds.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-04-04-seedless-fruit.jpg&quot; alt=&quot;Seedless Watermelon&quot;&gt;&lt;/p&gt;
&lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/18185006@N00/2434456158/&quot;&gt;calliope1&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/seedless-fruit.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;According to &lt;a href=&quot;http://en.wikipedia.org/wiki/Seedless_fruit&quot;&gt;Wikipedia&lt;/a&gt;, seedless fruit are the result of either:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;fruit that develops unfertilized (&lt;a href=&quot;http://en.wikipedia.org/wiki/Parthenocarpy&quot;&gt;parthenocarpy&lt;/a&gt;), or&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;aborted ovules or embryos that didn&#39;t produce mature seeds
(&lt;a href=&quot;http://en.wikipedia.org/wiki/Stenospermocarpy&quot;&gt;stenospermocarpy&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The former gives us seedless cucumbers, the latter gives us seedless grapes and
watermelon.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/04/seedless-fruit.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Does anyone know if &lt;a href=&quot;http://en.wikipedia.org/wiki/Fruitarianism&quot;&gt;Fruitarians&lt;/a&gt;
are for or against the reproductive rights of fruit?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Review: Mint.com</title>
      <link href="https://metaist.com/blog/2010/03/review-mintcom.html"/>
      <id>tag:metaist.com,2010:blog.post-044344d5bb38d72a2f5dcecd574abfac231c7b5f</id>
      <published>Mon Mar 08 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 16:20:53 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.mint.com/&quot;&gt;Mint.com&lt;/a&gt; is a website for managing your bank accounts,
loans, and retirement funds. For the deeply paranoid, it&#39;s a conspiracy to
gather all of your banking information that is already available online in
another place online.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-03-09-review-mintcom.jpg&quot; alt=&quot;Mint leaves&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  It starts when you notice their cool green color and refreshing taste.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/stankuns/3250702132/&quot;&gt;Fernando Stankuns&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;review&quot; tabindex=&quot;-1&quot;&gt;Review &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mint.com is relatively new (since 2006), yet
&lt;a href=&quot;https://trends.google.com/trends/explore?date=now%201-d&amp;amp;q=%2Fm%2F03cj4p7,%2Fm%2F0cfzgk&amp;amp;hl=en-US&quot;&gt;amazingly popular&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As I see it the main benefits of Mint.com are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transactions&lt;/strong&gt; - All your transactions across all your accounts
&lt;small&gt;(almost; some banks aren&#39;t supported)&lt;/small&gt;. This includes things
like your checking, savings, CDs, credit cards, loans, and retirement
accounts. It&#39;s nice to be able to see them all together and categorize them
appropriately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Graphs&lt;/strong&gt; - Being able to easily make visual representations of your
spending or the trends of your retirement account is nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Notifications&lt;/strong&gt; - Mint can notify you about certain important financial
moments. For example, they can notify you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if your spending seems anomalous &lt;small&gt;(this takes a few months to
adjust)&lt;/small&gt;,&lt;/li&gt;
&lt;li&gt;when a large purchase clears, or&lt;/li&gt;
&lt;li&gt;when you are near your credit limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some downsides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strike&gt;&lt;strong&gt;Small Banks&lt;/strong&gt; - Even though many institutions are supported, some smaller (e.g., local banks) are not, and there&#39;s no way to manually import your data. (Although, they say it&#39;s coming &amp;quot;mid-march.&amp;quot;)&lt;/strike&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Privacy&lt;/strong&gt; - Mint has a &lt;a href=&quot;https://web.archive.org/web/20201203213724/https://mint.intuit.com/how-mint-works/security&quot;&gt;strong privacy policy&lt;/a&gt; and many implicitly trust its security model. Nonetheless, it&#39;s a little strange to trust one entity with all of your transaction history &lt;small&gt;(&lt;em&gt;&lt;em&gt;Cough&lt;/em&gt;&lt;/em&gt; Google)&lt;/small&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On balance, Mint helps people who are interested in their spending habits get a
larger picture of their income &amp;amp; expenses.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20201221003553/https://mint.intuit.com/blog/&quot;&gt;MintLife Blog&lt;/a&gt;&lt;/cite&gt;
for personal finance articles that occasionally feature high quality
&lt;a href=&quot;http://en.wikipedia.org/wiki/Infographics&quot;&gt;infographics&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Mint.com&quot;&gt;Mint.com&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for some other information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100308132737/http://techcrunch.com/2009/12/11/blippy/&quot;&gt;Want Everyone To See Your Credit Card Transactions?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;TechCrunch&lt;/span&gt;
for a discussion about &lt;span class=&quot;vcard org fn&quot;&gt;Blippy&lt;/span&gt;—a
twitter-like site that tells everyone what you&#39;re buying.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2010-03-30&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2010-03-30T18:52-00:00&quot;&gt;2010-03-30&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mint now allows the creation of &lt;a href=&quot;https://web.archive.org/web/20100402090643/http://satisfaction.mint.com/mint/topics/ability_to_manually_enter_transactions_now_available&quot;&gt;manual transactions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T20:17:43-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20101002232640/http://blog.precipice.org/why-wesabe-lost-to-mint&quot;&gt;Why Wesabe Lost to Mint&lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;Marc Hedlund&lt;/span&gt;
for an introspective article on how Mint surpassed Wesabe, a former competitor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2012-12-18&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-12-18T12:38-00:00&quot;&gt;2012-12-18&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Forgot to mention that mint supports lots of banks now; even small ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T21:14:47Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/03/review-mintcom.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sadly, &lt;a href=&quot;https://web.archive.org/web/20231115141619/https://www.theverge.com/2023/11/2/23943254/mint-intuit-shutting-down-credit-karma&quot;&gt;Mint is shutting down&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Disease Screening &amp; Base Rate Fallacy</title>
      <link href="https://metaist.com/blog/2010/02/disease-screening-base-rate-fallacy.html"/>
      <id>tag:metaist.com,2010:blog.post-c7aefc3f881ec19e0c7a1866850088067ce42d51</id>
      <published>Wed Feb 24 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Feb 24 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/disease-screening-base-rate-fallacy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Base_rate_fallacy&quot;&gt;base rate fallacy&lt;/a&gt; refers to the neglect of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Prior_probability&quot;&gt;prior probability&lt;/a&gt;
of the evidence that supports the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Conditional_probability&quot;&gt;conditional probability&lt;/a&gt;
of a hypothesis. &lt;small&gt;(Based on &lt;a href=&quot;http://en.wikipedia.org/wiki/Base_rate_fallacy&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-02-25-disease-screening-base-rate-fallacy.jpg&quot; alt=&quot;Needle in a haystack&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/mayaevening/138372058/in/photostream&quot;&gt;Amy&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/disease-screening-base-rate-fallacy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A recent example is the &lt;a href=&quot;http://www.nytimes.com/2009/11/19/health/19cancer.html&quot;&gt;controversy about breast cancer screenings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Imagine that about 1% of women (1 in 100) have breast cancer. You have a
diagnostic test that correctly detects cancer 85% of the time (i.e. if the test
is given to 100 women &lt;strong&gt;with cancer&lt;/strong&gt;, it catches 85, but misses 15 of them).&lt;/p&gt;
&lt;p&gt;Also, the test sometimes incorrectly detects cancer (when none is present) about
10% of the time (i.e. if the test is given to 100 women &lt;strong&gt;without cancer&lt;/strong&gt;, it
accidentally tells 10 of them they have cancer, but correctly tells the other 90
they don&#39;t have cancer).&lt;/p&gt;
&lt;p&gt;Now the tricky bit: Imagine we give the test to 1,000 women in the population.
If the test says a women has cancer, what is the probability she &lt;em&gt;actually&lt;/em&gt; has
cancer?&lt;/p&gt;
&lt;p&gt;This question is hard for many people (including doctors!) because it&#39;s hard to
make the trade-offs in our head about whether or not the test is accurate for
&lt;em&gt;this particular woman&lt;/em&gt;. Here&#39;s how you would do the calculation correctly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Based on the rate of cancer in the population (1%), how many of the 1,000
women tested do we expect to have cancer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; About 10.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of those 10 who have cancer, about 9 will be told they have cancer, and 1
will missed.
&lt;br&gt;&lt;small&gt;(Recall, the test only catches 85% of cancers.)&lt;/small&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now of the remaining 990 women who don&#39;t have cancer, about 99 of them will
be told they have cancer (10% false-alarm) while the rest (891) will be
correctly told they don&#39;t have cancer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So how many women are &lt;strong&gt;told&lt;/strong&gt; they have cancer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; 9 + 99 = 108.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How many of those women &lt;strong&gt;actually have&lt;/strong&gt; cancer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Just the 9.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So if you&#39;re told you have cancer, what&#39;s the chance you actually have
cancer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; 9 / 108 = 8.3%&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pretty strange, right? What about the people who are told they
&lt;strong&gt;don&#39;t have cancer&lt;/strong&gt;? What&#39;s the probability you actually &lt;em&gt;do&lt;/em&gt; have cancer?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;How many women are &lt;strong&gt;told&lt;/strong&gt; they &lt;em&gt;don&#39;t&lt;/em&gt; have cancer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; 1 + 891 = 892.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How many of those &lt;strong&gt;actually have&lt;/strong&gt; cancer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Just the 1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So if you&#39;re told you don&#39;t have cancer, what&#39;s the chance that you
actually &lt;em&gt;do&lt;/em&gt; have cancer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; 1 / 892 = 0.1%&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That means that it&#39;s pretty unlikely for you to have cancer if the test says you
don&#39;t.&lt;/p&gt;
&lt;p&gt;The reason this occurs is because the number of women who have breast cancer
&lt;em&gt;to begin with&lt;/em&gt; is not that high (10 of 1,000). Therefore, the mistakes the test
makes start to matter when applied to the entire population.&lt;/p&gt;
&lt;p&gt;Naturally, this has policy implications: if you test more and more people, a
large percentage of people will be told they have cancer when they don&#39;t—
leading to more invasive testing that has other real side-effects. The trick is
either to try to test a high-risk subpopulation (where the prevalence rate is
higher) or to improve the test by reducing its false-positive rate.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/disease-screening-base-rate-fallacy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100211135919/https://understandinguncertainty.org/node/238&quot;&gt;Screening for disease and dishonesty&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Understanding Uncertainty&lt;/span&gt;
for an excellent interactive representation of base rates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100820220942/https://uspreventiveservicestaskforce.org/uspstf/uspsbrca.htm&quot;&gt;Screening for Breast Cancer&lt;/a&gt;&lt;/cite&gt;
at the &lt;span class=&quot;vcard org fn&quot;&gt;U.S. Preventive Services Task Force&lt;/span&gt;
for a summary of its recommendations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20090608214008/http://www.bbsonline.org/Preprints/OldArchive/bbs.koehler.html&quot;&gt;The base rate fallacy reconsidered&lt;/a&gt;&lt;/cite&gt;
for a counter-argument about base rate neglect.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Review: The Autonomy of Mathematical Knowledge</title>
      <link href="https://metaist.com/blog/2010/02/review-autonomy-of-mathematical.html"/>
      <id>tag:metaist.com,2010:blog.post-6da71bbd9eada3927601db6092b3abd231fd89cc</id>
      <published>Tue Feb 23 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Feb 23 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;figure class=&quot;cover&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0761147489&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-02-24-review-autonomy-of-mathematical.jpg&quot; alt=&quot;The Autonomy of Mathematical Knowledge&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://www.amazon.com/gp/product/0761147489&quot;&gt;Amazon&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;review&quot; tabindex=&quot;-1&quot;&gt;Review &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/review-autonomy-of-mathematical.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.nd.edu/~cfranks/&quot;&gt;Curtis Franks&#39;&lt;/a&gt;
(&lt;em&gt;full disclosure:&lt;/em&gt; he&#39;s is a friend of mine) PhD-turned-book
&lt;a href=&quot;http://www.amazon.com/gp/product/0761147489&quot;&gt;Autonomy of Mathematics: Hilbert&#39;s Program Revisited&lt;/a&gt; is an exciting
new look at an overlooked aspect of early twentieth century mathematics. Franks&#39;
writing is crisp and engaging, as he paints the picture of a man and his
philosophy that so many have spurned.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-02-24-david-hilbert.jpg&quot; alt=&quot;David Hilbert&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  The face of a brilliant mathematician or of a sun-hat enthusiast.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Hilbert.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/review-autonomy-of-mathematical.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the 1920&#39;s, Hilbert
&lt;a href=&quot;http://en.wikipedia.org/wiki/Hilbert&#39;s_program&quot;&gt;launched a program&lt;/a&gt; that was
ostensibly aimed at solving the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Foundational_crisis_of_mathematics#Foundational_crisis&quot;&gt;foundational crisis of mathematics&lt;/a&gt;—the
issues of paradoxes (e.g., &lt;a href=&quot;https://metaist.com/blog/2009/11/russells-paradox.html&quot;&gt;Russell&#39;s paradox&lt;/a&gt;).
The traditional understanding is that Hilbert&#39;s program failed because
&lt;a href=&quot;http://en.wikipedia.org/wiki/G%C3%B6del&#39;s_incompleteness_theorems&quot;&gt;Gödel&#39;s incompleteness theorems&lt;/a&gt;
threw a monkey wrench into any sufficiently sophisticated system that tried to
prove itself.&lt;/p&gt;
&lt;p&gt;Franks&#39; thesis is that this is a narrow understanding of Hilbert&#39;s goals.
While Gödel&#39;s results did complicate certain endeavors, Franks&#39; suggests
that Hilbert was really trying to take back mathematics. That is, certain other
endeavors were trying to resolve the foundational crisis by rooting mathematics
in some &lt;em&gt;other&lt;/em&gt; discipline (e.g., philosophy). Hilbert&#39;s goal was to keep
mathematics strictly within the realm of mathematics—a unique feature of
the discipline.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;The Autonomy of Mathematical Knowledge&lt;/cite&gt; is admittedly not for
everyone (perhaps not even for me)—about 20% of the book involves theorems
I faithfully assume describe what the surrounding text tells me they do. Yet,
about 80% of the book is eminently accessible—the historical context, the
epistemic issues, and the attempt to reconstruct a neglected approach combine
for a great read.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/review-autonomy-of-mathematical.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/russells-paradox.html&quot;&gt;Russell&#39;s paradox&lt;/a&gt;&lt;/cite&gt;
for our discussion of that issue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html&quot;&gt;Computational Theory for Lawyers&lt;/a&gt;&lt;/cite&gt;
for our discussion of the issues of intensionality (discussed in the book;
not to be confused with &lt;a href=&quot;http://en.wikipedia.org/wiki/Intentionality&quot;&gt;intentionality&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Arnell Group &amp; PepsiCo</title>
      <link href="https://metaist.com/blog/2010/02/arnell-group-pepsico.html"/>
      <id>tag:metaist.com,2010:blog.post-d8df224bad6ed29c987dda23d8f9ca85770a43d5</id>
      <published>Mon Feb 22 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Feb 22 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/arnell-group-pepsico.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://arnell.com/&quot;&gt;Arnell Group&lt;/a&gt; is a design company famous for its work
with &lt;a href=&quot;http://www.dkny.com/&quot;&gt;DKNY&lt;/a&gt; and &lt;a href=&quot;http://www.bananarepublic.com/&quot;&gt;Banana Republic&lt;/a&gt;
(among many others). In the last several years, several of its high-profile
projects with &lt;a href=&quot;http://www.pepsico.com/&quot;&gt;PepsiCo&lt;/a&gt; have met with derision and
consumer outrage.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-02-23-arnell-group-pepsico.jpg&quot; alt=&quot;Notebook with clean paper&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Blank paper does not count towards the page count of a report.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/jacqueline-w/56107224/&quot;&gt;jacqueline-w&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/arnell-group-pepsico.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In 2008, an Arnell Group design document called &lt;cite&gt;Breathtaking&lt;/cite&gt; was
leaked to the public. The 27-page document was the point of much ridicule as its
contents attempt to explain how the proposed &lt;a href=&quot;http://pepsi.com/&quot;&gt;Pepsi&lt;/a&gt; logo was
the ultimate realization of thousands of years of good design. Gems include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;conformance with the &lt;a href=&quot;http://en.wikipedia.org/wiki/Golden_ratio&quot;&gt;golden ratio&lt;/a&gt;
(frequently used in the world of design) (p. 18) and detailed instructions
on how to construct the logo using the golden ratio spiral (p. 19)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;comparison of the logo to the Earth&#39;s
&lt;a href=&quot;http://en.wikipedia.org/wiki/Geodynamo&quot;&gt;geodynamo&lt;/a&gt; and
&lt;a href=&quot;http://en.wikipedia.org/wiki/Earth&#39;s_magnetic_field&quot;&gt;magnetic fields&lt;/a&gt; (p. 21)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a 5000+ year timeline of all the &amp;quot;authentic Constitution of Design&amp;quot;
(culminating with the Pepsi &amp;quot;Breathtaking&amp;quot; logo) (p. 6)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apparently, the new logo fulfills the destiny of good design in addition to
making Pepsi&#39;s logo
&lt;a href=&quot;http://industry.bnet.com/advertising/1000545/new-pepsi-logo-seems-similar-to-three-other-corporate-emblems/&quot;&gt;look similar to other modern logos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In 2009, the Arnell Group orchestrated the &lt;a href=&quot;http://www.tropicana.com&quot;&gt;Tropicana&lt;/a&gt;
&lt;a href=&quot;http://www.nytimes.com/2009/01/08/business/media/08adco.html&quot;&gt;orange juice package redesign&lt;/a&gt;.
&lt;small&gt;(Tropicana is owned by PepsiCo).&lt;/small&gt; The design met with
&lt;a href=&quot;http://www.nytimes.com/2009/02/23/business/media/23adcol.html?_r=2&amp;amp;pagewanted=all&quot;&gt;amazing backlash from consumers&lt;/a&gt;
(supposedly, there was a 20% drop in sales) and the existing iconic
straw-in-orange design was reinstated.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/arnell-group-pepsico.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What was your reaction when Pepsi changed its logo? What about Tropicana?
Other companies?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/arnell-group-pepsico.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20210307163647/https://usefullunacy.typepad.com/files/pepsi-gravitational-field.pdf&quot;&gt;Breathtaking Design Strategy&lt;/a&gt;&lt;/cite&gt;
for the original 27-page design document.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://industry.bnet.com/advertising/1000821/pepsis-nonsensical-logo-redesign-document-1-million-for-this/&quot;&gt;Pepsi&#39;s Nonsensical Logo Redesign Document: $1 Million for This?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;BNET&lt;/span&gt;
for a longer discussion about the &lt;span class=&quot;vcard org fn&quot;&gt;Pepsi&lt;/span&gt;
logo redesign.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://blogs.hbr.org/merholz/2009/02/tropicanas-marketing-folly.html&quot;&gt;Tropicana&#39;s Marketing Folly&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Harvard Business Review&lt;/span&gt;
for a discussion of how focus groups fail to provide and understanding of
advertising &lt;em&gt;in context&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Reader Question: Brushing &amp; Curling</title>
      <link href="https://metaist.com/blog/2010/02/reader-question-what-does-furious.html"/>
      <id>tag:metaist.com,2010:blog.post-f10c8df4c8ae5ae29333b48cf7a45f8ff0ad0911</id>
      <published>Sat Feb 20 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Feb 20 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is a response to a reader question.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;question&quot; tabindex=&quot;-1&quot;&gt;Question &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/reader-question-what-does-furious.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;An anonymous reader asks: What does the furious brushing in curling accomplish?&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-02-21-reader-question-what-does-furious.jpg&quot; alt=&quot;Curling stone&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  From the little I&#39;ve read, curling is a combination of darts and marbles.
  Sort of.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/andreassolberg/118362389/&quot;&gt;Andreas Solberg&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/reader-question-what-does-furious.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Curling&quot;&gt;Curling&lt;/a&gt; is a 400+ year-old sport about
which I know very little. Wikipedia saves the day again.&lt;/p&gt;
&lt;h2 id=&quot;explanation&quot; tabindex=&quot;-1&quot;&gt;Explanation &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/reader-question-what-does-furious.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Curling is played on level ice. However, droplets of water called &lt;em&gt;pebbles&lt;/em&gt; are
added which cause the &lt;em&gt;stone&lt;/em&gt; (pictured above) to &lt;em&gt;curl&lt;/em&gt; when it travels across
the ice. According to Wikipedia, sweeping accomplishes two goals: to increase
the distance the stone travels, and to change the amount of curl. The strategy
of sweeping seems to involve figuring out when to sweep and how hard to sweep
(apparently that has an effect on the amount of moisture created).&lt;/p&gt;
&lt;p&gt;Overall, the point of sweeping seems to be to influence the &lt;em&gt;curl&lt;/em&gt; of the
&lt;em&gt;stone&lt;/em&gt; by wearing down the &lt;em&gt;pebbles&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/reader-question-what-does-furious.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Do you know more about curling than I do? If so, please contact me so that I
can update this post appropriately.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/reader-question-what-does-furious.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100215131454/http://www.foxnews.com/scitech/2010/02/12/olympic-science-science-curling/&quot;&gt;Olympic Science: The Science of Curling&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Fox News&lt;/span&gt;
for a discussion of curling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://ask.metafilter.com/146458/Does-sweeping-in-curling-achieve-anything&quot;&gt;Does sweeping in curling achieve anything?&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Metafilter&lt;/span&gt;
for a bunch of people talking about sweeping in curling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://faraday.physics.utoronto.ca/GeneralInterest/Harrison/Flash/ClassMechanics/Curling/Curling.html&quot;&gt;The Physics of Curling&lt;/a&gt;&lt;/cite&gt;
at the &lt;span class=&quot;vcard org fn&quot;&gt;University of Toronto&lt;/span&gt; for an interactive description of how curling works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Curling&quot;&gt;Curling&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Zotero</title>
      <link href="https://metaist.com/blog/2010/02/zotero.html"/>
      <id>tag:metaist.com,2010:blog.post-f9b3793d6eb96e32f8f9ca0bd65e6f7a4e7b7d33</id>
      <published>Sat Feb 13 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Feb 13 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/zotero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.zotero.org/&quot;&gt;Zotero&lt;/a&gt; is an excellent way to organize, save, and
cite your research.&lt;/p&gt;
&lt;p&gt;In other words, magic.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-02-14-zotero.jpg&quot; alt=&quot;Library books on shelf&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/libraryriot/3040401076/&quot;&gt;Christopher Warren&lt;/a&gt; at Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/zotero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Zotero is plugin for &lt;a href=&quot;http://en.wikipedia.org/wiki/Firefox&quot;&gt;Firefox&lt;/a&gt; that
provides inline &lt;a href=&quot;http://en.wikipedia.org/wiki/Citation&quot;&gt;citation&lt;/a&gt; and
&lt;a href=&quot;http://en.wikipedia.org/wiki/Bibliography&quot;&gt;bibliography&lt;/a&gt; for many
different styles including &lt;a href=&quot;http://en.wikipedia.org/wiki/The_MLA_Style_Manual&quot;&gt;MLA&lt;/a&gt;,
&lt;a href=&quot;http://en.wikipedia.org/wiki/APA_style&quot;&gt;APA&lt;/a&gt;,
&lt;a href=&quot;http://en.wikipedia.org/wiki/IEEE_Style&quot;&gt;IEEE&lt;/a&gt; and many more.&lt;/p&gt;
&lt;p&gt;Zotero also provides plugins for
&lt;a href=&quot;http://en.wikipedia.org/wiki/Openoffice.org&quot;&gt;OpenOffice.org&lt;/a&gt; and
&lt;a href=&quot;http://en.wikipedia.org/wiki/Microsoft_Word&quot;&gt;Microsoft Word&lt;/a&gt;. One thing I
particularly like is its ability to store PDFs and extract
&lt;a href=&quot;http://en.wikipedia.org/wiki/Metadata&quot;&gt;metadata&lt;/a&gt;; it saves so much time and
lets you focus on continuing to do your research.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/zotero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What tools do you use to organize your research?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/zotero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.zotero.org/&quot;&gt;Zotero&lt;/a&gt; for the plugin and related resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/zotero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2010-02-24&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2010-02-24&quot;&gt;2010-02-24&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/zotero.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added link to Zotero.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2011-09-19&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-19T20:17:00-04:00&quot;&gt;2011-09-19&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/zotero.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Zotero now offers &lt;a href=&quot;http://www.zotero.org/support/3.0#zotero_standalone&quot;&gt;Zotero Standalone&lt;/a&gt;
which works without requiring Firefox (e.g., in Google Chrome).&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Shoes &amp; Gait</title>
      <link href="https://metaist.com/blog/2010/02/shoes-gait.html"/>
      <id>tag:metaist.com,2010:blog.post-e7b53d08d437fe6cbad6e6ee0a06180f8e638576</id>
      <published>Sat Feb 13 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Feb 13 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/shoes-gait.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;A study in the journal &lt;cite&gt;The Foot&lt;/cite&gt; showed that
&lt;a href=&quot;http://www.thefootjournal.com/article/S0958-2592(07)00053-3/abstract&quot;&gt;wearing shoes isn&#39;t that good for your feet&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;340&quot; src=&quot;http://www.youtube.com/embed/7jrnj-7YKZE?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;figcaption&gt;
    &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=7jrnj-7YKZE&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/shoes-gait.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Suppose you were shown the overwhelming evidence of the harm of shoes on
&lt;a href=&quot;http://en.wikipedia.org/wiki/Gait&quot;&gt;gait&lt;/a&gt;—how would you respond?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/02/shoes-gait.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.thefootjournal.com/article/S0958-2592(07)00053-3/abstract&quot;&gt;Shod versus unshod: The emergence of forefoot pathology in modern humans?&lt;/a&gt;&lt;/cite&gt;
for the abstract or the &lt;a href=&quot;http://www.profleeberger.com/files/YFOOT1001.pdf&quot;&gt;author&#39;s personal version&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.barefootscience.com/data/research/Ar05.pdf&quot;&gt;Why Shoes Make &amp;quot;Normal&amp;quot; Gait Impossible&lt;/a&gt;&lt;/cite&gt;
in &lt;cite&gt;Podiatry Management&lt;/cite&gt; for an older study.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://nymag.com/health/features/46213/&quot;&gt;You Walk Wrong&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;New York Magazine&lt;/span&gt;
for an article on the subject.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20230203034258/https://www.npr.org/2008/04/22/89830802/feet-hurt-stop-wearing-shoes&quot;&gt;Feet Hurt? Stop Wearing Shoes&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;NPR&lt;/span&gt;
for another article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Clever Hans Effect</title>
      <link href="https://metaist.com/blog/2010/01/clever-hans-effect.html"/>
      <id>tag:metaist.com,2010:blog.post-3b6431230982e97aaa50cdbb48358f585b4be813</id>
      <published>Sat Jan 23 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Jan 23 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/clever-hans-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Clever_hans&quot;&gt;Clever Hans&lt;/a&gt; was a horse that seemed
to be able to perform arithmetic and solve puzzles. However, after a formal 1907
investigation, it was shown that Hans was actually picking up on and responding
to subtle audience cues rather than solving problems.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-24-clever-hans-effect.jpg&quot; alt=&quot;Clever Hans&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Step right up! Come one, come all! See the amazing wonder horse!
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:CleverHans.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/clever-hans-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Clever_hans#The_Clever_Hans_effect&quot;&gt;Clever Hans Effect&lt;/a&gt;
is important because it exposes how some of our involuntary reactions influence
or cue others. This is why there are occasionally problems with
&lt;a href=&quot;http://en.wikipedia.org/wiki/Police_lineup&quot;&gt;police lineups&lt;/a&gt; or
&lt;a href=&quot;http://www.ipt-forensics.com/journal/volume1/j1_1_3.htm&quot;&gt;interrogation of children&lt;/a&gt;. It is also why use of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Double-blind_experiment&quot;&gt;double-blind experiments&lt;/a&gt;
is encouraged.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More on this later.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/clever-hans-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.ipt-forensics.com/journal/volume1/j1_1_3.htm&quot;&gt;Interrogation Of Children&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Institute for Psychological Therapies&lt;/span&gt;
for a lengthy discussion on the subject.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Observer-expectancy_effect&quot;&gt;Observer-expectancy effect&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for the general form of this issue.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>First Instinct Fallacy</title>
      <link href="https://metaist.com/blog/2010/01/first-instinct-fallacy.html"/>
      <id>tag:metaist.com,2010:blog.post-1e47fb7fd959f28747d998d73bf655fa13ba806e</id>
      <published>Thu Jan 21 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Jan 21 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/first-instinct-fallacy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Popular advice about taking
&lt;a href=&quot;http://en.wikipedia.org/wiki/Multiple_choice_test&quot;&gt;multiple-choice tests&lt;/a&gt;
is to stick with your first response because, you&#39;re more likely to switch from
a correct response to an incorrect one. However, many decades of research seem
to suggest otherwise.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-22-first-instinct-fallacy.jpg&quot; alt=&quot;Multiple choice exam&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Test of knowledge and ability to cope with proofreading errors!
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Quote &amp;amp; Photo: &lt;a href=&quot;http://www.flickr.com/photos/karen_d/3511415916/&quot;&gt;karen_d&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/first-instinct-fallacy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A study on &lt;a href=&quot;https://web.archive.org/web/20081203055340/http://psych.colorado.edu/~vanboven/teaching/p7536_heurbias/p7536_readings/kuger_1stinstinct.pdf&quot;&gt;strategies for multiple choice tests&lt;/a&gt; posed the following
question to students and teachers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When taking multiple-choice tests, it is sometimes the case that one answer
seems correct at first, but upon further reflection another answer seems
correct. As a general rule is it better to stick with your initial
&amp;quot;first instinct&amp;quot; - or to change your answer if another choice seems better?
In other words, which answer is probably more likely to be correct?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Many students and teachers thought that the first answer you choose is more
likely to be correct. Yet, the reality is quite different. Here is an excerpt of
the study&#39;s results regarding changed answers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;51% - &lt;strong&gt;wrong to right&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;25% - &lt;strong&gt;right to wrong&lt;/strong&gt;, and&lt;/li&gt;
&lt;li&gt;23% - &lt;strong&gt;wrong to wrong&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;small&gt;(&lt;em&gt;Percentages do not add up to 100% due to rounding errors.&lt;/em&gt;)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;The study goes on to show that the reason so many people &lt;em&gt;think&lt;/em&gt; that sticking
with your first answer is better is because of excessive
&lt;a href=&quot;http://en.wikipedia.org/wiki/Counterfactual_thinking&quot;&gt;counterfactual thinking&lt;/a&gt;.
That is, when you change answer from a correct response to an incorrect one, you
are more likely to think &amp;quot;if only I hadn&#39;t...&amp;quot; which is easier to recall in the
future.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/first-instinct-fallacy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20081203055340/http://psych.colorado.edu/~vanboven/teaching/p7536_heurbias/p7536_readings/kuger_1stinstinct.pdf&quot;&gt;Counterfactual Thinking and the First Instinct Fallacy&lt;/a&gt;&lt;/cite&gt;
for the full text of the study.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Cargo Cults</title>
      <link href="https://metaist.com/blog/2010/01/cargo-cults.html"/>
      <id>tag:metaist.com,2010:blog.post-20a69a714c73d5145ed236774727acf05cbe0fad</id>
      <published>Wed Jan 20 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Jan 20 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/cargo-cults.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;http://en.wikipedia.org/wiki/Cargo_cult&quot;&gt;cargo cult&lt;/a&gt; is a type of religious
practice that may appear in traditional tribal societies in the wake of
interaction with technologically advanced cultures.
&lt;small&gt;(Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Cargo_cult&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/qmlYe2KS0-Y?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=qmlYe2KS0-Y&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/cargo-cults.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cargo cults provide an interesting insight into the development of beliefs and
rituals. The concept of cargo cults
&lt;a href=&quot;http://en.wikipedia.org/wiki/Cargo_cult#Other_uses_of_the_term&quot;&gt;has been extended&lt;/a&gt;
to include any superficial copy that is disconnected from the underlying
workings.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/cargo-cults.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What are other examples of cargo cults?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/cargo-cults.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://www.lesswrong.com/posts/zY4pic7cwQpa9dnyk/detached-lever-fallacy&quot;&gt;Detached Lever Fallacy&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Less Wrong&lt;/span&gt; (formerly Overcoming Bias)
for a somewhat related discussion on
&lt;a href=&quot;http://en.wikipedia.org/wiki/Artificial_intelligence&quot;&gt;artificial intelligence&lt;/a&gt;
systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=YfSC6RDyVA0&quot;&gt;Tanna: John Frum Day Sulfa Bay&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for part of the annual ceremonies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=8CtC_qbQ51U&quot;&gt;Great Designers Steal&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for a discussion about a similar behavior among designers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Pentatonic Scale</title>
      <link href="https://metaist.com/blog/2010/01/pentatonic-scale.html"/>
      <id>tag:metaist.com,2010:blog.post-c4f4c058c4f8325d27ef6c982a80b711e4290eeb</id>
      <published>Tue Jan 19 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 19 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/pentatonic-scale.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Pentatonic_scale&quot;&gt;pentatonic scale&lt;/a&gt;
is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Scale_(music)&quot;&gt;musical scale&lt;/a&gt;
(i.e. group of notes) with five pitches. It appears in music worldwide and may
be related to how humans process music.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Enjoy!&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/ne6tB2KiZuk?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=ne6tB2KiZuk&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
    </entry>
    <entry>
      <title>Placebo Effect</title>
      <link href="https://metaist.com/blog/2010/01/placebo-effect.html"/>
      <id>tag:metaist.com,2010:blog.post-9c3fa1a8ec8aea5e5ad6640c85554ae0f08d5e62</id>
      <published>Mon Jan 18 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 18 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/placebo-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;http://en.wikipedia.org/wiki/Placebo&quot;&gt;placebo&lt;/a&gt; is a fake treatment.
The &lt;em&gt;placebo effect&lt;/em&gt; is the phenomenon whereby patients feel some benefit even
from placebo treatments.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-19-placebo-effect.jpg&quot; alt=&quot;Sugar crystals&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Sweet sugar crystals.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Sugar_2xmacro.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/placebo-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;vcard org fn&quot;&gt;Wired&lt;/span&gt; has an excellent article on the
&lt;a href=&quot;http://www.wired.com/medtech/drugs/magazine/17-09/ff_placebo_effect?currentPage=all&quot;&gt;increasing effectiveness of placebos&lt;/a&gt;. It seems that this increase is
correlated with the lifting of the ban on direct-to-consumer marketing of drugs
by the FDA in 1997.&lt;/p&gt;
&lt;p&gt;Other research is focused on determining how placebos work. In one study,
researchers were able to
&lt;a href=&quot;http://www.newscientist.com/article/dn17993-placebo-effect-caught-in-the-act-in-spinal-nerves.html&quot;&gt;see parts of the placebo effect in action in the spine&lt;/a&gt; by telling
participants that they were trying out a new painkilling cream against a
non-painkilling cream (both creams were inactive). While the exact mechanism
needs further investigation, this was the first step towards demonstrating the
participation of the spine in the placebo effect.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/placebo-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.wired.com/medtech/drugs/magazine/17-09/ff_placebo_effect?currentPage=all&quot;&gt;Placebos Are Getting More Effective&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wired&lt;/span&gt;
for the full article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.newscientist.com/article/dn17993-placebo-effect-caught-in-the-act-in-spinal-nerves.html&quot;&gt;Placebos trigger an opioid hit in the brain&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;New Scientist&lt;/span&gt;
for a brief discussion of the &lt;em&gt;real&lt;/em&gt; effects that placebos have
(i.e. generating chemicals in our bodies).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;The Dilute Homeopathy&lt;/a&gt;&lt;/cite&gt;
for an example of a very expensive placebo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/placebo-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T20:24:02-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/placebo-effect.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=Cb_6PPBJJB8&quot;&gt;The magic of the placebo&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;TED&lt;/span&gt;
for a video of a magician explaining the placebo effect and
using the same principle to perform a magic trick.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>fMRI &amp; False Positives</title>
      <link href="https://metaist.com/blog/2010/01/fmri-false-positives.html"/>
      <id>tag:metaist.com,2010:blog.post-6b091ffa7b5e614981fcdde495029e597f19d82b</id>
      <published>Sun Jan 17 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Jan 17 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a submission by reader
&lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/daniel-bitran/b/989/ba1&quot;&gt;Professor Daniel Bitran&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;definitions&quot; tabindex=&quot;-1&quot;&gt;Definitions &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/fmri-false-positives.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Fmri&quot;&gt;&lt;abbr title=&quot;Functional Magnetic Resonance Imaging&quot;&gt;fMRI&lt;/abbr&gt;&lt;/a&gt;
is a way of measuring blood-flow in the brain or spinal cord and,
by extension, neural activity in those areas. A
&lt;a href=&quot;http://en.wikipedia.org/wiki/Type_I_and_type_II_errors&quot;&gt;false positive&lt;/a&gt;
is the sort of mistake your smoke detector makes when it goes off,
but there&#39;s no smoke.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/fmri-false-positives.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Despite the widespread use of fMRI, a few false positives may result in inaccurate results.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-18-fmri-false-positives.png&quot; alt=&quot;Salmon FMRI&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  The fMRI is showing neural activity, but the salmon is definitely dead.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: Courtesy of &lt;a href=&quot;http://prefrontal.org/blog/2009/06/human-brain-mapping-2009-presentations/&quot;&gt;Prefrontal.org&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/fmri-false-positives.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The image above is striking because the false positives seem to show neural activity
in a dead salmon&#39;s brain. According to
&lt;a href=&quot;http://prefrontal.org/blog/2009/06/human-brain-mapping-2009-presentations/&quot;&gt;researchers at UCLA Santa Barbra&lt;/a&gt;,
these errors are due to a problem of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Multiple_comparisons&quot;&gt;multiple comparisons&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Imagine we&#39;re playing
&lt;a href=&quot;http://en.wikipedia.org/wiki/Sesame_Workshop&quot;&gt;One of These Things is not Like the Others&lt;/a&gt;
with several tin cans of Atlantic salmons. At first, it&#39;s hard to tell which one is not
like the others—there&#39;s a bunch of canned salmon. They have similar color,
weight, shape, etc. But as we add different ways of comparing the cans (or more cans
to compare), we increase the probability that there will be &lt;em&gt;some way&lt;/em&gt; in which one
of them differs from the rest—particularly because of small differences, say
manufacturing defects.&lt;/p&gt;
&lt;p&gt;[&lt;strong&gt;Note:&lt;/strong&gt; Corrections appreciated.] Now imagine we&#39;re collecting data for an fMRI.
Each each point (called a
&lt;a href=&quot;http://en.wikipedia.org/wiki/Voxel&quot;&gt;&lt;abbr title=&quot;volumetric pixel&quot;&gt;voxel&lt;/abbr&gt;&lt;/a&gt;)
is measured several times with certain extreme values discarded. Now we want to figure
out which of the voxels is not like the others—that&#39;s because that&#39;s where we expect
to see &lt;a href=&quot;http://en.wikipedia.org/wiki/Hemodynamic_response&quot;&gt;differences in blood flow&lt;/a&gt;.
However, by comparing voxels we&#39;re actually comparing multiple measurements of each voxel
to multiple measurements of other voxels. This is like adding more ways of comparing the
cans. Moreover, because there is a small bit of noise, the measurements for each voxel
can be slightly different each time. This is why we occasionally find &lt;em&gt;some difference&lt;/em&gt;
between neighboring voxels that isn&#39;t really there—it&#39;s a false positive.
Luckily there are ways of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Multiple_comparisons#Methods&quot;&gt;correcting for this sort of error&lt;/a&gt;,
but unfortunately, it is not applied as frequently as it should.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/fmri-false-positives.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What are other examples of widespread errors of multiple comparisons or false positives?&lt;/p&gt;
&lt;h2 id=&quot;acknowledgements&quot; tabindex=&quot;-1&quot;&gt;Acknowledgements &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/fmri-false-positives.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Thanks to &lt;strong&gt;&lt;a href=&quot;http://prefrontal.org/blog/about/&quot;&gt;Craig Bennett&lt;/a&gt;&lt;/strong&gt;
of &lt;span class=&quot;vcard org fn&quot;&gt;Prefrontal.org&lt;/span&gt;
for providing a high resolution version of the Atlantic salmon fMRI.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/fmri-false-positives.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://prefrontal.org/blog/2009/06/human-brain-mapping-2009-presentations/&quot;&gt;Human Brain Mapping 2009 – Presentations&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Prefrontal.org&lt;/span&gt;
for the conference posters &amp;amp; slides.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.uvm.edu/~dhowell/StatPages/More_Stuff/RepMeasMultComp/RepMeasMultComp.html&quot;&gt;Multiple Comparisons with Repeated Measures&lt;/a&gt;&lt;/cite&gt;
by &lt;span class=&quot;vcard fn&quot;&gt;David Howell&lt;/span&gt;
for a lengthy discussion on the subject.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;The Importance of Numeracy&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Dihydrogen Monoxide</title>
      <link href="https://metaist.com/blog/2010/01/dihydrogen-monoxide.html"/>
      <id>tag:metaist.com,2010:blog.post-dadc7b96ea2471aeaa8b5e6e19970d5a1781fa50</id>
      <published>Sat Jan 16 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Jan 16 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dihydrogen-monoxide.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.dhmo.org/msdsdhmo.html&quot;&gt;Dihydrogen monoxide&lt;/a&gt; is the name
given to a &amp;quot;colorless and odorless chemical compound&amp;quot; that is pervasive
in the environment. It&#39;s also a fancy-pants way of saying water.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-17-dihydrogen-monoxide.jpg&quot; alt=&quot;Dihydrogen monoxide&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Dihydrogen monoxide is everywhere!
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Water_splashes_001.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dihydrogen-monoxide.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In 1997, the &lt;a href=&quot;http://en.wikipedia.org/wiki/DHMO&quot;&gt;DHMO hoax&lt;/a&gt; was revived by
14-year-old Nathan Zohner who brought it to the public&#39;s attention. Zohner petitioned
to get DHMO banned as the basis of his science project, titled &amp;quot;How Gullible Are We?&amp;quot;
Many people were very gullible, and this hoax occasionally comes back to haunt
politicians.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dihydrogen-monoxide.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;amp;objectid=10463579&quot;&gt;MP tries to ban water&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The New Zealand Herald&lt;/span&gt;
for an example of an official who fell for the hoax.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.snopes.com/science/dhmo.asp&quot;&gt;Dihydrogen Monoxide&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Snopes&lt;/span&gt;
for the email that was circulated on this subject.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Conference: Biological Foundations of Morality</title>
      <link href="https://metaist.com/blog/2010/01/conference-biological-foundations-of.html"/>
      <id>tag:metaist.com,2010:blog.post-d812e097cc651a187e965cdf2f5ca0290cc2c05c</id>
      <published>Thu Jan 14 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Jan 14 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is based on a submission by reader
&lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/daniel-bitran/b/989/ba1&quot;&gt;Professor Daniel Bitran&lt;/a&gt;&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;announcement&quot; tabindex=&quot;-1&quot;&gt;Announcement &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/conference-biological-foundations-of.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From the &lt;a href=&quot;http://academics.holycross.edu/crec/events/conferences/neuroscience&quot;&gt;conference event page&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How does what we are learning about the brain through &lt;a href=&quot;http://en.wikipedia.org/wiki/Neuroscience&quot;&gt;neuroscience&lt;/a&gt;
and &lt;a href=&quot;http://en.wikipedia.org/wiki/Evolutionary_psychology&quot;&gt;evolutionary science&lt;/a&gt;
influence how we ought to think about &lt;a href=&quot;http://en.wikipedia.org/wiki/Ethics&quot;&gt;ethics&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Recent advances in &lt;a href=&quot;http://en.wikipedia.org/wiki/Functional_neuroimaging&quot;&gt;functional neuroimaging&lt;/a&gt;
have increased scientists&#39; understanding of how our brains process &lt;a href=&quot;http://en.wikipedia.org/wiki/Morality&quot;&gt;moral decisions&lt;/a&gt;.
Some thinkers suggest that moral decision making is fundamentally an intuitive
or emotional process, and that what we call &amp;quot;reason&amp;quot; is a post-decision making
method of justification for actions, not a &amp;quot;higher order&amp;quot; process for
&lt;a href=&quot;http://en.wikipedia.org/wiki/Decision_making&quot;&gt;making decisions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If so, the new science challenges the &lt;a href=&quot;http://en.wikipedia.org/wiki/Free_will&quot;&gt;principle of free will&lt;/a&gt;,
the argument that reason is the foundation of moral decision making, and the
importance of understanding &lt;a href=&quot;http://en.wikipedia.org/wiki/Intention&quot;&gt;intentions&lt;/a&gt;
before judging responsibility for action. The potential implications for most
Western ethical traditions are enormous.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;small&gt;(Formatting added by The Metaist.)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;The conference is Thursday-Friday, &lt;strong&gt;March 18-19, 2010&lt;/strong&gt; at
&lt;a href=&quot;http://www.holycross.edu/&quot;&gt;College of the Holy Cross&lt;/a&gt; in
&lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;q=1+College+St,+Worcester,+Massachusetts+01610&amp;amp;sll=42.240655,-71.809044&amp;amp;sspn=0.044289,0.035148&amp;amp;ie=UTF8&amp;amp;cd=2&amp;amp;geocode=FZiFhAIdHUy4-w&amp;amp;split=0&amp;amp;hq=&amp;amp;hnear=1+College+St,+Worcester,+Massachusetts+01610&amp;amp;ll=42.237081,-71.806791&amp;amp;spn=0.011073,0.012875&amp;amp;z=17&quot;&gt;Worcester, MA&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/conference-biological-foundations-of.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://academics.holycross.edu/crec/events/conferences/neuroscience&quot;&gt;Conference page&lt;/a&gt;
for a list of speakers and recordings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/12/thinking-about-other-peoples-thoughts.html&quot;&gt;Thinking About Other People&#39;s Thoughts&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/conference-biological-foundations-of.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T20:06:00-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/conference-biological-foundations-of.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated links to conference.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Mindless Ginkgo</title>
      <link href="https://metaist.com/blog/2010/01/mindless-ginkgo.html"/>
      <id>tag:metaist.com,2010:blog.post-71d3da998003368c23deabac46e462295f8e2922</id>
      <published>Wed Jan 13 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Jan 13 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/mindless-ginkgo.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Ginko_biloba&quot;&gt;Ginkgo biloba&lt;/a&gt; is a species of tree that is claimed to help prevent &lt;a href=&quot;http://en.wikipedia.org/wiki/Memory_loss&quot;&gt;memory loss&lt;/a&gt;, reverse the effects of &lt;a href=&quot;http://en.wikipedia.org/wiki/Dementia&quot;&gt;dementia&lt;/a&gt;, and prevent the onset of &lt;a href=&quot;http://en.wikipedia.org/wiki/Alzheimer&#39;s_Disease&quot;&gt;Alzheimer&#39;s&lt;/a&gt;. A &lt;a href=&quot;http://jama.ama-assn.org/cgi/content/abstract/302/24/2663&quot;&gt;recent study&lt;/a&gt; showed no such effects.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-14-mindless-ginkgo.jpg&quot; alt=&quot;Gingko biloba&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/kcm76/1580382469/&quot;&gt;kcm76&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/mindless-ginkgo.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The study was the latest product of the
&lt;a href=&quot;http://nccam.nih.gov/&quot;&gt;National Center for Complementary and Alternative Medicine&lt;/a&gt;
(NCCAM)—an organization that uses taxpayer money to design excellent
studies to demonstrate the worthlessness of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Alternative_medicine&quot;&gt;alternative medicines&lt;/a&gt;
(such as &lt;a href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;homeopathy&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This particular study is impressive:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[The study is a] randomized, double-blind, placebo-controlled clinical trial
of 3069 community-dwelling participants aged 72 to 96 years, conducted in 6
academic medical centers in the United States between 2000 and 2008, with a
median follow-up of 6.1 years.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Their conclusion: &amp;quot;Annual rates of decline in z scores &lt;strong&gt;did not differ between
&lt;em&gt;G. biloba&lt;/em&gt; and placebo groups&lt;/strong&gt; in any domains...&amp;quot; (emphasis added).
Which domains did they test? Among them were memory, attention,
&lt;a href=&quot;http://en.wikipedia.org/wiki/Visuospatial&quot;&gt;visuospatial abilities&lt;/a&gt;, and
language.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/mindless-ginkgo.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.sciencebasedmedicine.org/?p=3235&quot;&gt;Ginkgo biloba – No Effect&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard fn org&quot;&gt;Science-Based Medicine&lt;/span&gt;
where &lt;span class=&quot;vcard fn&quot;&gt;Steven Novella&lt;/span&gt;
points out that some of the effects of supplements (e.g., blood thinning)
may pose unnecessary risks (e.g., patients undergoing surgery).&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Dilute Homeopathy</title>
      <link href="https://metaist.com/blog/2010/01/dilute-homeopathy.html"/>
      <id>tag:metaist.com,2010:blog.post-abc0dfeace18e4496ed6f237466d053879ce7e62</id>
      <published>Tue Jan 12 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Jan 12 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Homeopathy&quot;&gt;Homeopathy&lt;/a&gt; refers to treatment of
symptoms by extremely diluted versions of poisons that are thought to create
those symptoms. I&#39;ll defer to
&lt;a href=&quot;https://metaist.com/blog/2010/01/amazing-randi.html&quot;&gt;The Amazing Randi&lt;/a&gt; for a nice
explanation of why that doesn&#39;t make any sense.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;340&quot; src=&quot;http://www.youtube.com/embed/BWE1tH93G9U?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=BWE1tH93G9U&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My favorite part: &amp;quot;Non habit-forming.&amp;quot; Except for the people who have a habit of
buying homeopathic &amp;quot;remedies.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Mole_(unit)&quot;&gt;Mole&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard fn org&quot;&gt;Wikipedia&lt;/span&gt;
for the unit of substance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Avogadro_constant&quot;&gt;Avogadro&#39;s constant&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard fn org&quot;&gt;Wikipedia&lt;/span&gt;
for the number of atoms or molecules in a mole.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T20:27:00-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated video link.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Perceptive Lintgen</title>
      <link href="https://metaist.com/blog/2010/01/perceptive-lintgen.html"/>
      <id>tag:metaist.com,2010:blog.post-543f440bbba16e4ea0d2a40f0c16b03a4bc32008</id>
      <published>Mon Jan 11 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 11 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/perceptive-lintgen.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;In 1982, &lt;a href=&quot;http://en.wikipedia.org/wiki/Arthur_Lintgen&quot;&gt;Arthur Lintgen&lt;/a&gt;
demonstrated conclusively that he is able to identify many classical
&lt;a href=&quot;http://en.wikipedia.org/wiki/Phonograph_record&quot;&gt;phonograph records&lt;/a&gt;,
by simply looking at them.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-12-perceptive-lintgen.jpg&quot; alt=&quot;Spinning vinyl&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/smileitsshan/4182544625/&quot;&gt;Shannon&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/perceptive-lintgen.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lintgen never claimed to have any kind of supernatural powers or that he can
read individual notes off of records; he just used his vast knowledge of
classical music and phonograph construction to determine, for example, out how
many movements there are and their relative duration and loudness. His skills
are limited to orchestral music from Beethoven onwards.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/perceptive-lintgen.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I have told this story in the past (as recently as 12 days ago), I made two
errors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I was told that he used his fingernail to play the record very quietly and
identified it aurally, rather than visually. This was not the case.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was told that he was going to be paid the
&lt;a href=&quot;http://www.randi.org/site/index.php/1m-challenge.html&quot;&gt;JREF award&lt;/a&gt;, but,
out of a moral sense, confessed to his true methods. This, too, was not the
case; he never claimed to have any paranormal abilities; just abnormal
abilities.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;acknowledgements&quot; tabindex=&quot;-1&quot;&gt;Acknowledgements &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/perceptive-lintgen.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Two thanks to reader
&lt;strong&gt;&lt;a href=&quot;http://www.linkedin.com/pub/matthew-garland/8/a21/296&quot;&gt;Matthew Garland&lt;/a&gt;&lt;/strong&gt;:
once, for knowing the correct version of the story; and again, for making me to
look it up so that I could discover my mistakes. &lt;em&gt;Thanks and thanks!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/perceptive-lintgen.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://skepdic.com/vinylvision.html&quot;&gt;Vinyl Vision&lt;/a&gt;&lt;/cite&gt;
at the &lt;span class=&quot;vcard org fn&quot;&gt;Skeptic&#39;s Dictionary&lt;/span&gt;
for a longer discussion of Lintgen&#39;s methods.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.snopes.com/music/media/reader.asp&quot;&gt;The Record Reader&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Snopes&lt;/span&gt;
for links to other articles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>The Deceptive Hydrick</title>
      <link href="https://metaist.com/blog/2010/01/deceptive-hydrick.html"/>
      <id>tag:metaist.com,2010:blog.post-238910678759c925ad4c1c8ea634cf78a690a52c</id>
      <published>Sun Jan 10 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Jan 10 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/deceptive-hydrick.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/James_Hydrick&quot;&gt;James Hydrick&lt;/a&gt; was a performer in
the 1980s who claimed to have psychic powers. It turns out he was just blowing
on things very carefully.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-11-deceptive-hydrick.jpg&quot; alt=&quot;Packing peanuts&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; Heating &lt;a href=&quot;http://en.wikipedia.org/wiki/Packing_peanuts&quot;&gt;packing peanuts&lt;/a&gt;
may generate &lt;a href=&quot;http://en.wikipedia.org/wiki/Static_electricity&quot;&gt;static electricity&lt;/a&gt;.
Or not.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/cavale/4054665389/&quot;&gt;cavale&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/deceptive-hydrick.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hydrick had a cult following in early 1980s after appearing on several
television shows where he demonstrated his &amp;quot;psychic powers&amp;quot; by
&lt;a href=&quot;http://www.youtube.com/watch?v=9cS6DjeBz7g#t=4m35s&quot;&gt;moving a pencil on the edge of a table&lt;/a&gt;,
&lt;a href=&quot;http://www.youtube.com/watch?v=9cS6DjeBz7g#t=5m48s&quot;&gt;flipping pages of a telephone book&lt;/a&gt;,
and making dollar bills spin under a fish tank. &lt;small&gt;(Amazing, right?)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;James Randi &lt;a href=&quot;http://www.youtube.com/watch?v=7CASghTzNhc#t=2m28s&quot;&gt;challenged Hydrick&lt;/a&gt;
on &lt;cite&gt;That&#39;s My Line&lt;/cite&gt; hosted by Bob Barker.
&lt;a href=&quot;http://www.youtube.com/watch?v=9cS6DjeBz7g#t=6m47s&quot;&gt;According to Randi&lt;/a&gt;,
Hydrick took about 25 minutes to do the page flipping trick, and 45 minutes
under Randi&#39;s &lt;a href=&quot;http://www.youtube.com/watch?v=7CASghTzNhc#t=2m28s&quot;&gt;Styrofoam conditions&lt;/a&gt;
before giving up.&lt;/p&gt;
&lt;p&gt;In 1981, journalist (and former magician) Dan Korem managed to convince
Hydrick that he, too, had psychic abilities, and then eventually
&lt;a href=&quot;http://www.youtube.com/watch?v=pJG5OaoKU2I&quot;&gt;elicited a confession&lt;/a&gt; that
Hydrick was just full of air.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Amazing Randi</title>
      <link href="https://metaist.com/blog/2010/01/amazing-randi.html"/>
      <id>tag:metaist.com,2010:blog.post-c60227f21572dc14d23853ca639c6803074805b4</id>
      <published>Sat Jan 09 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Jan 09 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/amazing-randi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/James_Randi&quot;&gt;James Randi&lt;/a&gt; is a former magician
turned skeptic who is known for his challenges of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Pseudoscience&quot;&gt;pseudoscience&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-10-amazing-randi.jpg&quot; alt=&quot;James Randi&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:RANDI.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/amazing-randi.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;James Randi is the founder of the
&lt;a href=&quot;http://en.wikipedia.org/wiki/James_Randi_Educational_Foundation&quot;&gt;James Randi Educational Foundation&lt;/a&gt; (JREF)—an
organization that claims to be &amp;quot;an educational resource on the paranormal,
pseudoscientific, and the supernatural.&amp;quot; JREF also has a
&lt;a href=&quot;http://www.randi.org/site/index.php/1m-challenge.html&quot;&gt;$1 million dollar challenge&lt;/a&gt;
for concrete evidence, in the form of a mutually-accepted test procedure, of
paranormal or supernatural powers. No one has ever won
&lt;a href=&quot;http://www.randi.org/challenge/goldmansachs.pdf&quot;&gt;the prize&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More on this later.&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Split-brain</title>
      <link href="https://metaist.com/blog/2010/01/split-brain.html"/>
      <id>tag:metaist.com,2010:blog.post-36d81d23f5cbf083a69c149b59dbd1d31d5c2c0e</id>
      <published>Thu Jan 07 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Jan 07 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/split-brain.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Split_brain&quot;&gt;Split-brain&lt;/a&gt; is when the two
hemispheres of the brain (left &amp;amp; right) are not connected. This is often due to
surgery in which the &lt;a href=&quot;http://en.wikipedia.org/wiki/Corpus_callosum&quot;&gt;corpus callosum&lt;/a&gt;
is severed to avoid the spread of &lt;a href=&quot;http://en.wikipedia.org/wiki/Epileptic_seizures&quot;&gt;epileptic seizures&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/lfGwsAdS9Dc?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=lfGwsAdS9Dc&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/split-brain.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One might think that severing all of the connections between the two hemispheres
would lead to significant impairment of functioning, yet the two halves continue
to communicate—just outside of the body (e.g., writing, talking,
pointing).&lt;/p&gt;
&lt;p&gt;There have been cases, however, in which patients
&lt;a href=&quot;http://www.psywww.com/intropsych/ch02_human_nervous_system/split-brain_operation.html&quot;&gt;behave as though they have two personalities&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Case 1...would sometimes find himself pulling his pants down with one hand and
pulling them up with the other. Once, he grabbed his wife with his left hand
and shook her violently, with the right hand trying to come to his wife&#39;s aid
in bringing the left belligerent hand under control. Once, while I was playing
horseshoes with the patient in his backyard, he happened to pick up an ax with
his left hand. Because it was entirely likely that the more aggressive right
hemisphere might be in control, I discretely left the scene-not wanting to be
the victim for the test case of which half-brain does society punish or
execute. (Gazzaniga 1970, p.107)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wouldn&#39;t want to be the test case either.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Inattentional Blindness</title>
      <link href="https://metaist.com/blog/2010/01/inattentional-blindness.html"/>
      <id>tag:metaist.com,2010:blog.post-5b90f5526d5dff95b35ec0eae04e6a22c9f6a483</id>
      <published>Wed Jan 06 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Jan 06 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/inattentional-blindness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Inattentional_blindness&quot;&gt;Inattentional blindness&lt;/a&gt;
is an explanation for our inability to see certain changes that are usually
considered obvious.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/38XO7ac9eSs?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=38XO7ac9eSs&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/inattentional-blindness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Derren_Brown&quot;&gt;Derren Brown&lt;/a&gt; has demonstrated this
effect with &lt;a href=&quot;http://www.youtube.com/watch?v=vBPG_OBgTWg#t=2m15s&quot;&gt;different races, accents, and even genders&lt;/a&gt;!
While the original studies had a fail rate of 75%, Brown&#39;s informal study had
about a 50% fail rate.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/inattentional-blindness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Think of all the things we don&#39;t notice. Did you notice that in the first video
the color of the presenter&#39;s shirt changed?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/inattentional-blindness.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=vBPG_OBgTWg&quot;&gt;Person Swap&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for &lt;span class=&quot;vcard fn&quot;&gt;Derren Brown&lt;/span&gt;&#39;s version of this experiment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://well.blogs.nytimes.com/2009/10/22/what-clown-on-a-unicycle-studying-cell-phone-distraction/&quot;&gt;What Clown on a Unicycle? Studying Cellphone Distraction&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The New York Times&lt;/span&gt;
for a discussion about a similar phenomenon.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Wireless Electricity</title>
      <link href="https://metaist.com/blog/2010/01/wireless-electricity.html"/>
      <id>tag:metaist.com,2010:blog.post-ca3cb85c3202330b2f8a2236805bef4f2b9e32e2</id>
      <published>Tue Jan 05 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/wireless-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Wires are commonly associated with electricity. It is surprising, therefore,
that people thought electricity would never be adopted widely if wires were
required. Yet it was adopted, but we&#39;ve only recently started to shed the wires.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/y1GqNN2Xe7g?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=y1GqNN2Xe7g&quot;&gt;YouTube&lt;/a&gt; via TED)&lt;/p&gt;
&lt;/address&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/wireless-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Earlier efforts focused on charging pads such by &lt;a href=&quot;https://web.archive.org/web/20100106234427/http://www.shoppureenergy.com/&quot;&gt;PureEnergy&lt;/a&gt; and &lt;a href=&quot;https://web.archive.org/web/20090130045419/http://www.splashpower.com:80/&quot;&gt;SlashPower&lt;/a&gt;. The cleverness of MIT&#39;s technique is that it combines &lt;a href=&quot;https://metaist.com/blog/2010/01/electromagnetic-induction.html&quot;&gt;induction&lt;/a&gt; with &lt;a href=&quot;https://metaist.com/blog/2010/01/resonance.html&quot;&gt;resonance&lt;/a&gt; to achieve power at larger distances. That is, the resonance allows more of the power to be transmitted via induction to the receiver.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/wireless-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What are other potential uses of wireless electricity?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Electromagnetic Induction</title>
      <link href="https://metaist.com/blog/2010/01/electromagnetic-induction.html"/>
      <id>tag:metaist.com,2010:blog.post-801d3ab73d5cf469c1104c731933d5bcf5b1f01d</id>
      <published>Mon Jan 04 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Jan 04 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/electromagnetic-induction.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;From Wikipedia:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Electromagnetic_induction&quot;&gt;Electromagnetic induction&lt;/a&gt;
is the production of &lt;a href=&quot;http://en.wikipedia.org/wiki/Voltage&quot;&gt;voltage&lt;/a&gt; across a
&lt;a href=&quot;http://en.wikipedia.org/wiki/Electrical_conductor&quot;&gt;conductor&lt;/a&gt; situated in a
changing &lt;a href=&quot;http://en.wikipedia.org/wiki/Magnetic_field&quot;&gt;magnetic field&lt;/a&gt; or a
conductor moving through a stationary magnetic field.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, magic.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-05-electromagnetic-induction.jpg&quot; alt=&quot;Inductor&quot;&gt;&lt;/p&gt;
&lt;figcaption markdown=&quot;1&quot;&gt;
&lt;p&gt;One &lt;a href=&quot;http://en.wikipedia.org/wiki/Toroid&quot;&gt;toroid&lt;/a&gt; to rule them all. Or not.&lt;/p&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Toroidal_inductor.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/electromagnetic-induction.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Induction is the principle behind
&lt;a href=&quot;http://en.wikipedia.org/wiki/Electrical_generator&quot;&gt;generating electricity&lt;/a&gt;,
&lt;a href=&quot;http://en.wikipedia.org/wiki/Electric_motor&quot;&gt;most electrical motors&lt;/a&gt;, and some
&lt;a href=&quot;http://www.wikihow.com/Trigger-Green-Traffic-Lights&quot;&gt;&amp;quot;smart&amp;quot; traffic lights&lt;/a&gt;.
It&#39;s also how that &lt;a href=&quot;http://en.wikipedia.org/wiki/Induction_Sealing&quot;&gt;little bit of foil gets attached&lt;/a&gt;
to pill bottles and other containers.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More on this later.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/electromagnetic-induction.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=VPxdl1zpcC8&quot;&gt;Concepts in Science: Electromagnetic Induction&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for an 80&#39;s video that&#39;s long, but informative.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Resonance</title>
      <link href="https://metaist.com/blog/2010/01/resonance.html"/>
      <id>tag:metaist.com,2010:blog.post-eb2bf2873576c8f094fecc82a2fcc56b95ffb52b</id>
      <published>Sun Jan 03 2010 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Jan 03 2010 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/resonance.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Resonance&quot;&gt;Resonance&lt;/a&gt; refers to a tendency of a
system to oscillate more at certain frequencies than at others. Those
frequencies are known as resonant frequencies.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2010-01-04-resonance.jpg&quot; alt=&quot;Broken wine glass&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/stevenduong/4081192022/in/photostream/&quot;&gt;Steven Duong&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/resonance.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An excellent example of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Acoustic_resonance&quot;&gt;acoustic resonance&lt;/a&gt; is
&lt;a href=&quot;http://www.youtube.com/watch?v=17tqXgvCN0E#t=33s&quot;&gt;shattering a wine glass with sound&lt;/a&gt;.
Here&#39;s a quick explanation as to why the glass shatters:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Sound&quot;&gt;sound&lt;/a&gt; is being generated by a
&lt;a href=&quot;http://en.wikipedia.org/wiki/Loudspeaker&quot;&gt;speaker&lt;/a&gt;. The speaker works by
moving a small cone back and forth generating the appropriate frequency.
You can sometimes &lt;a href=&quot;http://www.youtube.com/watch?v=T6FFqaLmltY#t=25s&quot;&gt;see the movements&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many frequencies make the glass vibrate, but only a handful make it vibrate
so much that it cannot stay together. Those frequencies are the resonant
frequencies—they make the glass vibrate (i.e. oscillate) much more
than the other frequencies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since the glass is insufficiently
&lt;a href=&quot;http://en.wikipedia.org/wiki/Elasticity_(physics)&quot;&gt;elastic&lt;/a&gt;, it shatters.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2010/01/resonance.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What other resonant systems have you encountered?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Thinking About Other People&#39;s Thoughts</title>
      <link href="https://metaist.com/blog/2009/12/thinking-about-other-peoples-thoughts.html"/>
      <id>tag:metaist.com,2010:blog.post-10035f60308be039e4d8f5a71bfa2a6b5250f3fc</id>
      <published>Wed Dec 30 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 30 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/thinking-about-other-peoples-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The right &lt;a href=&quot;http://en.wikipedia.org/wiki/Temporoparietal_junction&quot;&gt;temporoparietal junction&lt;/a&gt;
(rTPJ) appears to be
&lt;a href=&quot;http://en.wikipedia.org/wiki/Theory_of_mind#Brain_mechanisms&quot;&gt;dedicated to thinking about other people&#39;s thoughts&lt;/a&gt;.
You can alter people&#39;s judgments of others by interfering with the rTPJ&#39;s
activity.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/GOCUH7TxHRI?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=GOCUH7TxHRI&quot;&gt;YouTube&lt;/a&gt; via TED)&lt;/p&gt;
&lt;/address&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;correction&quot; tabindex=&quot;-1&quot;&gt;Correction &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/thinking-about-other-peoples-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the video, Rebecca Saxe mistakenly attributed the following quote to Alan
Greenspan when it was actually said by
&lt;a href=&quot;http://en.wikiquote.org/wiki/Knowledge&quot;&gt;Robert McCloskey&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I know you believe you understand what you think I said, but I am not sure you
realise that what you heard is not what I meant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/thinking-about-other-peoples-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Moral thinking is critical in many
&lt;a href=&quot;http://en.wikipedia.org/wiki/Legal_systems_of_the_world&quot;&gt;legal systems&lt;/a&gt;. In
fact, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Insanity_defense&quot;&gt;insanity defense&lt;/a&gt;
depends on demonstrating that the defendant is &lt;em&gt;incapable&lt;/em&gt; of moral thinking
(temporarily or permanently). I imagine this research has far-reaching
consequences.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/thinking-about-other-peoples-thoughts.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Suppose you know that someone has a deficient rTPJ; how does that alter your
perception of their judgments?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Crowdsourcing &amp; Crowd Wisdom</title>
      <link href="https://metaist.com/blog/2009/12/crowdsourcing-crowd-wisdom.html"/>
      <id>tag:metaist.com,2010:blog.post-3f76f285c4bcbf63df9caefc7f76945a61fa812b</id>
      <published>Tue Dec 29 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Dec 29 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/crowdsourcing-crowd-wisdom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Crowdsourcing&quot;&gt;Crowdsourcing&lt;/a&gt; is a combination of
the words &amp;quot;crowd&amp;quot; and &amp;quot;outsourcing.&amp;quot; It refers to work done by volunteers
(usually online) that is traditionally outsourced.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-30-crowdsourcing-crowd-wisdom.jpg&quot; alt=&quot;Jelly beans&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:JellyBellyBeans.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/crowdsourcing-crowd-wisdom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Crowdsourcing is a popular concept that harnesses the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Wisdom_of_Crowds&quot;&gt;wisdom of crowds&lt;/a&gt; to solve a
problem. This communal wisdom is especially popular online where we vote, rate,
and assess content. James Surowiecki published a book called
&lt;a href=&quot;http://www.amazon.com/gp/product/0385721706&quot;&gt;The Wisdom of Crowds&lt;/a&gt;
on this subject &lt;small&gt;(I haven&#39;t read it)&lt;/small&gt;.&lt;/p&gt;
&lt;p&gt;Many famous demonstrations involve a large audience guessing the number of
jellybeans in a jar and having the guesses averaged. There have been interesting
discussions about &lt;a href=&quot;http://blog.asmartbear.com/ignoring-the-wisdom-of-crowds.html&quot;&gt;how it works&lt;/a&gt;,
&lt;a href=&quot;http://www.readwriteweb.com/archives/the_dirty_little_secret_about_the_wisdom_of_the_crowds.php&quot;&gt;how it fails&lt;/a&gt;,
and &lt;a href=&quot;http://online.wsj.com/article/SB124260235584228407.html&quot;&gt;how it could have saved us from the financial crisis&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/crowdsourcing-crowd-wisdom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The answer to the &lt;a href=&quot;https://metaist.com/blog/2009/12/vending-machines-for-crows.html#meta&quot;&gt;previous meta&lt;/a&gt;
is &lt;strong&gt;crowds&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/crowdsourcing-crowd-wisdom.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://www.mturk.com/mturk/welcome&quot;&gt;Amazon Mechanical Turk&lt;/a&gt;&lt;/cite&gt;
(&lt;a href=&quot;http://en.wikipedia.org/wiki/Amazon_Mechanical_Turk&quot;&gt;Wikipedia&lt;/a&gt;)
for an archetypal example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Netflix_prize&quot;&gt;Netflix Prize&lt;/a&gt;&lt;/cite&gt;
for another example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Crowdsourcing#Controversy&quot;&gt;Crowdsourcing - Controversy &lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for a brief discussion of possible issues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Vending Machines for Crows</title>
      <link href="https://metaist.com/blog/2009/12/vending-machines-for-crows.html"/>
      <id>tag:metaist.com,2010:blog.post-0e2ffc3e113efbc24c0ccc05141c84c9b3eda3e8</id>
      <published>Mon Dec 28 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Dec 28 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/vending-machines-for-crows.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Josh Klein has a fascinating discussion about
&lt;a href=&quot;http://en.wikipedia.org/wiki/Crows&quot;&gt;crows&lt;/a&gt;, their intelligence, and potentials
for mutually-beneficial (between humans and crows) scenarios.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Enjoy.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/bXQAgzfwuNQ?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=bXQAgzfwuNQ&quot;&gt;YouTube&lt;/a&gt; via TED)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a name=&quot;meta&quot; id=&quot;meta&quot;&gt; &lt;/a&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/vending-machines-for-crows.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So we&#39;ve harnessed the
&lt;a href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;power of children playing&lt;/a&gt;
and the intelligence of crows; what&#39;s next?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Playgrounds that Generate Electricity</title>
      <link href="https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html"/>
      <id>tag:metaist.com,2010:blog.post-6631500b5e2ed7237070b560e01dc6fce59d6cbe</id>
      <published>Sun Dec 27 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.empowerplaygrounds.org/&quot;&gt;Empower Playgrounds&lt;/a&gt; has installed a
carousel for children that generates electricity in Ghana.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-28-playgrounds-that-generate-electricity.jpg&quot; alt=&quot;Lamp&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.flickr.com/photos/hlusta/280702743/&quot;&gt;hlusta&lt;/a&gt; on Flickr)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In 2008, the children at the
&lt;a href=&quot;http://www.goldensunbeam.com/&quot;&gt;Golden Sunbeam Montessori School&lt;/a&gt; in Ghana
received a most welcome gift: a merry-go-round. But unlike other carousels, this
one generates electricity that is used in &lt;a href=&quot;http://en.wikipedia.org/wiki/LED_lamps&quot;&gt;LED lamps&lt;/a&gt;.
A zip-line that generates electricity is set to go into operation soon.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What other naturally fun forces could be harnessed (but not enslaved)?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20091008005512/news.byu.edu/archive08-Jun-Ghana.aspx&quot;&gt;BYU and Empower Playgrounds install electricity-generating merry-go-round in Ghana&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Empower_Playgrounds&quot;&gt;Empower Playgrounds&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2013-03-07&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-07T17:12:00-05:00&quot;&gt;2013-03-07&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Removed &lt;cite&gt;Could it become a workwheel?&lt;/cite&gt;
originally at &lt;code&gt;http://www.empowerplaygrounds.org/main/index.php?option=com_content&amp;amp;view=article&amp;amp;id=93:could-it-become-a-workwheel&amp;amp;catid=7:frequently-asked-questions&amp;amp;Itemid=25&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/playgrounds-that-generate-electricity.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Chiropractic Destroyed from Within</title>
      <link href="https://metaist.com/blog/2009/12/chiroprac-destroyed-from-within.html"/>
      <id>tag:metaist.com,2010:blog.post-ea919e55519b3c0c92ce204603c0479098d1abf3</id>
      <published>Mon Dec 21 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Dec 21 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/chiroprac-destroyed-from-within.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Chiropractors make numerous claims about their ability to treat symptoms by a
method called &lt;a href=&quot;http://en.wikipedia.org/wiki/Vertebral_subluxation&quot;&gt;chiropractic subluxation&lt;/a&gt;
(not to be confused with &lt;a href=&quot;http://en.wikipedia.org/wiki/Subluxation&quot;&gt;medical subluxation&lt;/a&gt;
which is visible in x-rays). A group of chiropractors has shown that the work of
&lt;a href=&quot;http://www.biomedcentral.com/content/pdf/1746-1340-17-13.pdf&quot;&gt;chiropractors provides no benefit over physical therapy&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-22-chiroprac-destroyed-from-within.original.jpg&quot; alt=&quot;German physical therapy&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Bundesarchiv_Bild_102-07750,_Berlin,_Studentinnen_beim_Turnen.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/chiroprac-destroyed-from-within.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Like &lt;a href=&quot;http://en.wikipedia.org/wiki/Homeopathy&quot;&gt;homeopathic remedies&lt;/a&gt;
&lt;small&gt;(a rant for &lt;a href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;another day&lt;/a&gt;)&lt;/small&gt;,
many have suggested that subluxation is ineffective. Simon Singh was
&lt;a href=&quot;http://gimpyblog.wordpress.com/2008/08/17/the-libellous-simon-singh-article-on-chiropractors/&quot;&gt;sued for libel&lt;/a&gt;
for writing an article highlighting the ineffectiveness of chiropractors (the UK
has &amp;quot;interesting&amp;quot; libel laws).&lt;/p&gt;
&lt;p&gt;However, Harriet Hall, of the
&lt;a href=&quot;http://www.sciencebasedmedicine.org/?p=3022&quot;&gt;Science-Based Medicine&lt;/a&gt; blog,
suggests that the &amp;quot;death knell&amp;quot; of chiropractic may have been rung. It is one
thing for members of a profession to be introspective; it is another for them
systematically refute the entire basis of their own profession. In the study
they published, the chiropractors used a standard method for establishing
causation known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Hill&#39;s_criteria#Bradford-Hill_criteria&quot;&gt;Hill&#39;s Criteria&lt;/a&gt;.
The criteria show the &lt;em&gt;possibility&lt;/em&gt; of a causal relationship; not that it
definitely exists. Yet, subluxation &lt;strong&gt;&lt;em&gt;fails to satisfy any of the criteria&lt;/em&gt;&lt;/strong&gt;.
Sounds pretty bad for a field that&#39;s existed for 114 years.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/chiroprac-destroyed-from-within.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What other professions should apply similar systematic rigor to their claims?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/chiroprac-destroyed-from-within.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://metaist.com/blog/2010/01/dilute-homeopathy.html&quot;&gt;The Dilute Homeopathy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/chiroprac-destroyed-from-within.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2012-12-05&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2012-12-05T20:40:00-05:00&quot;&gt;2012-12-05&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/chiroprac-destroyed-from-within.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated the &lt;a href=&quot;http://www.biomedcentral.com/content/pdf/1746-1340-17-13.pdf&quot;&gt;study link&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Fear of Spiders and Snakes</title>
      <link href="https://metaist.com/blog/2009/12/fear-of-spiders-and-snakes.html"/>
      <id>tag:metaist.com,2010:blog.post-b597fc31d112329634ebf8dca63a42cd5ee6042d</id>
      <published>Sun Dec 20 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/fear-of-spiders-and-snakes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Fear is an important part of how we make decisions. Everything from
&lt;a href=&quot;https://web.archive.org/web/20090624004642/http://www.ted.com/talks/lang/eng/steven_levitt_on_child_carseats.html&quot;&gt;selecting car seats for our children&lt;/a&gt;
to our &lt;a href=&quot;http://www.schneier.com/blog/archives/2009/11/fear_and_overre.html&quot;&gt;policy decisions&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-21-fear-of-spiders-and-snakes.jpg&quot; alt=&quot;Spider web&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Spider&#39;s_web.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/fear-of-spiders-and-snakes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fear of snakes and spiders is relatively common &lt;small&gt;(among humans)&lt;/small&gt;.
And thanks to shows like &lt;a href=&quot;https://en.wikipedia.org/wiki/Fear_Factor&quot;&gt;Fear Factor&lt;/a&gt;, we can
all watch others try to overcome these primal fears from the comfort of our
homes.&lt;/p&gt;
&lt;p&gt;However, there is reason to believe that these
&lt;a href=&quot;http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2268873/pdf/nihms41617.pdf&quot;&gt;fears are not strictly rooted in genetics&lt;/a&gt;
(nature), but are learned (nurture). Yet, a recent study does show the role that
nature might play, particularly for females, in facilitating fearful
associations for certain things such as spiders and snakes.&lt;/p&gt;
&lt;p&gt;In &lt;cite&gt;&lt;a href=&quot;http://www.psy.cmu.edu/~rakison/rakisonEHB.pdf&quot;&gt;Does women&#39;s greater fear of snakes and spiders originate in infancy?&lt;/a&gt;&lt;/cite&gt;,
David Rakison extends results from previous studies (done on adults) on the
rapid association between fear and snakes and spiders (as opposed to mushrooms
and flowers) to infants only 11 months old. The results show that infant girls
learn the association between fearful facial expressions and fearful stimuli
(snake, spider) more quickly than do boys. There was no similar distinction
between non-fearful stimuli (mushroom, flower). The resulting hypothesis, then,
is that certain types of fears are the products of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Evolutionary_psychology&quot;&gt;evolutionary psychology&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/fear-of-spiders-and-snakes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What steps have you taken to mitigate a fear you&#39;ve had? Were you successful?&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/fear-of-spiders-and-snakes.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/fear-of-spiders-and-snakes.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Punctuation Marks</title>
      <link href="https://metaist.com/blog/2009/12/punctuation-marks.html"/>
      <id>tag:metaist.com,2010:blog.post-e1e9d3dc4ec5be24c96ec17eb3f0c6b467f5ba5a</id>
      <published>Thu Dec 17 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Dec 17 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/punctuation-marks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Punctuation marks help us understand written text. Incorrectly used punctuation,
however, can result in serious consequences or humor.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-18-punctuation-marks.jpg&quot; alt=&quot;Keyboard keys in water&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Washing_the_keyboard.JPG&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/punctuation-marks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I remember once getting a lesson on the importance of commas:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Russian &lt;a href=&quot;http://en.wikipedia.org/wiki/Tsar&quot;&gt;Tsars&lt;/a&gt; would issue verdicts by
placing a single comma in pre-written papers that said
&lt;strong&gt;&amp;quot;Death forbidden pardon.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Guilty:&lt;/strong&gt; &amp;quot;Death, forbidden pardon.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not-guilty:&lt;/strong&gt; &amp;quot;Death forbidden, pardon.&amp;quot;&lt;/p&gt;
&lt;p&gt;And so, I was told, a single comma could save your life. There has been a
resurgence in the &lt;a href=&quot;http://www.google.com/search?q=lets+eat+grandpa&quot;&gt;life-saving virtue of the comma&lt;/a&gt;.
Jest aside, a few years ago Canada saw a
&lt;a href=&quot;http://www.techdirt.com/articles/20061026/185156.shtml&quot;&gt;$2 million dollar comma dispute&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Occasionally, someone tries to invent a new punctuation mark, but they are
rarely successful. A notable exception was the invention of the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Emoticon&quot;&gt;emoticon&lt;/a&gt; that now pervade informal
written communication (of the typed, but not handwritten, variety). Emoticons
were first proposed by &lt;a href=&quot;http://www.cs.cmu.edu/~sef/Orig-Smiley.htm&quot;&gt;Scott Fahlman on September 19th, 1982&lt;/a&gt;.
The number and types of emoticons has grown to the point where they may be
considered a form of micro-&lt;a href=&quot;http://en.wikipedia.org/wiki/ASCII_art&quot;&gt;ASCII art&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Recently, there was an attempt to re-purpose the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Interrobang&quot;&gt;interrobang&lt;/a&gt; to represent a
&lt;a href=&quot;http://cuiltheory.wikidot.com/what-is-cuil-theory&quot;&gt;unit of levels of abstraction&lt;/a&gt;
based on the very large, but mostly irrelevant,
&lt;a href=&quot;http://en.wikipedia.org/wiki/Cuil&quot;&gt;Cuil search engine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact:&lt;/strong&gt; The old Metaist logo used the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Therefore_sign&quot;&gt;because and therefore&lt;/a&gt; punctuation
symbols from logic and math.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/punctuation-marks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When have punctuation marks helped or harmed you?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/punctuation-marks.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.unnecessaryquotes.com/&quot;&gt;The &amp;quot;Blog&amp;quot; of &amp;quot;Unnecessary&amp;quot; Quotation Marks&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://wondermark.com/about/&quot;&gt;David Malki !&lt;/a&gt; and his use of an exclamation
point as an &lt;a href=&quot;http://en.wikipedia.org/wiki/Honorific&quot;&gt;honorific&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://theoatmeal.com/comics/apostrophe&quot;&gt;How to Use an Apostrophe&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The Oatmeal&lt;/span&gt;
for illustrated directions on the use of apostrophes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Punctuation_marks&quot;&gt;Punctuation marks&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wikipedia&lt;/span&gt;
for a long list of symbols.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Steampunk</title>
      <link href="https://metaist.com/blog/2009/12/steampunk.html"/>
      <id>tag:metaist.com,2010:blog.post-376e81ba48253f8b662b01fd93a3d59ab18df572</id>
      <published>Wed Dec 16 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Wed Dec 16 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/steampunk.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Steampunk&quot;&gt;Steampunk&lt;/a&gt; is a genre of science
fiction that imagines what the world would be like if Victorian steam-powered
technology persisted into the modern era. It also refers to a visual style
commonly associated with the late 18th to early 19th century as applied in a
modern context.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-17-steampunk.gif&quot; alt=&quot;Will you give me a hint if I tell you the street I grew up on?&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &quot;Will you give me a hint if I tell you the street I grew up on?&quot;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image &amp;amp; Quote: &lt;a href=&quot;http://wondermark.com/576/&quot;&gt;Wondermark&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/steampunk.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While I&#39;ve never read any of the
&lt;a href=&quot;https://metaist.com/blog/2009/11/zombies-in-math-and-literature.html&quot;&gt;zombie-enhanced literature&lt;/a&gt;,
I do appreciate the resurgence of interest in 19th-century, albeit with a darker
twist.&lt;/p&gt;
&lt;p&gt;At its core, steampunk represents a culture of anachronism that is part of the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Cyberpunk_derivatives&quot;&gt;cyberpunk&lt;/a&gt; speculative
fiction genre. I should note that this is similar to, but distinct from, the
activities endorsed by the
&lt;a href=&quot;http://www.sca.org/&quot;&gt;Society for Creative Anachronism&lt;/a&gt; which targets pre-17th
century Europe.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/steampunk.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://wondermark.com/&quot;&gt;Wondermark&lt;/a&gt;&lt;cite&gt;
for an interesting comic that splices Victorian-era comics to discuss modern
issues.&lt;/cite&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://steampunkworkshop.com/lcd.shtml&quot;&gt;Steampunk Flat-panel LCD&lt;/a&gt;&lt;/cite&gt;
for examples of the lengths to which people go to encase modern technology
in brass.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Information about the actual
&lt;a href=&quot;http://en.wikipedia.org/wiki/Victorian_era&quot;&gt;Victorian era&lt;/a&gt; &lt;small&gt;(the one that really happened)&lt;/small&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Gambling &amp; Insurance Policies</title>
      <link href="https://metaist.com/blog/2009/12/gambling-insurance-policies.html"/>
      <id>tag:metaist.com,2010:blog.post-0f37badd21013eb5b3d937bc9198559ab59e6c28</id>
      <published>Mon Dec 14 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Dec 14 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/gambling-insurance-policies.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Taking risks is part of everyday life. For the most part, people are good at
dealing with risks with which they are familiar. Certain types of risks,
however, when &amp;quot;intuitively&amp;quot; processed, lead to suboptimal behaviors.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-15-gambling-insurance-policies.jpg&quot; alt=&quot;Roulette wheel&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Cylindre_de_roulette_Anglaise.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/gambling-insurance-policies.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Schneier writes about risk a lot: our
&lt;a href=&quot;http://www.schneier.com/blog/archives/2009/08/risk_intuition.html&quot;&gt;intuitions about&lt;/a&gt;,
&lt;a href=&quot;http://www.schneier.com/blog/archives/2008/12/nut_allergy_fea.html&quot;&gt;overreactions to&lt;/a&gt;, and
&lt;a href=&quot;http://www.schneier.com/blog/archives/2009/03/the_zone_of_ess.html&quot;&gt;essential need for&lt;/a&gt;
risk. The most common failures of our risk intuition stem from
&lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_cognitive_biases&quot;&gt;cognitive biases&lt;/a&gt;
related to rare, unknown, or voluntary risks.&lt;/p&gt;
&lt;p&gt;In general, we tend to think that people are
&lt;a href=&quot;http://en.wikipedia.org/wiki/Risk_aversion&quot;&gt;risk averse&lt;/a&gt;. But sometimes people
seem to seek out risks—such as playing the lottery. Why? A possible
explanation is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Framing_effect_(psychology)&quot;&gt;framing effect&lt;/a&gt;.
Consider the following case. You can have one of the following applied to your
order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A $5 &lt;strong&gt;discount&lt;/strong&gt;, or&lt;/li&gt;
&lt;li&gt;A $5 &lt;strong&gt;fee waived&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Which did you choose? The first sounds like you&#39;re getting a good deal; the
second sounds &lt;em&gt;meh&lt;/em&gt;. &lt;strong&gt;&lt;em&gt;But they result in the same price!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now imagine there&#39;s probability thrown in for good measure. Which of the
following sounds like a better insurance sales pitch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&#39;s a pretty good chance you won&#39;t loose anything.&lt;/li&gt;
&lt;li&gt;There&#39;s a small chance you&#39;ll loose a lot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now compare that with a lottery sales pitch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&#39;s a pretty good chance you won&#39;t win anything.&lt;/li&gt;
&lt;li&gt;There&#39;s a small chance you&#39;ll win a lot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the first case (insurance), avoiding the loss sounds better. In the second
case (lottery), the large gains seem attractive. In each case, the way the
situation is framed changes which options seems better.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More on this later.&lt;/em&gt;&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Rules, Discretion, Appeals &amp; Audit</title>
      <link href="https://metaist.com/blog/2009/12/rules-discretion-appeals-audit.html"/>
      <id>tag:metaist.com,2010:blog.post-0dda8dd86fbbd55e9971a09a2e34fd0cbe314846</id>
      <published>Sun Dec 13 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Dec 13 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/rules-discretion-appeals-audit.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Many decisions in life require a delicate balance of trade-offs in order to get
the best results. Recent examples highlight the need to restore such balance to
everyday policies especially for so-called &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Zero_tolerance&quot;&gt;Zero-Tolerance&lt;/a&gt;&amp;quot; policies.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-14-rules-discretion-appeals-audit.jpg&quot; alt=&quot;Walking on a tightrope&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Tightrope_walking.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/rules-discretion-appeals-audit.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Schneier wrote a nice article on
&lt;a href=&quot;http://www.schneier.com/blog/archives/2009/11/zero-tolerance.html&quot;&gt;zero-tolerance policies&lt;/a&gt;
which he refers to as &amp;quot;zero-discretion&amp;quot; policies. He brings up the recent story
of the &lt;a href=&quot;http://www.nytimes.com/2009/10/12/education/12discipline.html?_r=1&quot;&gt;cub scout who brought a camping utensil to school&lt;/a&gt;
as an example of an unbalanced policy gone awry.&lt;/p&gt;
&lt;p&gt;Zero-discretion policies stem from the need to avoid inappropriate
discrimination, that is
&lt;a href=&quot;https://metaist.com/blog/2009/11/fairness-equity-equality-and-relative.html&quot;&gt;to be &amp;quot;fair&amp;quot;&lt;/a&gt;.
To that end, no discrimination—no matter how warranted—must be
allowed. You know you&#39;re dealing with a zero-discretion policy when the enforcer
of the policy agrees with you, but &amp;quot;those are the rules, I can&#39;t do anything
about it.&amp;quot;&lt;/p&gt;
&lt;p&gt;Schneier recommends a four-pronged solution:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt; - Start with the rules &amp;amp; procedures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Discretion&lt;/strong&gt; - Throw in a dash of discretion to taste.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Appeals&lt;/strong&gt; - Add plenty of opportunities for people to appeal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audit&lt;/strong&gt; - Stir occasionally to ensure smooth consistency.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In short, provide some room for interpretation (discretion), and then make sure
that that room doesn&#39;t get abused (appeals &amp;amp; audit).&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/rules-discretion-appeals-audit.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What are some examples of situations where you&#39;ve encountered &amp;quot;zero-tolerance&amp;quot;
policies?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Boredom &amp; Body Language</title>
      <link href="https://metaist.com/blog/2009/12/boredom-and-body-language.html"/>
      <id>tag:metaist.com,2010:blog.post-b8c665e28c3395ca201420c8f284a56cff7f398b</id>
      <published>Thu Dec 10 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/boredom-and-body-language.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Figuring out if you&#39;re boring someone is a non-trivial task for some people.
This is especially true for people who have a hard time reading social cues,
such as people with autism.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-11-boredom-and-body-language.jpg&quot; alt=&quot;Yawn&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Ducreuxyawn.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/boredom-and-body-language.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What do you do when you realize you&#39;re boring someone?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/boredom-and-body-language.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/static/archive/www.psychologytoday.com/blog/the-happiness-project/200912/eight-tips-know-if-youre-being-boring.pdf&quot;&gt;Eight Tips to Know If You&#39;re Being Boring&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;PsychologyToday&lt;/span&gt;
for a nice writeup about eight cues that indicate you&#39;re boring someone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20091213201321/https://www.wired.co.uk/news/archive/2009-12/10/popeye%2C-the-robot-with-brains-not-brawn.aspx&quot;&gt;Popeye, the robot with brains not brawn&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Wired&lt;/span&gt;
for an article about a robot that can read body language.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0553804723&quot;&gt;The Definitive Book of Body Language&lt;/a&gt;&lt;/cite&gt; by Barbara and Allen Pease which is more like a reference guide.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20091212224632/www.msnbc.msn.com/id/34047713/ns/health-mental_health/&quot;&gt;Autism seen as asset, not liability, in some jobs&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;MSNBC&lt;/span&gt;
for an article about a company that hires people with autism to test
software.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/boredom-and-body-language.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/boredom-and-body-language.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Intrinsic &amp; Extrinsic Motivation</title>
      <link href="https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html"/>
      <id>tag:metaist.com,2010:blog.post-0e3c6b7089ef29ec67f3102e94ecfb184583b768</id>
      <published>Wed Dec 09 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Motivation&quot;&gt;Motivation&lt;/a&gt; is an important part of
our lives. Managers seek motivated employees, teaches search for ways to
motivate their students, and investigators try to piece together people&#39;s
motives. Dan Pink discusses the &amp;quot;mismatch between what science knows and what
business does.&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/rrkrvAUbU9Y?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=rrkrvAUbU9Y&quot;&gt;YouTube&lt;/a&gt; via TED)&lt;/p&gt;
&lt;/address&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The important distinction in motivation is whether the motivator is &lt;em&gt;intrinsic&lt;/em&gt;
or &lt;em&gt;extrinsic&lt;/em&gt;. Intrinsic motivators are ones that you feel you can control,
such as your level of effort, whereas extrinsic motivators are outside of your
control: rewards, punishments, etc.&lt;/p&gt;
&lt;p&gt;Pink quotes from a 2005 commissioned by the Federal Reserve of Boston called
&amp;quot;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20100410083618/http://www.bos.frb.org/economic/wp/wp2005/wp0511.pdf&quot;&gt;Large Stakes and Big Mistakes&lt;/a&gt;&lt;/cite&gt;&amp;quot;.
Some random excerpts (emphasis added):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&amp;quot;With some important exceptions, we observed that &lt;strong&gt;high reward&lt;/strong&gt; levels can
have &lt;strong&gt;detrimental effects&lt;/strong&gt; on performance&amp;quot; (abstract).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;quot;[O]ne mechanism via which increased motivation can backfire is when it
leads to greater self-consciousness&amp;quot; (p. 3).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;quot;[T]he performance of participants was always lowest in the high-payment
condition when compared with the low- and mid-payment conditions
together...&amp;quot; (p. 13).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;quot;Many existing institutions provide very large incentives for exactly the
types of tasks we used here – those that require creativity, problem
solving, and concentration. Our results &lt;strong&gt;challenge the assumption&lt;/strong&gt; that
increases in motivation necessarily lead to improvements in
performance&amp;quot; (p. 19).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;quot;[W]e were &lt;strong&gt;surprised by the robustness&lt;/strong&gt; of the effect...&amp;quot; (p. 19).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;How do you cater to people&#39;s intrinsic motivations?&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html&quot;&gt;Maslow&#39;s Hierarchy of Needs&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;Psychological Barriers&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T20:00:45-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;See &lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1594484805&quot;&gt;Drive: The Surprising Truth About What Motivates Us&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;Amazon&lt;/span&gt;
for &lt;span class=&quot;vcard fn&quot;&gt;Dan Pink&lt;/span&gt;&#39;s book on the subject.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See &lt;cite&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=u6XAPnuFjJc&quot;&gt;RSA Animate - Drive: The surprising truth about what motivates us&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;YouTube&lt;/span&gt;
for another video.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2013-03-11&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-11T00:00:00-04:00&quot;&gt;2013-03-11&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2013/03/review-drive.html&quot;&gt;Review: Drive&lt;/a&gt;&lt;/cite&gt;
for our review of &lt;a href=&quot;http://www.amazon.com/gp/product/1594484805&quot;&gt;the book&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/intrinsic-v-extrinsic-motivation.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Review: Economics in One Lesson</title>
      <link href="https://metaist.com/blog/2009/12/review-economics-in-one-lesson.html"/>
      <id>tag:metaist.com,2010:blog.post-c702086e1f8dfe01485d9ffd2955b11e0bc3423b</id>
      <published>Tue Dec 08 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;figure style=&quot;float: right; width: 7em; margin: 0 0 1em 0;&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0517548232&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-09-review-economics-in-one-lesson.jpg&quot; alt=&quot;Economics in One Lesson&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.amazon.com/gp/product/0517548232&quot;&gt;Amazon&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;review&quot; tabindex=&quot;-1&quot;&gt;Review &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/review-economics-in-one-lesson.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0517548232&quot;&gt;Economics in One Lesson&lt;/a&gt; (&lt;a href=&quot;https://web.archive.org/web/20090329165134/https://fee.org/pdf/books/Economics_in_one_lesson.pdf&quot;&gt;PDF version&lt;/a&gt;) is an excellent primer to
economic thought. If I didn&#39;t know that it was published in 1940&#39;s, I could
easily have assumed that it was a pamphlet discussing the modern financial,
automotive, music, or newspaper industries.&lt;/p&gt;
&lt;p&gt;The main purpose of the book is expose common economic fallacies that
&amp;quot;are at last so prevalent that they have almost become a new orthodoxy&amp;quot;
(Hazlitt vii). This is accomplished through two dozen &amp;quot;lessons&amp;quot; that derive from
a single lesson summed up by Hazlitt as the essence of economics:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;From this aspect, therefore, the whole of economics can be reduced to a single
lesson, and that lesson can be reduced to a single sentence.
&lt;em&gt;The art of economics consists in looking not merely at the immediate but at
the longer effects of any act or policy; it consists in tracing the
consequences of that policy not merely for one group but for all groups&lt;/em&gt;.
(emphasis his; Hazlitt 5)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-broken-window&quot; tabindex=&quot;-1&quot;&gt;The Broken Window &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/review-economics-in-one-lesson.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first of the &amp;quot;applied&amp;quot; lessons is based on the parable of the broken window
as explained by &lt;a href=&quot;https://en.wikipedia.org/wiki/Fr%C3%A9d%C3%A9ric_Bastiat&quot;&gt;Frédéric Bastiat&lt;/a&gt;.&lt;/p&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-09-broken-window.jpg&quot; alt=&quot;Broken glass&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Broken_glass.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;What follows is my brief paraphrase of the parable. Imagine a hoodlum throws a
brick through a baker&#39;s window. The baker runs out of his shop and starts
chasing after the rock-thrower, but is unsuccessful. As the baker walks back to
his shop, a small crowd of people gather around the his window-less shop. After
the customary outrage, someone points out a bright side: some glass-maker just
got $200 worth of business. Moreover, the glass-maker can use those $200 to
spend on other merchants who, in turn, can spend money on yet other merchants;
the flow of money benefits all. The logical conclusion, then, is that the
hoodlum should continue to break people&#39;s windows for the benefit of society.&lt;/p&gt;
&lt;p&gt;If the conclusion sounds strange it is only because the crowd failed to consider
the larger picture. While it is true that some glass-maker will receive $200
worth of business, it is also the case that the baker, who started the day with
$200 and a window, is now left with only a window. That is, the net worth of
society went down by the value of a window; that other windows can be
manufactured is irrelevant because had the hooligan not broken the window, the
baker would not need a new window.&lt;/p&gt;
&lt;p&gt;While it may seem obvious that destruction leads to reduced net-worth, there are
many ways of obscuring the destruction to make it more palatable to the masses,
and Hazlitt covers many such fallacies in eminently accessibly prose.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The reader is urged to read at least the first two chapters of
&lt;a href=&quot;https://web.archive.org/web/20090329165134/https://fee.org/pdf/books/Economics_in_one_lesson.pdf&quot;&gt;the book&lt;/a&gt; because
many future posts will depend on understanding the &amp;quot;Fundamental Lesson of
Economics&amp;quot; and it&#39;s applications.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/review-economics-in-one-lesson.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/review-economics-in-one-lesson.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Arrow&#39;s Impossibility Theorem</title>
      <link href="https://metaist.com/blog/2009/12/arrows-impossibility-theorm.html"/>
      <id>tag:metaist.com,2010:blog.post-985d75c5b73adcba9fa313e6a6327d8fb30acd83</id>
      <published>Mon Dec 07 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Dec 07 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;I seem to be posting a lot about paradoxes recently. I&#39;ll probably take a
little break from paradoxes after this one.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/arrows-impossibility-theorm.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;In 1951, Kenneth Arrow demonstrated that it is not possible to have a
&amp;quot;&lt;a href=&quot;https://metaist.com/blog/2009/11/fairness-equity-equality-and-relative.html&quot;&gt;fair&lt;/a&gt;&amp;quot; voting
system that satisfied the following three criteria (imagine the group is voting
on which fruit to eat: apples or pears):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If every voter prefers apples to pears, then the group prefers apples to
pears. &lt;small&gt;(Sound familiar? It&#39;s called
&lt;a href=&quot;https://metaist.com/blog/2009/11/pareto-efficiency.html&quot;&gt;Pareto efficiency&lt;/a&gt;.)&lt;/small&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If every voter prefers apples to pears, then even if bananas are added to
the set of options, the group will still prefer apples to pears.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is no dictator.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Arrow&#39;s_impossibility_theorem&quot;&gt;Arrow&#39;s Impossibility Theorem&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-08-arrows-impossibility-theorm.jpeg&quot; alt=&quot;Arrow&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Fletching-Arrow-8.jpeg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/arrows-impossibility-theorm.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The actual details of the theorem are interesting, and I refer you to
&lt;a href=&quot;http://en.wikipedia.org/wiki/Arrow&#39;s_impossibility_theorem#Interpretations_of_the_theorem&quot;&gt;Wikipedia&lt;/a&gt;
(for those who are interested). There are situations, however where item 2
(where we added bananas) doesn&#39;t hold: imagine the game
&lt;a href=&quot;http://en.wikipedia.org/wiki/Rock-paper-scissors&quot;&gt;rocks-paper-scissors&lt;/a&gt;. In
such a case, adding an alternative transforms the straightforward choice into a
cyclic choice. I sometimes see this scenario when people compare different
aspects of multiple candidates&#39; platforms (or when they&#39;re choosing which car /
laptop / soap / pants to purchase).&lt;/p&gt;
&lt;p&gt;Sometimes, the trade-offs are hard; but sometimes they&#39;re impossible.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Zeno&#39;s Paradox</title>
      <link href="https://metaist.com/blog/2009/12/zenos-paradox.html"/>
      <id>tag:metaist.com,2010:blog.post-3ba741086b996d35b99a556d3a7859ff61322501</id>
      <published>Sun Dec 06 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sun Dec 06 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/zenos-paradox.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Zeno&#39;s_paradoxes&quot;&gt;Zeno&#39;s Paradox&lt;/a&gt; involves a race
between a tortoise and Achilles that suggests that motion is an illusion.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-07-zenos-paradox.jpg&quot; alt=&quot;Tortoise&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  This is not a picture of Zeno of Elea.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Aldabra.giant.tortoise.arp.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/zenos-paradox.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I remember when I was first introduced to this paradox in 8th grade; it was
utterly puzzling (until I heard a solution). A simplified version goes something
like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Achilles and the tortoise are having a 1000 paces race, but the tortoise has a
head start of 800 paces (Achilles is much faster than the tortoise). As the
tortoise inches forward, Achilles makes a plan.&lt;/p&gt;
&lt;p&gt;First, he&#39;ll get to the halfway point (let&#39;s call it Bob) between himself and
the tortoise. Of course, to get to Bob, Achilles realizes, he has to get to the
halfway point between himself and Bob (let&#39;s call it Jane). And before he can
consider anything else, he must first get to the halfway point between himself
and Jane (called Sam). [...]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As Achilles continues to think through his plan, he realizes he can never even
catch up to the tortoise, let alone win the race. When viewed abstractly, the
problem seems to show that nothing can ever pass anything else—that motion
is an illusion. Until the early 20th century, there wasn&#39;t really a way to
handle this paradox appropriately. However, with the advent of infinite series,
we can say that the reason Achilles &lt;em&gt;does&lt;/em&gt; pass the tortoise is because if you
add up all the little pieces (&lt;small&gt;1/2&lt;/small&gt; + &lt;small&gt;1/4&lt;/small&gt; +
&lt;small&gt;1/8&lt;/small&gt; + &lt;small&gt;1/16&lt;/small&gt; ...) you get 1 (which represents the
total distance between Achilles and the tortoise).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact&lt;/strong&gt;: Zeno&#39;s paradoxes are considered some of the earliest examples of
&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Reductio_ad_absurdum&quot;&gt;reductio ad absurdum&lt;/a&gt;&lt;/em&gt;,
also known as proof by contradiction.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Reader Question: What is Google Wave?</title>
      <link href="https://metaist.com/blog/2009/12/question-what-is-google-wave.html"/>
      <id>tag:metaist.com,2010:blog.post-5397e96c1eae70bff554fd73dd278f43a75bbcf9</id>
      <published>Sat Dec 05 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Dec 05 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;p&gt;&lt;em&gt;This post is a response to a reader question.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;question&quot; tabindex=&quot;-1&quot;&gt;Question &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;An anonymous reader asks: What is Google Wave and why would I want to use it?&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-12-06-question-what-is-google-wave.jpg&quot; alt=&quot;Surface waves&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Not this kind of wave, but close.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:2006-01-14_Surface_waves.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://wave.google.com/help/wave/about.html&quot;&gt;Google Wave&lt;/a&gt; is a new technology
that is supposed to combine three existing technologies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Instant Messaging (IM), and&lt;/li&gt;
&lt;li&gt;Wikis.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;email&quot; tabindex=&quot;-1&quot;&gt;Email &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most of us are familiar with email. Briefly, it&#39;s static distributed content. In
other words, one person can send out some information to a bunch of other
people.&lt;/p&gt;
&lt;h2 id=&quot;instant-messaging&quot; tabindex=&quot;-1&quot;&gt;Instant Messaging &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Instant messaging, however, is dynamic—you interact with another person
(or multiple people) at once.&lt;/p&gt;
&lt;h2 id=&quot;wikis&quot; tabindex=&quot;-1&quot;&gt;Wikis &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wikis are collaboratively editable documents. The most famous example is
&lt;a href=&quot;http://wikipedia.org/&quot;&gt;Wikipedia&lt;/a&gt;, but there are others (including private
wikis such as those found within corporations). Wikis are basically
&amp;quot;dynamic content&amp;quot;. So now, the content itself can change over time, but everyone
can see previous version of the content if they choose.&lt;/p&gt;
&lt;h2 id=&quot;wave&quot; tabindex=&quot;-1&quot;&gt;Wave &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Google&#39;s conception of a Wave, therefore, is a wiki where you see the changes in
real-time (sort of like &lt;a href=&quot;http://docs.google.com/&quot;&gt;Google Documents&lt;/a&gt;). Here&#39;s how
it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You create a new wave and add some collaborators.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new wave appears in the collaborators &amp;quot;inbox&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Any collaborator (including you, the creator) can start to edit the wave.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anyone looking at the wave (i.e. one of the collaborators) can see who&#39;s
editing (and where on the page they&#39;re editing) in real time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The wave can have robot collaborators who perform menial tasks (like
&amp;quot;replace all the YouTube links with YouTube videos&amp;quot;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The wave can also have &amp;quot;gadgets&amp;quot; that collaborators interact with (such as
a &amp;quot;survey gadget&amp;quot; that surveys people).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At any time, you can scroll back to see previous states of the wave all the
way back to its creation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;uses&quot; tabindex=&quot;-1&quot;&gt;Uses &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So where would you use a wave? The answer largely depends on how you handle
collaboration. Nature has a write-up about how
&lt;a href=&quot;http://www.readcube.com/articles/10.1038/461881a&quot;&gt;scientists could use waves&lt;/a&gt;
to collaborate and use robot collaborators to comb through papers and
cross-reference, for example, gene names in databases. More mundane uses might
include organizing a camping trip, but you&#39;re really only limited by your
imagination.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Have you used Google Wave? Did you find it useful? What did you like / dislike?&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2010-08-04&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2010-08-04T14:00:00-00:00&quot;&gt;2010-08-04&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://googleblog.blogspot.com/2010/08/update-on-google-wave.html&quot;&gt;Google has discontinued development for Wave&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2013-03-07&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-07T17:12:00-05:00&quot;&gt;2013-03-07&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated link to &lt;cite&gt;Nature&lt;/cite&gt; article.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Dan Bull Sings Open Letters</title>
      <link href="https://metaist.com/blog/2009/12/dan-bull-sings-open-letters.html"/>
      <id>tag:metaist.com,2010:blog.post-4b3e7afc05891b307a95b284b242dbd4862a31ed</id>
      <published>Mon Nov 30 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Nov 30 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/12/dan-bull-sings-open-letters.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Dan Bull, a musician, has written an interesting open letter to Lord Mandelson
on the subject of disconnecting people from the Internet on the basis of alleged
copyright violations. Below that, I include his previous open letter to Lilly
Allen on a similar subject.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Enjoy.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/6_P4lJD_OPI?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=6_P4lJD_OPI&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/HL9-esIM2CY?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=HL9-esIM2CY&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
    </entry>
    <entry>
      <title>Russell&#39;s Paradox</title>
      <link href="https://metaist.com/blog/2009/11/russells-paradox.html"/>
      <id>tag:metaist.com,2010:blog.post-c132136d25e2bb43b221eb5431b062389f1e52ac</id>
      <published>Thu Nov 26 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Nov 26 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/russells-paradox.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Russell_paradox&quot;&gt;Russell&#39;s paradox&lt;/a&gt; describes a
fundamental conundrum with &lt;a href=&quot;http://en.wikipedia.org/wiki/Set_theory&quot;&gt;set theory&lt;/a&gt;
that is sometimes illustrated by way of a story about a barber.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-27-russells-paradox.jpg&quot; alt=&quot;Barbers in a barbershop&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Denver_barbers.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;paradox&quot; tabindex=&quot;-1&quot;&gt;Paradox &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/russells-paradox.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;This presentation is a modified version of Russell&#39;s original presentation.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There once was a platoon of men who were very punctilious about following
orders. One day, the commander decided that the men needed to look less
disheveled. One of the men, a barber named Bob, proposed that he shave everyone
everyday. Some of the men complained and asked if they could shave themselves
instead. As a compromise, the commander ordered Bob to shave all and only the
men who do not shave themselves.&lt;/p&gt;
&lt;p&gt;The paradox is this: who shaves Bob? If he shaves himself, then he ends up being
&lt;em&gt;prohibited&lt;/em&gt; from shaving himself. In which case he &lt;em&gt;must&lt;/em&gt; shave himself.
Continue ad infinitum.&lt;/p&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/russells-paradox.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The significance of this paradox was that it undermined the existence of certain
types of sets, potentially undermining all of set theory. There were some
&lt;a href=&quot;http://en.wikipedia.org/wiki/ZFC&quot;&gt;interesting responses&lt;/a&gt;, but
&lt;a href=&quot;http://en.wikipedia.org/wiki/G%C3%B6del&#39;s_incompleteness_theorems&quot;&gt;ultimately Gödel showed &lt;/a&gt;
the inescapable nature of such paradoxes for most logical systems.&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>The Importance of Numeracy</title>
      <link href="https://metaist.com/blog/2009/11/importance-of-numeracy.html"/>
      <id>tag:metaist.com,2010:blog.post-9cdd164fe0e3e5e39f4a91d4079ffba1e5770a2f</id>
      <published>Tue Nov 24 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Numeracy&quot;&gt;Numeracy&lt;/a&gt;&lt;/em&gt; is a
&lt;a href=&quot;http://en.wikipedia.org/wiki/Portmanteau&quot;&gt;portmanteau&lt;/a&gt; of &amp;quot;numerical literacy&amp;quot;
and refers to the understanding of mathematical concepts such as orders of
magnitude, probability, and statistics.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-25-importance-of-numeracy.jpg&quot; alt=&quot;Bingo numbers&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Bingo_numbers_(red).jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;conjecture&quot; tabindex=&quot;-1&quot;&gt;Conjecture &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Certain concepts in math are necessary for critical thinking. Many people,
however, struggle to learn these concepts well thereby reducing the
effectiveness of their policy choices.&lt;/p&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In a country of over $12 trillion dollars deficit (and
&lt;a href=&quot;https://www.usdebtclock.org/&quot;&gt;counting&lt;/a&gt;), about 80% of people
&lt;a href=&quot;http://econ4u.org/blog/2009/05/01/poll-how-many-millions-are-in-a-trillion/&quot;&gt;cannot conceive of the magnitude of a trillion&lt;/a&gt;.
Very small quantities are equally confusing, because people are unaccustomed to
seeing them in their everyday lives. However, thanks to
&lt;a href=&quot;http://www.mint.com/blog/trends/one-trillion-dollars-video/&quot;&gt;wonderful videos&lt;/a&gt;
and &lt;a href=&quot;https://learn.genetics.utah.edu/content/cells/scale/&quot;&gt;interactive comparisons&lt;/a&gt;
you can get a better sense of how
&lt;a href=&quot;http://en.wikipedia.org/wiki/Order_of_magnitude&quot;&gt;orders of magnitude&lt;/a&gt; work.&lt;/p&gt;
&lt;p&gt;Of course, that&#39;s only a very small part of overall numeracy. Probability and
statistics, it can be argued, play an important role in everyday discourse,
especially as we continue to be bombarded by facts and figures of every sort.
When I was younger, someone told me a joke:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Two boys are walking home from school and one asks the other,
&amp;quot;What&#39;s the chance that I&#39;ll see a man riding a dinosaur in the street?&amp;quot;&lt;/p&gt;
&lt;p&gt;His friend thinks for a moment, and responds,
&amp;quot;Fifty percent. Either you will or you won&#39;t.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At the time I recall laughing very hard. As I got older, this joke became less
funny for I encountered more and more people who
&lt;a href=&quot;http://www.astroengine.com/?p=5262&quot;&gt;surprised me with their ignorance&lt;/a&gt; and
actually maintain variations of this sort of thinking.&lt;/p&gt;
&lt;p&gt;I currently do not have any solutions to this problem, yet I do not believe it
unsolvable. Part of the issue may lie with trying to solve the wrong problem.
But that will have to be another post.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More on this later.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T22:07:03-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;See &lt;cite&gt;&lt;a href=&quot;http://www.thedailyshow.com/watch/thu-april-30-2009/large-hadron-collider&quot;&gt;Large Hadron Collider&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;The Daily Show&lt;/span&gt;
for a clip of ridiculous risk assessment that parallels
the joke above (but the clip is not funny).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See &lt;cite&gt;&lt;a href=&quot;http://vimeo.com/4428480&quot;&gt;Poll: How many millions are in a trillion?&lt;/a&gt;&lt;/cite&gt;
for a poll by &lt;span class=&quot;vcard org fn&quot;&gt;Econ4U&lt;/span&gt; that shows that
people don&#39;t know how many millions are in a trillion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/importance-of-numeracy.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Computational Theory for Lawyers</title>
      <link href="https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html"/>
      <id>tag:metaist.com,2010:blog.post-b6d6f74ee69b10507f94ded9fe4084f887e4be46</id>
      <published>Mon Nov 23 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Theory_of_computation&quot;&gt;Computational Theory&lt;/a&gt;&lt;/em&gt; is
a branch of mathematics that morphed into computer science. Among its goals is
to look at a problem and ask: &lt;em&gt;Is there a series of steps that will solve this
problem?&lt;/em&gt; Those steps are also known as an
&lt;a href=&quot;http://en.wikipedia.org/wiki/Algorithm&quot;&gt;algorithm&lt;/a&gt;, and finding a fast &amp;amp;
efficient algorithm for something people care about, such as
&lt;a href=&quot;http://www.google.com/&quot;&gt;searching for a piece of information&lt;/a&gt;, is often a great
way to start a business.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-24-computational-theory-for-lawyers.jpg&quot; alt=&quot;Watch spring&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Watch_automatic_mainspring.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.groklaw.net/&quot;&gt;Groklaw&lt;/a&gt; has an interesting (and very long) discussion
about &lt;a href=&quot;http://www.groklaw.net/article.php?story=20091111151305785&quot;&gt;computational theory and how it applies to patent law&lt;/a&gt;.
From the article:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For example consider I write a program. Some outside party has written a
similar program. This party sees my program and thinks I infringe on his
proprietary rights. There are two scenarios depending on whether he makes his
claim according to copyright law or patent law.&lt;/p&gt;
&lt;p&gt;For claims of copyright infringement the text of the source code matters. If I
wrote my program independently and I can prove the texts are different, I
don&#39;t infringe on his rights. This is an intensional point of view.&lt;/p&gt;
&lt;p&gt;For claims of patent infringement then differences in the text of the source
code won&#39;t matter. It won&#39;t even matter if the code is written in a different
programming language. If my program uses the same method that is covered by
the patent according to whatever legal test of &amp;quot;same method&amp;quot; is applicable,
I will infringe. This is an extensional perspective.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The notion of an &lt;em&gt;intensional&lt;/em&gt; and &lt;em&gt;extensional&lt;/em&gt; perspectives is actually an
amazing insight into the world of mathematics that I hope to discuss more as I
make my way through the excellent book
&lt;a href=&quot;http://www.amazon.com/gp/product/0521514371&quot;&gt;Autonomy of Mathematical Knowledge&lt;/a&gt;
by &lt;a href=&quot;http://www.nd.edu/~cfranks/&quot;&gt;Curtis Franks&lt;/a&gt;.
&lt;em&gt;(Disclosure: the author is a friend of mine.)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The basic question is how can we say that two items or methods &amp;quot;are the same?&amp;quot;
In what way are they the same? Computational theory suggests that two methods
are the same if they are &lt;em&gt;reducible&lt;/em&gt; to each other. That is, if under the same
circumstances they both produce the same result, the methods are considered the
same.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More on this later.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2010-02-24&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2010-02-24T00:00-05:00&quot;&gt;2010-02-24&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2010/02/review-autonomy-of-mathematical.html&quot;&gt;Review: The Autonomy of Mathematical Knowledge&lt;/a&gt;&lt;/cite&gt;
for my review of that book.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/computational-theory-for-lawyers.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Review: I Will Teach You To Be Rich</title>
      <link href="https://metaist.com/blog/2009/11/review-i-will-teach-you-to-be-rich.html"/>
      <id>tag:metaist.com,2010:blog.post-12abe37ecdcd6e5e9f91fda0985001b1711dfd1a</id>
      <published>Sun Nov 22 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;figure style=&quot;float: right; width: 7em; margin: 0 0 1em 1.5em;&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0761147489&quot;&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-23-review-i-will-teach-you-to-be-rich.jpg&quot; alt=&quot;I Will Teach You To Be Rich&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://www.amazon.com/gp/product/0761147489&quot;&gt;Amazon&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;review&quot; tabindex=&quot;-1&quot;&gt;Review &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/review-i-will-teach-you-to-be-rich.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;/p&gt;&lt;p&gt;Ramit Sethi (that I guy I quote a lot), author of the website
&lt;a href=&quot;http://www.iwillteachyoutoberich.com/&quot;&gt;IWillTeachYouToBeRich.com&lt;/a&gt;,
&lt;a href=&quot;http://www.amazon.com/gp/product/0761147489&quot;&gt;published a book by the same name&lt;/a&gt; about personal finance for
twentysomethings.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Although I knew the book would not differ much from the content available on his
website, it was pleasant to have Ramit&#39;s thoughts presented in close proximity
to each other rather than spread out across the years I&#39;ve been following his
blog.&lt;/p&gt;
&lt;p&gt;Most of his advice revolves around a single theme: &lt;strong&gt;stop loosing money by doing
nothing&lt;/strong&gt;. It occurred to me that while in the world of economics, such appeals
to &lt;a href=&quot;http://en.wikipedia.org/wiki/Opportunity_cost&quot;&gt;opportunity cost&lt;/a&gt; are
customary, the world of twentysomethings would much rather feel guilty about
doing nothing rather than actually figuring out what needs to be done and doing
it. &lt;em&gt;(Please pardon the gross oversimplifications; there are many responsible
twenty year-olds, but few who think they can do anything about their finances.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The blog contains much, if not all, of the advice in the book, but the book
highlighted three things I had failed to implement (though I read them on the
blog). First, I finally took
&lt;a href=&quot;https://web.archive.org/web/20090602164754/http://www.iwillteachyoutoberich.com/negotiation/&quot;&gt;Ramit&#39;s advice about negotiation&lt;/a&gt;,
and negotiated a bill. I clearly have more work to do in that department, but it
was good to have a plan of how to approach the conversation, and not feel weird
about talking about money. To Ramit&#39;s credit, he portrays negotiation as
asymmetric warfare: you, a novice in negotiation, are battling with experts who
negotiate with people every day. However, you needn&#39;t become a Spartan to
negotiate effectively. In fact, being pleasant (and smiling) makes it even
easier. Negotiation is a fascinating phenomenon in the world of human
interaction; it has elements of conflict, optimization and compromise. Each
party seeks to optimize results that favor him or her, yet done right both
parties can win. A critical part of Ramit&#39;s advise is to avoid yes-or-no
questions when you really want to ask &amp;quot;&lt;strong&gt;how can we make this work?&lt;/strong&gt;&amp;quot; That one
question saved me $180 (over six months) for 2 minutes worth of effort.&lt;/p&gt;
&lt;p&gt;The next piece of advise I had failed to implement was to synchronize your bills
with your paycheck (to the extent possible). The idea is to have a more
predictable and automated flow of money. While I&#39;ve got much of the flow nailed
down, I never thought to change the billing date to a common date; we&#39;ll see how
this works out over the coming months and years.&lt;/p&gt;
&lt;p&gt;Lastly, the book provided a clearer perspective on what it takes to buy a house.
Again, this isn&#39;t anything that Ramit hadn&#39;t said previously about
&lt;a href=&quot;https://web.archive.org/web/20201020123014/https://www.iwillteachyoutoberich.com/blog/how-to-buy-a-house/&quot;&gt;buying a house&lt;/a&gt;. It was
just easier to focus on his points when I was reading a book (about finance!)
rather than reading my daily blogs. The only change in behavior this created was
creating a little &amp;quot;dashboard&amp;quot; for important goals. Previously the goals were
general (house, travel, etc.); now they are very specific (20% down payment,
trip to California, etc.). This small change forced me to also estimate the cost
and, by extension, the date of fulfillment of each of the goals. Again, the
payoff is mostly psychological, but it helps take down some
&lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;psychological barriers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Overall, I recommend this book to most people as an example of how to set up an
automatic system that helps alleviate certain kinds of stress. It&#39;s an excellent
short read and his good humored presentation doesn&#39;t hurt either.&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/review-i-will-teach-you-to-be-rich.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/review-i-will-teach-you-to-be-rich.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Advances in Printer Ink</title>
      <link href="https://metaist.com/blog/2009/11/advances-in-printer-ink.html"/>
      <id>tag:metaist.com,2010:blog.post-98733080aedac6686f815ba4fb20537f40aa93cc</id>
      <published>Sat Nov 21 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/advances-in-printer-ink.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;A recent IEEE Spectrum featured an article about an
&lt;a href=&quot;http://ieeexplore.ieee.org/xpls/abs_all.jsp?isnumber=5292025&amp;amp;arnumber=5292045&amp;amp;count=21&amp;amp;index=15&quot;&gt;advance in ink-less printing called ZINK&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-22-advances-in-printer-ink.png&quot; alt=&quot;CMYK circles&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:CMYK-circles.png&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/advances-in-printer-ink.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As consumers, we&#39;re familiar with the
&lt;a href=&quot;https://web.archive.org/web/20091124070724/https://www.pcworld.com/article/112199/why_do_ink_cartridges_cost_so_much.html&quot;&gt;high price of ink&lt;/a&gt;.
If you think &lt;a href=&quot;http://auto.howstuffworks.com/fuel-efficiency/fuel-consumption/gas-price.htm&quot;&gt;gasoline is expensive&lt;/a&gt;,
how&#39;s &lt;a href=&quot;http://www.ebusinessforum.com/index.asp?doc_id=7159&amp;amp;layout=rich_story&quot;&gt;$8,000 a gallon&lt;/a&gt;
for HP ink? And it doesn&#39;t help that many printers have been
&amp;quot;&lt;a href=&quot;http://arstechnica.com/hardware/news/2007/06/study-inkjet-printers-are-filthy-lying-thieves.ars&quot;&gt;designed&lt;/a&gt;&amp;quot;
to &lt;a href=&quot;http://consumerist.com/282784/printers-prompt-for-ink-replacement-before-ink-is-out&quot;&gt;produce false out-of-ink messages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There have been several attempts at lowering the cost of printer ink. In 2007,
&lt;a href=&quot;http://www.nytimes.com/2007/05/17/technology/17pogue.html?_r=0&amp;amp;ei=5090&amp;amp;en=0d0fc2e6a84ceb30&amp;amp;ex=1337054400&amp;amp;partner=rssuserland&amp;amp;emc=rss&amp;amp;pagewanted=all&quot;&gt;Kodak introduced a printer&lt;/a&gt;
that used their &amp;quot;pigment-based ink&amp;quot; and was supposed to revolutionize the
printer world. I&#39;m not sure how successful, they&#39;ve been, but it put the issue
of ink pricing at the forefront of many consumers minds.&lt;/p&gt;
&lt;p&gt;The most recent attempt at overcoming printer ink pricing comes from a
&lt;a href=&quot;http://www.polaroid.com/&quot;&gt;Polaroid&lt;/a&gt; spin-off called &lt;a href=&quot;http://www.zink.com/&quot;&gt;ZINK&lt;/a&gt;
&lt;small&gt;(for Zero-ink)&lt;/small&gt; that has been working for decades on creating
colorless, ink-less paper that uses localized heat to change the color at each
point. Several companies have cameras that also print 2x3 inch photos using
ZINK: the &lt;a href=&quot;https://www.amazon.com/Polaroid-PoGo-Instant-Mobile-Printer/dp/B001ZSDC1A&quot;&gt;Polaroid PoGo&lt;/a&gt;, &lt;a href=&quot;http://www.amazon.com/gp/product/B002LOC3PS&quot;&gt;Dell Wasabi&lt;/a&gt;, and the &lt;a href=&quot;https://web.archive.org/web/20201127152454/https://www.engadget.com/2008-11-06-tomy-xiao-digital-camera-has-built-in-zink-printer-the-spirit-o.html&quot;&gt;TOMY xiao&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&#39;s fascinating to see the old fallen giants Kodak and Polaroid wake from their
slumber and try to compete in their former markets adapting to the digital
realities of today. If their technologies advance and expand, we may see a
disruption in the printer market similar to that of the &#39;80s.&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/advances-in-printer-ink.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2013-03-07&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-07T17:12:00-05:00&quot;&gt;2013-03-07&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/advances-in-printer-ink.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated link about Kodak&#39;s All-in-One printers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/advances-in-printer-ink.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Maslow&#39;s Hierarchy of Needs</title>
      <link href="https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html"/>
      <id>tag:metaist.com,2010:blog.post-71cc126b2744a7e31451da319f48eb481cf50c65</id>
      <published>Thu Nov 19 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Thu Nov 19 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Maslow&#39;s_hierarchy_of_needs&quot;&gt;Maslow&#39;s Hierarchy of Needs&lt;/a&gt; is a structure that describes human
desires and motivations in terms of tiers of fulfillment.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-20-maslows-hierarchy-of-needs.png&quot; alt=&quot;Maslow&#39;s Hierarchy of Needs&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://en.wikipedia.org/wiki/File:Maslow&#39;s_Hierarchy_of_Needs.svg&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The basic premise behind &lt;a href=&quot;http://en.wikipedia.org/wiki/Maslow&#39;s_hierarchy_of_needs&quot;&gt;Maslow&#39;s hierarchy&lt;/a&gt; is that people&#39;s
needs are organized in such a way that when lower needs (e.g., sleep) are
unfulfilled, it is impossible to focus on higher needs (e.g., self-esteem).
Recently, a friend questioned the nature of this hierarchy citing examples of
religious people who clearly appear to be fulfilled at the highest level
(self-actualization), yet lacked many of the securities provided by the lower
levels (e.g., food, employment, health).&lt;/p&gt;
&lt;p&gt;Alderfer proposed a revised version known as
&lt;a href=&quot;http://en.wikipedia.org/wiki/ERG_theory&quot;&gt;ERG Theory&lt;/a&gt; in which needs are also
grouped into &lt;em&gt;Existence&lt;/em&gt;, &lt;em&gt;Relatedness&lt;/em&gt;, and &lt;em&gt;Growth&lt;/em&gt; categories. However,
neither of these theories explains how people could work on higher levels while
lower levels remain unfulfilled.&lt;/p&gt;
&lt;h2 id=&quot;conjecture&quot; tabindex=&quot;-1&quot;&gt;Conjecture &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A possible explanation might be the inverse of the &amp;quot;regression&amp;quot; theory that
Alderfer proposed. He suggested that when a higher need was unfulfilled, lower
needs received more attention. I propose that if a higher need is
over-fulfilled, lower needs can be (temporarily) ignored.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Is it useful to organize human needs in this way? I&#39;m aware of some applications
in education and business, are there any others? Do you know of alternatives?&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2009-11-23&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2009-11-23&quot;&gt;2009-11-23&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/maslows-hierarchy-of-needs.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A friend suggested that perhaps only people who have had lower levels
satisfied in the past are able to refocus efforts into higher levels when
those lower levels are subsequently unfulfilled because they at least
&lt;em&gt;experienced&lt;/em&gt; those levels.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Pomodoro Technique</title>
      <link href="https://metaist.com/blog/2009/11/pomodoro-technique.html"/>
      <id>tag:metaist.com,2010:blog.post-2570ae5e5473197c9f57858be1be9984a8a53bcd</id>
      <published>Wed Nov 18 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;technique&quot; tabindex=&quot;-1&quot;&gt;Technique &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.pomodorotechnique.com/&quot;&gt;Pomodoro Technique&lt;/a&gt; is a method for
improving productivity by creating focused periods of attention as well as
forcing breaks at regular intervals.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-19-pomodoro-technique.jpg&quot; alt=&quot;Tomato&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Pomidor.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A pomodoro is an indivisible unit of time (usually 25 minutes), plus a short
break (3-5 minutes). Also the word for tomato in Italian.
&lt;small&gt;(The inventor, Francesco Cirillo, used a tomato kitchen timer when he
came up with this technique.)&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Although I&#39;ve only been using this technique for several months, I&#39;m finding it
an increasingly pleasant way to organize my day. In particular, I enjoy the
focus on the down-time and context switching. Here&#39;s my adapted version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Task Lists&lt;/strong&gt; - Believe it or not, I use a plain text file. In fact, I make
a new text file every month for all the things that need to be done
(unfinished items from previous months carry over). This text file is split
into two parts: the top part has all the unscheduled tasks (i.e., tasks that
have not been assigned to a day) and the bottom is a reverse-chronological
list of tasks by date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scheduling&lt;/strong&gt; - Most days start by selecting which unscheduled tasks I&#39;ll
do today. Occasionally, I create a &amp;quot;check-on-the-status&amp;quot; tasks which are
derived from special unscheduled tasks that indicate that I&#39;m waiting for
something (e.g., someone needs to get back to me). Tasks are organized
roughly in the order I want to accomplish them, and I add estimates for the
number of pomodoros I anticipate certain tasks to take. Since pomodoros are
indivisible I group small tasks together and estimate the total time for all
of them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Countdown&lt;/strong&gt; - I use an
&lt;a href=&quot;http://www.online-stopwatch.com/online-stopwatch.swf&quot;&gt;online stopwatch&lt;/a&gt; to
count-down 25 minutes during which time I work on the next task in the list.
If I finish early, I try to look over my work. When the bell rings I force
myself to stop immediately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recordkeeping&lt;/strong&gt; - I use a variant of the notation in the book. Instead of
&amp;quot;X&amp;quot;&#39;s, I record the pomodoro number. This way, if I accomplish multiple
tasks, I record the pomodoro during which they were accomplished. Internal
interruptions (e.g., hunger, tiredness) are indicated by an apostrophe (&#39;),
external interruptions by a dash (-), and a lost pomodoro by a slash (/).
&lt;small&gt;(Pomodoros are considered indivisible, so if you get really
off-track, you have to reset the clock.)&lt;/small&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Break&lt;/strong&gt; - When the stopwatch rings, I usually take a three minute break,
and take care of most of the interruptions that occurred during the previous
pomodoro.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;External interruptions are dealt with by announcing that you &amp;quot;are in the middle
of a pomodoro&amp;quot; which usually works. Sometimes, however, I loose my pomodoro
because of an external distraction that is anything but brief. But it&#39;s okay,
because practitioners of the technique know that &amp;quot;the next pomodoro will go
better.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2011-09-20&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2011-09-20T21:31:16-04:00&quot;&gt;2011-09-20&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20091121214205/http://www.iwillteachyoutoberich.com/blog/time-management-how-an-mit-postdoc-writes-3-books-a-phd-defense-and-6-peer-reviewed-papers-and-finishes-by-530pm/&quot;&gt;Time management: How an MIT postdoc writes 3 books, a PhD defense, and 6+ peer-reviewed papers – and finishes by 5:30pm&lt;/a&gt;&lt;/cite&gt;
at &lt;span class=&quot;vcard org fn&quot;&gt;IWillTeachYouToBeRich&lt;/span&gt;
for a remarkable example of time management.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Discontent Grows with Google: Wave, Closure and Go</title>
      <link href="https://metaist.com/blog/2009/11/discontent-grows-with-google-wave.html"/>
      <id>tag:metaist.com,2010:blog.post-770c74ba908b3ca95362ed0557643e816f7ff7f9</id>
      <published>Tue Nov 17 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/discontent-grows-with-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Recently, programmers have been grumbling about Google on several fronts,
although none of the issues seem unsurmountable. Complaints about
(the currently invite-only) &lt;a href=&quot;http://wave.google.com/&quot;&gt;Google Wave&lt;/a&gt; and, more
recently, Google&#39;s &lt;a href=&quot;https://github.com/google/closure-library&quot;&gt;Closure Library&lt;/a&gt;
and &lt;a href=&quot;http://golang.org/&quot;&gt;Go programming language&lt;/a&gt;, all seem to wonder at how
these formerly Google-internal technologies could lack Google&#39;s characteristic
polish.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-18-discontent-grows-with-google-wave.jpg&quot; alt=&quot;Buried in snow&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Now is the winter of the programmer&#39;s discontent.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:FEMA_-_626_-_Photograph_by_Dave_Saville_taken_on_03-01-2000_in_Alaska.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;For example, Lukas Mathis is concerned about
&lt;a href=&quot;http://ignorethecode.net/blog/2009/11/15/google_waves_scrollbars/&quot;&gt;Wave&#39;s scrollbars&lt;/a&gt;),
while others seem to have &lt;a href=&quot;https://web.archive.org/web/20091118011807/http://easiertounderstandthanwave.com/&quot;&gt;more general concerns&lt;/a&gt;.
Similarly, while Closure seems to be providing the world with Google&#39;s
&lt;a href=&quot;https://www.techdirt.com/2009/11/12/google-doesnt-rely-on-intellectual-property-for-its-leadership-position/&quot;&gt;internal toolset&lt;/a&gt;,
Dmitry Baranovskiy points out that the library is
&lt;a href=&quot;http://www.sitepoint.com/google-closure-how-not-to-write-javascript/&quot;&gt;riddled with poorly written code&lt;/a&gt;
leaving many scratching their heads thinking &amp;quot;how could this come from Google?&amp;quot;&lt;/p&gt;
&lt;p&gt;And then there&#39;s Go. Go is Google&#39;s new programming language that is
&lt;a href=&quot;https://arstechnica.com/information-technology/2009/11/go-new-open-source-programming-language-from-google/&quot;&gt;attracting a lot of attention&lt;/a&gt;.
Aside from the &lt;a href=&quot;https://github.com/golang/go/issues/9&quot;&gt;previously used name&lt;/a&gt;
(a surprisingly lively discussion), apparently many of its advantages (namely
its compiled, concurrent nature) are apparently
&lt;a href=&quot;http://www.dalkescientific.com/writings/diary/archive/2009/09/15/100000_tasklets.html&quot;&gt;not as stellar&lt;/a&gt;
as Google supposes.&lt;/p&gt;
&lt;p&gt;Yet unlike other companies that dig themselves into a hole, Google has a great
escape plan: outsource the work to the community, and with enough interest,
they&#39;ll polish your product for you. This only works, of course, as long as
Google continues to give off the impression that they care about the communal
input. Without that respect, Google is stuck under an avalanche.&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/discontent-grows-with-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2009-12-06&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2009-12-06T00:00:00-05:00&quot;&gt;2009-12-06&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/discontent-grows-with-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;cite&gt;&lt;a href=&quot;https://metaist.com/blog/2009/12/question-what-is-google-wave.html&quot;&gt;Reader Question: What is Google Wave?&lt;/a&gt;&lt;/cite&gt;
for my explanation of Google Wave.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2013-03-07&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2013-03-07T20:54:00-05:00&quot;&gt;2013-03-07&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/discontent-grows-with-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/discontent-grows-with-google-wave.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Update more broken links and replaced article from CNet with Ars.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Inbox Zero</title>
      <link href="https://metaist.com/blog/2009/11/inbox-zero.html"/>
      <id>tag:metaist.com,2010:blog.post-8eacfd28671769f12339df67fa671ba58d1e2050</id>
      <published>Mon Nov 16 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;technique&quot; tabindex=&quot;-1&quot;&gt;Technique &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/inbox-zero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20090905004742/http://inboxzero.com/video/&quot;&gt;Inbox Zero&lt;/a&gt; is a technique for processing your
email and somewhat related to the concepts David Allen put forth in
&lt;a href=&quot;http://www.amazon.com/gp/product/0142000280&quot;&gt;Getting Things Done&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/z9UjeTMb3Yk?rel=0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Video: &lt;a href=&quot;http://www.youtube.com/watch?v=z9UjeTMb3Yk&quot;&gt;YouTube&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/inbox-zero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have found Inbox Zero effective at dealing with the
&lt;a href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;psychological barriers&lt;/a&gt; around
checking and responding to email. I&#39;ve adapted the process so that for every
email (starting with the oldest) I choose one of the following actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Label &amp;amp; Archive&lt;/strong&gt; - This is the most common action since most of my email
is purely information. By using filters, most the email is pre-labeled and I
usually just archive it (or delete it if it&#39;s an unsolicited advertisement).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Star It&lt;/strong&gt; - I choose this for emails that require me either do something
or that indicate that I&#39;m waiting for something to happen (e.g., receipts
for an order).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Respond&lt;/strong&gt; - Usually to acknowledge receipt of an email, or provide someone
with a particular piece of information. This must take less than two
minutes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After all the emails have been processed, I view all the starred emails. I add
all the items I need to do to my task list. (I will discuss how I process the
task list in a &lt;a href=&quot;https://metaist.com/blog/2009/11/pomodoro-technique.html&quot;&gt;future post&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;In the past two years, I have maintained an empty inbox at home and at work and
have found that I spend more time doing what needs to be done rather then
&lt;a href=&quot;http://linkinghub.elsevier.com/retrieve/pii/S0361923098000835&quot;&gt;trying to keep it all in my head&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/inbox-zero.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/inbox-zero.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Psychological Barriers</title>
      <link href="https://metaist.com/blog/2009/11/psychological-barriers.html"/>
      <id>tag:metaist.com,2010:blog.post-2c36777cbcd2bd4b77a88fe77bd412d40ef434bc</id>
      <published>Sun Nov 15 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;A &lt;em&gt;psychological barrier&lt;/em&gt; is a perception that impedes an action usually by
creating a sense that the activity is overly burdensome or that some unstated
prerequisite is unfulfilled. The result is often procrastination.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-16-psychological-barriers.jpg&quot; alt=&quot;Barrier&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Psychological barriers are not insurmountable, but they&#39;re annoying.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Boom_barrier.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;example&quot; tabindex=&quot;-1&quot;&gt;Example &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In a &lt;a href=&quot;http://www.nber.org/programs/ag/rrc/04-08LaibsonFinal.pdf&quot;&gt;study of 401(k) enrollment&lt;/a&gt;,
only 40% of employees took advantage of matching programs (note that this is
basically free money). Most employees viewed the task of enrolling as annoying
and simply took the passive do-nothing route.&lt;/p&gt;
&lt;p&gt;Ramit Sethi likes to talk about &lt;a href=&quot;https://www.getrichslowly.org/passive-barriers/&quot;&gt;psychological barriers&lt;/a&gt;
and how to overcome them. In that post, he also mentions how one could use
psychological barriers to intentionally prevent oneself from doing an action.
For example, people who have trouble using credit cards responsibly can freeze
it in a block of ice so that it is available for emergencies, but is otherwise
annoying to access.&lt;/p&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Psychological barriers provide insight into the origin of responses such as
&amp;quot;I didn&#39;t have a pen at the time&amp;quot; in response to why someone might forfeit
thousands of dollars in matched retirement income—the perception of
complexity (no matter how small) can shift one&#39;s decision away from even
ridiculously beneficial activities.&lt;/p&gt;
&lt;p&gt;Moreover, we gain insight into the world of advertising. Note how advertisers
try to tear down the barriers between you and an order for their product
(&amp;quot;order today&amp;quot;, &amp;quot;act now&amp;quot;, &amp;quot;call now&amp;quot;, &amp;quot;but wait there&#39;s more&amp;quot;) and how they try
to create barriers for the &amp;quot;problem&amp;quot; that their product &amp;quot;solves&amp;quot;. Of course we
always knew that
&lt;a href=&quot;http://www.gocomics.com/calvinandhobbes/1986/01/19/&quot;&gt;television is the opiate of the masses&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/psychological-barriers.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Easy Big Wins</title>
      <link href="https://metaist.com/blog/2009/11/easy-big-wins.html"/>
      <id>tag:metaist.com,2010:blog.post-cd554e35f5e2cabcb36e046814452f40f48762d2</id>
      <published>Sat Nov 14 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Sat Nov 14 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;conjecture&quot; tabindex=&quot;-1&quot;&gt;Conjecture &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/easy-big-wins.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;Optimizations that are easier to implement and that have a higher return on
investment are better than the alternative optimizations. Furthermore, most
popular optimizations do not deliver high returns on investment.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-15-easy-big-wins.jpg&quot; alt=&quot;Apples on pebbles&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Apple_on_pebbles.JPG&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;technique&quot; tabindex=&quot;-1&quot;&gt;Technique &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/easy-big-wins.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ramit Sethi outlines (in eye-catching ways) how one can figure out which
optimizations are worth your effort. Mostly, his advice hinges on
&lt;a href=&quot;http://www.iwillteachyoutoberich.com/blog/the-craigslist-penis-effect/&quot;&gt;differentiating yourself from everyone else&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As you can see, many Big Wins are actually easily within reach—&lt;em&gt;if&lt;/em&gt; you
choose the right targets and differentiate yourself from others. While you&#39;ll
have a few areas of life where you&#39;ll have to go up against formidable
competition, many other areas of life are wide open.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    <entry>
      <title>Zombies in Math and Literature</title>
      <link href="https://metaist.com/blog/2009/11/zombies-in-math-and-literature.html"/>
      <id>tag:metaist.com,2010:blog.post-79a6d7f92a1650c3c3d444bf133f3914bca8ea0f</id>
      <published>Wed Nov 11 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 28 2023 12:09:10 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/zombies-in-math-and-literature.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;http://en.wikipedia.org/wiki/Zombie&quot;&gt;zombie&lt;/a&gt; is typically a reanimated
corpse. Also known as the &amp;quot;un-dead.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;commentary&quot; tabindex=&quot;-1&quot;&gt;Commentary &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/zombies-in-math-and-literature.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;While zombies are not as popular as brains, the former are increasingly the
subject of discussion. For example, the recent film
&lt;a href=&quot;http://www.imdb.com/title/tt1156398/&quot;&gt;Zombieland&lt;/a&gt; and the video game
&lt;a href=&quot;http://www.amazon.com/gp/product/B001EHD9GA&quot;&gt;Left 4 Dead&lt;/a&gt;
both feature zombies.
Various &lt;a href=&quot;http://www.flickr.com/photos/samsmith/243104896/sizes/l/&quot;&gt;defenses&lt;/a&gt; and
&lt;a href=&quot;http://www.amazon.com/gp/product/1400049628&quot;&gt;survival guides&lt;/a&gt;
exist to help you deal with potential zombie attacks.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-12-zombies-in-math-and-literature.png&quot; alt=&quot;Trends of zombies and brains&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  Brains are still more popular than zombies.
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://www.google.com/trends?q=zombie,brain&amp;amp;ctab=0&amp;amp;geo=us&amp;amp;geor=all&amp;amp;date=2009&amp;amp;sort=0&quot;&gt;Google Trends&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;However, the emergence of zombies in non-entertainment fields is interesting. David Sirota of &lt;span class=&quot;vcard org fn&quot;&gt;In These Times&lt;/span&gt; has an interesting article on &lt;cite&gt;&lt;a href=&quot;http://web.archive.org/web/20100326134113/http://www.inthesetimes.com/article/5025/the_zombie_zeitgeist/&quot;&gt;The Zombie Zeitgeist&lt;/a&gt;&lt;/cite&gt; which discusses this new/old phenomenon and how society is dealing with
&amp;quot;apocalyptic anxiety&amp;quot;.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot; tabindex=&quot;-1&quot;&gt;See Also &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/zombies-in-math-and-literature.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;https://web.archive.org/web/20101231214804/https://mysite.science.uottawa.ca/rsmith43/Zombies.pdf&quot;&gt;When Zombies Attack!: Mathematical Modelling of an Outbreak of Zombie Infection&lt;/a&gt;&lt;/cite&gt;
(via &lt;a href=&quot;http://www.schneier.com/blog/archives/2009/08/modeling_zombie.html&quot;&gt;Schneier&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1594743347&quot;&gt;Pride and Prejudice and Zombies&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1594744424&quot;&gt;Sense and Sensibility and Sea Monsters&lt;/a&gt;&lt;/cite&gt; &lt;small&gt;(not about zombies, but related)&lt;/small&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;updates&quot; tabindex=&quot;-1&quot;&gt;Updates &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/zombies-in-math-and-literature.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2023-11-28&quot; tabindex=&quot;-1&quot;&gt;&lt;span class=&quot;rel-date&quot; title=&quot;2023-11-28T17:09:10Z&quot;&gt;2023-11-28&lt;/span&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/zombies-in-math-and-literature.html&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated broken links.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    <entry>
      <title>Fairness: Equity, Equality and Relative Need</title>
      <link href="https://metaist.com/blog/2009/11/fairness-equity-equality-and-relative.html"/>
      <id>tag:metaist.com,2010:blog.post-ac40d1fd6c9902b7d8b8b745718a0e5d236487e3</id>
      <published>Tue Nov 10 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Tue Nov 10 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;conjecture&quot; tabindex=&quot;-1&quot;&gt;Conjecture &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/fairness-equity-equality-and-relative.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;When people discuss &amp;quot;fairness&amp;quot; they are actually referring to either equity,
equality or relative need. Or (like children) they mean &amp;quot;it&#39;s not what I want.&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-11-fairness-equity-equality-and-relative.jpg&quot; alt=&quot;Customers waiting in line&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Photo: &lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Potter_queue.jpg&quot;&gt;Wikimedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;definitions&quot; tabindex=&quot;-1&quot;&gt;Definitions &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/fairness-equity-equality-and-relative.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Equity&quot;&gt;Equity&lt;/a&gt;&lt;/em&gt; is how a checkout line (queue)
works: people line up and are served in order. This is also know as
&amp;quot;first-come, first-serve.&amp;quot; Notice that we don&#39;t randomly select among the
customers waiting to be served (equality) nor do we order the customers by the
number of items in their cart (relative need).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Equality&lt;/em&gt; is how a one-ticket-per-person raffle works. Assuming the winning
ticket is chosen at random, the probability of winning is the same for each
ticket-holder. We don&#39;t award the prize to the first person who buys a ticket
(equity), nor do we award the prize to whomever wants or needs it the most
(relative need).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Relative need&lt;/em&gt; is how an emergency room works. If Alice is waiting to have a
splinter removed and Bob needs immediate surgery, the relative needs of Bob take
priority over the needs of Alice and Bob is served first. While in some cases,
we&#39;d process patients in the order in which they arrived (equity), it seems
rather arbitrary to select patients at random (equality).&lt;/p&gt;
&lt;h2 id=&quot;example&quot; tabindex=&quot;-1&quot;&gt;Example &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/fairness-equity-equality-and-relative.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A simple example is
&lt;a href=&quot;http://en.wikipedia.org/wiki/Affirmative_action&quot;&gt;affirmative action&lt;/a&gt;. Both
sides of the debate tend to complain about &amp;quot;fairness,&amp;quot; yet both refer to
different policies. One side demands equality or equity, while the other wants a
policy of relative need. Of course, such realizations do not solve the problems
involved, but they do clarify the locus of dispute.&lt;/p&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/fairness-equity-equality-and-relative.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;How do we decide which policy of &amp;quot;fairness&amp;quot; to apply in a given situation?&lt;/p&gt;
</content>
    </entry>
    <entry>
      <title>Pareto Efficiency</title>
      <link href="https://metaist.com/blog/2009/11/pareto-efficiency.html"/>
      <id>tag:metaist.com,2010:blog.post-9fd4b4534258de1ffcae2026630920eec35dc691</id>
      <published>Mon Nov 09 2009 19:00:00 GMT-0500 (Eastern Standard Time)</published>
      <updated>Mon Nov 09 2009 19:00:00 GMT-0500 (Eastern Standard Time)</updated>
      <author>
        <name>The Metaist</name>
      </author>
      <content type="html">&lt;h2 id=&quot;definition&quot; tabindex=&quot;-1&quot;&gt;Definition &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pareto-efficiency.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;entry-summary&quot; markdown=&quot;1&quot;&gt;
&lt;p&gt;If a change from X to Y results in at least one agent better off without making
any agents worse off, we call Y a
&lt;a href=&quot;http://en.wikipedia.org/wiki/Pareto_improvement&quot;&gt;Pareto improvement&lt;/a&gt;
relative to X. If no more Pareto improvements are possible, the situation is
said to be &lt;em&gt;Pareto efficient&lt;/em&gt; or &lt;em&gt;Pareto optimal&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;figure markdown=&quot;1&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://metaist.com/static/img/2009-11-10-pareto-efficiency.png&quot; alt=&quot;Pareto&quot;&gt;&lt;/p&gt;
&lt;figcaption&gt;
  &lt;address markdown=&quot;1&quot;&gt;
&lt;p&gt;(Image: &lt;a href=&quot;http://en.wikipedia.org/wiki/File:Front_pareto.svg&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/p&gt;&lt;/address&gt;&lt;p&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;meta&quot; tabindex=&quot;-1&quot;&gt;Meta &lt;a class=&quot;header-anchor&quot; href=&quot;https://metaist.com/blog/2009/11/pareto-efficiency.html&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When thinking about a proposed Pareto improvement, consider the &lt;em&gt;resistance to
change&lt;/em&gt; on the part of the people who will implement your proposal. You may
realize that your proposal is no longer a Pareto improvement because of the
non-monetary costs involved.&lt;/p&gt;
</content>
    </entry>
</feed>
