<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>hi, it&#39;s mike</title>
    <link>https://mike.puddingtime.org/tags/doom/</link>
    <description>Recent content on hi, it&#39;s mike</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>mike@puddingtime.org (mike)</managingEditor>
    <webMaster>mike@puddingtime.org (mike)</webMaster>
    <copyright>© 2026, mike</copyright>
    <lastBuildDate>Mon, 21 Apr 2025 11:10:53 -0700</lastBuildDate>
    <atom:link href="https://mike.puddingtime.org/tags/doom/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>By-host configs in Doom. Custom starting window sizes. </title>
      <link>https://mike.puddingtime.org/posts/2025-04-21-by-host-configs-in-doom-custom-starting-window-sizes-/</link>
      <pubDate>Mon, 21 Apr 2025 11:10:53 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2025-04-21-by-host-configs-in-doom-custom-starting-window-sizes-/</guid>
      <description>Removed a little conditional logic from config.org</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve got a few Macs and a few Linux machines and they all respond differently to some basic font size stuff and starting window dimensions. For the laptops, I don&rsquo;t mind if they start Emacs maximized. For the desktops, their screen geometries differ enough that I end up fiddling around. On the Macs I&rsquo;ve got <a href="https://rectangleapp.com/pro">Rectangle Pro</a> to make a preset and keyboard shortcut, but even that&rsquo;s a little annoying.</p>
<p>I used to have a bunch of conditional logic in <code>config.org</code> to manage all this, but it was sort of a pain to pick through when adding a machine, so I wanted to isolate the individual machine configurations a little. I&rsquo;m guessing it could be useful for other stuff in the future, but for now it handles some appearance stuff.</p>
<p>For by-host configs, I added this to my <code>config.org</code>:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">hostname</span> <span class="p">(</span><span class="nv">system-name</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">hostname-file</span> <span class="p">(</span><span class="nv">expand-file-name</span> <span class="p">(</span><span class="nv">concat</span> <span class="nv">hostname</span> <span class="s">&#34;.el&#34;</span><span class="p">)</span> <span class="nv">doom-private-dir</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nv">file-exists-p</span> <span class="nv">hostname-file</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nv">load-file</span> <span class="nv">hostname-file</span><span class="p">))))</span></span></span></code></pre></div>
<p>That just looks for a file in my Doom directory with the <code>hostname.el</code> naming convention.</p>
<p>A sample <code>hostname.el</code> file looks like this:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="k">setq</span> <span class="nv">doom-font</span> <span class="p">(</span><span class="nv">font-spec</span> <span class="ss">:family</span> <span class="s">&#34;Fira Code&#34;</span> <span class="ss">:size</span> <span class="mf">14.0</span> <span class="ss">:weight</span> <span class="ss">&#39;medium</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">setq</span> <span class="nv">mixed-pitch-set-height</span> <span class="mi">15</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nv">set-face-attribute</span> <span class="ss">&#39;default</span> <span class="no">nil</span> <span class="ss">:family</span> <span class="s">&#34;Fira Code&#34;</span> <span class="ss">:height</span> <span class="mi">140</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nv">set-face-attribute</span> <span class="ss">&#39;fixed-pitch</span> <span class="no">nil</span> <span class="ss">:family</span> <span class="s">&#34;Fira Code&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nv">set-face-attribute</span> <span class="ss">&#39;variable-pitch</span> <span class="no">nil</span> <span class="ss">:family</span> <span class="s">&#34;Helvetica Neue&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">setq</span> <span class="nv">initial-frame-alist</span>
</span></span><span class="line"><span class="cl">      <span class="o">&#39;</span><span class="p">((</span><span class="nv">width</span> <span class="o">.</span> <span class="mi">171</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="nv">height</span> <span class="o">.</span> <span class="mi">66</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="nv">left</span> <span class="o">.</span> <span class="mi">728</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="nv">top</span> <span class="o">.</span> <span class="mi">166</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="k">setq</span> <span class="nv">default-frame-alist</span>
</span></span><span class="line"><span class="cl">      <span class="o">&#39;</span><span class="p">((</span><span class="nv">width</span> <span class="o">.</span> <span class="mi">171</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="nv">height</span> <span class="o">.</span> <span class="mi">66</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="nv">left</span> <span class="o">.</span> <span class="mi">728</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">(</span><span class="nv">top</span> <span class="o">.</span> <span class="mi">166</span><span class="p">)))</span></span></span></code></pre></div>
<p>The <code>initial-frame-alist</code> and <code>default-frame-alist</code> dimensions came from this function:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">defun</span> <span class="nv">my/print-frame-setup-snippet</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;Print a config snippet for setting the current frame size and position.&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="k">let*</span> <span class="p">((</span><span class="nv">w</span> <span class="p">(</span><span class="nv">frame-width</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">h</span> <span class="p">(</span><span class="nv">frame-height</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">pos</span> <span class="p">(</span><span class="nv">frame-position</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">l</span> <span class="p">(</span><span class="nf">car</span> <span class="nv">pos</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">top-pos</span> <span class="p">(</span><span class="nf">cdr</span> <span class="nv">pos</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nv">with-temp-buffer</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nv">insert</span> <span class="p">(</span><span class="nf">format</span> <span class="s">&#34;(setq initial-frame-alist\n      &#39;((width . %d)\n        (height . %d)\n        (left . %d)\n        (top . %d)))\n\n&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="nv">w</span> <span class="nv">h</span> <span class="nv">l</span> <span class="nv">top-pos</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nv">insert</span> <span class="p">(</span><span class="nf">format</span> <span class="s">&#34;(setq default-frame-alist\n      &#39;((width . %d)\n        (height . %d)\n        (left . %d)\n        (top . %d)))&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="nv">w</span> <span class="nv">h</span> <span class="nv">l</span> <span class="nv">top-pos</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nv">kill-new</span> <span class="p">(</span><span class="nv">buffer-string</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nv">message</span> <span class="s">&#34;!!! Frame setup snippet copied to clipboard! Paste it into your config.el.&#34;</span><span class="p">))))</span></span></span></code></pre></div>
<p>So, set the Emacs frame up the way you want, then run that function, and paste it into <code>hostname.el</code>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2023-05-24</title>
      <link>https://mike.puddingtime.org/posts/2023-05-24-daily-notes/</link>
      <pubDate>Wed, 24 May 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-05-24-daily-notes/</guid>
      <description>Cleaning up results in literate config files. Portland and the JOHS. Some Doom discontent.</description>
      <content:encoded><![CDATA[<h2 id="cleaning-up-my-literate-config-file">Cleaning up my literate config file</h2>
<p>I like keeping my Doom Emacs config file in config.org. I didn&rsquo;t like the <code>#RESULTS</code> drawers cluttering up the file, especially for longer functions with copious output.</p>
<p>The way to selectively disable that for a given src block is to append <code>:results output silent</code> to the block opener, e.g.</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="err">#</span><span class="nv">+begin_src</span> <span class="nv">emacs-lisp</span> <span class="nb">:results</span> <span class="nv">output</span> <span class="nv">silent</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nv">vertico-reverse-mode</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">setq</span> <span class="nv">vertico-count</span> <span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">setq</span> <span class="nv">vertico-resize</span> <span class="no">t</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="err">#</span><span class="nv">+end_src</span></span></span></code></pre></div>
<p>The way to do it for an entire file is to put <code>#+property: header-args :results silent</code> at the top.</p>
<p>You can still evaluate a given src block by tapping return on either the first or <code>#+end_src</code> lines, but the output goes to the minibuffer instead of a <code>#RESULTS</code> drawer. If you need to really read through the output, there&rsquo;s always the <code>*Messages*</code> buffer, or tacking <code>:results output replace</code> onto the src block opener to get your <code>#RESULTS</code> drawer back.</p>
<h2 id="johs-and-the-city">JOHS and the city</h2>
<p>The city and the county are <a href="https://www.wweek.com/news/city/2023/05/23/city-council-will-vote-to-extend-joint-office-agreement-with-multnomah-county-to-allow-for-further-negotiations-again/">again considering extending the JOHS for just a year</a>. I still don&rsquo;t understand the division of labor there. It&rsquo;s the worst of both worlds: The city drops a pallet of money on the county&rsquo;s dock, but remains on the hook for the tactical response. The county takes the money, claims the high ground of long-term, strategic perspective, then has an effective veto over elements of the city&rsquo;s tactical response even as it fails to allocate half its budget, and actual providers on the ground <a href="https://www.wweek.com/news/2023/04/05/joint-office-of-homeless-services-contracting-woes-create-instability-for-survivors-of-domestic-violence/">struggle to retain help with a living wage, or even get decent contracts through the JOHS</a>.</p>
<p>If the JOHS were a <em>joint</em> office, performing some actual coordinative role, maybe it&rsquo;d be different. But it&rsquo;s a county office: Its reporting structure roles up to the chair, it uses county administrative structures and processes, and it is beholden to county leadership. It&rsquo;s also profoundly dysfunctional, leaving millions and millions of dollars on the table, and failing in its most basic data-gathering, reporting, and contracting commitments.</p>
<p>But we&rsquo;re in one of those situations where the dysfunction seems to be politically expedient. The city and county are at fundamental odds on homelessness policy, and the people in this policy area at the county level view themselves as a sort of superego governing the city&rsquo;s id. Once one partner in a relationship predicates their participation on the notion that they&rsquo;re mostly there to keep their partner from doing something they don&rsquo;t like, the relationship is sunk. Burn it down and start over with a new charter.</p>
<h2 id="batteries-included-situations-and-their-discontents">Batteries-included situations and their discontents</h2>
<p>I think I&rsquo;ve hit the first thing using Doom Emacs that is not sitting well with me. Well, let&rsquo;s scope out a little: I think I&rsquo;ve hit the first time something <em>that is inevitable</em> with &ldquo;batteries-included&rdquo; situations has annoyed me as I&rsquo;ve used Doom in particular.</p>
<p>Emacs has a bunch of &ldquo;completion frameworks,&rdquo; which control what happens when you go to issue a command, open a file, look up a definition or whatever. The last time I used Emacs a lot <a href="https://github.com/emacs-helm/helm">Helm</a> was sort of the big deal, but since then plenty of others have come along. If you look in the part of Doom&rsquo;s config that offers pre-packaged completion frameworks, you get several choices:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="nb">:completion</span>
</span></span><span class="line"><span class="cl"><span class="nv">company</span>           <span class="c1">; the ultimate code completion backend</span>
</span></span><span class="line"><span class="cl"><span class="c1">;; helm              ; the *other* search engine for love and life</span>
</span></span><span class="line"><span class="cl"><span class="c1">;; ido               ; the other *other* search engine...</span>
</span></span><span class="line"><span class="cl"><span class="c1">;; ivy               ; a search engine for love and life</span>
</span></span><span class="line"><span class="cl"><span class="nv">vertico</span>           <span class="c1">; the search engine of the future</span></span></span></code></pre></div>
<p>Which, so far so good. As near as I can parse the conversation, newer completion frameworks like <a href="https://github.com/minad/vertico/blob/main/README.org">Vertico</a> are built around the idea that it&rsquo;s better to build off of core Emacs functionality and think in a more modular manner. So then you look up what happens when you enable Vertico, that involves a series of complementary packages:</p>
<ul>
<li>consult</li>
<li>consult-flycheck</li>
<li>embark</li>
<li>embark-consult</li>
<li>marginalia</li>
<li>orderless</li>
<li>vertico</li>
<li>vertico-posframe (maybe)</li>
<li>wgrep</li>
</ul>
<p>Because I do not want to make this about the problem I&rsquo;m dealing with at this particular moment, I just want to say <em>holy cow what a stew of possible starting points for solving a problem</em>.</p>
<p>I&rsquo;ve spent this morning trying to track down a UI annoyance and the mere act of changing word order in my searches has implicated four of the packages on that list.  Because the Emacs community is a relatively small one &mdash; at least by the time you get done subdividing it into &ldquo;Emacs users who also use Doom and who are using Vertico within Doom&rdquo; &mdash; you exhaust possible resolutions quickly, and begin to realize you&rsquo;ve seen the same configuration go by several different times as people in this relatively small subset share it around.</p>
<p>Anyhow, I&rsquo;m not here to bag on Doom or complain about copypasta configs. I&rsquo;m just noting that at a certain point in the world of batteries-included frameworks you are sorting through a metric ton of batteries, all tucked away behind a very smooth housing requiring a variety of Torx and jeweler&rsquo;s screwdrivers to get open. One of those paradoxes, I guess, where your lower-skilled people (me) get a ton of leverage from all the layers of abstraction and affordance, but then wander into situations where it would take a very highly skilled person (not me) to sort out where the magic is going wrong (or just not going the way you wished, since &ldquo;wrong&rdquo; is sort of fraught, here.)</p>
<p>And I fall on the maximizer end of <a href="https://www.psychologistworld.com/cognitive/maximizers-satisficers-decision-making">the satisficer/maximizer spectrum</a>, so it&rsquo;s hard to say of some UI glitch &ldquo;well, that&rsquo;s an annoyance I&rsquo;ll be living with,&rdquo; even if there are ample workarounds or even simple &ldquo;then quit moving your arm that way&rdquo; solutions.</p>
<p>Okay. I think I&rsquo;ve gotten that off my chest. Time to go to the Doom Discourse, <a href="https://discourse.doomemacs.org/t/trying-to-get-a-handle-on-fixing-file-preview-during-find-file/3896">mention the issue</a>, and see what I get.</p>
<h2 id="monodraw">Monodraw</h2>
<p>Even if you don&rsquo;t follow that link, I had an excuse to use <a href="https://monodraw.helftone.com">Monodraw</a> to illustrate my problem. Monodraw makes it super easy to make ASCII diagrams then copies them in a pre block to your clipboard.</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">┌──────────────────────────┐  ┌──────────────────────────┐
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│     Original window      │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │      Preview window      │
</span></span><span class="line"><span class="cl">├──────────────────────────┤  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│      Preview window      │  │                          │
</span></span><span class="line"><span class="cl">│                          │  ├──────────────────────────┤
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">├──────────────────────────┤  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │      Vertico window      │
</span></span><span class="line"><span class="cl">│      Vertico window      │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">│                          │  │                          │
</span></span><span class="line"><span class="cl">└──────────────────────────┘  └──────────────────────────┘</span></span></code></pre></div>
<p>There is a world somewhere that I could use Monodraw in a business context and not have it be a complete distraction, but for anything other than &ldquo;a box with words in it,&rdquo; e.g. a more complex organizational diagram or flow chart, it is utterly distracting, either by people who want there to be boxes with colors or people who want to know how on Earth you made such a complex diagram with pipes and dashes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2023-05-18</title>
      <link>https://mike.puddingtime.org/posts/2023-05-18-daily-notes/</link>
      <pubDate>Thu, 18 May 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-05-18-daily-notes/</guid>
      <description>Changing how Vertico opens projects in Doom: A shaggy dog story. The security system.  They Live!</description>
      <content:encoded><![CDATA[<h2 id="doom-emacs-opening-a-project-in-dired-instead-of-having-to-pick-a-file">Doom Emacs: Opening a project in dired instead of having to pick a file</h2>
<p>So, I thought that &ldquo;<a href="https://en.wikipedia.org/wiki/Feghoot">feghoot</a>&rdquo; and &ldquo;shaggy dog story&rdquo; were interchangeable. They are not. This section of today&rsquo;s daily post, while possibly qualifying as a shaggy dog story,  will not end with a pun. If you&rsquo;d like I am happy to do a Zoom call or meet for coffee or lunch and share one or two of the three feghoots I cherish. If there is anything more fun than telling one of them and seeing how long I can prolong your agony, I don&rsquo;t know what it is.</p>
<p>Actually, I do: It&rsquo;s being stuck in a room with a bunch of directors all sitting around awkwardly awaiting the CEO&rsquo;s arrival having exhausted all their small talk, and telling three feghoots in a row. The first one elicits uneasy and nervous grins, but what the hell: It&rsquo;s Mike and he does things like this and also we&rsquo;re out of small talk.</p>
<p>Rounding into the second one, the smiles are more forced. Is he going to prolong the telling? Is this one perhaps more efficient? Has anyone checked Slack to see where Yvonne is?</p>
<p>The third one, and you&rsquo;re out of &ldquo;nervous grin&rdquo; territory, and into the family of facial expressions that pair well with &ldquo;rictus.&rdquo; Except for the one or two people who are completely here for the performance. <em>Your</em> people.</p>
<p>And it&rsquo;s completely a race against time. The CEO could turn up at any time. Three feghoots in a row is a punishing exercise, so getting them all in without betraying the form with efficiency and then quietly packing up your wagon and riding out of town/slipping back into the mien of your accustomed station &hellip; it&rsquo;s a craft.  You know you&rsquo;re good at it when you start any conversation over the next six months with &ldquo;so &hellip; &quot; and people wince.</p>
<p>Anyhow:</p>
<p>By default, Doom&rsquo;s projectile project switcher command (<code>SPC p p</code>) uses <code>projectile-switch-project</code> to take you to another project. That means you hit <code>SPC p p</code> and it presents a list of known projects, you select one, and then it asks for a file. If you don&rsquo;t want to open a file, you just want to be in a project directory, and if you&rsquo;re using Helm, you can use <code>CTRL d</code> to open a given project directory in dired at the point in the workflow where you have a list of projects.</p>
<p>This is fine, and I think I actually may have seen a testy Stack Overflow exchange about the matter, because one would-be answerer could not understand for the life of them why you&rsquo;d <em>not</em> want to get to a specific file in a project right away &hellip; do you not know why you&rsquo;re going there?</p>
<p>I do, but I&rsquo;ve got my reasons. One is very straightforward: I want to go to the project so I can do magit stuff with it, and it is weird to me to have to open a file. Another is just a personal tic: When I switch to a project, opening its directory is sort of like pulling a project&rsquo;s folder out of the filing cabinet and opening it on my desk. It&rsquo;s a small mental reset. &ldquo;I was there doing that, I am now here doing this.&rdquo;</p>
<p>Anyhow, I&rsquo;m using <a href="https://github.com/minad/vertico">Vertico</a> instead of Helm. Vertico does not, as near as I can tell, have a way to open a directory in dired from the Projectile picker.</p>
<p>So &hellip;</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">defun</span> <span class="nv">my-vertico-project-dired</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">let*</span> <span class="p">((</span><span class="nv">collection</span> <span class="p">(</span><span class="nv">projectile-relevant-known-projects</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">project</span> <span class="p">(</span><span class="nf">completing-read</span> <span class="s">&#34;Open project in dired: &#34;</span> <span class="nv">collection</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nv">dired</span> <span class="p">(</span><span class="nf">expand-file-name</span> <span class="nv">project</span><span class="p">))))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nv">map!</span> <span class="nb">:leader</span>
</span></span><span class="line"><span class="cl">      <span class="nb">:desc</span> <span class="s">&#34;Open project in dired&#34;</span> <span class="s">&#34;p p&#34;</span> <span class="nf">#&#39;</span><span class="nv">my-vertico-project-dired</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="nb">:desc</span> <span class="s">&#34;Select project and file&#34;</span> <span class="s">&#34;p P&#34;</span> <span class="nf">#&#39;</span><span class="nv">projectile-switch-project</span><span class="p">)</span></span></span></code></pre></div>
<p>That just remaps <code>SPC p p</code> to a function that opens a given projectile project in dired, and then moves the original command to <code>SPC p P</code> if I ever want to go that way.</p>
<p>But that made me think about what problem I was really trying to solve initially, which was just opening my blog project in magit right away while in another project. So:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nb">defun</span> <span class="nv">my-magit-start-in-hugo</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nv">magit-status</span> <span class="s">&#34;~/src/hugo&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nv">map!</span> <span class="nb">:leader</span>
</span></span><span class="line"><span class="cl">      <span class="nb">:desc</span> <span class="s">&#34;Start Magit in ~/src/hugo&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="s">&#34;g h&#34;</span> <span class="nf">#&#39;</span><span class="nv">my-magit-start-in-hugo</span><span class="p">)</span></span></span></code></pre></div>
<p><code>SPC p p</code> is so wired into my muscle memory after just a few months of Doom use that I can imagine I won&rsquo;t use the shortcut that routes through the Hugo submenus that much. But it&rsquo;s there.</p>
<p>Anyhow, once I went through all that I asked myself why I had my <code>blog.org</code> file over in my <code>~/org/</code> hierarchy to begin with. I remember <em>why</em> I did it that way, but realized I didn&rsquo;t <em>need</em> to do it like that. So I moved it over into my Hugo repo/project where it can just travel around with the project it belongs in, anyhow.</p>
<p>But I can open any project straight into its directory using Vertico now!</p>
<h2 id="my-tiger-rock">My tiger rock</h2>
<p>Nine or ten years ago our house got broken into. Al came home to do the front door jimmied open, all of our small electronics crammed into suitcases, and our bikes moved out of the garage and into the living room. She closed the door, turned around, and walked across the street, where she sat on the curb and called me. Given that everything was sitting there in the living room, it stood to reason someone was, perhaps, still upstairs.</p>
<p>So I left work early, picked Ben up from his art camp, and came home. I poked my head in the house, saw the situation, and yelled up the stairs that it&rsquo;d be best, were anyone to still be up there, to get out, and that if they wanted to do that I&rsquo;d be across the street and not in their way. I don&rsquo;t know if that strategy made a ton of sense, but I wasn&rsquo;t going to commit to going in the house and cornering someone, and I wanted to offer them an out that might avert eventual violence.</p>
<p>So we all sat on the curb across the street from the house, unsure of how to proceed. Nobody had come out for over an hour, so it seemed unlikely they were still upstairs. Eventually, when I checked my mail, I realized that UPS had dropped a package off about an hour before Al got home. UPS always bangs on the door when they drop something off, so we reasoned that the UPS person had dropped off a package, pounded on the door, and frightened off the thieves. I poked my head back in, saw that the back sliding door was slightly ajar, and realized they&rsquo;d gone out the back.</p>
<p>The police eventually turned up, took the crowbar into custody in case there were prints, and told us it was sort of a nothingburger situation because nothing had been stolen. We had to pay to repair the door. It was sort of gross, once we took stock, to see how they&rsquo;d gone through drawers, dumped out boxes, tossed underwear around, etc.</p>
<p>So, we got an alarm system.  It&rsquo;s a common kind, not super expensive, easy to set up, has an app, and it will call a dispatcher if you don&rsquo;t disable a triggered alarm within a minute.</p>
<p>It has worked fine for the last decade, but a few months ago we were told it needed to have its cellular module upgraded, and we settled into a routine of the alarm system telling us it would soon be useless if we didn&rsquo;t open the manila envelope the vendor sent us and do brain surgery and us ignoring it and the increasingly insistent emails.</p>
<p>Maybe it&rsquo;s complacency, but we&rsquo;ve lived through the several years since that incident and we have formed an impression: We&rsquo;ve called 911 a few times over neighborhood shootings, a brutal assault in the park across the street from our house, a brush fire on the Springwater, an attempt to get help for a Spanish-speaking guy who&rsquo;d been mugged on the trail, and Al&rsquo;s shattered elbow joint from a longboarding accident. One of the faster responses we ever got was to the longboarding accident, which involved a three-jurisdiction squabble over who should come get her. The fire response wasn&rsquo;t bad. The violent crimes took over an hour, and on one of them no reports were collected even though we had a license number and description.</p>
<p>&ldquo;Should we even bother calling next time?&rdquo;</p>
<p>&ldquo;Yeah, tell your state representatives to give the police more money. We&rsquo;re not going to investigate it.&rdquo;</p>
<p><em>Literally.</em></p>
<p>This is, theoretically, the same agency that the alarm system dispatchers would contact were someone to break in.</p>
<p>So as I sat at the kitchen table with a tiny screw driver, carefully removing the old cell module and screwing in the new one, I rationalized the use of my time by remembering that the one time we have had a break-in, a loud noise is probably what frightened off the burglar, and that the alarm system does make a super loud noise. And also that if we had an alarm, and someone broke in, we&rsquo;d at least know it because we&rsquo;d get a ping from the app or an SMS and there&rsquo;d be less chance of anyone walking in on someone.</p>
<p>But the police part? There&rsquo;s always the Simpsons.</p>
<div style="text-align:center;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/xSVqLHghLpw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>
<h2 id="they-live">They Live</h2>
<p>&hellip; is <a href="https://hollywoodtheatre.org/events/they-live/">showing at the Hollywood</a> this week and next.</p>
<figure><img src="/img/they_live.gif"
    alt="GIF of Roddy Rowdy Piper in They Live - I&#39;m all outta bubblegum" width="500">
</figure>

<p>Its time was then. Its time is now.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily notes for 2023-02-27</title>
      <link>https://mike.puddingtime.org/posts/2023-02-27-daily-notes-for-2023-02-27/</link>
      <pubDate>Mon, 27 Feb 2023 10:52:37 -0800</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-02-27-daily-notes-for-2023-02-27/</guid>
      <description>TickTick and productivity, the hilarity of Doom, an electrical failure, Tailscale, design fiddling</description>
      <content:encoded><![CDATA[<p><em>I used to do a daily page for my old dotunplanned blog, where I&rsquo;d dump things in as I thought about them and publish at the end of the day. Today&rsquo;s attempt to revive the custom is longer than usual because I ended up with a ton of time on my hands waiting for the electrician with all the infra shut down. We&rsquo;ll see how it goes.</em></p>
<h2 id="i-gamer">I, gamer</h2>
<p>The fun part of the PS4 has just been catching up on whatever has been going on in console gaming over the past while. I remember being a very avid gamer once upon a time &ndash; during the PS1 and PS2 era &ndash; then I was just really into the Nintendo DS, and then I didn&rsquo;t play much anymore. My 3DS never saw a lot of use, and I don&rsquo;t get much time in on the Switch. It has always felt like games on the Switch are too big to just pick up and put down between meetings, but too small to really invest discretionary time in.</p>
<p>So I got a PlayStationPlus membership and I&rsquo;ve been taking advantage of how cheap everything I&rsquo;m curious about is.</p>
<p>I <a href="https://mph.weblog.lol/2023/02/omg-its-a-weekly-update-2023-02-17">took a detour into the Doom remake</a>, and I am not sure if it&rsquo;s okay to say so, but I find it hilarious.</p>
<p>I remember Doom from when it was the slightly grittier evolution of Wolfenstein 3D, and it always to me to be solid execution with an excellent vibe. The remastered version I downloaded to my PlayStation is also pretty well executed, and the vibe benefits from the graphical advancements.</p>
<p>The first time I killed a demon by running up to it, tearing its arm off and beating it until it spilled ammo and health like an infernal piñata made me howl.</p>
<p>The whole thing is sort of hilarious that way. You end up in hell fighting demons to a grinding, thrashing soundtrack, there are demonic runes everywhere, bodies, flames, blood all over the place. It&rsquo;s just hilarious.</p>
<div style="position: relative; width: 100%; padding-bottom: 56.25%;">
<iframe
style="position:absolute; width:100%; height:100%;"
src="https://getyarn.io/yarn-clip/ee8eff9b-869e-462f-a4c0-1ec7b6565562/embed?autoplay=false&responsive=true"
frameborder="0"
></iframe>
</div>
<h2 id="i-handyman">I, handyman</h2>
<p>I just fixed our garage door sensor for the third time in fourteen years. I predicted it would go differently this time the last time I fixed it, because the recurring problem is a pair of wires leading to the sensor that periodically get snagged by &hellip; something  &mdash; a yard tool, a piece of bicycle, a carelessly plopped laundry basket &mdash; and one of them breaks.</p>
<p>Whoever built the house and installed the garage door provided as much wire as was needed to connect the sensor, then covered the wiring in dryall. If there is any spare wiring available up there in the wall somewhere, it is smashed in place behind the drywall and I&rsquo;ve tugged at it as hard as I dare lest I break off the remaining bits coming out of the wall.</p>
<p>So I&rsquo;ve known for five years now that there was no more wire coming out of the wall &hellip; that the next break would be the one where I&rsquo;d have to splice more wire in, because there wasn&rsquo;t enough left to cover the space from the wall to the sensor and still get it wrapped around the post.</p>
<p>Anyhow, this time Gorilla Tape is involved in making it all sit there more snugly and less likely to be snagged and I can close the garage door without standing there holding the button. That has created a surprising amount of friction where taking my bike anywhere is concerned.</p>
<p>I had the time to do this today because the half of the house that hosts all our networking infrastructure and my office sits shrouded in darkness. The breaker for that circuit failed last week as the winter storm was happening. It didn&rsquo;t fail in the &ldquo;it just blew, you can reset it&rdquo; kind of way, but in the &ldquo;fails and doesn&rsquo;t even seem to have blown and you can&rsquo;t even trip the test switch&rdquo; kind of way.</p>
<p>I felt it coming &ndash; the UPS for all the infrastructure was making the click it makes when the supply is getting frisky, but never tripped over into &ldquo;I&rsquo;m running on battery power now.&rdquo; When everything did finally go dark I went down to the garage, couldn&rsquo;t seen a tripped breaker, flipped the two candidates (both are labeled the same thing and I&rsquo;ve never taken the time to label them &ldquo;front&rdquo; and &ldquo;back&rdquo;) and went back upstairs to &hellip; nothing.</p>
<p>Then eight hours later it all lit up again. Then failed again.</p>
<p>Same symptoms: Not tripped, can&rsquo;t test.</p>
<p>I called the home warranty company and they promised a 24 hour window for a contractor, but by then Portland was covered in ice. They finally texted this morning, asked for availability, and are on their way.</p>
<p>For now the router, Wi-Fi, and switch are running off of a long extension cord running out of my office, down the hall and into an outlet on the not-blown upstairs circuit.</p>
<p>The last time we had an electrical problem like this was maybe 10 years ago during a pair of 100-degree-plus days. A light fixture that was a little heavy pulled itself free of a softened nylon anchor and the clash of wires tripped the arc breaker (on the same circuit that&rsquo;s bothering me now). That was when we learned that whoever wired the house had run the range hood in the kitchen downstairs into the same circuit as the two bedrooms and bathroom on the other, upstairs end of the house.</p>
<p>&ldquo;Some Russian, probably,&rdquo; opined the contractor who came to have a look.</p>
<p>I destroyed an <a href="https://en.wikipedia.org/wiki/AirPort_Extreme">Airport Extreme</a> that week by bringing it down from my office and putting it the only place it could rest near the only open outlet, in a window.</p>
<p>I say &ldquo;destroyed,&rdquo; but what really happened was that the Ethernet port stopped working.</p>
<p>The &ldquo;Progress!&rdquo; note in all this is that during the period where all the networking and Wi-Fi was down, we just flipped to the 5G hotspots our phones provide and carried on with our business. It doesn&rsquo;t outperform <a href="/posts/2023-02-21-the-miracle-of-moca/">the new MOCA/EdgeRouter/CenturyLink</a> setup, but it is faster than our Xfinity/Eero-as-wireless-only-mesh setup was.</p>
<p>Last time, I would imagine all we had was 3G, and there was no &ldquo;all you can eat.&rdquo; I remember because we burned through our cap, decided to go to the mall for the air conditioning, and my attempt to transfer some spending money to Ben using the mobile bank page took five minutes because AT&amp;T dealt with data hogs by dropping them to EDGE speeds until the month was over.</p>
<h2 id="ticktick">TickTick</h2>
<p>I&rsquo;m giving TickTick a try this week. Stuff I like about it:</p>
<ul>
<li>The interface looks as simple or busy as I want it to be. Something I appreciate about Things 3 is its ability to fall back to &ldquo;just a nice todo list app&rdquo; during those times when I don&rsquo;t feel like messing with it.</li>
<li>It has a habit tracker that integrates with the rest of the app. If you set up a habit and it&rsquo;s due, it turns up in the &ldquo;Today&rdquo; list, or you can interact with it in its own &ldquo;habits&rdquo; area.</li>
<li>It has a built-in Pomodoro timer. That method works pretty well for me (using it now!) and it&rsquo;s more than a superficial integration: You can specify what on your list is getting the time.</li>
</ul>
<p>Stuff I&rsquo;d rather it not:</p>
<p>Everything is framed as &ldquo;how productive&rdquo; you are. I&rsquo;m just tired of that language.</p>
<p>I am tired of that language because after a couple of years of watching people burn out and then thrash around trying to figure out what was &ldquo;wrong&rdquo; with them, I came to the conclusion that as much as the gentrification of mental illness annoys the living hell out of me, it doesn&rsquo;t <em>outrage</em> me the way the modern workplace turns workers on themselves (and deepens that gentrification feedback loop, because the only help you&rsquo;re going to get as you thrash around, worrying that you&rsquo;re falling behind your peers in the company&rsquo;s &ldquo;performance culture,&rdquo; is a non-ironic invitation to take your woes to the EAP).</p>
<p>And, more importantly, not every single thing you want to do has to be &ldquo;productive.&rdquo;  It is not, for instance, a matter of &ldquo;productivity&rdquo; to remind myself that I want to read a chapter of a book every day, or learn how to make my own mayonnaise, or take a picture every day.</p>
<p>Anyhow, it&rsquo;s pretty easily ignored if you stay away from the reporting, which I intend to. I just want something more ergonomically sound than Apple&rsquo;s Reminders, and the purpose-built habit and pomodoro stuff rolls a number of things into one context.</p>
<h2 id="tailscale">Tailscale</h2>
<p>I spent a while not bothering to play with tech stuff, so when I heard about <a href="https://tailscale.com">Tailscale</a> I never did anything with it. Once I <a href="/posts/2023-02-21-the-miracle-of-moca/">got my new network stuff going</a> I decided to start doing more with my Synology NAS just because it&rsquo;d be easier to network and secure with a decent router in place.</p>
<p>Poking around the VPN packages available for it I saw the Tailscale app and thought &ldquo;oh, that.&rdquo;  In just a few minutes I had all my stuff added to it and talking to each other, and a whole set of problems I was willing to create for myself went away.</p>
<p>I haven&rsquo;t done any testing with it out in the world yet, but internally it integrates fine with my internal DNS. It&rsquo;s so smooth.</p>
<h2 id="design-fiddling">Design fiddling</h2>
<p>I spent a little time fiddling with site design today, too, just to make the front page a little more lively. I took a swing at some responsive design, as well. It&rsquo;s crude, but the front page is way more &ldquo;just the essentials&rdquo; on a phone, were someone to wander out to it.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
