<?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/orgroam/</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>Tue, 02 May 2023 00:00:00 -0700</lastBuildDate>
    <atom:link href="https://mike.puddingtime.org/tags/orgroam/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Daily Notes for 2023-05-02</title>
      <link>https://mike.puddingtime.org/posts/2023-05-02-daily-notes/</link>
      <pubDate>Tue, 02 May 2023 00:00:00 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-05-02-daily-notes/</guid>
      <description>A Mackup/Dropbox glitch, integrating org-contacts and Things, conversations not interviews.</description>
      <content:encoded><![CDATA[<h2 id="mackup-and-dropbox">Mackup and Dropbox</h2>
<p>I recently recommended <a href="https://github.com/lra/mackup">Mackup</a>, a Mac config syncronization tool, but I&rsquo;m having a few issues with it now. In general, it does a pretty good job with most apps, but I ran into a weird bug with Mailmate where it kept forgetting all my settings. After a few go-rounds I opened up the Console and searched for Mailmate messages and found it wasn&rsquo;t able to write to its prefs file. I put Mailmate in Mackup&rsquo;s skip list, removed the symlinks and let it write its files again and all was well. Searching Mackup&rsquo;s issues, <a href="https://github.com/lra/mackup/issues/1891">I found someone experiencing a similar issue with Xcode</a> and learned it seems to be a thing with Dropbox and iCloud and certain apps. In the case of Dropbox, it has come with that app&rsquo;s move to the <code>CloudStorage</code> folder.</p>
<p>I&rsquo;m not sure this is enough to get me quit using it. It works quite well with my Emacs config, gpg, ssh, zsh, and other stuff. I also like using it for syncing my <code>~/bin</code>.  It doesn&rsquo;t work so well with Terminal.app, and gets a little weird now and then with a few other things.</p>
<p>Just &hellip; proceed with caution, I guess is the advice.  For now I&rsquo;ve got Mailmate, Terminal.app, karabiner, and Bartender on the skip list. That&rsquo;s fine for most of them: They&rsquo;re generally best configured a little different between laptop and desktop anyhow.</p>
<h2 id="my-org-contacts-file-and-things">My  org-contacts file and Things</h2>
<p>I stopped using mu4e. I was uncomfortable with the interplay between several different clients (both automated and user-facing) and my Maildir and IMAP. That left a a small hole in the functionality I&rsquo;d built into my org-mode PRM: being able to quickly mail a contact from a Doom Emacs menu. So I made a quick function that just turns the email address in the org-contacts record into a <code>mailto:</code> link and <code>open</code> call to the system that invokes my preferred mail client (Mailmate at this point). So if the point is over an org-contacts heading I can <code>SPC C m</code> (&ldquo;leader - CRM - mail&rdquo;)  and get a new message.</p>
<p>I&rsquo;m on the record somewhere about not liking the emphasis on URL schemes for Mac automation. I don&rsquo;t like the ins and outs of encoding values and cramming data into that format. At the same time, it <em>does</em> seem to have kept the idea of Mac end-user automation from fading away. So as I sat there looking at my new mailto function, I wondered about how all the contact data I&rsquo;m keeping could interact with the wider Mac ecosystem in a sort of &ldquo;if needed&rdquo; manner, hence this little thing.</p>
<p>It just provides an interactive menu for selecting a contact activity (ping, call, write, etc.) and an interactive date picker, then makes a Thing todo that includes the tags for the contact, with a &ldquo;start date.&rdquo; I can get at it with <code>SPC C g</code> (&ldquo;leader CRM thinGs&rdquo;).  I don&rsquo;t mean to use it? I was just curious. I&rsquo;m not sure.</p>
<p>What I am learning as I use org-mode day-to-day again is that there are things that come naturally to it and that do not come naturally to it. I&rsquo;ve got working integrations with my calendar, for instance, but calendar syncing is another one of those things that eats the one thread you have to work with when it runs, and sometimes it does mysterious things if you mess with a plaintext representation of a more complex data structure that was never written with direct human interaction in mind.</p>
<p>That&rsquo;s always the struggle with Emacs: What <em>can</em> it do, and what <em>should</em> it do?</p>
<p>The temptation is to crawl into a uni-environment and torture everything into some kind of alignment, but that&rsquo;s brittle. It might <em>feel</em> good if your temperament or proclivities lead you to feeling comfortable with that particular shape, but there are tradeoffs whether you acknowledge them or not. In this particular case, the line I am sensing is the line between &ldquo;getting things done&rdquo; in a very mixed, tactical, &ldquo;chores, obligations, and interrupts&rdquo; kind of way, and getting things done in a very &ldquo;life is an information problem&rdquo; kind of way.</p>
<p>I love org-mode as a way of organizing information and thoughts. In particular, I am very fond of all the refiling capabilities it offers, because ideas and information can be shuffled around between different contexts inside the broader org-mode context without lifting a hand from the keyboard. As a day-to-day &ldquo;chores and household projects&rdquo; tool, I&rsquo;m a little less certain about it, mainly because of the mobile piece. <a href="https://beorgapp.com">beorg</a> is great, but it is also a little bit of work to use, and its syncing model is borrowed, so it&rsquo;s not as good as a purpose-built solution. Further, it is not consistent with my desktop org-mode environments when it comes to things like the agenda views.</p>
<p>So, you know, the interesting thing to me becomes &ldquo;how can this sophisticated text manipulation environment fit into a broader toolkit?&rdquo; How can all these things interconnect and complement each other? What are the kinds of work that makes sense living in a purpose-built tool because their typical context favors less thinking and less complexity, vs. the kinds of work that are broadly the same thing (&ldquo;a thing I need to do&rdquo;) that benefit from more thinking and more complexity? What kinds of tasks can be &ldquo;dead&rdquo; and in a little purpose-built silo, and what kinds of tasks benefit from a little bit of added complexity to exist in a better context? How could a thing move from one environment to the other?</p>
<p>Interesting to me, anyhow, because my tendency, at rest &ndash; my unconscious tendency &ndash; is to want everything in one tool, but I continue to learn over time that the one-tool outlook breeds its own kinds of complexity.</p>
<p>Anyhow, here&rsquo;s that function. It works okay so far. The one glitch is that the Things URL scheme won&rsquo;t make a tag if it doesn&rsquo;t exist, so I had to go in and tag an existing todo with all my contact types (friend, network, recruiter, etc.) to get the function to properly tag a contact todo.</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">mph/org-contacts-to-things</span> <span class="p">(</span><span class="nv">contact-kind</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;Create a Things to-do item based on the current Org Contacts record.
</span></span></span><span class="line"><span class="cl"><span class="s">   CONTACT-KIND is a string that specifies the kind of contact (&#39;ping&#39;, &#39;call&#39;, &#39;write&#39;, &#39;schedule&#39;, or &#39;follow up&#39;).&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="nb">interactive</span>
</span></span><span class="line"><span class="cl">   <span class="p">(</span><span class="nf">list</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nf">completing-read</span> <span class="s">&#34;Contact Kind: &#34;</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;ping&#34;</span> <span class="s">&#34;call&#34;</span> <span class="s">&#34;write&#34;</span> <span class="s">&#34;schedule&#34;</span> <span class="s">&#34;follow up&#34;</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">name</span> <span class="p">(</span><span class="nv">org-entry-get</span> <span class="no">nil</span> <span class="s">&#34;Name&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">email</span> <span class="p">(</span><span class="nv">org-entry-get</span> <span class="no">nil</span> <span class="s">&#34;Email&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">phone</span> <span class="p">(</span><span class="nv">org-entry-get</span> <span class="no">nil</span> <span class="s">&#34;Phone&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">note</span> <span class="p">(</span><span class="nf">read-string</span> <span class="s">&#34;Note: &#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">notes</span> <span class="p">(</span><span class="nf">format</span> <span class="s">&#34;Email: %s\nPhone: %s\nNote: %s&#34;</span> <span class="nv">email</span> <span class="nv">phone</span> <span class="nv">note</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">start-date</span> <span class="p">(</span><span class="nv">org-read-date</span> <span class="no">nil</span> <span class="no">nil</span> <span class="no">nil</span> <span class="s">&#34;Start Date: &#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">start-date-string</span> <span class="p">(</span><span class="nf">format-time-string</span> <span class="s">&#34;%Y-%m-%d&#34;</span> <span class="p">(</span><span class="nv">org-time-string-to-time</span> <span class="nv">start-date</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">tags</span> <span class="p">(</span><span class="nv">org-get-tags</span> <span class="no">nil</span> <span class="no">t</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">tag-string</span> <span class="p">(</span><span class="nb">if</span> <span class="nv">tags</span> <span class="p">(</span><span class="nf">mapconcat</span> <span class="ss">&#39;identity</span> <span class="nv">tags</span> <span class="s">&#34;,&#34;</span><span class="p">)</span> <span class="s">&#34;&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">title</span> <span class="p">(</span><span class="nf">format</span> <span class="s">&#34;%s: %s&#34;</span> <span class="nv">contact-kind</span> <span class="nv">name</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">         <span class="p">(</span><span class="nv">url</span> <span class="p">(</span><span class="nf">format</span> <span class="s">&#34;things:///add?title=%s&amp;notes=%s&amp;when=%s&amp;tags=%s&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="p">(</span><span class="nv">url-encode-url</span> <span class="nv">title</span><span class="p">)</span> <span class="p">(</span><span class="nv">url-encode-url</span> <span class="nv">notes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                      <span class="p">(</span><span class="nv">url-encode-url</span> <span class="nv">start-date-string</span><span class="p">)</span> <span class="p">(</span><span class="nv">url-encode-url</span> <span class="nv">tag-string</span><span class="p">))))</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="nv">start-process-shell-command</span> <span class="s">&#34;open&#34;</span> <span class="no">nil</span> <span class="p">(</span><span class="nf">format</span> <span class="s">&#34;open \&#34;%s\&#34;&#34;</span> <span class="nv">url</span><span class="p">))))</span></span></span></code></pre></div>
<h2 id="conversations-not-interviews">Conversations, not interviews</h2>
<p>Refreshing interview closer of the month:</p>
<p>&ldquo;We have a few minutes left, any questions of me?&rdquo;</p>
<p>&ldquo;No. I came into this thinking you&rsquo;d either say &lsquo;did you even read the job description? Now good day while I go fire the recruiter,&rsquo; or you&rsquo;d see something that would lead you to want a conversation, which I hope we&rsquo;ll continue so I can learn more.&rdquo;</p>
<p>And there we were, having a conversation.</p>
<p>I&rsquo;ve been very lucky to have had several <em>conversations</em> recently. It&rsquo;s reminding me of the times I had <em>interviews</em> and how those things went wrong down the road. It&rsquo;s great to end a conversation hearing the person you were conversing with say &ldquo;wow, the time flew by &hellip; but this felt so organic.&rdquo; You can enter a conversation with curiosity, and with a good conversational partner you can see where things go, make connections to your experience in the moment, change course or call up other experiences when they say &ldquo;well, that&rsquo;s not quite what we&rsquo;re dealing with here.&rdquo; That&rsquo;s much better than  pre-thinking a bunch of answers and poring over &ldquo;ten most common questions&rdquo; or (if Nigel or Chris are reading) &ldquo;you&rsquo;re trapped in a 20&rsquo; blender&rdquo; scenarios.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Exporting a DayOne commonplace book to org-roam</title>
      <link>https://mike.puddingtime.org/posts/2023-04-30-exporting-a-dayone-commonplace-book-to-org-roam/</link>
      <pubDate>Sun, 30 Apr 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-04-30-exporting-a-dayone-commonplace-book-to-org-roam/</guid>
      <description>A very cheap and cheerful DayOne-to-org-roam exporter and a link to a useful org-roam search function.</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve kept some quotes in DayOne for years, and I frequently find myself coming back to them when I&rsquo;m writing, either to actually use them or to just remember an idea. I thought it&rsquo;d be handy to have them in my writing tool, so I used ChatGPT to help me write a quick exporter.</p>
<p>I&rsquo;ll include that below, but the other thing to link to before your eyes glaze over with a hunk of Ruby is <a href="https://org-roam.discourse.group/t/using-consult-ripgrep-with-org-roam-for-searching-notes/1226/7">this useful post on using consult-ripgrep with org-roam for fulltext search from the org-roam Discourse.</a> I&rsquo;ve been careful to tag everything I&rsquo;ve put in so far, but I won&rsquo;t get to that with this batch of files, and I usually remember a keyword, anyhow. So they&rsquo;re just tagged  with &ldquo;quotes&rdquo; and &ldquo;commonplace&rdquo; for now.</p>
<p>The script just consumes the JSON that DayOne&rsquo;s export function provides and coughs out formatted org-roam nodes. It uses DayOne&rsquo;s uuid&rsquo;s, but tacks on a few words &ndash; just in case? Maybe over time I&rsquo;ll go clean up the titles but for now they&rsquo;re just there to provide a hint when I search.</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env ruby</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">require</span> <span class="s1">&#39;json&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">require</span> <span class="s1">&#39;date&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Set these up before running</span>
</span></span><span class="line"><span class="cl"><span class="n">src_json</span> <span class="o">=</span> <span class="s2">&#34;/path/to/file.json&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">destination_dir</span> <span class="o">=</span> <span class="s2">&#34;/path/to/export/dir&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Read the JSON file</span>
</span></span><span class="line"><span class="cl"><span class="n">json_str</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">src_json</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Parse the JSON string</span>
</span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">json_str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">write_json_to_org_roam_files</span><span class="p">(</span><span class="n">json_str</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">data</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">json_str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">entries</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="s1">&#39;entries&#39;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">  <span class="n">entries</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">entry</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">    <span class="n">created_date</span> <span class="o">=</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">entry</span><span class="o">[</span><span class="s1">&#39;creationDate&#39;</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%Y%m%d%H%M%S&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">title</span> <span class="o">=</span> <span class="n">entry</span><span class="o">[</span><span class="s1">&#39;text&#39;</span><span class="o">].</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/^&#34;/</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/&#34;$/</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/[^a-zA-Z0-9 ]/</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="c1"># replace non-alphanumeric with space, remove extra spaces</span>
</span></span><span class="line"><span class="cl">    <span class="n">first_words</span> <span class="o">=</span> <span class="n">title</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">first</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/[^a-zA-Z0-9]/</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span> <span class="c1"># replace non-alphanumeric with dash</span>
</span></span><span class="line"><span class="cl">    <span class="n">uuid</span> <span class="o">=</span> <span class="n">first_words</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="n">entry</span><span class="o">[</span><span class="s1">&#39;uuid&#39;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">content</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">entry</span><span class="o">[</span><span class="s1">&#39;richText&#39;</span><span class="o">]</span><span class="p">)</span><span class="o">[</span><span class="s1">&#39;contents&#39;</span><span class="o">].</span><span class="n">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">c</span><span class="o">|</span> <span class="n">c</span><span class="o">[</span><span class="s1">&#39;text&#39;</span><span class="o">]</span> <span class="p">}</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">filename</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">created_date</span><span class="si">}</span><span class="s2">-</span><span class="si">#{</span><span class="n">first_words</span><span class="si">}</span><span class="s2">.org&#34;</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/^-/</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/-$/</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/-{2,}/</span><span class="p">,</span><span class="s1">&#39;-&#39;</span><span class="p">)</span> <span class="c1"># remove leading/trailing dashes and collapse multiple dashes</span>
</span></span><span class="line"><span class="cl">    <span class="n">file_content</span> <span class="o">=</span> <span class="o">&lt;&lt;~</span><span class="no">ORG_NODE</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/^\s*/</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="ss">:PROPERTIES</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">      <span class="ss">:ID</span><span class="p">:</span> <span class="c1">#{uuid}</span>
</span></span><span class="line"><span class="cl">      <span class="ss">:END</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">      <span class="c1">#+title: #{first_words}</span>
</span></span><span class="line"><span class="cl">      <span class="c1">#+filetags: :commonplace:quotes:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c1">#{content}</span>
</span></span><span class="line"><span class="cl">    <span class="no">ORG_NODE</span>
</span></span><span class="line"><span class="cl">    <span class="n">file</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">filename</span><span class="p">),</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">file_content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">file</span><span class="o">.</span><span class="n">close</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Iterate over each entry</span>
</span></span><span class="line"><span class="cl"><span class="n">data</span><span class="o">[</span><span class="s1">&#39;entries&#39;</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">entry</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="n">write_json_to_org_roam_files</span><span class="p">(</span><span class="n">json_str</span><span class="p">,</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="n">destination_dir</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div>
]]></content:encoded>
    </item>
    <item>
      <title>plasticity and org-roam</title>
      <link>https://mike.puddingtime.org/posts/2023-04-30-plasticity-and-org-roam/</link>
      <pubDate>Sun, 30 Apr 2023 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-04-30-plasticity-and-org-roam/</guid>
      <description>The more a thing tends to be permanent, the more it tends to be lifeless.</description>
      <content:encoded><![CDATA[<blockquote>
<p>&ldquo;The more a thing tends to be permanent, the more it tends to be lifeless.&rdquo;</p>
</blockquote>
<div class="src-block-caption">
<p>— Alan Watts</p>
</div>
<p>A few days ago <a href="https://mike.puddingtime.org/posts/2023-04-26-daily-notes/">I wrote about Zettelkasten</a>:</p>
<blockquote>
<p>In the end, it just wasn’t for me. I tried it, and Obsidian is an excellent tool for organizing your work that way, but I think the problem I had with it was that the ratio of “volume of stuff that’s just there in my head” to “volume of stuff I need to keep in a second brain” didn’t justify the existence of the second brain, or at least not one organized in classic Zettelkasten fashion.</p>
</blockquote>
<p>That remains true. However &hellip;</p>
<p>In the process of thinking about <a href="/posts/2023-02-28-about-old-posts/">what to make of old blog posts</a>  I realized that one of my bigger impediments to blogging at all was a little personal confusion about what a blog is. In the past year I had a small crisis around my personal domains and realized things had sprawled and gotten a little too tangled up, so I got a new domain that solved a few problems the old one caused, and I went to some effort to establish new email addresses and sites. It was time to do all that, because I was pretty sure I was about to get thrown out of my work nest, and I had some ideas about what I needed to do to be ready for that.</p>
<p>But solving one problem &ndash; correcting for a lack of intentionality in my web presence over years &ndash; led to another one I only recently figured out, which was about having the <em>wrong</em> intentions once I got more intentional.</p>
<h2 id="the-brochure-site-months">The brochure site months</h2>
<p>I got very into the &ldquo;personal branding&rdquo; aspects of my web presence. I had some ideas about a small book, I had done some writing about work, and I was feeling defensive about what exactly it was I said I did there. So as I sat down to think about why I wanted to have a website, there was a &ldquo;professional considerations&rdquo; piece to it that loomed larger than it ever had, and I was thinking in the direction of &ldquo;content marketing.&rdquo;</p>
<p>I built that site and really enjoyed doing it. It was a chance to stretch a few web development muscles, and I really loved the way I&rsquo;d managed to blend my photography and writing. And I liked the idea of positioning it as a slow-moving, professionally safe space where I could pull in work from past sites, but keep the focus on The Work Persona. I didn&rsquo;t discount the value of a more personal, faster-moving site, so I focused on fixing up my microblog, too.</p>
<p>Actually maintaining that sort of web presence turned out to be a drag. The second the site was up and running it became a gigantic, statically generated Blank Page Problem. Over on the microblog I was just being me; on the &ldquo;core&rdquo; site I was struggling with being the kind of writer I sort of hate to come across out in the real world, trying to sound <em>authoritative</em> and <em>opinionated</em> about <em>matters of professional import</em>. I completely get that some people manage to strike a very authentic balance with writing about what they care about, and what they care about happening to be, in part, their professional life. I couldn&rsquo;t make myself fill the page, so the site mostly sat.</p>
<p>Then I <em>did</em> get thrown out of the nest, and something I thought was kind of irritating but would eventually be surmountable when push came to shove actually became even more of an issue for me, because what had been a simple but misguided idea that I&rsquo;d just gradually fill that site up with stuff as it came to me felt inadequately urgent.</p>
<p>I am very lucky to have a supportive partner and some other good voices around me, because after I spent maybe six weeks last  fall using a period I&rsquo;d known for <em>months</em> was meant to be restful downtime doing anything but resting, thrashing around, coming up with Big Projects, I just settled down and actually rested. I just stopped. Or rather, I stopped doing anything I would ordinarily believe I was <em>supposed</em> to do, and <a href="https://mike.puddingtime.org/2023-01-17-oauth-rubocop-a/">let myself do</a> what I <em>wanted</em> to do as it occurred to me to do it:</p>
<blockquote>
<p>&hellip; I am feeling good because I realized at some point over the past couple of weeks that I am doing all this because it is playing. I used to do a lot of little utility scripts and silly gadgets because it was fun and absorbing, not because it was hugely practical or efficient. It was just playing. I stopped playing for a long while. It feels good to play again.</p>
</blockquote>
<p>Since January, I&rsquo;ve slowly turned back to what I <em>need</em> to be doing, and I&rsquo;ve been immensely grateful that my friends and network have been there for me as I find my way back to a job because there are parts of The Job Hunt that are a colossal drag &ndash; the grind of getting opportunities into the top of the funnel &ndash; and there are parts of it, once something works its way down the funnel that are hard in different ways.</p>
<p>The value of this site has played out a little differently than I imagined when I thought it was going to be a content marketing thing. It definitely <em>does</em> come up in interviews, because I&rsquo;ve done writing for it that is about work stuff, but less <code>HERE IS A BROCHURE OF MY THOUGHT LEADERSHIP</code> and more &ldquo;oh yeah, you know, I wrote about this very thing a few weeks ago, and found my thoughts changing a little once I thought it out more.&rdquo; A <em>few</em> people say &ldquo;oh, I&rsquo;d love to read that if you don&rsquo;t mind sending me the link,&rdquo; but not many. <em>But</em> when they&rsquo;ve asked there&rsquo;s been, in funnel terms, a 100 percent conversion rate from top-of-the-funnel to middle-of-the-funnel. That&rsquo;s great.</p>
<p>But the hidden half of that has been the very real struggle, after ten years in one place, of getting back into the swing of looking for my next thing to do, and shifting from that mode of sitting quietly with your hands folded politely in your lap answering questions as correctly as you can muster, to  finding the people who want to have actual conversations and <em>welcoming</em> the opportunity they present.</p>
<p>It took getting all the way to the end of one very mechanistic, flat, incurious hiring process to flip a switch in my brain.</p>
<p>One of the interviewers as good as said &ldquo;well, you&rsquo;re coming from this environment you were in so you probably are this certain way&rdquo; in the midst of a &ldquo;here are nine questions, prepare your three-minute responses, we are not permitted to have a conversation that deviates from you answering this question&rdquo; session. It was incredibly belittling and frustrating, and it finally sparked the thing that I guess you have to have sparked if you&rsquo;re going to continue the process of going around asking people to give you money in exchange for having to use Outlook or whatever, which was a sense that my background &ndash; the places I&rsquo;ve been, the things I&rsquo;ve seen, and the work I&rsquo;ve done &ndash; adds up to something more than a collection of self-published pamphlets about businessing.</p>
<p>Anyhow, the switch that flipped was, &ldquo;this could get harder before it gets easier, but it&rsquo;s going to suck hard and it&rsquo;s not going to end well if I keep looking over my shoulder.&rdquo; I, er, <em>contain multitudes</em>, and I have come to believe that the best way to get across who I am is to quit trying to draw a circle around me.</p>
<p>(I do not, by the way, have a &ldquo;so I told that guy to shove the job&rdquo; story to tell. I got declined, apparently very narrowly. I definitely would have taken the job, because I&rsquo;m fine working against expectations. You cannot go from &ldquo;studied philosophy&rdquo; to &ldquo;worked at a newspaper&rdquo; to &ldquo;administered UNIX systems&rdquo; to &ldquo;volunteered for airborne school&rdquo; without feeling comfortable being misunderstood by everyone around you.)</p>
<p>So this site is now the way it is, instead of the Brochure About Mike it was meant to be, because this, more or less and as much as I&rsquo;m willing to disclose, is <em>me</em>.</p>
<h2 id="okay-but-something-about-org-roam">Okay, but something about org-roam?</h2>
<p>Right. As I was saying. A few days ago I wrote about Zettelkasten, related some reasons I decided at the time it was not for me, and then gently defended what I took to be a mild challenge from someone who wished I&rsquo;d given it more of a chance.</p>
<p>But if the point of this site is less to <em>represent me as a unit of productive capacity</em> and more to <em>think out loud</em> about my preoccupations as they emerge (and hence become its own sort of representation), then it did its work in this case, because over the weekend that post ended up being just a thesis that I applied to what I thought I&rsquo;d want to use a Zettelkasten system for, flavored in part by my natural (and not always flattering) skepticism about why people get into these things.</p>
<p>But like all good theses, it is subject to dialectical forces &ndash; new contexts, conditions, or information.</p>
<p>In the process of trying to salvage something from hours of over-preparation, I realized I had a bunch of good material about what I think about certain things that was suffering from being stuffed into the mold of a very rigid and dysfunctional interview process that nevertheless had forced me to rethink my value proposition and set my sights a little higher than they were going in. And I also realized I have a few opportunities coming up &ndash; and will no doubt have more &ndash; to use that material very soon.</p>
<p>As I killed a little time waiting for Al to get home, my mind first went to &ldquo;well, turn it all into a couple of very thoughtful essays about IT, inclusion, etc. the better to stock your website with brochures.&rdquo;</p>
<p>Then I thought, &ldquo;we told ourselves we don&rsquo;t like doing that.&rdquo; Or as a friend put it, &ldquo;I thought you said you were over the idea of writing weird shit for LinkedIn.&rdquo;</p>
<p><em>Then</em> I thought, &ldquo;but wow, it can&rsquo;t stay in this form, because it&rsquo;ll always smell like the janitor&rsquo;s closet at the county jail when you try to get any good out of it.&rdquo;</p>
<p>I realized I wanted to do with it what I&rsquo;d sworn 48 hours earlier didn&rsquo;t really make sense to me, which was to sort of draw dashed lines on the surface of that big, strangely shaped accretion of thought, then go at it with a hammer until I had a bunch of chunks I could label and repurpose. So I took some time to re-read the org-roam manual, look at some half-understood config I&rsquo;d put in place when I was giving it a try post-Obsidian, and clear my head of the idea that I was going to some day write eight-dozen books about management thanks to Zettelkasten, or do anything particularly public at all, really.</p>
<p>Having done that, I started chunking out the ideas in that writing and  &ldquo;inserting nodes,&rdquo; in the org-roam parlance.</p>
<p>I didn&rsquo;t get too much into linking anything for now, preferring to start at the level of tagging. I once went to a talk then years later had an interesting exchange with the guy who invented the term &ldquo;folksonomy,&rdquo; and his ideas about free-tagging have stuck with me since. People often screw it up by assuming that free-tagging is somehow antithetical to &ldquo;categorization&rdquo; or other ways of making associations &hellip;  oh, <a href="http://www.ibiblio.org/hhalpin/homepage/notes/taggingcss.html">just read this for the problem with that</a>. Briefly, I have gotten hung up in the past with the advice to build <a href="https://justgage.github.io/moc.md">MoC pages,</a> etc. but was encouraged by that guy to think instead of tagging as  <a href="https://english.stackexchange.com/questions/44800/what-does-don-t-pave-the-cow-path-mean-in-this-context">cow-pathing</a>.  Eventually, you will want to put up lights and signs, and before that you may even want to make a map of the best ones. For now, I am just being careful to tag. When there is a nugget in something that I didn&rsquo;t manage to break down or separate from something close to it, I am giving it its own heading so I can make it a node with a tag.</p>
<p>Anyhow, I&rsquo;m giving the whole thing another try because I have a practical thing to do try it out on, and it is already helping me: I have a presentation coming up and it&rsquo;s great to go through that previous work shorn of a little of the original context.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily notes for 2023-03-22</title>
      <link>https://mike.puddingtime.org/posts/2023-03-22-daily-notes-for-2023-03-22/</link>
      <pubDate>Wed, 22 Mar 2023 10:42:33 -0700</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2023-03-22-daily-notes-for-2023-03-22/</guid>
      <description>Succumbing to org-roam, the pleasures of a straight razor competently wielded, Decline of Western Civilization.</description>
      <content:encoded><![CDATA[<h3 id="succumbing-to-org-roam">Succumbing to org-roam</h3>
<p>Well, it took less than 12 hours to go from &ldquo;I&rsquo;m not going to even touch that&rdquo; to &ldquo;huh, I wonder if it&rsquo;s cool?&rdquo;</p>
<p>Yes, <a href="https://www.orgroam.com">org-roam</a> is cool. It&rsquo;s a Zettelkasten implementation built atop org-mode. To make it work in Doom Emacs you just add it to the org-mode line in Doom&rsquo;s <code>init.el</code>:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">(org +roam2) </span></span></code></pre></div>
<p>&hellip; and then run <code>doom sync</code>.</p>
<p>You should add a <code>roam</code> subdir to your standard org files location or it will complain when you try to use it.</p>
<p>You can instantiate a new node with <code>spc n r i</code> (&rsquo;n&rsquo;otes, &lsquo;r&rsquo;oam, &lsquo;i&rsquo;nsert)</p>
<p>That gets you a roam buffer and you can start typing. As with most transient Emacs buffers, <code>C-c</code> will save and exit.</p>
<p>If you want to link to a separate note, you can start typing its name in the body of the current note and get an autocomplete list.</p>
<p>If you link to a note from another note, Roam takes care of adding a backlink at the bottom of the target note.</p>
<p>As with all things Emacs, there are org-roam configs you can go find on the street and stick in your mouth. As with all things Emacs, I didn&rsquo;t describe it that way because I thought that would make such an approach attractive to you. I want you to be repulsed by that approach because it is unclean. One of the advantages of Doom Emacs (or Spacemacs, or Prelude) is that if they include a package, they probably include some basic configuration, so you can kick the tires then start layering on capabilities.</p>
<p>Anyhow, in its basic Doom Emacs config, org-roam is unremarkable. If you want a zettel and don&rsquo;t want Emacs, go get Obsidian or one of its competitors. I&rsquo;m going to stick with it for a while. As I mentioned <a href="/posts/2023-03-21-daily-notes-for-2023-03-21/">yesterday</a>, I like org-mode&rsquo;s intertwingling of tasks/actions/todos and prose, so it suits me.</p>
<h3 id="the-pleasures-of-a-straight-razor-competently-wielded">The pleasures of a straight razor competently wielded</h3>
<p>A brief history of me and professional grooming:</p>
<ul>
<li>My grandmother paid for my first stylist haircut when I was in 7th grade. I had no idea how to maintain it.</li>
<li>I spent a few years just telling barbers to take it all off.</li>
<li>The army taught me the pleasures of walking in, paying your $5, and getting a high-and-tight. Once I&rsquo;d been in a few years, I&rsquo;d modify the request to say &ldquo;leave a little up top.&rdquo;</li>
<li>Over the past 20 years I developed an appreciation for Great Clips because they store your preferences and last cut in the computer under your phone number.</li>
</ul>
<p>Then last year I walked into a barber shop near the office because things were dire and I had a few minutes. The barber handled the basic cut, then offered to do some detail work with a straight razor since he had time. That part was amazing, and it made my day.</p>
<p>I started going back, partially because it was a great first experience and partly because the barber was utterly disinterested in small talk. Just enough to establish we spoke a common tongue, then nothing except the occasional request for a decision.  We did enter into an extended dialog about my beard made up of very sharp exchanges in the ensuing months. He was in favor of taking more of it off, and I would say &ldquo;no, I&rsquo;m not there yet, please just do what you can with it.&rdquo; He&rsquo;d mutter and then cluck when he got to the part where it began to curl at the bottom. &ldquo;I can&rsquo;t do anything with this &hellip; you&rsquo;re sure you&rsquo;re okay?&rdquo;</p>
<p>Then last week I had a video conference and was wearing a shirt with a collar and a jacket and I realized I couldn&rsquo;t see my collar under my beard. I couldn&rsquo;t really see my mouth, either.</p>
<p>I recently read about a study that suggested people with beards will ultimately be perceived as more trustworthy and accessible <em>once they are given an opportunity to smile</em>. Until that point, the unbearded have all the social advantages. So I decided it might be best to make my mouth observable. COVID and masking did reveal me to be a proficient eyebrow flasher, but I don&rsquo;t think you can completely rely on that.</p>
<p>So I booked time with my barber and left out the haircut (I&rsquo;m good for a few more weeks) but did add the razor true-up.</p>
<p>When I sat down he resignedly asked &ldquo;the usual, just fix the scruff?&rdquo; and I said &ldquo;no, I&rsquo;d like to get some of that length and volume out of there.&rdquo; He started to nod vigorously, and we entered into an extended negotiation measured in finger widths (&ldquo;okay, but top of finger or bottom?&rdquo;) and ultimately settled on something that would both reveal my mouth and also let you see my neck and/or collar.</p>
<p>Then it was just closing my eyes and enjoying the hot towel, thick lather, and precision work of a sharp straight razor, including temples and neck.</p>
<p>Restorative.</p>
<p>I go all the way across town &ndash; the barber moved from near the office to even further west &ndash; but it&rsquo;s worth the train ride once a month to have a good barber.</p>
<h3 id="movie-decline-of-western-civilization">Movie: Decline of Western Civilization</h3>
<p>I rewatched Penelope Spheeris&rsquo; <em>Decline of Western Civilization</em> for the umpteenth time. X is one of my top 5 favorite bands of all time, so I love everything with them in it, even if John Doe&rsquo;s trolling over &ldquo;Johnny Hit and Run Pauline&rdquo; makes me cringer harde with every viewing.  The people around the periphery are great, too, including Club 88&rsquo;s owner, who is determined to greet the whole freak show playing out in his venue with a certain patient equanimity I hope I can equal as the world moves on around me. And I&rsquo;m grimly fascinated with Fear, and Lee Ving in particular, and his theatrical hate.</p>
<p>Punk was the first real subgenre I embraced. I was up at 2 in the morning in 10th grade, working on a paper for my journalism class, when the college radio station I&rsquo;d been listening to jazz on hours earlier suddenly crackled back to life from its post-midnight-signoff hiss because someone had snuck into the studio and announced the first (and possibly last) installment of &ldquo;Goshen College&rsquo;s Guts Radio.&rdquo;</p>
<p>Then they peeled my skull back with Fear, Black Flag, Dead Kennedys, and stuff I never heard again.</p>
<p>I mentioned it to the stoner who sat in front of me in American History and he came back the next day with the Dead Boys&rsquo; <em>Young, Loud and Snotty</em> on one side of a cassette tape, and a hastily assembled tour of more vintage punk on the other.</p>
<p>Anyhow, <em>Decline</em>: X are the odd ones out there. A punk act, yes, but with the seeds of their eventual trajectory present if you look for them. The case has been made that they were a case of tragic mistiming and I think it might be true: There they were at the height of their <em>energy</em> in 1980, but the <em>sensibility</em> they anticipated was years away from the eventual saturation it achieved with vintage scavengers and billy boys. My affection for X is undying: They were my bridge from a sullen, resentful anger toward all the normal people to a belief that maybe <em>I</em> was one of the decent people, too.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
