<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>xenodium.com @alvaro</title>
<link>https://xenodium.com</link>
<atom:link href="https://xenodium.com/rss.xml" rel="self" type="application/rss+xml"/>
  <description>RSS feed for xenodium.com @alvaro</description>
  <language>en-us</language>
  
  <item>
    <title>…and then there were three (expect delays)</title>
<link>https://xenodium.com/and-then-there-were-three</link>
<guid isPermaLink="false">https://xenodium.com/and-then-there-were-three</guid>
    <description><![CDATA[<p>The other day, my partner and I went into the hospital as two and came out as three. This week, I became a father. From the second I cuddled this little fella, I felt like I'd known him my entire life. I love him so much.</p>
<p><img src="https://xenodium.github.io/images/and-then-there-were-three/hello-world.jpg" alt=""></p>
<p>Since going indie dev full-time, I've enjoyed a great degree of flexibility to work on personal projects. This has enabled me to share more via blog <a href="https://xenodium.com/">posts</a> and <a href="https://www.youtube.com/xenodium">YouTube videos</a>, but also dedicate more time to projects like <a href="https://github.com/xenodium/agent-shell">agent-shell</a>. It is now my most popular Emacs package, receiving lots of attention from users (bug reports, pull requests, discussion, etc). If you've been in touch recently and haven't heard from me, now you know why. Fatherhood is new to me. I'll need a little time to adjust while finding my footing.</p>
<p>While my hope is to continue working on my indie projects, sustainability is now… errm, a tad more important. If you get value out of my work, please consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>. Better yet, if you use my tools at work, consider getting your employer to <a href="https://github.com/sponsors/xenodium">sponsor</a> me instead. I also run a <a href="https://lmno.lol/">blogging service</a> and offer a handful of <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS/macOS apps</a>. If you're keen to journal or take quick notes on iOS, <a href="https://apps.apple.com/us/app/journelly/id6470714669">Journelly</a> is my take on it. Bonus points for Emacs users, as it saves entries to an org file.</p>
<p>Now, please excuse me while I start crafting my son's first <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html">init.el</a>…</p>
<p>ps. This post was stitched up from a handful of seconds here and there, in between all the sleep-deprived but loving activities currently rocking my world.</p>
]]></description>
    <pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>agent-shell 0.47 updates</title>
<link>https://xenodium.com/agent-shell-0-47-1-updates</link>
<guid isPermaLink="false">https://xenodium.com/agent-shell-0-47-1-updates</guid>
    <description><![CDATA[<p>We got quite a few agent-shell additions since the <a href="https://xenodium.com/agent-shell-0-25-updates">last post</a>, so let's go through the highlights as of <code>v0.47.1</code>.</p>
<h2>What's <code>agent-shell</code>?</h2>
<p><a href="https://github.com/xenodium/agent-shell">Agent shell</a> is a native <a href="https://www.gnu.org/software/emacs/">Emacs</a> mode to interact with LLM agents powered by ACP (<a href="https://agentclientprotocol.com/">Agent Client Protocol</a>).</p>
<h2>Your employer can make a difference</h2>
<p><code>agent-shell</code> has been attracting quite a few users. Many of you are working in tech where employers are happily paying for IDE subscriptions and LLM tokens to improve productivity. If you are using <code>agent-shell</code> for work, consider getting your employer to give back by <a href="https://github.com/sponsors/xenodium">sponsoring</a> the project.</p>
<p>I also know many of you work at AI companies offering paid agents like Claude Code, Copilot, Gemini, Codex, etc. all supported by <code>agent-shell</code>. Please nudge your employers to help fund projects like <code>agent-shell</code>, which are making their services available to more users.</p>
<center>✨ <a href="https://github.com/sponsors/xenodium">Sponsor agent-shell</a> ✨</center>
<h2>So what's new?</h2>
<h3>claude-code-acp renamed to claude-agent-acp [Action Required]</h3>
<p>Let's get this one out of the way, as it needs actioning. Both the npm package and the CLI agent have been renamed from <code>claude-code-acp</code> to <code>claude-agent-acp</code> (to align with Anthropic's <a href="https://platform.claude.com/docs/en/agent-sdk/overview#branding-guidelines">branding guidelines</a>). If you're using Claude Code, you'll need to update:</p>
<pre><code class="language-bash">npm remove -g @zed-industries/claude-code-acp
npm install -g @zed-industries/claude-agent-acp
</code></pre>
<p>If you had customized <code>agent-shell-anthropic-claude-acp-command</code>, update it to point to <code>claude-agent-acp</code>.</p>
<h3>New agents supported</h3>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/agents.png" alt=""></p>
<ul>
<li>Auggie (<a href="https://github.com/xenodium/agent-shell/pull/179">#179</a> by <a href="https://github.com/Pacane">@Pacane</a>).</li>
<li>Cline.</li>
<li>Factory Droid (<a href="https://github.com/xenodium/agent-shell/pull/178">#178</a> by <a href="https://github.com/ag91">@ag91</a>).</li>
<li>GitHub Copilot.</li>
<li>Kiro CLI (<a href="https://github.com/xenodium/agent-shell/pull/351">#351</a> by <a href="https://github.com/zmjones">@zmjones</a>).</li>
<li>Mistral Vibe.</li>
<li>Pi (<a href="https://github.com/xenodium/agent-shell/pull/232">#232</a> by <a href="https://github.com/conornash">@conornash</a>)</li>
</ul>
<h3>Bootstrapped sessions (experimental)</h3>
<p>This was a biggie. How sessions are loaded is now configurable via <code>agent-shell-session-strategy</code>. When set to <code>'new</code>, starting a new shell delivers a fully bootstrapped session before presenting you with the shell prompt. This means the ACP handshake, authentication, and session creation all happen upfront.</p>
<p>You can enable this flow with:</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-session-strategy 'new)
</code></pre>
<p>What's the benefit? Bootstrapped sessions enable changing models and session modes (Planning, Don't ask, Skip permissions, etc…) <em>before</em> submitting your first prompt.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/bootstrap.gif" alt=""></p>
<p>For the time being, the existing (deferred) behaviour is still offered via <code>'new-deferred</code>. Just set as follows:</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-session-strategy 'new-deferred)
</code></pre>
<h3>Session resume (experimental)</h3>
<p>Probably the most requested feature and also facilitated by the bootstrapping changes. <code>agent-shell-session-strategy</code> also unlocks session resume. Set it to <code>'prompt</code> and every time either <code>M-x agent-shell-new-shell</code> or <code>C-u M-x agent-shell</code> are invoked, you'll be offered to resume previous sessions or start a new one.</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-session-strategy 'prompt)
</code></pre>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/resume.png" alt=""></p>
<p>Alternatively, you can set to <code>'latest</code> to always resume the most recent session in current project.</p>
<p>Under the hood, there are two ways to pick up from previous session: <a href="https://agentclientprotocol.com/rfds/session-resume">session/resume</a> (lightweight, no message replay) and <a href="https://agentclientprotocol.com/protocol/schema#session-load">session/load</a> (full history replay). By default, <code>agent-shell</code> prefers resuming (controlled by <code>agent-shell-prefer-session-resume</code>). Please favor resuming for the time being as loading has more edge cases to sort out still.</p>
<p>Note: Both resuming and loading sessions are agent-dependent. Some agents may not yet support either, especially as the features aren't yet considered stable in Agent Client Protocol (see <a href="https://agentclientprotocol.com/rfds/session-list">session/list</a> spec).</p>
<p>This feature was a collaboration between <a href="https://github.com/farra">@farra</a>, <a href="https://github.com/travisjeffery">@travisjeffery</a>, and myself.</p>
<h3>Clipboard images</h3>
<p>You can now use <code>agent-shell-send-clipboard-image</code> (<a href="https://github.com/xenodium/agent-shell/pull/285">#285</a> by <a href="https://github.com/dangom">@dangom</a>) to send images straight from your clipboard into <code>agent-shell</code>. Clipboard images are saved to <code>.agent-shell/screenshots</code> in your project root and inserted into the shell buffer as context.</p>
<p>Note: You'll need either <code>pngpaste</code> or <code>xclip</code> installed on your system for the feature to automatically kick in.</p>
<p>In addition, we now have <code>agent-shell-yank-dwim</code>: if the clipboard has an image, it pastes it as context. Otherwise, it yanks text as usual. In other words, copy an image anywhere to your system's clipboard and paste/yank into the buffer as usual (typically via <code>C-y</code>).</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/paste.gif" alt=""></p>
<h3>Status display + tool calls</h3>
<p>Status labels and tool call titles rendering got some improvements. Status reporting is generally more compact, redundant text is dropped from tool call titles, and tool status/kind shortening has been consolidated.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/toolcall.png" alt=""></p>
<h3>Image rendering</h3>
<p><code>agent-shell</code> now renders images inline. When agents output images (charts, diagrams, screenshots, etc.), they display directly in the shell buffer. You may need to nudge the agent to output image paths in the expected format so <code>agent-shell</code> can pick up.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/charts.gif" alt=""></p>
<p>Markdown images:</p>
<pre><code class="language-markdown">![alt text](/path/to/image.png)
</code></pre>
<p>Any of the following in a line of their own are supported also:</p>
<pre><code class="language-fundamental">/path/to/image.png
</code></pre>
<pre><code class="language-fundamental">file:///path/to/image.png
</code></pre>
<pre><code class="language-fundamental">./output/chart.png
~/screenshots/demo.png
</code></pre>
<p>Recognized image formats depend on what your Emacs was built with (typically png, jpeg, gif, svg, webp, tiff, etc. via <code>image-file-name-extensions</code>).</p>
<h3>Emacs skills</h3>
<p>While on the topic of image rendering, this works particularly well when coupled with charting <a href="https://agentskills.io/home">agent skills</a>. I shared some of these over at <a href="https://github.com/xenodium/emacs-skills">emacs-skills</a>, demoed in <a href="https://www.youtube.com/watch?v=HJQ86HuSIJI">episode 13</a> of the <a href="https://www.youtube.com/@xenodium">Bending Emacs</a> series.</p>
<center>
  <a href="https://www.youtube.com/watch?v=HJQ86HuSIJI" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/HJQ86HuSIJI/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<h3>Table rendering</h3>
<p>Tables are now rendered using overlays (<a href="https://github.com/xenodium/shell-maker/pull/17/">#17</a> by <a href="https://github.com/ewilderj">@ewilderj</a>).</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/table.png" alt=""></p>
<h3>Usage tracking</h3>
<p>Tracking usage now possible (<a href="https://github.com/xenodium/agent-shell/pull/270">#270</a> by <a href="https://github.com/Lenbok">@Lenbok</a>):</p>
<ul>
<li>A color-coded context usage indicator in the header (green -&gt; yellow -&gt; red as context fills up), enabled by default via <code>agent-shell-show-context-usage-indicator</code>.</li>
<li><code>M-x agent-shell-show-usage</code> to check token counts, context window usage, and cost in the minibuffer.r- An optional end-of-turn usage summary can be enabled via <code>(setq agent-shell-show-usage-at-turn-end t)</code>.</li>
</ul>
<h3>Git worktree shell</h3>
<p>If keen to run multiple agents on the same repo without stepping on each other's work, <code>M-x agent-shell-new-worktree-shell</code> facilitates this via git worktrees (<a href="https://github.com/xenodium/agent-shell/pull/255">#255</a> by <a href="https://github.com/nhojb">@nhojb</a>).</p>
<h3>Send context to…</h3>
<p>You can now send context to a specific shell using <code>agent-shell-send-file-to</code>, <code>agent-shell-send-region-to</code>, <code>agent-shell-send-clipboard-image-to</code>. and <code>agent-shell-send-screenshot-to</code>. These prompt you to pick a target shell.</p>
<p>Both <code>M-x agent-shell</code> and <code>agent-shell-send-dwim</code> are now prefix-aware. <code>C-u</code> forces a new shell, while <code>C-u C-u</code> prompts you to pick a target shell.</p>
<h3>Compose buffer improvements</h3>
<p>Compose buffers now support file (via @) and command (via /) completions. It is now also possible to browse previous pages via <code>C-c C-p</code> and come back to your prompt draft.</p>
<p>There's also prompt history navigation/insertion when composing prompts via <code>M-p</code> (previous), <code>M-n</code> (next), and <code>M-r</code> (search).</p>
<p>Bringing context into viewport compose buffers is now more robust. For example, carrying context into a new viewport compose buffer is now supported (<a href="https://github.com/xenodium/agent-shell/pull/383">#383</a> by <a href="https://github.com/liaowang11">@liaowang11</a>).</p>
<h3>Viewport improvements</h3>
<p>While viewport interaction was <a href="https://xenodium.com/agent-shell-0-25-updates#viewport%2Fcompose-(experimental)">introduced in the previous post</a>, it is now my preferred way of interacting with agent-shell. You can enable via <code>(setq agent-shell-prefer-viewport-interaction t)</code>. In any case, viewport buffers got a handful of quality-of-life improvements.</p>
<p>Single key replies without needing to open a compose/reply buffer:</p>
<ul>
<li><code>y</code> sends &quot;yes&quot; (handy for quickly answering agent questions).</li>
<li><code>1-9</code> sends digits (handy for quickly choosing options).</li>
<li><code>m</code> sends &quot;more&quot; (handy for requesting more of the same kind of data).</li>
<li><code>a</code> sends &quot;again&quot; (handy for requesting to carry out instructions again).</li>
</ul>
<h3>Customizable context sources</h3>
<p><code>agent-shell-context-sources</code> lets you configure which DWIM context sources are considered by <code>M-x agent-shell</code>, <code>agent-shell-send-dwim</code>, and compose buffers. You can control the order sources are checked and add custom functions. Defaults to <code>files</code>, <code>region</code>, <code>error</code>, and <code>line</code>.</p>
<p>I'm always on the lookout for some DWIM goodness. If you add your own context function, I'd love to hear about it.</p>
<h3>Flycheck support</h3>
<p>While on the topic of context sources, in addition to picking up <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Flymake.html">flymake</a> errors at point, <a href="https://www.flycheck.org/">flycheck</a> errors are now automatically recognized (<a href="https://github.com/xenodium/agent-shell/pull/219">#219</a> by <a href="https://github.com/Lenbok">@Lenbok</a>).</p>
<h3>Diff improvements</h3>
<p>Diff buffers got some love too, now with syntax highlighting (<a href="https://github.com/xenodium/agent-shell/pull/198">#198</a> by <a href="https://github.com/Azkae">@Azkae</a>). There's also a new <code>agent-shell-diff-mode-map</code> for customizing diff keybindings, which avoid inheriting unsupported features from the parent mode. You can also press <code>f</code> to open the modified file from a diff buffer.</p>
<p>Additionally, you can now press <code>C-c C-c</code> from an <code>agent-shell-diff</code> buffer to reject all changes (same binding as the shell itself).</p>
<h3>Event subscriptions</h3>
<p>You can now programmatically subscribe to <code>agent-shell</code> events like initialization steps, tool call updates, file writes, permission responses, permission requests, and turn completions. This opens the door for building integrations on top of <code>agent-shell</code>.</p>
<pre><code class="language-{.commonlisp">(agent-shell-subscribe-to
 :shell-buffer (current-buffer)
 :event 'file-write
 :on-event (lambda (event)
             (message &quot;File written: %s&quot;
                      (alist-get :path (alist-get :data event)))))
</code></pre>
<h3>Permission UX improvements</h3>
<p>Permission dialogs got a few improvements. Amongst them, automatic navigation to the next pending dialog and also making executed commands more prominent for some agents.</p>
<h3>Permission responder function</h3>
<p>You can now programmatically respond to permission requests via <code>agent-shell-permission-responder-function</code>. A built-in <code>agent-shell-permission-allow-always</code> handler is provided to auto-approve everything (use with caution):</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-permission-responder-function #'agent-shell-permission-allow-always)
</code></pre>
<h3>Claude Code OAuth token support</h3>
<p>OAuth token now supported for Claude Code (<a href="https://github.com/xenodium/agent-shell/pull/339">#339</a> by <a href="https://github.com/chemtov">@chemtov</a>).</p>
<h3>Transcript improvements</h3>
<p>Markdown transcripts generation needed love. Thank you <a href="https://github.com/Idorobots">@Idorobots</a> and <a href="https://github.com/systemfreund">@systemfreund</a> for the improvements (<a href="https://github.com/xenodium/agent-shell/pull/374">#374</a>, <a href="https://github.com/xenodium/agent-shell/pull/325">#325</a>, and <a href="https://github.com/xenodium/agent-shell/pull/326">#326</a>).</p>
<h3>Session ID display</h3>
<p>With <code>(setq agent-shell-show-session-id t)</code>, session IDs are now displayed in header as well as session lists (<a href="https://github.com/xenodium/agent-shell/pull/363">#363</a> by <a href="https://github.com/Cy6erBr4in">@Cy6erBr4in</a>).</p>
<h3>Custom CWD function</h3>
<p><code>agent-shell-cwd-function</code> now enables customizing how <code>agent-shell</code> determines the working directory sent to agents.</p>
<h3>Configurable dot-subdir location</h3>
<p><code>agent-shell-dot-subdir-function</code> now lets you customize where <code>agent-shell</code> keeps per-project files (<a href="https://github.com/xenodium/agent-shell/pull/378">#378</a> by <a href="https://github.com/zackattackz">@zackattackz</a>).</p>
<h3>Lambda MCP servers</h3>
<p><code>agent-shell-mcp-servers</code> now accept lambda functions too (<a href="https://github.com/xenodium/agent-shell/pull/237">#237</a> by <a href="https://github.com/matthewbauer">@matthewbauer</a>). Useful for setups like <code>claude-code-ide</code> using dynamic MCP details.</p>
<h3>Buffer name format</h3>
<p><code>agent-shell-buffer-name-format</code> now makes buffer naming configurable. Choose between the default title case (<code>&quot;Claude Code Agent @ My Project&quot;</code>), kebab-case (<code>&quot;claude-code-agent @ my-project&quot;</code>), or provide your own function (<a href="https://github.com/xenodium/agent-shell/pull/256">#256</a> by <a href="https://github.com/nhojb">@nhojb</a>).</p>
<h3>Inhibit minor modes during writes</h3>
<p><code>agent-shell-write-inhibit-minor-modes</code> lets you temporarily disable modes (like auto-formatting entire file) when agents write files (<a href="https://github.com/xenodium/agent-shell/pull/224">#224</a> by <a href="https://github.com/ultronozm">@ultronozm</a>).</p>
<h3>File autocompletion performance</h3>
<p>File autocompletion is now more performant for larger repositories (<a href="https://github.com/xenodium/agent-shell/pull/262">#262</a> by <a href="https://github.com/perfectayush">@perfectayush</a>).</p>
<h3>Container modeline indicator</h3>
<p>When running shells inside a container, a <code>[C]</code> indicator now shows up in the modeline (<a href="https://github.com/xenodium/agent-shell/pull/250">#250</a> by <a href="https://github.com/ElleNajt">@ElleNajt</a>).</p>
<h3>Graphical header improvements</h3>
<p>Graphical header rendering is more robust now (<a href="https://github.com/xenodium/agent-shell/pull/275">#275</a> by <a href="https://github.com/nhojb">@nhojb</a>).</p>
<h3>Busy throbber display options</h3>
<p>The busy/working indicator now offers multiple visual styles, customizable via <code>agent-shell-busy-indicator-frames</code> (<a href="https://github.com/xenodium/agent-shell/pull/280">#280</a> by <a href="https://github.com/Lenbok">@Lenbok</a>).</p>
<h3>New related packages</h3>
<ul>
<li><a href="https://github.com/ElleNajt/agent-shell-to-go">agent-shell-to-go</a>: Interact with <code>agent-shell</code> sessions from your mobile or any other device via Slack (by <a href="https://github.com/ElleNajt">@ElleNajt</a>).</li>
<li><a href="https://github.com/ElleNajt/meta-agent-shell">meta-agent-shell</a>: Multi-agent coordination system for <code>agent-shell</code> with inter-agent communication, task tracking, and project-level dispatching (by <a href="https://github.com/ElleNajt">@ElleNajt</a>).</li>
<li><a href="https://github.com/gveres/agent-shell-workspace">agent-shell-workspace</a>: Dedicated tab-bar workspace for managing multiple <code>agent-shell</code> sessions (by <a href="https://github.com/gveres">@gveres</a>).</li>
</ul>
<h3>Pull requests</h3>
<p>Thank you to all contributors for these improvements!</p>
<ul>
<li><a href="https://github.com/xenodium/agent-shell/pull/159">#159</a>: Improve Mistral Vibe documentation (<a href="https://github.com/KaiHa">@KaiHa</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/162">#162</a>: Fix agent-shell-help-menu binding (<a href="https://github.com/jinnovation">@jinnovation</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/164">#164</a>: Fix nil-check semantics in <code>when-let</code> (<a href="https://github.com/jinnovation">@jinnovation</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/166">#166</a>: Use project-name for buffer names (<a href="https://github.com/catern">@catern</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/169">#169</a>: Resolve <code>@mentioned</code> paths in devcontainers (<a href="https://github.com/fritzgrabo">@fritzgrabo</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/173">#173</a>: Fix <code>when-let</code> binding issue (<a href="https://github.com/byronclark">@byronclark</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/178">#178</a>: Add Factory Droid capability (<a href="https://github.com/ag91">@ag91</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/179">#179</a>: Add Auggie support (<a href="https://github.com/Pacane">@Pacane</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/185">#185</a>: Update OpenCode logo (<a href="https://github.com/bps">@bps</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/186">#186</a>: Use context in viewport mode (<a href="https://github.com/byronclark">@byronclark</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/193">#193</a>: Handle <code>user_message_chunk</code> session update type (<a href="https://github.com/Lenbok">@Lenbok</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/196">#196</a>: Fix agent names when config icons are off (<a href="https://github.com/budevg">@budevg</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/197">#197</a>: Function-based container command runner (<a href="https://github.com/rpoisel">@rpoisel</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/198">#198</a>: Syntax highlighting in diffs (<a href="https://github.com/Azkae">@Azkae</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/199">#199</a>: Fix reply in viewport mode (<a href="https://github.com/byronclark">@byronclark</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/200">#200</a>: Prevent context from own agent-shell buffer (<a href="https://github.com/juboba">@juboba</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/204">#204</a>: Terminal-mode status labels (<a href="https://github.com/whhone">@whhone</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/206">#206</a>: Add Evil section to README (<a href="https://github.com/juboba">@juboba</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/208">#208</a>: Theme-aware status label color (<a href="https://github.com/whhone">@whhone</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/209">#209</a>: Add missing <code>image</code> require (<a href="https://github.com/timvisher">@timvisher</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/212">#212</a>: Simplify language detection (<a href="https://github.com/necaris">@necaris</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/213">#213</a>: Improve file and command completion (<a href="https://github.com/necaris">@necaris</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/214">#214</a>: Fix auto-insert variable declaration (<a href="https://github.com/ultronozm">@ultronozm</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/219">#219</a>: Flycheck error context support (<a href="https://github.com/Lenbok">@Lenbok</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/224">#224</a>: Inhibit minor modes during file writes (<a href="https://github.com/ultronozm">@ultronozm</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/226">#226</a>: Deduplicate file link (<a href="https://github.com/bixuanzju">@bixuanzju</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/232">#232</a>: Add Pi coding agent (<a href="https://github.com/conornash">@conornash</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/235">#235</a>: Fix empty list normalizer (<a href="https://github.com/ROCKTAKEY">@ROCKTAKEY</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/237">#237</a>: Lambda MCP servers (<a href="https://github.com/matthewbauer">@matthewbauer</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/240">#240</a>: Fix viewport shell buffer association (<a href="https://github.com/Rutherther">@Rutherther</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/245">#245</a>: Fix <code>:tool-calls</code> state maintenance (<a href="https://github.com/vermiculus">@vermiculus</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/246">#246</a>: Respect viewport visits for buffer ordering (<a href="https://github.com/Rutherther">@Rutherther</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/249">#249</a>: Fix tool call title duplication (<a href="https://github.com/ElleNajt">@ElleNajt</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/250">#250</a>: Container modeline indicator (<a href="https://github.com/ElleNajt">@ElleNajt</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/252">#252</a>: Document <code>C-c C-c</code> to send (<a href="https://github.com/HIRANO-Satoshi">@HIRANO-Satoshi</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/255">#255</a>: Git worktree shell (<a href="https://github.com/nhojb">@nhojb</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/256">#256</a>: Buffer name format customization (<a href="https://github.com/nhojb">@nhojb</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/257">#257</a>: Fix kebab-case project name (<a href="https://github.com/nhojb">@nhojb</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/262">#262</a>: File autocompletion speedup (<a href="https://github.com/perfectayush">@perfectayush</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/266">#266</a>: Guard permission title rendering (<a href="https://github.com/budevg">@budevg</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/269">#269</a>: Add missing paren (<a href="https://github.com/Rutherther">@Rutherther</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/270">#270</a>: Session usage tracking (<a href="https://github.com/Lenbok">@Lenbok</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/272">#272</a>: Update Copilot ASCII art (<a href="https://github.com/ewilderj">@ewilderj</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/275">#275</a>: Graphical header improvements (<a href="https://github.com/nhojb">@nhojb</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/279">#279</a>: Add <code>agent-shell-send-dwim</code> to transient (<a href="https://github.com/matthewbauer">@matthewbauer</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/280">#280</a>: Busy throbber options (<a href="https://github.com/Lenbok">@Lenbok</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/285">#285</a>: Clipboard image pasting (<a href="https://github.com/dangom">@dangom</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/289">#289</a>: Session list/load/resume (<a href="https://github.com/farra">@farra</a>, <a href="https://github.com/travisjeffery">@travisjeffery</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/291">#291</a>: Normalize tool call commands (<a href="https://github.com/ultronozm">@ultronozm</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/292">#292</a>: Strip text properties from copied text (<a href="https://github.com/ultronozm">@ultronozm</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/293">#293</a>: Restore usage indicator color (<a href="https://github.com/Lenbok">@Lenbok</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/295">#295</a>: Handle tools without a command (<a href="https://github.com/byronclark">@byronclark</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/296">#296</a>: Handle nil tool-call command (<a href="https://github.com/genegoykhman">@genegoykhman</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/299">#299</a>: claude-code-acp -&gt; claude-agent-acp rename (<a href="https://github.com/byronclark">@byronclark</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/312">#312</a>: Function-valued model ID (<a href="https://github.com/lgfang">@lgfang</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/316">#316</a>: Fix diff syntax highlighting (<a href="https://github.com/Azkae">@Azkae</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/318">#318</a>: Tool call parameters in transcripts (<a href="https://github.com/systemfreund">@systemfreund</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/319">#319</a>: Fix terminal Emacs font crash (<a href="https://github.com/eddof13">@eddof13</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/325">#325</a>: Log agent thoughts in transcript (<a href="https://github.com/Idorobots">@Idorobots</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/326">#326</a>: Fix nested backtick fences in transcript (<a href="https://github.com/systemfreund">@systemfreund</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/328">#328</a>: Switch modes in agent-shell-diff (<a href="https://github.com/wmedrano">@wmedrano</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/329">#329</a>: Fix tests (<a href="https://github.com/timvisher-dd">@timvisher-dd</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/313">#313</a>: Bring &quot;Start a new session&quot; to the top (<a href="https://github.com/catern">@catern</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/335">#335</a>: Fix plan from request_permission (<a href="https://github.com/Azkae">@Azkae</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/339">#339</a>: OAuth token support for Anthropic (<a href="https://github.com/chemtov">@chemtov</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/350">#350</a>: Prepare devcontainer package extraction (<a href="https://github.com/fritzgrabo">@fritzgrabo</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/351">#351</a>: Add Kiro CLI ACP support (<a href="https://github.com/zmjones">@zmjones</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/353">#353</a>: Fix xclip blocking on X11 (<a href="https://github.com/chemtov">@chemtov</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/363">#363</a>: Configurable session selection columns (<a href="https://github.com/Cy6erBr4in">@Cy6erBr4in</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/370">#370</a>: Fix permission UI on out-of-order status updates (<a href="https://github.com/xar7">@xar7</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/374">#374</a>: Indent markdown headers in transcript (<a href="https://github.com/systemfreund">@systemfreund</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/376">#376</a>: Fix file skip check (<a href="https://github.com/zackattackz">@zackattackz</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/378">#378</a>: Configurable dot-subdir location (<a href="https://github.com/zackattackz">@zackattackz</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/382">#382</a>: Permission-request and turn-complete subscription events (<a href="https://github.com/emil-e">@emil-e</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/383">#383</a>: Viewport context on first open (<a href="https://github.com/liaowang11">@liaowang11</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/385">#385</a>: Fix leading space in terminal prompt (<a href="https://github.com/bcc32">@bcc32</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/388">#388</a>: Apply dir-local variables in shell buffer (<a href="https://github.com/fritzgrabo">@fritzgrabo</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li><a href="https://github.com/xenodium/agent-shell/issues/168">#168</a>: <code>replace-buffer-contents</code> timeout to prevent freeze on large diffs</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/170">#170</a>: Suppress effects of <code>find-file-noselect</code> during agent writes</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/175">#175</a>: ACP configuration JSON-RPC inserted into shell</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/180">#180</a>: Terminal-friendly keybindings</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/189">#189</a>: Changing the model with Claude causes hang</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/191">#191</a>: <code>user_message_chunk</code> session updates no longer dump raw JSON</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/220">#220</a>: Python comments no longer interpreted as Markdown headers</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/265">#265</a>: <code>session/request_permission</code> with argv array commands</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/297">#297</a>: Unexpected tool-call command type error</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/300">#300</a>: <code>agent-shell-send-region</code> no longer fails silently without a region</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/303">#303</a>: Context insertion for new deferred sessions</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/319">#319</a>: Fix &quot;Wrong type argument: font, unspecified&quot; in terminal Emacs (fix by <a href="https://github.com/eddof13">@eddof13</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/335">#335</a>: Plan not displaying from <code>session/request_permission</code> (fix by <a href="https://github.com/Azkae">@Azkae</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/345">#345</a>: Out of turn notifications inserted into shell</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/353">#353</a>: xclip handler blocking on X11 when clipboard has no image (fix by <a href="https://github.com/chemtov">@chemtov</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/361">#361</a>: <code>loadSession</code> regression</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/370">#370</a>: Permission UI not reacting on status failed/completed (fix by <a href="https://github.com/xar7">@xar7</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/376">#376</a>: File skip check using full path instead of filename only (fix by <a href="https://github.com/zackattackz">@zackattackz</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/385">#385</a>: Leading space in <code>agent-shell-select-config</code> prompt in terminal frames (fix by <a href="https://github.com/bcc32">@bcc32</a>)</li>
</ul>
<h3>Lots of polish</h3>
<p>Beyond what's showcased, I've poured much love and effort into polishing the <code>agent-shell</code> experience. Interested in the nitty-gritty? Have a look through <a href="https://github.com/xenodium/agent-shell/commits/main/">my regular commits</a>.</p>
<h3>Make the work sustainable</h3>
<p>If <a href="https://github.com/xenodium/agent-shell">agent-shell</a> is useful to you, please consider <a href="https://github.com/sponsors/xenodium">sponsoring</a> the project. These days, I've been working on <code>agent-shell</code> daily.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-47-1-updates/github.png" alt=""></p>
<p>LLM tokens aren't free, and neither is the time dedicated to building this stuff. While I now have more time to work on <code>agent-shell</code> as an indie dev, I also have bills to pay ;)</p>
<p>Unless I can make this work sustainable, I will have to shift my focus to work on something else that is.</p>
<center>✨ <a href="https://github.com/sponsors/xenodium">Sponsor agent-shell</a> ✨</center>
]]></description>
    <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 13: agent-shell charting</title>
<link>https://xenodium.com/bending-emacs-episode-13-agent-shell-charting</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-13-agent-shell-charting</guid>
    <description><![CDATA[<p>Time for a new <a href="https://www.youtube.com/@xenodium">Bending Emacs</a> episode. This one is a follow-up to <a href="https://xenodium.com/bending-emacs-episode-12-agent-shell-claude-skills">Episode 12</a>, where we explored Claude Skills as <a href="https://github.com/xenodium/emacs-skills">emacs-skills</a>.</p>
<p><a href="https://youtu.be/HJQ86HuSIJI">Bending Emacs Episode 13: agent-shell + Claude Skills + Charts</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=HJQ86HuSIJI" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/HJQ86HuSIJI/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>This time around, we look at inline image rendering in <a href="https://github.com/xenodium/agent-shell">agent-shell</a> and how it opens the door to charting. I added a handful of new charting skills to <a href="https://github.com/xenodium/emacs-skills">emacs-skills</a>: <a href="http://www.gnuplot.info/">/gnuplot</a>, <a href="https://mermaid.js.org/">/mermaid</a>, <a href="https://d2lang.com/">/d2</a>, and <a href="https://plantuml.com/">/plantuml</a>.</p>
<p>The agent extracts or fetches data from context, generates the charting code, saves it as a PNG, and agent-shell renders it inline. Cherry on top: the generated charts match your Emacs theme colors by querying them via <code>emacsclient --eval</code>.</p>
<p>Hope you enjoyed the video!</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/HJQ86HuSIJI">me some comments</a>.</p>
<p>Please <a href="https://youtu.be/HJQ86HuSIJI">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>As an indie dev, I now have a lot more flexibility to build Emacs tools and share knowledge, but it comes at the cost of not focusing on other activities that help pay the bills. If you benefit or enjoy my work please consider <a href="https://xenodium.com/sponsor">sponsoring</a>.</p>
]]></description>
    <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 12: agent-shell + Claude Skills</title>
<link>https://xenodium.com/bending-emacs-episode-12-agent-shell-claude-skills</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-12-agent-shell-claude-skills</guid>
    <description><![CDATA[<p>Time for a new <a href="https://www.youtube.com/@xenodium">Bending Emacs</a> episode. This one is a follow-up to <a href="https://xenodium.com/bending-emacs-episode-10-agent-shell">Episode 10</a>, where we introduced <a href="https://github.com/xenodium/agent-shell">agent-shell</a>.</p>
<p><a href="https://youtu.be/ymMlftdGx4I">Bending Emacs Episode 12: agent-shell + Claude Skills</a></p>
<ul>
<li></li>
</ul>
<center>
  <a href="https://www.youtube.com/watch?v=ymMlftdGx4I" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/ymMlftdGx4I/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>This time around, we explore Claude Skills and how to use them to teach agents Emacs tricks. I built a handful of skills packaged as a Claude Code plugin at <a href="https://github.com/xenodium/emacs-skills">github.com/xenodium/emacs-skills</a>.</p>
<p>The skills use <code>emacsclient --eval</code> under the hood to bridge agent work to your running Emacs session:</p>
<ul>
<li><code>/dired</code> - Open files from the latest interaction in a dired buffer with marks.</li>
<li><code>/open</code> - Open files in Emacs, jumping to a specific line when relevant.</li>
<li><code>/select</code> - Open a file and select the relevant region.</li>
<li><code>/highlight</code> - Highlight relevant regions across files with a temporary read-only minor mode.</li>
<li><code>/describe</code> - Look up Emacs documentation and summarize findings.</li>
<li><code>emacsclient</code> (auto) - Teaches the agent to always prefer <code>emacsclient</code> over <code>emacs</code>.</li>
</ul>
<p>Hope you enjoyed the video!</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/ymMlftdGx4I">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/ymMlftdGx4I">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>As an indie dev, I now have a lot more flexibility to build Emacs tools and share knowledge, but it comes at the cost of not focusing on other activities that help pay the bills. If you benefit or enjoy my work please consider <a href="https://xenodium.com/sponsor">sponsoring</a> the work.</p>
]]></description>
    <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ready Player cover download improvements</title>
<link>https://xenodium.com/ready-player-cover-download-improvements</link>
<guid isPermaLink="false">https://xenodium.com/ready-player-cover-download-improvements</guid>
    <description><![CDATA[<p>At times, even purchased music excludes album covers in track metadata. For those instances, <a href="https://github.com/xenodium/ready-player">ready-player-mode</a> offers <code>M-x ready-player-download-album-artwork</code>, which does as it says on the tin. The interactive command offers a couple of fetching providers (iTunes vs Internet Archive / MusicBrainz) to grab the album cover. The thing is, I often found myself trying one or the other provider, sometimes without luck. Today, I finally decided to add a third provider (<a href="https://deezer.com">Deezer</a>) to the list. Even then, what's the point of manually trying each provider out when I can automatically try them all and return the result from the first successful one? And so that's what I did.</p>
<p>In addition to offering all providers, <code>M-x ready-player-download-album-artwork</code> now offers &quot;Any&quot;, to download from the first successful provider. Now, why keep the option to request from a specific provider? Well, sometimes one provider has better artwork than another. If I don't like what &quot;Any&quot; returns, I can always request from a specific provider.</p>
<p>While on the subject, I also tidied the preview experience up and now display the thumbnail in the minibuffer. In any case, best to show rather than tell.</p>
<p><img src="https://xenodium.github.io/images/ready-player-cover-download-improvements/download.gif" alt=""></p>
<p>Enjoying your unrestricted music via Emacs and <code>ready player mode</code>? ✨<a href="https://github.com/sponsors/xenodium">sponsor</a>✨ the project.</p>
]]></description>
    <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 11: winpulse</title>
<link>https://xenodium.com/bending-emacs-episode-11-winpulse</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-11-winpulse</guid>
    <description><![CDATA[<p>I recently built a little package to <a href="https://xenodium.com/introducing-winpulse">flash Emacs windows</a> as you switch through them, so I might as well showcase it in a new <a href="https://www.youtube.com/@xenodium">Bending Emacs</a> episode, so here it goes:</p>
<p><a href="https://www.youtube.com/watch?v=qaqpcjJ1u6I">Bending Emacs Episode 11: winpulse</a></p>
<ul>
<li></li>
</ul>
<center>
  <a href="https://www.youtube.com/watch?v=qaqpcjJ1u6I" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/qaqpcjJ1u6I/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>In addition to showcasing <a href="https://github.com/xenodium/winpulse">winpulse</a>, we showed some of the built-in window-managing commands like:</p>
<ul>
<li><code>C-x 3</code> split-window-right</li>
<li><code>C-x 2</code> split-window-below</li>
<li><code>C-x 0</code> delete-window</li>
<li><code>C-x ^</code> enlarge-window</li>
<li><code>C-x }</code> enlarge-window-horizontally</li>
<li><code>C-x {</code> shrink-window-horizontally</li>
<li><code>C-x o</code> other-window</li>
</ul>
<p>It's worth noting the last four commands are can be optimized by <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Repeating.html">repeat-mode</a>. Check out Karthink's <a href="https://karthinks.com/software/it-bears-repeating/">It Bears Repeating: Emacs 28 &amp; Repeat Mode</a> post.</p>
<p>Hope you enjoyed the video!</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://www.youtube.com/watch?v=qaqpcjJ1u6I">me some comments</a>.</p>
<p>Please go <a href="https://www.youtube.com/watch?v=qaqpcjJ1u6I">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
<h2>Make it all sustainable</h2>
<p>Enjoying this content or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Introducing winpulse</title>
<link>https://xenodium.com/introducing-winpulse</link>
<guid isPermaLink="false">https://xenodium.com/introducing-winpulse</guid>
    <description><![CDATA[<p>Hard to say officially, but I've been primarily using Emacs for roughly a couple of decades. Maybe my eyesight isn't what it used to be, or maybe I've just been wanting a stronger visual signal as I navigate through Emacs windows. Either way, today's the day I finally did something about it…</p>
<p>I <a href="https://indieweb.social/@xenodium/116045729460859056">asked around</a> to see if a package already existed for this purpose. Folks shared a handful of great options:</p>
<ul>
<li><a href="https://github.com/protesilaos/pulsar">pulsar:</a> Emacs package to pulse the current line after running select functions.</li>
<li><a href="https://github.com/gonewest818/dimmer.el">dimmer.el:</a> Interactively highlight the active buffer by dimming the others.</li>
<li><a href="https://github.com/alvgaona/window-dim.el">window-dim.el:</a> A window dimmer package for Emacs.</li>
</ul>
<p>I wanted my windows to temporarily flash when switching between them. Of these options, <a href="https://github.com/protesilaos/pulsar">pulsar</a> came closest, though highlighting the current line only.</p>
<p>This is Emacs, so I should be able to get the behavior I want by throwing some elisp at the problem. With that, I give you <a href="https://github.com/xenodium/winpulse">winpulse</a>, a package to temporarily highlight focused Emacs windows.</p>
<img src="https://raw.githubusercontent.com/xenodium/winpulse/refs/heads/main/demo.webp" width="100%">
<p>This package is fresh out of the oven and likely has some edge cases I haven't yet considered. If you're still keen to check it out, it's <a href="https://github.com/xenodium/winpulse">available on GitHub</a>.</p>
<h2>Make it sustainable</h2>
<p>Enjoying this package or my content? I'm an indie dev. Consider <a href="https://github.com/sponsors/xenodium">sponsoring</a> to help make it sustainable.</p>
]]></description>
    <pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Film/TV bookmarks (chaos resolved)</title>
<link>https://xenodium.com/film-tv-bookmarks-chaos-resolved</link>
<guid isPermaLink="false">https://xenodium.com/film-tv-bookmarks-chaos-resolved</guid>
    <description><![CDATA[<p>I've been somewhat chaotically &quot;bookmarking&quot; things to watch for some time. The info typically goes straight to an Emacs org file primarily via <a href="https://journelly.com/">Journelly</a>.</p>
<p>I'm fairly forgiving in my input form. I often link to <a href="https://www.reddit.com">Reddit</a> discussions, <a href="https://www.imdb.com">IMDB</a>/<a href="https://letterboxd.com">Letterboxd</a> links, or at times simply write movie or director names. The only real requirement is to sprinkle some hashtags (#film or #series or #watch) for retrieval.</p>
<p>While this flexibility is important (makes it more likely for me to actually write), it's not super practical to browse through this mixed structure when looking for something to watch. Yesterday, I finally did something about that.</p>
<p>Here's what my <code>save-to-Journelly</code> flow may look like for a Reddit link:</p>
<p><img src="https://xenodium.github.io/images/film-tv-bookmarks-chaos-resolved/sharing.png" alt=""></p>
<p>All entries are saved to Journelly.org, a plain text org file (<a href="https://xenodium.com/journelly-1-3-released">Markdown is supported too</a>), so I first extracted all relevant entries (containing #film or #series or #watch). A matching entry looks a little something like this:</p>
<pre><code class="language-org">* [2026-01-29 Thu 09:52] @ Home
:PROPERTIES:
:LATITUDE: 51.5007
:LONGITUDE: -0.1246
:WEATHER_TEMPERATURE: 4.2°C
:WEATHER_CONDITION: Cloudy
:WEATHER_SYMBOL: cloud
:END:
#film #hongkong #watch

https://www.reddit.com/r/movies/comments/1j85b52/just_rewatched_kung_fu_hustle_still_felt_great
</code></pre>
<p>Having extracted non-personal items from <code>Journelly.org</code>, I created a git repo with just one file: <code>watchlist.org</code> including entries like the one above.</p>
<p>With personal/private details out of the way, I decided to let the LLM robots loose. That is, hand <code>watchlist.org</code> over to a <a href="https://claude.com/product/claude-code">Claude Code agent</a>, via Emacs <a href="https://github.com/xenodium/agent-shell">agent-sell</a> to organize my chaos.</p>
<p>First I asked to normalize data by extracting all film/tv info from each entry, visiting Reddit/IMDB/Letterboxd links if needed, which yielded <code>normalized.org</code>:</p>
<pre><code class="language-text">Kung Fu Hustle
https://www.imdb.com/title/tt0373074
</code></pre>
<p>Next I asked to generate metadata for me (using the fields I wanted from <code>IMDB</code>), stored in org drawers, saved to <code>db.org</code>:</p>
<pre><code class="language-org">* Kung Fu Hustle
:PROPERTIES:
:TYPE: film
:YEAR: 2004
:IMDB: https://www.imdb.com/title/tt0373074/
:IMDB_RATING: 7.7
:COUNTRY: Hong Kong
:DIRECTOR: Stephen Chow
:GENRE: action, comedy, fantasy
:RUNTIME: 99
:ADDED: [2026-01-28]
:THUMBNAIL: file:thumbnails/tt0373074.png
:IMDB_THUMBNAIL: https://m.media-amazon.com/images/M/MV5BNGU2OWVlM2ItZGZlOC00Yzk2LWE1NzEtMDYwMzE4YTE5MzQ2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg
:END:
</code></pre>
<p>Finally, I asked to generate HTML from <code>db.org</code> so I can render and easily browse.</p>
<pre><code class="language-html">&lt;div&gt;
  &lt;a href=&quot;https://www.imdb.com/title/tt0373074/&quot;&gt;&lt;img src=&quot;https://m.media-amazon.com/images/M/MV5BNGU2OWVlM2ItZGZlOC00Yzk2LWE1NzEtMDYwMzE4YTE5MzQ2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg&quot; alt=&quot;Kung Fu Hustle&quot; width=&quot;150&quot; height=&quot;225&quot;&gt;&lt;/a&gt;
  &lt;p&gt;&lt;strong&gt;Kung Fu Hustle (2004)&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;action · comedy · fantasy&lt;/p&gt;
  &lt;p&gt;Hong Kong · Stephen Chow&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<p>For each transformation, <code>Claude Code</code> generated a python script. I've yet to decide what to do with all the resulting source code. Do I clean it up? Rewrite it?</p>
<p>For now, I'm happy with the results of the experiment. I managed to organize some of my chaos! In some ways, this isn't too different from me writing a quick/hacky/ugly script, when it's acceptable to do so.</p>
<p>At the center of it all, is my beloved org syntax. Thanks to plain text formats, we can easily peek at them, query them, poke at them, tweak them, and bend til our heart's content. It's just so versatile, and now we can throw them at LLMs too.</p>
<p>Oh, and if you're curious about that watch list, here you go. Do you have some movie/show suggestions for me?</p>
<div class="grid">
  <div>
    <a href="https://www.imdb.com/title/tt3148266/"><img src="https://m.media-amazon.com/images/M/MV5BMTQ2NDUxMjY1M15BMl5BanBnXkFtZTgwMzM0MTE5NTE@._V1_FMjpg_UY1024_.jpg" alt="12 Monkeys" width="150" height="225"></a>
    <p><strong>12 Monkeys (2015)</strong></p>
    <p>tv · adventure · drama · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3113498/"><img src="https://m.media-amazon.com/images/M/MV5BMWJhZmUwYjEtNzgxZC00ZWUzLWJmN2QtYmE4YjI5MzYxZmMyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="2149: The Aftermath" width="150" height="225"></a>
    <p><strong>2149: The Aftermath (2021)</strong></p>
    <p>sci-fi</p>
    <p>Canada · Benjamin Duffield</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13016388/"><img src="https://m.media-amazon.com/images/M/MV5BMDdkYWZiZWYtMzA0Yi00NzNlLThkODktY2Q3N2NjN2ExZmMwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="3 Body Problem" width="150" height="225"></a>
    <p><strong>3 Body Problem (2024)</strong></p>
    <p>tv · adventure · drama · fantasy</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0225009/"><img src="https://m.media-amazon.com/images/M/MV5BYTJhYjQ5NDMtMDBlNy00NTBkLWEzZTQtMjQ4MTNiZWFkY2ExXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="964 Pinocchio" width="150" height="225"></a>
    <p><strong>964 Pinocchio (1991)</strong></p>
    <p>horror · sci-fi</p>
    <p>Japan · Shozin Fukui</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0405296/"><img src="https://m.media-amazon.com/images/M/MV5BMDliMjJiYTYtYWU0YS00OTUzLWI4MjMtYmM1YzgxNDcwOTZjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="A Scanner Darkly" width="150" height="225"></a>
    <p><strong>A Scanner Darkly (2006)</strong></p>
    <p>animation · comedy · crime</p>
    <p>United States · Richard Linklater</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1832382/"><img src="https://m.media-amazon.com/images/M/MV5BMDM0ZWRmMzctM2M5ZS00ZjU0LWIxN2MtNWNlNGY1ZDhjMDVhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="A Separation" width="150" height="225"></a>
    <p><strong>A Separation (2011)</strong></p>
    <p>drama</p>
    <p>Iran · Asghar Farhadi</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt17921714/"><img src="https://m.media-amazon.com/images/M/MV5BNDNmMDI1NjctZmNkMy00NjdkLTgyYTEtNzFlZjRlYmFiYjhjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="A Small Light" width="150" height="225"></a>
    <p><strong>A Small Light (2023)</strong></p>
    <p>tv · biography · drama · history</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0093502/"><img src="https://m.media-amazon.com/images/M/MV5BNTRhMmExNjctNDkzZS00ZmY5LWJiMzQtODdhMGIyNjllMjc3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="A Taxing Woman" width="150" height="225"></a>
    <p><strong>A Taxing Woman (1987)</strong></p>
    <p>comedy · crime</p>
    <p>Japan · Jûzô Itami</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6794990/"><img src="https://m.media-amazon.com/images/M/MV5BZTIyMDYwNTctOGZkOC00NjkzLWI2NDMtZTc2YWY5OWUxMzA2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Absentia" width="150" height="225"></a>
    <p><strong>Absentia (2017)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>Israel</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt12151818/"><img src="https://m.media-amazon.com/images/M/MV5BOTBhZjBjMzctZjNlZC00YTAxLWI1MTItMDRmN2JmZWQ0YmY0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Across the Furious Sea" width="150" height="225"></a>
    <p><strong>Across the Furious Sea (2023)</strong></p>
    <p>crime · drama · mystery</p>
    <p>China · Baoping Cao</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0094625/"><img src="https://m.media-amazon.com/images/M/MV5BNGY0ODg1MWMtYjQ4My00MWExLTgxZGMtODNhOTMxYjczODhkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Akira" width="150" height="225"></a>
    <p><strong>Akira (1988)</strong></p>
    <p>animation · action · drama</p>
    <p>Japan · Katsuhiro Ôtomo</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0437086/"><img src="https://m.media-amazon.com/images/M/MV5BYmZhZGQzM2MtMWEyZC00YTU1LTk4YTQtMTg3ZjEzM2U1NTkxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Alita: Battle Angel" width="150" height="225"></a>
    <p><strong>Alita: Battle Angel (2019)</strong></p>
    <p>action · adventure · sci-fi</p>
    <p>United States · Robert Rodriguez</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0185125/"><img src="https://m.media-amazon.com/images/M/MV5BYzgyNWMzNDItZmJhZi00NzZmLTkyNmMtMjBiNjUyMmNkYjg4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="All About My Mother" width="150" height="225"></a>
    <p><strong>All About My Mother (1999)</strong></p>
    <p>comedy · drama · romance</p>
    <p>Spain · Pedro Almodóvar</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2261227/"><img src="https://m.media-amazon.com/images/M/MV5BNTY4MWY1ZDktZjQxZS00ZDc5LWE3OTctZDU5MzQ2ZWU5ZTJkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Altered Carbon" width="150" height="225"></a>
    <p><strong>Altered Carbon (2018)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5069086/"><img src="https://m.media-amazon.com/images/M/MV5BMjU1MzQ5ZjQtOTEwOC00MjJjLTk3OTYtYTgyM2IzZmQ4MTE2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Altered Hours" width="150" height="225"></a>
    <p><strong>Altered Hours (2016)</strong></p>
    <p>sci-fi · thriller</p>
    <p>United States · Bruce Wemple</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0211915/"><img src="https://m.media-amazon.com/images/M/MV5BOTNmYzY0MWQtZGZmNy00Y2Y4LWFmMDQtMTZjYTdiYzEwZGQ2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Amelie" width="150" height="225"></a>
    <p><strong>Amelie (2001)</strong></p>
    <p>comedy · romance</p>
    <p>France · Jean-Pierre Jeunet</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0245712/"><img src="https://m.media-amazon.com/images/M/MV5BMmUzNDI1MDYtNmIxNC00NjczLTk0ZDEtYWFkZDcxMWVhYTEwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Amores Perros" width="150" height="225"></a>
    <p><strong>Amores Perros (2000)</strong></p>
    <p>drama · thriller</p>
    <p>Mexico · Alejandro G. Iñárritu</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8020896/"><img src="https://m.media-amazon.com/images/M/MV5BZDU1NGM3ZjAtYTM1My00ZmU5LTljNGQtYTljNmUyMGEwZjgxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="An Elephant Sitting Still" width="150" height="225"></a>
    <p><strong>An Elephant Sitting Still (2018)</strong></p>
    <p>crime · drama</p>
    <p>China · Bo Hu</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt17009710/"><img src="https://m.media-amazon.com/images/M/MV5BYTk3MjFkZmQtMThiYi00N2JhLTk2YzItZTE5ZGUxZTIyZDVkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Anatomy of a Fall" width="150" height="225"></a>
    <p><strong>Anatomy of a Fall (2023)</strong></p>
    <p>crime · drama · mystery</p>
    <p>France · Justine Triet</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11126994/"><img src="https://m.media-amazon.com/images/M/MV5BYjA2NzhlMDItNWRmZC00MzRjLWE3ZjAtZjBlZDAwOWY2ODdjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Arcane" width="150" height="225"></a>
    <p><strong>Arcane (2021)</strong></p>
    <p>tv · animation · action · adventure</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13365348/"><img src="https://m.media-amazon.com/images/M/MV5BYjMzOTk2NzktNzYxNy00YTY4LTg1NTgtYWY5NmIzNzdiMzllXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Archive 81" width="150" height="225"></a>
    <p><strong>Archive 81 (2022)</strong></p>
    <p>tv · drama · horror · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0096461/"><img src="https://m.media-amazon.com/images/M/MV5BN2Q1YmQyNDgtY2M5Mi00NzQ0LThmNzAtNWIzZjllZjVmOTI2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="As Tears Go By" width="150" height="225"></a>
    <p><strong>As Tears Go By (1988)</strong></p>
    <p>crime · drama · romance</p>
    <p>Hong Kong · Wong Kar-Wai</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13528562/"><img src="https://m.media-amazon.com/images/M/MV5BMzQ4ZWY0Y2EtZGY5NC00Mzc2LTllZjMtNmZhOWQ0MjVmMjAzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Asakusa Kid" width="150" height="225"></a>
    <p><strong>Asakusa Kid (2021)</strong></p>
    <p>biography · drama</p>
    <p>Japan · Gekidan Hitori</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7298400/"><img src="https://m.media-amazon.com/images/M/MV5BMGI0NTZlYmEtYWVkOC00ZTA5LThiMTQtZWU4ZWRmNTNkODgxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ash Is Purest White" width="150" height="225"></a>
    <p><strong>Ash Is Purest White (2018)</strong></p>
    <p>crime · drama · romance</p>
    <p>China · Jia Zhang-ke</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt15713446/"><img src="https://m.media-amazon.com/images/M/MV5BN2M1MGExNDItZjI5Ni00ZWU1LWFlMGUtYTA3NWQ5OWZiYTEwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Asura" width="150" height="225"></a>
    <p><strong>Asura (2023)</strong></p>
    <p>tv · comedy · drama</p>
    <p>Indonesia</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0185906/"><img src="https://m.media-amazon.com/images/M/MV5BMTQ3NTdmOTEtZTRmMi00NTg5LWI5NmUtYTNiOTc0ZmNkODU0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Band of Brothers" width="150" height="225"></a>
    <p><strong>Band of Brothers (2001)</strong></p>
    <p>tv · action · drama · history</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2017109/"><img src="https://m.media-amazon.com/images/M/MV5BMTkzNTA1MDI5M15BMl5BanBnXkFtZTcwNTY3NjAwOQ@@._V1_FMjpg_UY1024_.jpg" alt="Banshee" width="150" height="225"></a>
    <p><strong>Banshee (2013)</strong></p>
    <p>tv · action · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5348176/"><img src="https://m.media-amazon.com/images/M/MV5BYzdlYWZkNjQtMWYwNi00YjNkLTljYjgtZjRhMmQ2YTQ1MWQ0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Barry" width="150" height="225"></a>
    <p><strong>Barry (2018)</strong></p>
    <p>tv · action · comedy · crime</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0407362/"><img src="https://m.media-amazon.com/images/M/MV5BNmMzYzdmNWMtM2ZmMi00Y2E2LWI5ZTMtYWJlNmJiMDgyYWRiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Battlestar Galactica" width="150" height="225"></a>
    <p><strong>Battlestar Galactica (2004)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1349938/"><img src="https://m.media-amazon.com/images/M/MV5BMTc0NjEzMTAyM15BMl5BanBnXkFtZTcwMTQ3NTM0Mw@@._V1_FMjpg_UY1024_.jpg" alt="Being Human (UK)" width="150" height="225"></a>
    <p><strong>Being Human (UK) (2008)</strong></p>
    <p>tv · comedy · drama · fantasy</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0997147/"><img src="https://m.media-amazon.com/images/M/MV5BMTgyMjQ5MTc3OV5BMl5BanBnXkFtZTcwNjUwMzY0Mg@@._V1_FMjpg_UY1024_.jpg" alt="Big Man Japan" width="150" height="225"></a>
    <p><strong>Big Man Japan (2007)</strong></p>
    <p>action · comedy · sci-fi</p>
    <p>Japan · Hitoshi Matsumoto</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3469910/"><img src="https://m.media-amazon.com/images/M/MV5BZWUyYTMwZGQtNmJlMy00NThhLTlmYWUtNjJmMWQ2Y2M2OTMwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Black Coal, Thin Ice" width="150" height="225"></a>
    <p><strong>Black Coal, Thin Ice (2014)</strong></p>
    <p>crime · drama · mystery</p>
    <p>China · Yi'nan Diao</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2375692/"><img src="https://m.media-amazon.com/images/M/MV5BMjA5NjAyOTk5MV5BMl5BanBnXkFtZTgwNTI4OTMyMDI@._V1_FMjpg_UY1024_.jpg" alt="Black Sails" width="150" height="225"></a>
    <p><strong>Black Sails (2014)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>South Africa</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0084988/"><img src="https://m.media-amazon.com/images/M/MV5BOWY2OGZjZDYtYjQwNC00NjEzLTg2YzEtMGJiOTdlYjAyZmMwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Blackadder" width="150" height="225"></a>
    <p><strong>Blackadder (1983)</strong></p>
    <p>tv · comedy</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt21867434/"><img src="https://m.media-amazon.com/images/M/MV5BYzEzZDM5NWEtODgzNC00MTE5LWFhZTYtMGE2YTkxMzFiZWIyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="BlackBerry" width="150" height="225"></a>
    <p><strong>BlackBerry (2023)</strong></p>
    <p>biography · comedy · drama</p>
    <p>Canada · Matt Johnson</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0083658/"><img src="https://m.media-amazon.com/images/M/MV5BOWQ4YTBmNTQtMDYxMC00NGFjLTkwOGQtNzdhNmY1Nzc1MzUxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Blade Runner" width="150" height="225"></a>
    <p><strong>Blade Runner (1982)</strong></p>
    <p>action · drama · sci-fi</p>
    <p>United States · Ridley Scott</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1856101/"><img src="https://m.media-amazon.com/images/M/MV5BNzA1Njg4NzYxOV5BMl5BanBnXkFtZTgwODk5NjU3MzI@._V1_FMjpg_UY1024_.jpg" alt="Blade Runner 2049" width="150" height="225"></a>
    <p><strong>Blade Runner 2049 (2017)</strong></p>
    <p>action · drama · mystery</p>
    <p>United States · Denis Villeneuve</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt9359796/"><img src="https://m.media-amazon.com/images/M/MV5BZDYzYWI2NzYtOWNkMS00YzA4LThlNWEtNmMxNDIwYmVmYTgzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Blade Runner: Black Lotus" width="150" height="225"></a>
    <p><strong>Blade Runner: Black Lotus (2021)</strong></p>
    <p>tv · animation · action · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt9772374/"><img src="https://m.media-amazon.com/images/M/MV5BZThkZDk0N2YtMjJjMC00MTU2LThkZDktZWQ3MTgxNGI2YTQ4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Bloody Hell" width="150" height="225"></a>
    <p><strong>Bloody Hell (2020)</strong></p>
    <p>comedy · horror · mystery</p>
    <p>Australia · Alister Grierson</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0979432/"><img src="https://m.media-amazon.com/images/M/MV5BN2MzODhjYTEtZTA2ZS00ZTRjLTlkZDYtNTBkNTdhNWJlMTYwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Boardwalk Empire" width="150" height="225"></a>
    <p><strong>Boardwalk Empire (2010)</strong></p>
    <p>tv · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3398228/"><img src="https://m.media-amazon.com/images/M/MV5BZmMwMDlkNTEtMmQzZS00ODQ0LWJlZmItOTgwYWMwZGM4MzFiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Bojack Horseman" width="150" height="225"></a>
    <p><strong>Bojack Horseman (2014)</strong></p>
    <p>tv · animation · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11343600/"><img src="https://m.media-amazon.com/images/M/MV5BNDZjNTJmMmEtZjYwOS00MTYzLTgwYTYtYWJiMDkxNDMzMDAyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Brand New Cherry Flavor" width="150" height="225"></a>
    <p><strong>Brand New Cherry Flavor (2021)</strong></p>
    <p>tv · drama · horror · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0088846/"><img src="https://m.media-amazon.com/images/M/MV5BNjI1MTAzNmYtYzQ3Zi00ZWE0LWJiZmQtY2UwZWU3ZTE4OGQ3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Brazil" width="150" height="225"></a>
    <p><strong>Brazil (1985)</strong></p>
    <p>drama · sci-fi · thriller</p>
    <p>United Kingdom · Terry Gilliam</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2249364/"><img src="https://m.media-amazon.com/images/M/MV5BNDU4ODc2MWMtNDBhMC00N2M3LWI5YzAtMGFjN2U1ZjBlOGU4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Broadchurch" width="150" height="225"></a>
    <p><strong>Broadchurch (2013)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0810788/"><img src="https://m.media-amazon.com/images/M/MV5BMTczMzg4NjU1Ml5BMl5BanBnXkFtZTcwODc4NzY5Nw@@._V1_FMjpg_UY1024_.jpg" alt="Burn Notice" width="150" height="225"></a>
    <p><strong>Burn Notice (2007)</strong></p>
    <p>tv · action · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7282468/"><img src="https://m.media-amazon.com/images/M/MV5BZWU3YzgzMTgtOTIwYi00MmNkLWExYWEtZTEyOTAzYzEwM2Q2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Burning" width="150" height="225"></a>
    <p><strong>Burning (2018)</strong></p>
    <p>drama · mystery · thriller</p>
    <p>South Korea · Lee Chang-dong</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0319969/"><img src="https://m.media-amazon.com/images/M/MV5BMjNkYTAwMjQtNjZlNC00MGZiLWE1YTYtNmNjMjE5ODAzY2U2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Carnivale" width="150" height="225"></a>
    <p><strong>Carnivale (2003)</strong></p>
    <p>tv · drama · fantasy · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6517102/"><img src="https://m.media-amazon.com/images/M/MV5BMjAzMjU2MjYzMl5BMl5BanBnXkFtZTgwNTQ4Nzk1NjM@._V1_FMjpg_UY1024_.jpg" alt="Castlevania" width="150" height="225"></a>
    <p><strong>Castlevania (2017)</strong></p>
    <p>tv · animation · action · adventure</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0109424/"><img src="https://m.media-amazon.com/images/M/MV5BNDQ4ZmYxODctZDVlZC00OTcxLWJjOGItZjRlMzk4MDA1Yjg1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Chungking Express" width="150" height="225"></a>
    <p><strong>Chungking Express (1994)</strong></p>
    <p>comedy · crime · drama</p>
    <p>Hong Kong · Wong Kar-Wai</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt24478470/"><img src="https://m.media-amazon.com/images/M/MV5BNzI5ZWZjN2UtNjRiNS00MzViLTgzNjMtZWEyZTlmNWJhYjJkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="City Hunter" width="150" height="225"></a>
    <p><strong>City Hunter (2024)</strong></p>
    <p>action · comedy · crime</p>
    <p>Japan · Yûichi Satô</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0317248/"><img src="https://m.media-amazon.com/images/M/MV5BYjY4NGI5OTUtY2ZlZS00Zjk4LTk5N2MtN2JmYWVjNGNmMGRlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="City of God" width="150" height="225"></a>
    <p><strong>City of God (2002)</strong></p>
    <p>crime · drama</p>
    <p>Brazil · Kátia Lund</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt32828123/"><img src="https://m.media-amazon.com/images/M/MV5BYTE5ZjM5MWQtMjU0MS00YzEzLTg5YTQtYmVjZWQ1Mzc0NTc3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Cloud" width="150" height="225"></a>
    <p><strong>Cloud (2024)</strong></p>
    <p>action · crime · drama</p>
    <p>Japan · Kiyoshi Kurosawa</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1632547/"><img src="https://m.media-amazon.com/images/M/MV5BOTA5YzJiODUtZWU3OS00YWE5LTk3YTQtNDVlMWIxOTNiOTM4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Cold Fish" width="150" height="225"></a>
    <p><strong>Cold Fish (2010)</strong></p>
    <p>crime · drama · horror</p>
    <p>Japan · Sion Sono</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4209256/"><img src="https://m.media-amazon.com/images/M/MV5BMTg1MzAzODQ5OF5BMl5BanBnXkFtZTgwMDA1MDI0NTM@._V1_FMjpg_UY1024_.jpg" alt="Colony" width="150" height="225"></a>
    <p><strong>Colony (2016)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4643084/"><img src="https://m.media-amazon.com/images/M/MV5BODg5NDU5NjM1NV5BMl5BanBnXkFtZTgwOTE0NjY1NjM@._V1_FMjpg_UY1024_.jpg" alt="Counterpart" width="150" height="225"></a>
    <p><strong>Counterpart (2017)</strong></p>
    <p>tv · drama · sci-fi · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0190332/"><img src="https://m.media-amazon.com/images/M/MV5BMzRmMTU2OWEtZjI0Ni00MGRhLThjOTItZTJiNmM4MDk0ZWU2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Crouching Tiger Hidden Dragon" width="150" height="225"></a>
    <p><strong>Crouching Tiger Hidden Dragon (2000)</strong></p>
    <p>action · adventure · drama</p>
    <p>Taiwan · Ang Lee</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0123948/"><img src="https://m.media-amazon.com/images/M/MV5BNDcyMTRiMWQtMjA4MS00OTk3LTkxYmMtMjI4ODAyNGVlZTU0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Cure" width="150" height="225"></a>
    <p><strong>Cure (1997)</strong></p>
    <p>crime · horror · mystery</p>
    <p>Japan · Kiyoshi Kurosawa</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt12590266/"><img src="https://m.media-amazon.com/images/M/MV5BM2JkMzM2ZmYtNWU4MS00MjZhLWFhZWUtYWFjYTJkN2RhZDliXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Cyberpunk: Edgerunners" width="150" height="225"></a>
    <p><strong>Cyberpunk: Edgerunners (2022)</strong></p>
    <p>tv · animation · action · adventure</p>
    <p>Japan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2094262/"><img src="https://m.media-amazon.com/images/M/MV5BYzc5ODJmOTItYzgwOC00YTM4LTk5YmQtYjhkMWU3ZDdlMzg5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="DaVinci's Demons" width="150" height="225"></a>
    <p><strong>DaVinci's Demons (2013)</strong></p>
    <p>tv · adventure · biography · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0101258/"><img src="https://m.media-amazon.com/images/M/MV5BMTE0OGQxNmYtMTU0Mi00ZTc1LTk5OGUtZWY2NDIzNTQ0YjgyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Days of Being Wild" width="150" height="225"></a>
    <p><strong>Days of Being Wild (1990)</strong></p>
    <p>crime · drama · romance</p>
    <p>Hong Kong · Wong Kar-Wai</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6616260/"><img src="https://m.media-amazon.com/images/M/MV5BYzlkMjFmYzctNzc2MS00N2Q5LTllYzItODBmOTBkMTk3YzQyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Deadwind" width="150" height="225"></a>
    <p><strong>Deadwind (2018)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>Finland</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0348914/"><img src="https://m.media-amazon.com/images/M/MV5BODFiMjBkNDMtN2I1NS00YWM3LTliNWEtMTg0NjVlN2I5YTNlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Deadwood" width="150" height="225"></a>
    <p><strong>Deadwood (2004)</strong></p>
    <p>tv · crime · drama · history</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt20863760/"><img src="https://m.media-amazon.com/images/M/MV5BYjkzNWZjYzktYjAwNS00YTVkLWIzNjUtNGM5MWRlMTUxMWY2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Dear Child" width="150" height="225"></a>
    <p><strong>Dear Child (2023)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>Germany</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt12477480/"><img src="https://m.media-amazon.com/images/M/MV5BN2NhZjcxYjItNDhlOC00Y2U2LWE4NDktMDJhNTQ1NzNjMmNmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Decision to Leave" width="150" height="225"></a>
    <p><strong>Decision to Leave (2022)</strong></p>
    <p>crime · drama · mystery</p>
    <p>South Korea · Park Chan-wook</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt35111035/"><img src="https://m.media-amazon.com/images/M/MV5BYzg3ZGY5MmUtNGViOC00ZjRkLTg4ZmYtMDI1NWZiZDQ0Zjc2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Demon City" width="150" height="225"></a>
    <p><strong>Demon City (2024)</strong></p>
    <p>action · adventure · crime</p>
    <p>Japan · Seiji Tanaka</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7120662/"><img src="https://m.media-amazon.com/images/M/MV5BZjVhN2FhMzctZDlkMS00NTY3LWEyZmEtOTE5NDlkN2JkNDE3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Derry Girls" width="150" height="225"></a>
    <p><strong>Derry Girls (2018)</strong></p>
    <p>tv · comedy</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7137380/"><img src="https://m.media-amazon.com/images/M/MV5BODI4MTI2OTAyMV5BMl5BanBnXkFtZTgwNjY3NDY1NjM@._V1_FMjpg_UY1024_.jpg" alt="Destroyer" width="150" height="225"></a>
    <p><strong>Destroyer (2018)</strong></p>
    <p>action · crime · drama</p>
    <p>United States · Karyn Kusama</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8134186/"><img src="https://m.media-amazon.com/images/M/MV5BMDBmMGFiNGYtNDRjMS00NzJlLWE5YjctOTkzNDM0ODM5YTRlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Devs" width="150" height="225"></a>
    <p><strong>Devs (2020)</strong></p>
    <p>tv · drama · mystery · sci-fi</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4047038/"><img src="https://m.media-amazon.com/images/M/MV5BMDBlZTEzMGMtNjkwNS00MzlhLTkxN2MtYTM5OGQwZWNmYWRhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Dirk Gently's Holistic Detective Agency" width="150" height="225"></a>
    <p><strong>Dirk Gently's Holistic Detective Agency (2016)</strong></p>
    <p>tv · action · adventure · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1136608/"><img src="https://m.media-amazon.com/images/M/MV5BMTM4OTI1OTM5NF5BMl5BanBnXkFtZTcwMzk5MTU1Mg@@._V1_FMjpg_UY1024_.jpg" alt="District 9" width="150" height="225"></a>
    <p><strong>District 9 (2009)</strong></p>
    <p>action · sci-fi · thriller</p>
    <p>South Africa · Neill Blomkamp</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8416494/"><img src="https://m.media-amazon.com/images/M/MV5BYjY1MDExMzctMzQ4Mi00NmU1LWIyMWItZTkzZDk2YmY2NGI2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Doom Patrol" width="150" height="225"></a>
    <p><strong>Doom Patrol (2019)</strong></p>
    <p>tv · action · adventure · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1606375/"><img src="https://m.media-amazon.com/images/M/MV5BYzgzNDVjNjgtNzQxZS00N2E2LTkxNjgtNjIzMGZiM2UwYWQ2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Downton Abbey" width="150" height="225"></a>
    <p><strong>Downton Abbey (2010)</strong></p>
    <p>tv · drama · romance</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1343727/"><img src="https://m.media-amazon.com/images/M/MV5BODkyNDQzMzUzOF5BMl5BanBnXkFtZTcwODYyMDEyOA@@._V1_FMjpg_UY1024_.jpg" alt="Dredd" width="150" height="225"></a>
    <p><strong>Dredd (2012)</strong></p>
    <p>action · crime · sci-fi</p>
    <p>United Kingdom · Pete Travis</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6867482/"><img src="https://m.media-amazon.com/images/M/MV5BNWI1NmY1NzMtMjE1MS00Njg3LWFiYmEtY2E3ZWNhNDAyZjVkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Drops of God" width="150" height="225"></a>
    <p><strong>Drops of God (2023)</strong></p>
    <p>tv · drama</p>
    <p>France</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1160419/"><img src="https://m.media-amazon.com/images/M/MV5BNWIyNmU5MGYtZDZmNi00ZjAwLWJlYjgtZTc0ZGIxMDE4ZGYwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Dune" width="150" height="225"></a>
    <p><strong>Dune (2021)</strong></p>
    <p>action · adventure · drama</p>
    <p>United States · Denis Villeneuve</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0105382/"><img src="https://m.media-amazon.com/images/M/MV5BZTUzYmUyODktMmFkYS00YjY0LWJlOTctM2Q2NjE4NGQ2OTQ2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Dust of Angels" width="150" height="225"></a>
    <p><strong>Dust of Angels (1992)</strong></p>
    <p>action · crime · drama</p>
    <p>Taiwan · Hsiao-Ming Hsu</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1631867/"><img src="https://m.media-amazon.com/images/M/MV5BMTc5OTk4MTM3M15BMl5BanBnXkFtZTgwODcxNjg3MDE@._V1_FMjpg_UY1024_.jpg" alt="Edge of Tomorrow" width="150" height="225"></a>
    <p><strong>Edge of Tomorrow (2014)</strong></p>
    <p>action · adventure · sci-fi</p>
    <p>United States · Doug Liman</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3823098/"><img src="https://m.media-amazon.com/images/M/MV5BYjM5ZDg4ZjItNWJhYy00MTIyLWI1NWQtNTFkY2QzYTU3ZTg5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Edie" width="150" height="225"></a>
    <p><strong>Edie (2017)</strong></p>
    <p>adventure · drama</p>
    <p>United Kingdom · Simon Hunter</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1535108/"><img src="https://m.media-amazon.com/images/M/MV5BNDc2NjU0MTcwNV5BMl5BanBnXkFtZTcwMjg4MDg2OQ@@._V1_FMjpg_UY1024_.jpg" alt="Elysium" width="150" height="225"></a>
    <p><strong>Elysium (2013)</strong></p>
    <p>action · drama · sci-fi</p>
    <p>United States · Neill Blomkamp</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2953050/"><img src="https://m.media-amazon.com/images/M/MV5BNGEyNzk2M2MtNjBhZS00MzYwLWI0Y2YtYjc5ZWE2MjM0YWE5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Encanto" width="150" height="225"></a>
    <p><strong>Encanto (2021)</strong></p>
    <p>animation · comedy · family</p>
    <p>United States · Jared Bush</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2701582/"><img src="https://m.media-amazon.com/images/M/MV5BOTdhYzQyMzItNTk0YS00MWNmLWFlMDctZGU0NGEzYTVlZTgzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Endeavour" width="150" height="225"></a>
    <p><strong>Endeavour (2012)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0238380/"><img src="https://m.media-amazon.com/images/M/MV5BMTkzMzA1OTI3N15BMl5BanBnXkFtZTYwMzUyMDg5._V1_FMjpg_UY1024_.jpg" alt="Equilibrium" width="150" height="225"></a>
    <p><strong>Equilibrium (2002)</strong></p>
    <p>action · drama · sci-fi</p>
    <p>United States · Kurt Wimmer</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8772296/"><img src="https://m.media-amazon.com/images/M/MV5BZjVlN2M2N2MtOWViZC00MzIxLTlhZWEtMTIwNDIwMzE3ZWJiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Euphoria" width="150" height="225"></a>
    <p><strong>Euphoria (2019)</strong></p>
    <p>tv · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt9541602/"><img src="https://m.media-amazon.com/images/M/MV5BNjkwYmRiY2EtYTAwZi00ZTA1LTk4OTgtNzlhYTVlM2RmOWExXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Extreme Job" width="150" height="225"></a>
    <p><strong>Extreme Job (2019)</strong></p>
    <p>action · comedy · crime</p>
    <p>South Korea · Lee Byeong-heon</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt16304446/"><img src="https://m.media-amazon.com/images/M/MV5BNjkxYjNkMGMtOTkyNC00YTRhLWIyZDctNmFmZjYxNjEwMDdjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Fair Play" width="150" height="225"></a>
    <p><strong>Fair Play (2023)</strong></p>
    <p>drama · thriller</p>
    <p>United States · Chloe Domont</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt21027780/"><img src="https://m.media-amazon.com/images/M/MV5BZjNkY2M5NWMtZjJiMy00YTZmLWI2NWEtZTI0MjhmNDc4ZThmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Fallen Leaves" width="150" height="225"></a>
    <p><strong>Fallen Leaves (2023)</strong></p>
    <p>comedy · drama · romance</p>
    <p>Finland · Aki Kaurismäki</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt12637874/"><img src="https://m.media-amazon.com/images/M/MV5BYzE1MTZmY2ItMTgxNi00OGU5LTk4NTItMmY2ODFhYzhjZjRkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Fallout" width="150" height="225"></a>
    <p><strong>Fallout (2024)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2802850/"><img src="https://m.media-amazon.com/images/M/MV5BMjMzMTIzMTUwN15BMl5BanBnXkFtZTgwNjE0NTg0MTE@._V1_FMjpg_UY1024_.jpg" alt="Fargo" width="150" height="225"></a>
    <p><strong>Fargo (2014)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0303461/"><img src="https://m.media-amazon.com/images/M/MV5BYzYyZWYzNzUtOWQ4Yi00Y2Q4LWJjZjgtZTllNjg2ZGM0MTcyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Firefly" width="150" height="225"></a>
    <p><strong>Firefly (2002)</strong></p>
    <p>tv · adventure · drama · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0804484/"><img src="https://m.media-amazon.com/images/M/MV5BMzY5OGJhYzItNGQyOS00NmU3LWFhOWMtNGY1OGVlNTlmYjc0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Foundation" width="150" height="225"></a>
    <p><strong>Foundation (2021)</strong></p>
    <p>tv · drama · sci-fi</p>
    <p>Ireland</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0310455/"><img src="https://m.media-amazon.com/images/M/MV5BNjExMDJlZWUtNzQxMS00ZGI4LTg1N2QtMmU3NTkyN2Q4NzYyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Foyle's War" width="150" height="225"></a>
    <p><strong>Foyle's War (2002)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1119644/"><img src="https://m.media-amazon.com/images/M/MV5BMWVlMmE1MmEtNjhjMC00MDdmLWIzZGMtNjc1YTZmNDc2MWExXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Fringe" width="150" height="225"></a>
    <p><strong>Fringe (2008)</strong></p>
    <p>tv · drama · mystery · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt9813792/"><img src="https://m.media-amazon.com/images/M/MV5BYzM5ZWMxOGEtZjEyMC00YjQ0LThiYjEtZjVkZGEzN2NlOGEwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="From" width="150" height="225"></a>
    <p><strong>From (2022)</strong></p>
    <p>tv · drama · horror · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0451829/"><img src="https://m.media-amazon.com/images/M/MV5BMzFlMTRlODUtMmQxZC00M2JiLTk2MGMtMmZjNTdiNmE0MTI0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Funky Forest" width="150" height="225"></a>
    <p><strong>Funky Forest (2005)</strong></p>
    <p>comedy · fantasy</p>
    <p>Japan · Katsuhito Ishii</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4975856/"><img src="https://m.media-amazon.com/images/M/MV5BODExYjljNzEtMDc3ZC00MzAwLTg3MzMtN2M4NWNkMmE3N2U5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Future Man" width="150" height="225"></a>
    <p><strong>Future Man (2017)</strong></p>
    <p>tv · action · adventure · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13159924/"><img src="https://m.media-amazon.com/images/M/MV5BYWU4YTljYmItYjczNS00MWY0LWI3NjctZjJhYjU3NWNmNWZhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Gen V" width="150" height="225"></a>
    <p><strong>Gen V (2023)</strong></p>
    <p>tv · action · adventure · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0113568/"><img src="https://m.media-amazon.com/images/M/MV5BNzljMjA3MTQtMjM1OS00OGJjLWJiYzctZDRiMTk1NWI5YzQ5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ghost in the Shell" width="150" height="225"></a>
    <p><strong>Ghost in the Shell (1995)</strong></p>
    <p>animation · action · crime</p>
    <p>Japan · Mamoru Oshii</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4513678/"><img src="https://m.media-amazon.com/images/M/MV5BMDJmZmM2NmQtMzhlYi00MGNkLTlhMWUtYjM1MmFlMTA1YTliXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ghostbusters Afterlife" width="150" height="225"></a>
    <p><strong>Ghostbusters Afterlife (2021)</strong></p>
    <p>adventure · comedy · fantasy</p>
    <p>United States · Jason Reitman</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt23289160/"><img src="https://m.media-amazon.com/images/M/MV5BMjc5MjllMGUtMDIwMS00ZDVkLWEzODQtM2NlMTMwMTZhNThmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Godzilla Minus One" width="150" height="225"></a>
    <p><strong>Godzilla Minus One (2023)</strong></p>
    <p>action · adventure · drama</p>
    <p>Japan · Takashi Yamazaki</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1193460/"><img src="https://m.media-amazon.com/images/M/MV5BNzgzNjgyMjUxOF5BMl5BanBnXkFtZTgwMzI1NzE1MjE@._V1_FMjpg_UY1024_.jpg" alt="Going By The Book" width="150" height="225"></a>
    <p><strong>Going By The Book (2007)</strong></p>
    <p>action · comedy</p>
    <p>South Korea · Hee-chan Ra</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2049116/"><img src="https://m.media-amazon.com/images/M/MV5BYWUwYmYwNmItMTRiMy00ZDBhLWE3OTUtMDdmYjA1Mzc2M2IwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Gomorrah" width="150" height="225"></a>
    <p><strong>Gomorrah (2014)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>Italy</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0295368/"><img src="https://m.media-amazon.com/images/M/MV5BMTM3NjY5OTM4N15BMl5BanBnXkFtZTcwNjk3NzYyMQ@@._V1_FMjpg_UY1024_.jpg" alt="Guns & Talks" width="150" height="225"></a>
    <p><strong>Guns & Talks (2001)</strong></p>
    <p>action · drama · comedy</p>
    <p>South Korea · Jang Jin</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2543312/"><img src="https://m.media-amazon.com/images/M/MV5BZTRkNzQwMjAtMzg5Mi00ZDQwLThmYWYtNmQwMDFiYmIxOWRhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Halt and Catch Fire" width="150" height="225"></a>
    <p><strong>Halt and Catch Fire (2014)</strong></p>
    <p>tv · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5834204/"><img src="https://m.media-amazon.com/images/M/MV5BMWIxMzk4NmItZmM1YS00ODUyLWFlNjgtZDQ4MzljZTZmZDQ5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Handmaid's Tale" width="150" height="225"></a>
    <p><strong>Handmaid's Tale (2017)</strong></p>
    <p>tv · drama · sci-fi · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6932244/"><img src="https://m.media-amazon.com/images/M/MV5BNzMyNWFjNjYtYzYwNi00ZWY5LWFjNjQtZDdhYWQyMTFmZjUzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Hanna" width="150" height="225"></a>
    <p><strong>Hanna (2019)</strong></p>
    <p>tv · action · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2243973/"><img src="https://m.media-amazon.com/images/M/MV5BNjBmYjdiMzItNTEwNi00YTI2LTg4YjctOTRjNDYxNTUxNGQ1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Hannibal" width="150" height="225"></a>
    <p><strong>Hannibal (2013)</strong></p>
    <p>tv · crime · drama · horror</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11052434/"><img src="https://m.media-amazon.com/images/M/MV5BYTc1YjA5ODctODBjZi00MzkzLThhZDUtZGY1MzQ2MDVhNmQ5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Hausen" width="150" height="225"></a>
    <p><strong>Hausen (2020)</strong></p>
    <p>tv · drama · horror · mystery</p>
    <p>Germany</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3280150/"><img src="https://m.media-amazon.com/images/M/MV5BMTU4NTU0NDc5OV5BMl5BanBnXkFtZTgwMjc0ODk1NTE@._V1_FMjpg_UY1024_.jpg" alt="Heavy Water War (Kampen om tungtvannet)" width="150" height="225"></a>
    <p><strong>Heavy Water War (Kampen om tungtvannet) (2015)</strong></p>
    <p>tv · drama · history · war</p>
    <p>Norway</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0813715/"><img src="https://m.media-amazon.com/images/M/MV5BMjI3ODU0OTQ1MV5BMl5BanBnXkFtZTgwNzI0MTQ2MzE@._V1_FMjpg_UY1024_.jpg" alt="Heroes" width="150" height="225"></a>
    <p><strong>Heroes (2006)</strong></p>
    <p>tv · crime · drama · fantasy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt10220588/"><img src="https://m.media-amazon.com/images/M/MV5BZmFmYTU0YTItZTk4ZS00ZWMzLThmOTgtOGIyOTBkY2QwZjc0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Hotel Del Luna" width="150" height="225"></a>
    <p><strong>Hotel Del Luna (2019)</strong></p>
    <p>tv · action · comedy · drama</p>
    <p>South Korea</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0338564/"><img src="https://m.media-amazon.com/images/M/MV5BNWZjNDdiOWUtZDI0Ni00YmY1LTk4MmYtM2Y0YTY3ZTc3OWFiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Infernal Affairs" width="150" height="225"></a>
    <p><strong>Infernal Affairs (2002)</strong></p>
    <p>crime · drama · mystery</p>
    <p>Hong Kong · Wai Keung Lau</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt10399622/"><img src="https://m.media-amazon.com/images/M/MV5BMzA3Y2M0MGYtMzRmMS00MmNkLTg5MTUtNjc0YjBmZjc0Y2IwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Inside the Yellow Cocoon Shell" width="150" height="225"></a>
    <p><strong>Inside the Yellow Cocoon Shell (2023)</strong></p>
    <p>drama</p>
    <p>Vietnam · Thien An Pham</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0092379/"><img src="https://m.media-amazon.com/images/M/MV5BNGQ5OTMzNDQtMGNlMy00OWI3LTkwNjQtNjM3ZTA0NmZkZGUyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Inspector Morse" width="150" height="225"></a>
    <p><strong>Inspector Morse (1987)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1220719/"><img src="https://m.media-amazon.com/images/M/MV5BZmJjZDE0MmYtNzgwYy00NTg2LWE0NDYtNzA0YTA4MjA0NmYxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ip Man" width="150" height="225"></a>
    <p><strong>Ip Man (2008)</strong></p>
    <p>action · biography · drama</p>
    <p>Hong Kong · Wilson Yip</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0113481/"><img src="https://m.media-amazon.com/images/M/MV5BZGFjNWVhMzktZjJkZi00NWI3LWJiY2MtMTM1MGMxYzI0NmFjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Johnny Mnemonic" width="150" height="225"></a>
    <p><strong>Johnny Mnemonic (1995)</strong></p>
    <p>action · drama · sci-fi</p>
    <p>Canada · Robert Longo</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0260991/"><img src="https://m.media-amazon.com/images/M/MV5BMTI1NDA4NTMyN15BMl5BanBnXkFtZTYwNTA2ODc5._V1_FMjpg_UY1024_.jpg" alt="JSA: Joint Security Area" width="150" height="225"></a>
    <p><strong>JSA: Joint Security Area (2000)</strong></p>
    <p>action · drama · thriller</p>
    <p>South Korea · Park Chan-wook</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt22074164/"><img src="https://m.media-amazon.com/images/M/MV5BMzNjY2QyMDItMDFiZC00NmZjLTlhMmQtNzdlYzU2MWMzYTU2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Jury Duty" width="150" height="225"></a>
    <p><strong>Jury Duty (2023)</strong></p>
    <p>tv · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1489428/"><img src="https://m.media-amazon.com/images/M/MV5BZGIzNmFlMzgtYWY0MC00NjFmLWJhMGItZTM2YjVlZjY3ZjBlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Justified" width="150" height="225"></a>
    <p><strong>Justified (2010)</strong></p>
    <p>tv · action · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4613272/"><img src="https://m.media-amazon.com/images/M/MV5BNGIxN2Q1NzgtNDU5YS00MzIwLWE1ZGEtOTRlZDdkNjU5Y2Q3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Kaili Blues" width="150" height="225"></a>
    <p><strong>Kaili Blues (2015)</strong></p>
    <p>drama · mystery</p>
    <p>China · Bi Gan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11398870/"><img src="https://m.media-amazon.com/images/M/MV5BYjU0NWQ4NjYtOGQ3OS00OGU5LWE3YmEtOTBkM2Q5NGQzY2ZjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Kalifat" width="150" height="225"></a>
    <p><strong>Kalifat (2020)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>Sweden</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11102190/"><img src="https://m.media-amazon.com/images/M/MV5BMGNjNzM0YzMtODc2Yi00NDM3LWE3YjAtN2E5OTk4ZTlhYzQxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Katla" width="150" height="225"></a>
    <p><strong>Katla (2021)</strong></p>
    <p>tv · drama · fantasy · mystery</p>
    <p>Iceland</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5537002/"><img src="https://m.media-amazon.com/images/M/MV5BNTRhODE3NTYtOGEwOC00OGQ4LTgzYjItNDdhNGU4YTdmODcyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Killers of the Flower Moon" width="150" height="225"></a>
    <p><strong>Killers of the Flower Moon (2023)</strong></p>
    <p>crime · drama · history</p>
    <p>United States · Martin Scorsese</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0478024/"><img src="https://m.media-amazon.com/images/M/MV5BMTk5NTU2NzAyNV5BMl5BanBnXkFtZTgwNjAyOTEzMjE@._V1_FMjpg_UY1024_.jpg" alt="Killzone (SPL)" width="150" height="225"></a>
    <p><strong>Killzone (SPL) (2005)</strong></p>
    <p>action · crime · thriller</p>
    <p>Hong Kong · Wilson Yip</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6611916/"><img src="https://m.media-amazon.com/images/M/MV5BYWQyMDQyYzItYWFhNi00YmViLTkwZTctY2M2NjEyNDJmNGQ5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Kingdom" width="150" height="225"></a>
    <p><strong>Kingdom (2019)</strong></p>
    <p>tv · action · drama · horror</p>
    <p>South Korea</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0848538/"><img src="https://m.media-amazon.com/images/M/MV5BMTU0ODg3Mzc1Ml5BMl5BanBnXkFtZTgwMzQ3NjI2MDE@._V1_FMjpg_UY1024_.jpg" alt="Kung Fu Dunk" width="150" height="225"></a>
    <p><strong>Kung Fu Dunk (2008)</strong></p>
    <p>action · comedy · sport</p>
    <p>China · Yen-Ping Chu</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0373074/"><img src="https://m.media-amazon.com/images/M/MV5BNGU2OWVlM2ItZGZlOC00Yzk2LWE1NzEtMDYwMzE4YTE5MzQ2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Kung Fu Hustle" width="150" height="225"></a>
    <p><strong>Kung Fu Hustle (2004)</strong></p>
    <p>action · comedy · fantasy</p>
    <p>Hong Kong · Stephen Chow</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0113247/"><img src="https://m.media-amazon.com/images/M/MV5BYmU2OWQwNGYtNDA1ZS00ZGJjLWFhMDAtZGI4MGRhYzY0ZDY4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="La Haine" width="150" height="225"></a>
    <p><strong>La Haine (1995)</strong></p>
    <p>crime · drama</p>
    <p>France · Mathieu Kassovitz</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4063800/"><img src="https://m.media-amazon.com/images/M/MV5BZDk2NDA3MzktNTQyOS00YjY0LWI2ZDgtMWI2MTQ5N2Q1Njg0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Le Bureau des Legendes" width="150" height="225"></a>
    <p><strong>Le Bureau des Legendes (2015)</strong></p>
    <p>tv · drama · thriller</p>
    <p>France</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt27722618/"><img src="https://m.media-amazon.com/images/M/MV5BYTE2OWQxZWMtNjdjNC00NGNhLWE5OTUtZDA2ZjhhMjk0MmRmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Left Handed Girl" width="150" height="225"></a>
    <p><strong>Left Handed Girl (2024)</strong></p>
    <p>drama</p>
    <p>Taiwan · Shih-Ching Tsou</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5114356/"><img src="https://m.media-amazon.com/images/M/MV5BYmM4NDNlYzctNDgxYi00OWU5LTg4NTctOWE2NzMyMjgxY2QwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Legion" width="150" height="225"></a>
    <p><strong>Legion (2017)</strong></p>
    <p>tv · action · sci-fi · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2521668/"><img src="https://m.media-amazon.com/images/M/MV5BMjEwOTExNDY5MV5BMl5BanBnXkFtZTgwMzMzOTU5MTE@._V1_FMjpg_UY1024_.jpg" alt="Les Revenants" width="150" height="225"></a>
    <p><strong>Les Revenants (2012)</strong></p>
    <p>tv · drama · fantasy · horror</p>
    <p>France</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8089592/"><img src="https://m.media-amazon.com/images/M/MV5BZWQ2YzA5ZDgtNGM1Yi00OGVjLWFmMDAtNjMwODc1MDgyMTg3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Little Fires Everywhere" width="150" height="225"></a>
    <p><strong>Little Fires Everywhere (2020)</strong></p>
    <p>tv · drama · mystery · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt26314963/"><img src="https://m.media-amazon.com/images/M/MV5BMzcxZDQ2OTctMjFhYi00MGZlLWJlZTMtNzM4OTI4MTM2Zjk4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Locked In" width="150" height="225"></a>
    <p><strong>Locked In (2023)</strong></p>
    <p>mystery · thriller</p>
    <p>United States · David C. Snyder</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6128254/"><img src="https://m.media-amazon.com/images/M/MV5BMjRmMzRlNWQtOGRlMS00YzliLTg1MDItY2M4MjNlMWRiMGE0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Lodge 49" width="150" height="225"></a>
    <p><strong>Lodge 49 (2018)</strong></p>
    <p>tv · comedy · drama · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5439796/"><img src="https://m.media-amazon.com/images/M/MV5BMTYyODg0NDU1OV5BMl5BanBnXkFtZTgwNjcxMzU0MjI@._V1_FMjpg_UY1024_.jpg" alt="Logan Lucky" width="150" height="225"></a>
    <p><strong>Logan Lucky (2017)</strong></p>
    <p>action · comedy · crime</p>
    <p>United States · Steven Soderbergh</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt9140554/"><img src="https://m.media-amazon.com/images/M/MV5BYzA2YjM2ZWQtYTZhMS00OTI3LTlhYzQtZjBiZWZkMDdlNjA5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Loki" width="150" height="225"></a>
    <p><strong>Loki (2021)</strong></p>
    <p>tv · action · adventure · fantasy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8185182/"><img src="https://m.media-amazon.com/images/M/MV5BNTBhODJiMDgtYjEzMy00MTU0LTlmYmEtMDRlYTY4NmM5ZjY1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Long Day's Journey Into Night" width="150" height="225"></a>
    <p><strong>Long Day's Journey Into Night (2018)</strong></p>
    <p>drama · mystery · romance</p>
    <p>China · Bi Gan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1276104/"><img src="https://m.media-amazon.com/images/M/MV5BMTg5NTA3NTg4NF5BMl5BanBnXkFtZTcwNTA0NDYzOA@@._V1_FMjpg_UY1024_.jpg" alt="Looper" width="150" height="225"></a>
    <p><strong>Looper (2012)</strong></p>
    <p>action · drama · sci-fi</p>
    <p>United States · Rian Johnson</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2531336/"><img src="https://m.media-amazon.com/images/M/MV5BMDJhODQ3ZDEtN2JmMS00Yjk5LTk1ZTUtMzI3YTU0NTNjMjAyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Lupin" width="150" height="225"></a>
    <p><strong>Lupin (2021)</strong></p>
    <p>tv · action · crime · drama</p>
    <p>France</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0808357/"><img src="https://m.media-amazon.com/images/M/MV5BNzc4Mzc4NTQtMzkwZS00ZWUzLTk1YWUtNDVlY2U1YTMzMTg2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Lust, Caution" width="150" height="225"></a>
    <p><strong>Lust, Caution (2007)</strong></p>
    <p>drama · history · romance</p>
    <p>Taiwan · Ang Lee</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1740299/"><img src="https://m.media-amazon.com/images/M/MV5BMTU0NTQ5NjU1MV5BMl5BanBnXkFtZTgwMzAxNjY5NjE@._V1_FMjpg_UY1024_.jpg" alt="Man in the High Castle" width="150" height="225"></a>
    <p><strong>Man in the High Castle (2015)</strong></p>
    <p>tv · drama · sci-fi · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11358398/"><img src="https://m.media-amazon.com/images/M/MV5BOGYyNGIwNDItMDRjOS00YmZiLWIxMTAtMTQ3YzA0MTAwMzkxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Man Standing Next" width="150" height="225"></a>
    <p><strong>Man Standing Next (2020)</strong></p>
    <p>thriller</p>
    <p>South Korea · Min-ho Woo</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7801964/"><img src="https://m.media-amazon.com/images/M/MV5BOWM5NzMzZTMtNzYwOS00YzBhLTg1OTQtZDY5YWI3M2ExZWU0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Manhunt" width="150" height="225"></a>
    <p><strong>Manhunt (2019)</strong></p>
    <p>tv · biography · crime · drama</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8421350/"><img src="https://m.media-amazon.com/images/M/MV5BMTFlNjg0YjAtYzMwOC00Zjc0LTkwYjAtZmRiYzdjNjcyYjc2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Manifest" width="150" height="225"></a>
    <p><strong>Manifest (2018)</strong></p>
    <p>tv · drama · mystery · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2189461/"><img src="https://m.media-amazon.com/images/M/MV5BMTcwMDU5NzMzOV5BMl5BanBnXkFtZTgwNzk5NTE0MzE@._V1_FMjpg_UY1024_.jpg" alt="Marco Polo" width="150" height="225"></a>
    <p><strong>Marco Polo (2014)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5788792/"><img src="https://m.media-amazon.com/images/M/MV5BMTE1MTgyNzY5NTleQTJeQWpwZ15BbWU4MDA2NDkyODYz._V1_FMjpg_UY1024_.jpg" alt="Marvelous Mrs Maisel" width="150" height="225"></a>
    <p><strong>Marvelous Mrs Maisel (2017)</strong></p>
    <p>tv · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0092402/"><img src="https://m.media-amazon.com/images/M/MV5BNjViZjgwMzQtM2VjYS00NTBlLTlhNWYtYmQyZWI3MzAwMWY0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Max Headroom" width="150" height="225"></a>
    <p><strong>Max Headroom (1987)</strong></p>
    <p>tv · comedy · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13651794/"><img src="https://m.media-amazon.com/images/M/MV5BMjA0ODViOWUtYzFjYy00ZDZlLWFlMmMtMjU2NzFmNWNlZmFhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="May December" width="150" height="225"></a>
    <p><strong>May December (2023)</strong></p>
    <p>comedy · drama</p>
    <p>United States · Todd Haynes</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0017136/"><img src="https://m.media-amazon.com/images/M/MV5BMjhjMGYyMjAtMzJkYy00NzhlLWIwY2MtMWQ2ODIxZDUyOGYyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Metropolis" width="150" height="225"></a>
    <p><strong>Metropolis (1927)</strong></p>
    <p>drama · sci-fi</p>
    <p>Germany · Fritz Lang</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt10574558/"><img src="https://m.media-amazon.com/images/M/MV5BYWFjMDM5MzgtZWI3OC00ZWRmLThlNTktN2ZkMTc3ZTA5NGEzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Midnight Mass" width="150" height="225"></a>
    <p><strong>Midnight Mass (2021)</strong></p>
    <p>tv · drama · fantasy · horror</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8772262/"><img src="https://m.media-amazon.com/images/M/MV5BMzQxNzQzOTQwM15BMl5BanBnXkFtZTgwMDQ2NTcwODM@._V1_FMjpg_UY1024_.jpg" alt="Midsommar" width="150" height="225"></a>
    <p><strong>Midsommar (2019)</strong></p>
    <p>drama · horror · mystery</p>
    <p>United States · Ari Aster</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0181689/"><img src="https://m.media-amazon.com/images/M/MV5BYTdmNzM3YzItZTRkYS00MTY5LTg4ZmItNjFmNTk2N2Q2NmNlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Minority Report" width="150" height="225"></a>
    <p><strong>Minority Report (2002)</strong></p>
    <p>action · crime · mystery</p>
    <p>United States · Steven Spielberg</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1548850/"><img src="https://m.media-amazon.com/images/M/MV5BYjJjYjE2MTMtOGE5OS00YWVlLTk4NzktOTRjNjcyZjYxZTkxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Misfits" width="150" height="225"></a>
    <p><strong>Misfits (2009)</strong></p>
    <p>tv · comedy · drama · fantasy</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt38498244/"><img src="https://m.media-amazon.com/images/M/MV5BYWFiOGI0NDQtOTlhNS00MTE4LTliMzktNDk3MWQzM2VlMmI2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Miss King" width="150" height="225"></a>
    <p><strong>Miss King (2024)</strong></p>
    <p>tv · drama · thriller</p>
    <p>Japan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt31510819/"><img src="https://m.media-amazon.com/images/M/MV5BZDVmMzJkOWUtMjdjMi00NzA4LTgxMTItYjA4NjVjZDI0ZWU1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Mobland" width="150" height="225"></a>
    <p><strong>Mobland (2024)</strong></p>
    <p>tv · crime · drama</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt36147111/"><img src="https://m.media-amazon.com/images/G/01/imdb/images/social/imdb_logo.png" alt="Mogura" width="150" height="225"></a>
    <p><strong>Mogura (2024)</strong></p>
    <p>tv</p>
    <p></p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0312172/"><img src="https://m.media-amazon.com/images/M/MV5BNWM0YjQ4ZjYtNWYyYi00ZDVmLTg5NDQtOTkzZjljYzg2ZWI1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Monk" width="150" height="225"></a>
    <p><strong>Monk (2002)</strong></p>
    <p>tv · comedy · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt24640580/"><img src="https://m.media-amazon.com/images/M/MV5BNTg4NTI5NmItNGJjNC00ZmFhLTg0NzctZWQxZjAzYTAyNTQwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Moving" width="150" height="225"></a>
    <p><strong>Moving (2023)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>South Korea</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7472896/"><img src="https://m.media-amazon.com/images/M/MV5BNzA0MDk0NDE5N15BMl5BanBnXkFtZTgwODk5MjAzNjM@._V1_FMjpg_UY1024_.jpg" alt="Mr Inbetween" width="150" height="225"></a>
    <p><strong>Mr Inbetween (2018)</strong></p>
    <p>tv · comedy · crime · drama</p>
    <p>Australia</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4158110/"><img src="https://m.media-amazon.com/images/M/MV5BMTE0Mjc1MTk2MjFeQTJeQWpwZ15BbWU4MDk2NzI4MDYx._V1_FMjpg_UY1024_.jpg" alt="Mr. Robot" width="150" height="225"></a>
    <p><strong>Mr. Robot (2015)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0310775/"><img src="https://m.media-amazon.com/images/M/MV5BM2ZlYmM2OGUtMzkxMS00YjZlLTg4NjctZjc3OWRlYjY0YmI1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Sympathy for Mr. Vengeance" width="150" height="225"></a>
    <p><strong>Sympathy for Mr. Vengeance (2002)</strong></p>
    <p>crime · drama · thriller</p>
    <p>South Korea · Park Chan-wook</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt14759574/"><img src="https://m.media-amazon.com/images/M/MV5BNmI3ZjNhNjQtMWNlMi00OTc0LThmYTYtMDM2NGY2NWU1MmRlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Mrs. Davis" width="150" height="225"></a>
    <p><strong>Mrs. Davis (2023)</strong></p>
    <p>tv · comedy · drama · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt12940504/"><img src="https://m.media-amazon.com/images/M/MV5BN2ZiZWU3MzMtNGM5OC00ZWVkLTkxNjUtMTYwZGU4MzgxYzk0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="My Name" width="150" height="225"></a>
    <p><strong>My Name (2021)</strong></p>
    <p>tv · action · crime · drama</p>
    <p>South Korea</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2707408/"><img src="https://m.media-amazon.com/images/M/MV5BNzQwOTcwMzIwN15BMl5BanBnXkFtZTgwMjYxMTA0NjE@._V1_FMjpg_UY1024_.jpg" alt="Narcos" width="150" height="225"></a>
    <p><strong>Narcos (2015)</strong></p>
    <p>tv · biography · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt10451852/"><img src="https://m.media-amazon.com/images/M/MV5BM2FhMTg4ZGYtOGNkZi00MTg2LTg4M2QtMGU3NmFjZTEzMjVjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Nine Days" width="150" height="225"></a>
    <p><strong>Nine Days (2020)</strong></p>
    <p>drama · fantasy</p>
    <p>United States · Edson Oda</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1527793/"><img src="https://m.media-amazon.com/images/M/MV5BMjg3NzY0N2ItZGFlMy00NzAzLTk2NjItMDk2YTU3ZWU0MDA1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="No Other Choice" width="150" height="225"></a>
    <p><strong>No Other Choice (2025)</strong></p>
    <p>comedy · crime · drama</p>
    <p>South Korea · Park Chan-wook</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4591834/"><img src="https://m.media-amazon.com/images/M/MV5BYWVlY2MxNDYtNGUyZi00NDhlLTgyNzEtZWU1ZTQxMGM3MTM4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Nobel" width="150" height="225"></a>
    <p><strong>Nobel (2016)</strong></p>
    <p>tv · drama · thriller · war</p>
    <p>Norway</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0098878/"><img src="https://m.media-amazon.com/images/M/MV5BZmM4MzM0YjctMDlmZS00YTZiLWJjZTYtNmFiZTc5NzM3NDY2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Northern Exposure" width="150" height="225"></a>
    <p><strong>Northern Exposure (1990)</strong></p>
    <p>tv · adventure · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4192998/"><img src="https://m.media-amazon.com/images/M/MV5BZTA5NjE4MWUtNmNhZC00YWFkLWFmNTEtOWIwNjQ3NTE3YThlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Occupied (Okkupert)" width="150" height="225"></a>
    <p><strong>Occupied (Okkupert) (2015)</strong></p>
    <p>tv · drama · thriller</p>
    <p>Norway</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0364569/"><img src="https://m.media-amazon.com/images/M/MV5BMTAwNzNjYWItZmI0Ni00ZTcyLWIwNWMtZjlmNGMxZTEyYTJmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Oldboy" width="150" height="225"></a>
    <p><strong>Oldboy (2003)</strong></p>
    <p>action · drama · mystery</p>
    <p>South Korea · Park Chan-wook</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0103285/"><img src="https://m.media-amazon.com/images/M/MV5BOWEwZmU2N2ItNWVkNi00OGRhLWE1N2YtNzM1MDRiYWM4MjgyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Once Upon a Time in China" width="150" height="225"></a>
    <p><strong>Once Upon a Time in China (1991)</strong></p>
    <p>action</p>
    <p>Hong Kong · Hark Tsui</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0102592/"><img src="https://m.media-amazon.com/images/M/MV5BMmNmNmQ0M2MtZjIzNi00OTVkLTkxMzAtOTM1ZDA4Y2UyNTkwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="One False Move" width="150" height="225"></a>
    <p><strong>One False Move (1992)</strong></p>
    <p>crime · drama · thriller</p>
    <p>United States · Carl Franklin</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0368909/"><img src="https://m.media-amazon.com/images/M/MV5BOTcwMTAzNDItODg2MC00MjE0LWEyNzYtYzZjNjZmNjdhODE2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ong Bak" width="150" height="225"></a>
    <p><strong>Ong Bak (2003)</strong></p>
    <p>action · crime · thriller</p>
    <p>Thailand · Prachya Pinkaew</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt15398776/"><img src="https://m.media-amazon.com/images/M/MV5BN2JkMDc5MGQtZjg3YS00NmFiLWIyZmQtZTJmNTM5MjVmYTQ4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Oppenheimer" width="150" height="225"></a>
    <p><strong>Oppenheimer (2023)</strong></p>
    <p>biography · drama · history</p>
    <p>United States · Christopher Nolan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2234222/"><img src="https://m.media-amazon.com/images/M/MV5BNzdmMzI1NjktOTE5MS00MWM1LWI1YTAtODE4YjkzZmRlNzI4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Orphan Black" width="150" height="225"></a>
    <p><strong>Orphan Black (2013)</strong></p>
    <p>tv · drama · sci-fi · thriller</p>
    <p>Canada</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5071412/"><img src="https://m.media-amazon.com/images/M/MV5BZDk1ZTdjOWItNTJmYS00MGIzLThmY2ItZWNiOGY5MzJlNTA5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ozark" width="150" height="225"></a>
    <p><strong>Ozark (2017)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13702796/"><img src="https://m.media-amazon.com/images/M/MV5BMmUzNjNlNDktYzAxZS00OTMzLTlhZjItMmI2NDJhNWEwYzhiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Pacifiction" width="150" height="225"></a>
    <p><strong>Pacifiction (2022)</strong></p>
    <p>drama · thriller</p>
    <p>France · Albert Serra</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0457430/"><img src="https://m.media-amazon.com/images/M/MV5BOTc1NTAxMWItMWFlNy00MmU2LTkwMTMtNzMwOTg5OTQ5YTFiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Pan's Labyrinth" width="150" height="225"></a>
    <p><strong>Pan's Labyrinth (2006)</strong></p>
    <p>drama · fantasy · war</p>
    <p>Mexico · Guillermo del Toro</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt12004706/"><img src="https://m.media-amazon.com/images/M/MV5BNjMwYWMxNjYtY2I2NC00OWE0LTg4MmQtMmI5ZGI2NzU4ODhiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Panchayat" width="150" height="225"></a>
    <p><strong>Panchayat (2020)</strong></p>
    <p>tv · comedy · drama</p>
    <p>India</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11680642/"><img src="https://m.media-amazon.com/images/M/MV5BNGM2NjRjMzAtZjY5Ni00MWVkLWJlMTQtMWVmOWE1N2M2ZWM0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Pantheon" width="150" height="225"></a>
    <p><strong>Pantheon (2022)</strong></p>
    <p>tv · animation · action · adventure</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13238346/"><img src="https://m.media-amazon.com/images/M/MV5BYjQyMTNhNjUtN2VmYy00NWRhLTkwOTctMGVmNTBmNDIxYjZhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Past Lives" width="150" height="225"></a>
    <p><strong>Past Lives (2023)</strong></p>
    <p>drama · romance</p>
    <p>United States · Celine Song</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13146488/"><img src="https://m.media-amazon.com/images/M/MV5BZDIyMGU2NTktOTM3YS00OTRjLWJiMmItNDEyNjVhZTZiZGUxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Peacemaker" width="150" height="225"></a>
    <p><strong>Peacemaker (2022)</strong></p>
    <p>tv · action · adventure · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2442560/"><img src="https://m.media-amazon.com/images/M/MV5BMTQxODYzNTQzOV5BMl5BanBnXkFtZTgwMTI2MDYwMDE@._V1_FMjpg_UY1024_.jpg" alt="Peaky Blinders" width="150" height="225"></a>
    <p><strong>Peaky Blinders (2013)</strong></p>
    <p>tv · crime · drama</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8324422/"><img src="https://m.media-amazon.com/images/M/MV5BZThiMmZjNTMtMTNkYS00YTU3LWI5MWEtZWIzZDkwZjMzMmIwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="PEN15" width="150" height="225"></a>
    <p><strong>PEN15 (2019)</strong></p>
    <p>tv · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2628232/"><img src="https://m.media-amazon.com/images/M/MV5BZjkxMDAzMDgtNzFhNS00MjJkLWI5NTctZGRjODg3MzRiOWEzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Penny Dreadful" width="150" height="225"></a>
    <p><strong>Penny Dreadful (2014)</strong></p>
    <p>tv · drama · fantasy · horror</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt27503384/"><img src="https://m.media-amazon.com/images/M/MV5BNGVmODFkM2MtOTEzMy00MjFjLThjZmYtODMxZmI1MzcyNDkyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Perfect Days" width="150" height="225"></a>
    <p><strong>Perfect Days (2023)</strong></p>
    <p>drama</p>
    <p>Japan · Wim Wenders</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0808417/"><img src="https://m.media-amazon.com/images/M/MV5BNzk3NTI2NGUtNmM1Yy00YTRmLWE2YTItZTYyNGM0ZjdjOTliXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Persepolis" width="150" height="225"></a>
    <p><strong>Persepolis (2007)</strong></p>
    <p>animation · biography · drama</p>
    <p>France · Vincent Paronnaud</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0089374/"><img src="https://m.media-amazon.com/images/M/MV5BZTMxMWUxNjctOGNiOC00MzRkLWI1NjktZWUzOGJiZTM2ZDg1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Police Story" width="150" height="225"></a>
    <p><strong>Police Story (1985)</strong></p>
    <p>action · comedy · crime</p>
    <p>Hong Kong · Jackie Chan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt14230458/"><img src="https://m.media-amazon.com/images/M/MV5BYWU2MjRjZTYtMjVkMS00MTBjLWFiMTAtYmZlYTk1YjkyMWFkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Poor Things" width="150" height="225"></a>
    <p><strong>Poor Things (2023)</strong></p>
    <p>comedy · drama · romance</p>
    <p>Ireland · Yorgos Lanthimos</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5016504/"><img src="https://m.media-amazon.com/images/M/MV5BNzcxYzY1ZjYtNzY0OS00ZDliLWJmNjQtYmE4YWE5YjViMTFhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Preacher" width="150" height="225"></a>
    <p><strong>Preacher (2016)</strong></p>
    <p>tv · adventure · comedy · fantasy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt14584394/"><img src="https://m.media-amazon.com/images/M/MV5BZGI4YTVkNzUtMzViNy00NzVjLTg4MjUtZjYwMGM1NWU4OTYyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Primo" width="150" height="225"></a>
    <p><strong>Primo (2023)</strong></p>
    <p>tv · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt22041854/"><img src="https://m.media-amazon.com/images/M/MV5BOWRjYjVhYWUtNjM2OS00OWE1LTk5ZmYtZDM3MjllNzI1ZmQ4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Priscilla" width="150" height="225"></a>
    <p><strong>Priscilla (2023)</strong></p>
    <p>biography · drama · music</p>
    <p>Italy · Sofia Coppola</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3823996/"><img src="https://m.media-amazon.com/images/M/MV5BNjIyNTdiMzItOGM0Ny00YmFlLTkyOWQtOGQ3NzNmMTgxMTQwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Professor T" width="150" height="225"></a>
    <p><strong>Professor T (2015)</strong></p>
    <p>tv · comedy · crime · drama</p>
    <p>Belgium</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0101640/"><img src="https://m.media-amazon.com/images/M/MV5BZjZlMThlZTktOGYxNS00NjY0LWFkMzAtMjNiOTYxYjYxZWFmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Raise the Red Lantern" width="150" height="225"></a>
    <p><strong>Raise the Red Lantern (1991)</strong></p>
    <p>drama · romance</p>
    <p>China · Yimou Zhang</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13623580/"><img src="https://m.media-amazon.com/images/M/MV5BNjA5ZTdkOWYtNmMzYy00ZmM0LTg3YWYtNDgyODY5OTIxN2RlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Reservation Dogs" width="150" height="225"></a>
    <p><strong>Reservation Dogs (2021)</strong></p>
    <p>tv · comedy · crime</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0102293/"><img src="https://m.media-amazon.com/images/M/MV5BOGYxZmE1YTQtM2MyOC00NTczLThhNzYtYWE0OTk0MDgxOTU1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Riki Oh" width="150" height="225"></a>
    <p><strong>Riki Oh (1991)</strong></p>
    <p>action · comedy · crime</p>
    <p>Hong Kong · Ngai Choi Lam</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11016042/"><img src="https://m.media-amazon.com/images/M/MV5BMmI0NzgyY2ItODVmMy00YzQzLWI3ODAtMzExZDMxYWU0YmZhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ripley" width="150" height="225"></a>
    <p><strong>Ripley (2024)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0093870/"><img src="https://m.media-amazon.com/images/M/MV5BZWM1YzRhODktZDE1MC00NzBlLTk0NGMtOGNhZDQyMmJiZGFiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Robocop" width="150" height="225"></a>
    <p><strong>Robocop (1987)</strong></p>
    <p>action · crime · sci-fi</p>
    <p>United States · Paul Verhoeven</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0384766/"><img src="https://m.media-amazon.com/images/M/MV5BMGQ0M2YxMGEtMDQ2MC00NGEwLTliMTQtODVkYWZkNDFkM2Y3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Rome" width="150" height="225"></a>
    <p><strong>Rome (2005)</strong></p>
    <p>tv · action · drama · romance</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1979319/"><img src="https://m.media-amazon.com/images/M/MV5BNDgzODM2MjUyMF5BMl5BanBnXkFtZTgwMzg4MjA1OTE@._V1_FMjpg_UY1024_.jpg" alt="Rurouni Kenshin" width="150" height="225"></a>
    <p><strong>Rurouni Kenshin (2012)</strong></p>
    <p>action · adventure · drama</p>
    <p>Japan · Keishi Otomo</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7520794/"><img src="https://m.media-amazon.com/images/M/MV5BYTMyYjU1MGEtYzE3ZS00MjJhLTllZWUtNmEyNmIyNGQ1NWMzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Russian Doll" width="150" height="225"></a>
    <p><strong>Russian Doll (2019)</strong></p>
    <p>tv · comedy · drama · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt21056886/"><img src="https://m.media-amazon.com/images/M/MV5BZmEyOWU1YjctNjgxNS00MTcyLTk3NDgtZmY3ZjBkY2RkN2YxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Scavengers Reign" width="150" height="225"></a>
    <p><strong>Scavengers Reign (2023)</strong></p>
    <p>tv · animation · adventure · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8649252/"><img src="https://m.media-amazon.com/images/M/MV5BNmMzYWI0M2UtOGI3MS00OGI2LTk1ZDYtOWU3NDgwZDU0ZTY4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Scrapper" width="150" height="225"></a>
    <p><strong>Scrapper (2023)</strong></p>
    <p>comedy · drama</p>
    <p>United Kingdom · Charlotte Regan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt33204697/"><img src="https://m.media-amazon.com/images/M/MV5BZWEwMjgwOTYtZmM1MC00MzdhLWJhMmUtNmNhNGMxMDdkYzNmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Secret Level" width="150" height="225"></a>
    <p><strong>Secret Level (2024)</strong></p>
    <p>tv · animation · action · adventure</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7949218/"><img src="https://m.media-amazon.com/images/M/MV5BMDEwYTg3MWQtZTNmMi00ZjU1LTkwNWQtZDFmODQ5NjcwMDc2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="See" width="150" height="225"></a>
    <p><strong>See (2019)</strong></p>
    <p>tv · action · drama · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0341555/"><img src="https://m.media-amazon.com/images/M/MV5BM2RkM2FlMjQtMWUwYy00ODg5LWEwYWEtMWM5MmMwMjFjNGIyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Sex is Zero" width="150" height="225"></a>
    <p><strong>Sex is Zero (2002)</strong></p>
    <p>comedy · drama · romance</p>
    <p>South Korea · JK Youn</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0117615/"><img src="https://m.media-amazon.com/images/M/MV5BMzEwN2E3NjAtZTk0MS00NDUzLWI2NmYtMDg5M2E3ZjRhOGMyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Shall We Dance" width="150" height="225"></a>
    <p><strong>Shall We Dance (1996)</strong></p>
    <p>comedy · drama · music</p>
    <p>Japan · Masayuki Suô</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1586680/"><img src="https://m.media-amazon.com/images/M/MV5BMjM5MzAzNTQyOV5BMl5BanBnXkFtZTgwNjY0MjcyNjM@._V1_FMjpg_UY1024_.jpg" alt="Shameless" width="150" height="225"></a>
    <p><strong>Shameless (2011)</strong></p>
    <p>tv · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0429087/"><img src="https://m.media-amazon.com/images/M/MV5BNzdlODA5MWEtOTM3MC00NjZkLTk2MjItMzExZTk1NjUxZGViXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Shantaram" width="150" height="225"></a>
    <p><strong>Shantaram (2022)</strong></p>
    <p>tv · action · adventure · crime</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0286112/"><img src="https://m.media-amazon.com/images/M/MV5BM2JhYTkzYmUtYjY1Mi00OWNjLTk4N2ItNDRkZTIyMzgyMjMyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Shaolin Soccer" width="150" height="225"></a>
    <p><strong>Shaolin Soccer (2001)</strong></p>
    <p>action · comedy · fantasy</p>
    <p>Hong Kong · Stephen Chow</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2649356/"><img src="https://m.media-amazon.com/images/M/MV5BYTY4OTQ0N2EtMDExMC00NTYzLTk0NmItYTRjNDYxOWU5ZDY3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Sharp Objects" width="150" height="225"></a>
    <p><strong>Sharp Objects (2018)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt10737918/"><img src="https://m.media-amazon.com/images/M/MV5BYWVlMmRjOTYtMDgwYy00NDQxLTkzZGEtY2UzZDc0YzBmNmE4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Shin Ultraman" width="150" height="225"></a>
    <p><strong>Shin Ultraman (2022)</strong></p>
    <p>action · adventure · drama</p>
    <p>Japan · Shinji Higuchi</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0164882/"><img src="https://m.media-amazon.com/images/M/MV5BNjc1N2U1MDAtYjAyYS00MTBiLWI5NTAtZWFlMmI2Yjg3MmQyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Shinobi No Mono" width="150" height="225"></a>
    <p><strong>Shinobi No Mono (1962)</strong></p>
    <p>action · drama</p>
    <p>Japan · Satsuo Yamamoto</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2788316/"><img src="https://m.media-amazon.com/images/M/MV5BNzBkNjFkZDItYjQ1OS00MWNmLThjYzYtOWM1ZTkzZDYwODI1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Shogun" width="150" height="225"></a>
    <p><strong>Shogun (2024)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1130884/"><img src="https://m.media-amazon.com/images/M/MV5BN2FjNWExYzEtY2YzOC00YjNlLTllMTQtNmIwM2Q1YzBhOWM1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Shutter Island" width="150" height="225"></a>
    <p><strong>Shutter Island (2010)</strong></p>
    <p>drama · mystery · thriller</p>
    <p>Canada · Martin Scorsese</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5332206/"><img src="https://m.media-amazon.com/images/M/MV5BNzM5Njc3YTctMmIzNi00Mjk2LWFhYjUtNTk5ODFkOTU3YzhiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Signal" width="150" height="225"></a>
    <p><strong>Signal (2016)</strong></p>
    <p>tv · crime · drama · fantasy</p>
    <p>South Korea</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt14688458/"><img src="https://m.media-amazon.com/images/M/MV5BNjA5ODM4YTEtNDcxZi00N2ViLTg0MTgtNGQxNjBjZWY5YTk3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Silo" width="150" height="225"></a>
    <p><strong>Silo (2023)</strong></p>
    <p>tv · drama · mystery · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0248654/"><img src="https://m.media-amazon.com/images/M/MV5BMDA5YTAxNGMtOWYxYy00ZDdkLWIwODUtNjdlYmNhMWQ5NzViXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Six Feet Under" width="150" height="225"></a>
    <p><strong>Six Feet Under (2001)</strong></p>
    <p>tv · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5875444/"><img src="https://m.media-amazon.com/images/M/MV5BY2NkNTBiYWUtMGFiZS00MGI4LWE3YjMtZTU3NzhhZmEyYzlkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Slow Horses" width="150" height="225"></a>
    <p><strong>Slow Horses (2022)</strong></p>
    <p>tv · drama · thriller</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6439752/"><img src="https://m.media-amazon.com/images/M/MV5BODI2MDliNDEtNzg3ZC00Y2RlLWI1YmItZTYyOWM0NzMwNGJmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Snowfall" width="150" height="225"></a>
    <p><strong>Snowfall (2017)</strong></p>
    <p>tv · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1706620/"><img src="https://m.media-amazon.com/images/M/MV5BMTQ3NzA1MTY3MV5BMl5BanBnXkFtZTgwNzE2Mzg5MTE@._V1_FMjpg_UY1024_.jpg" alt="Snowpiercer" width="150" height="225"></a>
    <p><strong>Snowpiercer (2013)</strong></p>
    <p>action · sci-fi · thriller</p>
    <p>South Korea · Bong Joon Ho</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt12759100/"><img src="https://m.media-amazon.com/images/M/MV5BM2U3ZThlODMtMGU0YS00ZDVkLWE2ZmItNmI0ZDM5MDNiMGJkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Somebody Somewhere" width="150" height="225"></a>
    <p><strong>Somebody Somewhere (2022)</strong></p>
    <p>tv · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0108188/"><img src="https://m.media-amazon.com/images/M/MV5BYjk2NGRhZDUtNjVmNy00NmFiLTk3MWQtMzIyZjc1ZmExYzAzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Sonatine" width="150" height="225"></a>
    <p><strong>Sonatine (1993)</strong></p>
    <p>action · comedy · crime</p>
    <p>Japan · Takeshi Kitano</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1442449/"><img src="https://m.media-amazon.com/images/M/MV5BNTc4ZjlkNjUtOWZlMS00ODQ0LTg2MWUtMjBkNjMwOTJkOWZmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Spartacus" width="150" height="225"></a>
    <p><strong>Spartacus (2010)</strong></p>
    <p>tv · action · adventure · biography</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0477507/"><img src="https://m.media-amazon.com/images/M/MV5BYTAzZWU4NzItNDVlNi00MDIyLWJkODAtYTg2MzE3Y2Q5NTI1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Spiral (Engrenage)" width="150" height="225"></a>
    <p><strong>Spiral (Engrenage) (2005)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>France</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt22375054/"><img src="https://m.media-amazon.com/images/M/MV5BNDE2OTQ0NjEtNmEwMC00NmRjLThiOGMtN2M1N2Q2YWY0NGY4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Strange Darling" width="150" height="225"></a>
    <p><strong>Strange Darling (2023)</strong></p>
    <p>horror · thriller</p>
    <p>United States · JT Mollner</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0114558/"><img src="https://m.media-amazon.com/images/M/MV5BNzk1NGY4ZGUtYzllYy00ODM0LTljNmItYTY5NGI4YWQxNTQxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Strange Days" width="150" height="225"></a>
    <p><strong>Strange Days (1995)</strong></p>
    <p>crime · drama · sci-fi</p>
    <p>United States · Kathryn Bigelow</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1492179/"><img src="https://m.media-amazon.com/images/M/MV5BOTE4YjQ3NzgtNGI1My00MzkxLWIwY2EtOTQzMzZiYzBiMTg2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Strike Back" width="150" height="225"></a>
    <p><strong>Strike Back (2010)</strong></p>
    <p>tv · action · drama · thriller</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7660850/"><img src="https://m.media-amazon.com/images/M/MV5BYTY4YTVkY2QtMjRmOS00YzliLWIxOWQtMTdkOTVkN2UzODNmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Succession" width="150" height="225"></a>
    <p><strong>Succession (2018)</strong></p>
    <p>tv · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0430651/"><img src="https://m.media-amazon.com/images/M/MV5BZWViMDk1MzYtM2FiYS00MTdkLWI3YTQtNmFjN2FlMTY0NmM1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Survive Style 5+" width="150" height="225"></a>
    <p><strong>Survive Style 5+ (2004)</strong></p>
    <p>comedy · fantasy · horror</p>
    <p>Japan · Gen Sekiguchi</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0234837/"><img src="https://m.media-amazon.com/images/M/MV5BNGMxM2IwZjgtNGQ0My00ZTc0LTk3MTMtYTIyNWI2OWJhZGU5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Suzhou River" width="150" height="225"></a>
    <p><strong>Suzhou River (2000)</strong></p>
    <p>drama · romance</p>
    <p>Germany · Ye Lou</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0386064/"><img src="https://m.media-amazon.com/images/M/MV5BNjUzNTVlYzQtOGYxMy00NmExLTgzYTQtOGEyM2YyM2YzYjJkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Taegukgi" width="150" height="225"></a>
    <p><strong>Taegukgi (2004)</strong></p>
    <p>action · drama · war</p>
    <p>South Korea · Kang Je-kyu</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0287467/"><img src="https://m.media-amazon.com/images/M/MV5BM2NjMmQyYmQtMjRjMi00OGVjLWFlMDAtNDYzNDE0MmY4YjE1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Talk to Her" width="150" height="225"></a>
    <p><strong>Talk to Her (2002)</strong></p>
    <p>drama · mystery · romance</p>
    <p>Spain · Pedro Almodóvar</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6878038/"><img src="https://m.media-amazon.com/images/M/MV5BNTczN2QxM2MtMjBkYi00ZDk4LWI3MGYtMzcyYTAxM2JmMzJiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Taxi Driver" width="150" height="225"></a>
    <p><strong>Taxi Driver (2017)</strong></p>
    <p>action · drama · history</p>
    <p>South Korea · Hun Jang</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt10986410/"><img src="https://m.media-amazon.com/images/M/MV5BZmI3YWVhM2UtNDZjMC00YTIzLWI2NGUtZWIxODZkZjVmYTg1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Ted Lasso" width="150" height="225"></a>
    <p><strong>Ted Lasso (2020)</strong></p>
    <p>tv · comedy · drama · sport</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11743610/"><img src="https://m.media-amazon.com/images/M/MV5BOTU3NDc5OTYtNjUxNS00MzgxLWI3YjItZmZmNWJkYTNiNGUwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Terminal List" width="150" height="225"></a>
    <p><strong>Terminal List (2022)</strong></p>
    <p>tv · action · drama · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0088247/"><img src="https://m.media-amazon.com/images/M/MV5BZmE0YzIxM2QtMGNlMi00MjRmLWE3MWMtOWQzMGVjMmU0YTFmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Terminator" width="150" height="225"></a>
    <p><strong>Terminator (1984)</strong></p>
    <p>action · adventure · sci-fi</p>
    <p>United Kingdom · James Cameron</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0096251/"><img src="https://m.media-amazon.com/images/M/MV5BY2YwM2EyZDMtZTdhYi00NDg1LTgxYWItNWU2NDdiY2JiZGJjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Tetsuo: The Iron Man" width="150" height="225"></a>
    <p><strong>Tetsuo: The Iron Man (1989)</strong></p>
    <p>horror · sci-fi</p>
    <p>Japan · Shin'ya Tsukamoto</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt30423279/"><img src="https://m.media-amazon.com/images/M/MV5BYjM1OWEzZDctMTZkZS00ZjIyLTk5OGEtZGIzZWZhNjNlNmM5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The 8 Show" width="150" height="225"></a>
    <p><strong>The 8 Show (2024)</strong></p>
    <p>tv · comedy · drama · horror</p>
    <p>South Korea</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2149175/"><img src="https://m.media-amazon.com/images/M/MV5BMjIzNTEzMDY3OF5BMl5BanBnXkFtZTcwMzI5NDI5OA@@._V1_FMjpg_UY1024_.jpg" alt="The Americans" width="150" height="225"></a>
    <p><strong>The Americans (2013)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt15314262/"><img src="https://m.media-amazon.com/images/M/MV5BNzg3YjVmZGYtOTc5MC00MDdiLTllOTYtZWQ0ODQ1MmMyNTExXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Beekeeper" width="150" height="225"></a>
    <p><strong>The Beekeeper (2024)</strong></p>
    <p>action · crime · thriller</p>
    <p>United Kingdom · David Ayer</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1190634/"><img src="https://m.media-amazon.com/images/M/MV5BMGRlZDE2ZGEtZTU5Mi00ODdkLWFmMTEtY2UwMmViNWNmZjczXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Boys" width="150" height="225"></a>
    <p><strong>The Boys (2019)</strong></p>
    <p>tv · action · comedy · crime</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1733785/"><img src="https://m.media-amazon.com/images/M/MV5BMjQ3MDAzNDU4NV5BMl5BanBnXkFtZTgwNjE2NDQ0NzE@._V1_FMjpg_UY1024_.jpg" alt="The Bridge (Broen/Bron)" width="150" height="225"></a>
    <p><strong>The Bridge (Broen/Bron) (2011)</strong></p>
    <p>tv · crime · mystery · thriller</p>
    <p>Sweden</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt17632862/"><img src="https://m.media-amazon.com/images/M/MV5BYzMxMjRmZDQtNWEzNC00ZDUyLTk0YzgtMDBkODJkNjExMTkzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Brothers Sun" width="150" height="225"></a>
    <p><strong>The Brothers Sun (2024)</strong></p>
    <p>tv · action · comedy · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1259521/"><img src="https://m.media-amazon.com/images/M/MV5BNTUxNzYyMjg2N15BMl5BanBnXkFtZTcwMTExNzExNw@@._V1_FMjpg_UY1024_.jpg" alt="The Cabin in the Woods" width="150" height="225"></a>
    <p><strong>The Cabin in the Woods (2011)</strong></p>
    <p>horror · mystery · thriller</p>
    <p>Canada · Drew Goddard</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4903242/"><img src="https://m.media-amazon.com/images/M/MV5BMjEwNjc4MzY4NF5BMl5BanBnXkFtZTgwOTY2NjA0NDM@._V1_FMjpg_UY1024_.jpg" alt="The Detour" width="150" height="225"></a>
    <p><strong>The Detour (2016)</strong></p>
    <p>tv · adventure · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7766378/"><img src="https://m.media-amazon.com/images/M/MV5BZGIyYzNmNjYtZTM3OC00OGE0LTgyNzctYzQ0OTYxYjhiZTNlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Electric State" width="150" height="225"></a>
    <p><strong>The Electric State (2025)</strong></p>
    <p>action · adventure · comedy</p>
    <p>United States · Anthony Russo</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5867314/"><img src="https://m.media-amazon.com/images/M/MV5BMzI3OWYwNTQtOWM1Yi00Zjc1LWJmOGItN2UzMTNmNmJmZjE3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Empty Man" width="150" height="225"></a>
    <p><strong>The Empty Man (2020)</strong></p>
    <p>drama · horror · mystery</p>
    <p>United States · David Prior</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6257970/"><img src="https://m.media-amazon.com/images/M/MV5BNTVkZTI3MmMtMDY1Yi00NjJhLTgyYTctNWE1OTJkNmZiZjdlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The End of the F***ing World" width="150" height="225"></a>
    <p><strong>The End of the F***ing World (2017)</strong></p>
    <p>tv · adventure · comedy · crime</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3230854/"><img src="https://m.media-amazon.com/images/M/MV5BYzUyYmI3MjctY2Q2MC00NmFjLTgwZGUtNWQzZWNlYmVjNzE2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Expanse" width="150" height="225"></a>
    <p><strong>The Expanse (2015)</strong></p>
    <p>tv · drama · mystery · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt15567174/"><img src="https://m.media-amazon.com/images/M/MV5BY2RiMjhkMzYtOWFmYS00YmRkLWIxYmYtN2FmZDEwODllYzA3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Fall of the House of Usher" width="150" height="225"></a>
    <p><strong>The Fall of the House of Usher (2023)</strong></p>
    <p>tv · drama · horror · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt21344706/"><img src="https://m.media-amazon.com/images/M/MV5BODM0ZTc5YTAtZmMxNi00YzJkLWEzODItZDczZTRlNTc1NGE3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Glory" width="150" height="225"></a>
    <p><strong>The Glory (2022)</strong></p>
    <p>tv · drama · mystery · thriller</p>
    <p>South Korea</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0901487/"><img src="https://m.media-amazon.com/images/M/MV5BMjM0NTE3NjkyNl5BMl5BanBnXkFtZTgwMzQyNzE1MjE@._V1_FMjpg_UY1024_.jpg" alt="The Good The Bad The Weird" width="150" height="225"></a>
    <p><strong>The Good The Bad The Weird (2008)</strong></p>
    <p>action · adventure · comedy</p>
    <p>South Korea · Kim Jee-woon</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4016934/"><img src="https://m.media-amazon.com/images/M/MV5BOTllZDI1OGItOGUxNS00OGZhLWIzMjAtYzllZTY1YTA0ZmYwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Handmaiden" width="150" height="225"></a>
    <p><strong>The Handmaiden (2016)</strong></p>
    <p>drama · romance · thriller</p>
    <p>South Korea · Park Chan-wook</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8290362/"><img src="https://m.media-amazon.com/images/M/MV5BMDE4MzYwMjgtMTliNS00MDFmLWEyZGEtOWM1MDA2ZDgzODM1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Head" width="150" height="225"></a>
    <p><strong>The Head (2020)</strong></p>
    <p>tv · drama · horror · mystery</p>
    <p>Spain</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt14849194/"><img src="https://m.media-amazon.com/images/M/MV5BOTliOWYyYmYtMjZlNy00ZDQwLWE4NTgtNTFmYTQ5MTcxNDMwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Holdovers" width="150" height="225"></a>
    <p><strong>The Holdovers (2023)</strong></p>
    <p>comedy · drama</p>
    <p>United States · Alexander Payne</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0468492/"><img src="https://m.media-amazon.com/images/M/MV5BMTQzYzI1MDAtYzVkOC00N2U1LThmNzYtNmYyNDg5MzQwYjEwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Host" width="150" height="225"></a>
    <p><strong>The Host (2006)</strong></p>
    <p>drama · horror · sci-fi</p>
    <p>South Korea · Bong Joon Ho</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0097202/"><img src="https://m.media-amazon.com/images/M/MV5BMjQyZDJhNTktYjZiZC00ODU4LTg5OTYtYjc2MzA2OGFjMzZmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Killer" width="150" height="225"></a>
    <p><strong>The Killer (1989)</strong></p>
    <p>action · crime · drama</p>
    <p>Hong Kong · John Woo</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0826760/"><img src="https://m.media-amazon.com/images/M/MV5BMmJjZjU1MGYtODY0Yy00NjM2LTk0YzYtZTc4YzgyOWU4NWNiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Killing" width="150" height="225"></a>
    <p><strong>The Killing (2007)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>Denmark</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt4179452/"><img src="https://m.media-amazon.com/images/M/MV5BMjE1MzYzNjk3OF5BMl5BanBnXkFtZTgwMzk0MzYwNzE@._V1_FMjpg_UY1024_.jpg" alt="The Last Kingdom" width="150" height="225"></a>
    <p><strong>The Last Kingdom (2015)</strong></p>
    <p>tv · action · drama · history</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3581920/"><img src="https://m.media-amazon.com/images/M/MV5BYWI3ODJlMzktY2U5NC00ZjdlLWE1MGItNWQxZDk3NWNjN2RhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Last of Us" width="150" height="225"></a>
    <p><strong>The Last of Us (2023)</strong></p>
    <p>tv · action · adventure · drama</p>
    <p>Canada</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt14190592/"><img src="https://m.media-amazon.com/images/M/MV5BMjVjZDkzMTMtMDRmOC00ZThhLThmZWItNmMyODg4MWE0Y2FmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Lazarus Project" width="150" height="225"></a>
    <p><strong>The Lazarus Project (2022)</strong></p>
    <p>tv · action · drama · fantasy</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2699128/"><img src="https://m.media-amazon.com/images/M/MV5BNTE3MDc1MjY4NV5BMl5BanBnXkFtZTgwMDg4MjQ4MTE@._V1_FMjpg_UY1024_.jpg" alt="The Leftovers" width="150" height="225"></a>
    <p><strong>The Leftovers (2014)</strong></p>
    <p>tv · drama · fantasy · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11247158/"><img src="https://m.media-amazon.com/images/M/MV5BMjI0ZjE2NDgtM2IxMy00NTk3LWFhMTEtMWNhOWJiYjIzYzY2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Legend of Vox Machina" width="150" height="225"></a>
    <p><strong>The Legend of Vox Machina (2022)</strong></p>
    <p>tv · animation · action · adventure</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7320300/"><img src="https://m.media-amazon.com/images/M/MV5BZjljODIzMGQtMDA4ZS00OGNjLTliZjgtNmQ0YWI2Y2JmODNlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Letdown" width="150" height="225"></a>
    <p><strong>The Letdown (2017)</strong></p>
    <p>tv · comedy</p>
    <p>Australia</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1527788/"><img src="https://m.media-amazon.com/images/M/MV5BMTgzMTkxNjAxNV5BMl5BanBnXkFtZTgwMDU3MDE0MjE@._V1_FMjpg_UY1024_.jpg" alt="The Man from Nowhere" width="150" height="225"></a>
    <p><strong>The Man from Nowhere (2010)</strong></p>
    <p>action · crime · drama</p>
    <p>South Korea · Lee Jeong-beom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0133093/"><img src="https://m.media-amazon.com/images/M/MV5BN2NmN2VhMTQtMDNiOS00NDlhLTliMjgtODE2ZTY0ODQyNDRhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Matrix" width="150" height="225"></a>
    <p><strong>The Matrix (1999)</strong></p>
    <p>action · sci-fi</p>
    <p>United States · Lana Wachowski</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6116856/"><img src="https://m.media-amazon.com/images/M/MV5BMWFmYmE4MmEtNjgxNy00NjE1LWFmNzItNGRiMDJjYmFmZDU2XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Night Comes for Us" width="150" height="225"></a>
    <p><strong>The Night Comes for Us (2018)</strong></p>
    <p>action · crime · thriller</p>
    <p>Indonesia · Timo Tjahjanto</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8310612/"><img src="https://m.media-amazon.com/images/M/MV5BYTE3ODVkZGItNzBmZi00MzkzLWEwZmEtZDEwZjJhMmUyODhiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Other Two" width="150" height="225"></a>
    <p><strong>The Other Two (2019)</strong></p>
    <p>tv · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8550800/"><img src="https://m.media-amazon.com/images/M/MV5BOGY0YjJmOWItOGI2MS00N2VmLTlmNjYtMDM3YjY1MzkyM2E1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Outsider" width="150" height="225"></a>
    <p><strong>The Outsider (2020)</strong></p>
    <p>tv · crime · drama · horror</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt31938062/"><img src="https://m.media-amazon.com/images/M/MV5BMThjMjYxM2YtM2IzZC00NDdmLThiNDYtNzEyNzA0YTRmYTk3XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Pitt" width="150" height="225"></a>
    <p><strong>The Pitt (2025)</strong></p>
    <p>tv · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt10048342/"><img src="https://m.media-amazon.com/images/M/MV5BMmRlNjQxNWQtMjk1OS00N2QxLTk0YWQtMzRhYjY5YTFhNjMxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Queen's Gambit" width="150" height="225"></a>
    <p><strong>The Queen's Gambit (2020)</strong></p>
    <p>tv · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1899353/"><img src="https://m.media-amazon.com/images/M/MV5BOGUxM2Q0MzItZDRmYy00ZWY1LWFiNzctNmY3Njg2ODJjZWNmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Raid" width="150" height="225"></a>
    <p><strong>The Raid (2011)</strong></p>
    <p>action · crime · thriller</p>
    <p>Indonesia · Gareth Evans</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2265171/"><img src="https://m.media-amazon.com/images/M/MV5BMDMyNTMzZmYtNDIxYi00YTNkLWE2ZTMtM2M4ZGQwYTFjZTEyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Raid 2" width="150" height="225"></a>
    <p><strong>The Raid 2 (2014)</strong></p>
    <p>action · crime · thriller</p>
    <p>Indonesia · Gareth Evans</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0093894/"><img src="https://m.media-amazon.com/images/M/MV5BMDQwYzMwMDItYzFhZC00YjkzLTlmODAtMzg3NDFlNDhhZjYzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Running Man" width="150" height="225"></a>
    <p><strong>The Running Man (1987)</strong></p>
    <p>action · sci-fi · thriller</p>
    <p>United States · Paul Michael Glaser</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0286486/"><img src="https://m.media-amazon.com/images/M/MV5BMTcwNzQwODI5NV5BMl5BanBnXkFtZTcwNzQxMjI5MQ@@._V1_FMjpg_UY1024_.jpg" alt="The Shield" width="150" height="225"></a>
    <p><strong>The Shield (2002)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0141842/"><img src="https://m.media-amazon.com/images/M/MV5BMjRmMTNiMTQtMDg1ZS00MGM1LWE1MGUtYjEzMGFjNWUzOWRkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Sopranos" width="150" height="225"></a>
    <p><strong>The Sopranos (1999)</strong></p>
    <p>tv · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt19760052/"><img src="https://m.media-amazon.com/images/M/MV5BMTBkZTk1NzMtMTNlMC00ZjFmLWE5ZWYtYzg0NmVlNzllNTRlXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Taste of Things" width="150" height="225"></a>
    <p><strong>The Taste of Things (2023)</strong></p>
    <p>drama · history · romance</p>
    <p>France · Anh Hung Tran</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt14364876/"><img src="https://m.media-amazon.com/images/M/MV5BNDFiNTFiYTYtMzA4Mi00OTBjLWEzYTctYTFhMGJmNDQ2N2FmXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Tower" width="150" height="225"></a>
    <p><strong>The Tower (2021)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0840361/"><img src="https://m.media-amazon.com/images/M/MV5BMTcyNzcxODg3Nl5BMl5BanBnXkFtZTcwMTUyNjQ3Mw@@._V1_FMjpg_UY1024_.jpg" alt="The Town" width="150" height="225"></a>
    <p><strong>The Town (2010)</strong></p>
    <p>crime · drama · thriller</p>
    <p>United States · Ben Affleck</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1312171/"><img src="https://m.media-amazon.com/images/M/MV5BMzlmMmIxODItYzBjNC00YjMwLWIwOTAtNzVlMTBlNTNkMjZjXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Umbrella Academy" width="150" height="225"></a>
    <p><strong>The Umbrella Academy (2019)</strong></p>
    <p>tv · action · adventure · comedy</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0306414/"><img src="https://m.media-amazon.com/images/M/MV5BZWYyNmRhYjktNjBhNC00M2NhLWEzYmMtZDYwNmIyZTRiZWMzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Wire" width="150" height="225"></a>
    <p><strong>The Wire (2002)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7160372/"><img src="https://m.media-amazon.com/images/M/MV5BNjk4MTQ3MGEtZmI4OS00N2NhLWI5ZjgtYWE5ZWVkZGExYTQ1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="The Zone of Interest" width="150" height="225"></a>
    <p><strong>The Zone of Interest (2023)</strong></p>
    <p>drama · history · war</p>
    <p>United Kingdom · Jonathan Glazer</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0108394/"><img src="https://m.media-amazon.com/images/M/MV5BNWMxNWE2NGYtMzYwOS00NmJhLTgwNjAtNGM3ODIwNjU5MTZiXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Three Colors: Blue" width="150" height="225"></a>
    <p><strong>Three Colors: Blue (1993)</strong></p>
    <p>drama · music · mystery</p>
    <p>France · Krzysztof Kieslowski</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0111495/"><img src="https://m.media-amazon.com/images/M/MV5BMTQ0YTQyYzItNGEzMi00NmI4LWJkOTMtOWMyMjAwMWEzYTZhXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Three Colors: Red" width="150" height="225"></a>
    <p><strong>Three Colors: Red (1994)</strong></p>
    <p>drama · mystery · romance</p>
    <p>France · Krzysztof Kieslowski</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0111507/"><img src="https://m.media-amazon.com/images/M/MV5BMWUyMWJiYTEtNmIzYi00OTYxLTlkYjEtMGFjMjY3NDc5Mjk0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Three Colors: White" width="150" height="225"></a>
    <p><strong>Three Colors: White (1994)</strong></p>
    <p>comedy · drama · romance</p>
    <p>France · Krzysztof Kieslowski</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2887954/"><img src="https://m.media-amazon.com/images/M/MV5BYjkxMjU2ODUtNzdlZi00NDg0LWEyZDgtZGE3NTVkNDYyZjIzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Tokyo Vice" width="150" height="225"></a>
    <p><strong>Tokyo Vice (2022)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>Japan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0427954/"><img src="https://m.media-amazon.com/images/M/MV5BM2JhMjVjZTktODVkYi00ZTM2LTlkMDAtMDBhMDVjYTQxZmYzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Tom Yum Goong (The Protector)" width="150" height="225"></a>
    <p><strong>Tom Yum Goong (The Protector) (2005)</strong></p>
    <p>action · crime · drama</p>
    <p>Thailand · Prachya Pinkaew</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0100802/"><img src="https://m.media-amazon.com/images/M/MV5BZjRlMzBkOGMtMTA1Ny00ZWI4LTkzMDItOGVkNWJkN2E4ZTkwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Total Recall" width="150" height="225"></a>
    <p><strong>Total Recall (1990)</strong></p>
    <p>action · adventure · sci-fi</p>
    <p>United States · Paul Verhoeven</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt3561180/"><img src="https://m.media-amazon.com/images/M/MV5BMjEwOTQ0OTIwNV5BMl5BanBnXkFtZTgwNTAwODY2NzE@._V1_FMjpg_UY1024_.jpg" alt="Trapped" width="150" height="225"></a>
    <p><strong>Trapped (2015)</strong></p>
    <p>tv · crime · drama · mystery</p>
    <p>Iceland</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0084827/"><img src="https://m.media-amazon.com/images/M/MV5BMTA4Y2VjOWEtMWQ5MS00YWU5LTkxZTMtNzVmMDYyNWFiODU5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Tron" width="150" height="225"></a>
    <p><strong>Tron (1982)</strong></p>
    <p>action · adventure · sci-fi</p>
    <p>United States · Steven Lisberger</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8239946/"><img src="https://m.media-amazon.com/images/M/MV5BOTY0YzY3MTMtOWQ5Yi00ODY2LThhOGMtMzFlMjhlODcxOGU1XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Tumbbad" width="150" height="225"></a>
    <p><strong>Tumbbad (2018)</strong></p>
    <p>drama · fantasy · horror</p>
    <p>India · Rahi Anil Barve</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt6499752/"><img src="https://m.media-amazon.com/images/M/MV5BMjI0NzcyMjM5Ml5BMl5BanBnXkFtZTgwMzk2NzAyNTM@._V1_FMjpg_UY1024_.jpg" alt="Upgrade" width="150" height="225"></a>
    <p><strong>Upgrade (2018)</strong></p>
    <p>action · sci-fi · thriller</p>
    <p>United States · Leigh Whannell</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8033592/"><img src="https://m.media-amazon.com/images/M/MV5BYWUxMjZjNDYtYjUxYS00NmM5LWE2ZDItODljNTI0ZjJjMWQzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Us and Them" width="150" height="225"></a>
    <p><strong>Us and Them (2018)</strong></p>
    <p>drama · romance</p>
    <p>China · Rene Liu</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2384811/"><img src="https://m.media-amazon.com/images/M/MV5BMjMwMTA5NDc5M15BMl5BanBnXkFtZTgwMjQ4MTY0MjE@._V1_FMjpg_UY1024_.jpg" alt="Utopia" width="150" height="225"></a>
    <p><strong>Utopia (2013)</strong></p>
    <p>tv · drama · mystery · sci-fi</p>
    <p>United Kingdom</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8652818/"><img src="https://m.media-amazon.com/images/M/MV5BOWUyNDFjOWUtNGM5MS00YTUzLWFhYzYtZDg5NDNjMWJiY2MyXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Violet Evergarden: The Movie" width="150" height="225"></a>
    <p><strong>Violet Evergarden: The Movie (2020)</strong></p>
    <p>animation · drama · fantasy</p>
    <p>Japan · Taichi Ishidate</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0441909/"><img src="https://m.media-amazon.com/images/M/MV5BMjA0NTUxMjY1OV5BMl5BanBnXkFtZTcwNjI2OTMzMQ@@._V1_FMjpg_UY1024_.jpg" alt="Volver" width="150" height="225"></a>
    <p><strong>Volver (2006)</strong></p>
    <p>comedy · drama</p>
    <p>Spain · Pedro Almodóvar</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2215676/"><img src="https://m.media-amazon.com/images/M/MV5BOTJjZmU5NTctODVlYy00MGM0LTgzNjUtNjU5NDkyYTcxZWQ4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Warped Forest" width="150" height="225"></a>
    <p><strong>Warped Forest (2011)</strong></p>
    <p>comedy · fantasy</p>
    <p>Japan · Shunichirô Miki</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5743796/"><img src="https://m.media-amazon.com/images/M/MV5BNTE5MjE3NTUtNTQxMC00ZjIwLWE2ZjctNmQ2NDc3ZmY2YTE0XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Warrior" width="150" height="225"></a>
    <p><strong>Warrior (2019)</strong></p>
    <p>tv · action · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt2618986/"><img src="https://m.media-amazon.com/images/M/MV5BMjUwY2NmZDItZjdjNC00ZGQ3LTk2NTEtNjY5NTQxOGYwNGY4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Wayward Pines" width="150" height="225"></a>
    <p><strong>Wayward Pines (2015)</strong></p>
    <p>tv · drama · horror · mystery</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0439100/"><img src="https://m.media-amazon.com/images/M/MV5BOWVmOGQyNDEtY2Y1NS00MGM2LWI5ZTMtNmJmOGUwNjY0N2FkXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Weeds" width="150" height="225"></a>
    <p><strong>Weeds (2005)</strong></p>
    <p>tv · comedy · crime · drama</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt0475784/"><img src="https://m.media-amazon.com/images/M/MV5BMjM2MTA5NjIwNV5BMl5BanBnXkFtZTgwNjI2OTMxNTM@._V1_FMjpg_UY1024_.jpg" alt="Westworld" width="150" height="225"></a>
    <p><strong>Westworld (2016)</strong></p>
    <p>tv · drama · mystery · sci-fi</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt9647768/"><img src="https://m.media-amazon.com/images/M/MV5BZTgwZTYyNjItOTQ5YS00MjZhLTkyODAtMzc5YWQzZDIwMTAzXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Wild Goose Lake" width="150" height="225"></a>
    <p><strong>Wild Goose Lake (2019)</strong></p>
    <p>crime · drama</p>
    <p>China · Yi'nan Diao</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt5362988/"><img src="https://m.media-amazon.com/images/M/MV5BMTUyMjU1OTUwM15BMl5BanBnXkFtZTgwMDg1NDQ2MjI@._V1_FMjpg_UY1024_.jpg" alt="Wind River" width="150" height="225"></a>
    <p><strong>Wind River (2017)</strong></p>
    <p>crime · drama · mystery</p>
    <p>United Kingdom · Taylor Sheridan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt1399683/"><img src="https://m.media-amazon.com/images/M/MV5BMjA0OTM3MDMxNF5BMl5BanBnXkFtZTcwMDY1MjI0Mw@@._V1_FMjpg_UY1024_.jpg" alt="Winter's Bone" width="150" height="225"></a>
    <p><strong>Winter's Bone (2010)</strong></p>
    <p>crime · drama · mystery</p>
    <p>United States · Debra Granik</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt11041332/"><img src="https://m.media-amazon.com/images/M/MV5BNzMyM2QyNWUtMjQzMS00M2U0LTgxODUtOWU2ZjcxNzdjN2EwXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Yellowjackets" width="150" height="225"></a>
    <p><strong>Yellowjackets (2021)</strong></p>
    <p>tv · drama · mystery · thriller</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt7335184/"><img src="https://m.media-amazon.com/images/M/MV5BZmU4ZWZlMmItZTc1My00YjU5LTk1ZTQtMjA4MzM5Yzk5NWQ5XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="You" width="150" height="225"></a>
    <p><strong>You (2018)</strong></p>
    <p>tv · crime · drama · romance</p>
    <p>United States</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt13664452/"><img src="https://m.media-amazon.com/images/M/MV5BMjViMThmZWMtMDhiNS00OWVkLThlNzYtMDA1NWQwZjRkMjYxXkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Yu Yu Hakusho" width="150" height="225"></a>
    <p><strong>Yu Yu Hakusho (2023)</strong></p>
    <p>tv · action · adventure · comedy</p>
    <p>Japan</p>
  </div>
  <div>
    <a href="https://www.imdb.com/title/tt8332438/"><img src="https://m.media-amazon.com/images/M/MV5BMWYwNGVjZWItMjA3Yi00YjBkLTliYmItM2E0NWRjZDU5ODc4XkEyXkFqcGc@._V1_FMjpg_UY1024_.jpg" alt="Zero Zero Zero" width="150" height="225"></a>
    <p><strong>Zero Zero Zero (2020)</strong></p>
    <p>tv · crime · drama · thriller</p>
    <p>Italy</p>
  </div>
</div>
]]></description>
    <pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Introducing Kitty Cards</title>
<link>https://xenodium.com/introducing-kitty-cards</link>
<guid isPermaLink="false">https://xenodium.com/introducing-kitty-cards</guid>
    <description><![CDATA[<p>Back in 2023, I toyed with the relevant iOS dev tools needed to <a href="https://xenodium.com/my-custom-tesco-clubcard-pkpass">create a custom Tesco Clubcard pkpass</a>, and even showed how to <a href="https://xenodium.com/emacs-scan-this-qrcode">scan a QR code from our beloved Emacs</a> (of course).</p>
<p>Neither my friend <a href="https://vaarnan.com/">Vaarnan</a> nor I are strangers to the iOS ecosystem, yet we both agreed the above approach wasn't very practical (for neither devs nor the average iOS user). So we figured we should have a crack at it.</p>
<p>While there are some ready-made solutions out there, they often require downloading additional iOS apps or working through clunky web interfaces. We just wanted a simpler way to create our own Apple Wallet cards, and so <a href="https://www.kitty.cards/">Kitty Cards</a> (<a href="https://www.kitty.cards">kitty.cards</a>) was born: no app download or sign-in required.</p>
<p><img src="https://kitty.cards/og-image.png" alt=""></p>
<p>Hopefully not much to explain. From <a href="https://kitty.cards">kitty.cards</a>, customize a card, press the <code>Add to Apple Wallet</code> button, and <a href="https://en.wikipedia.org/wiki/Bob%27s_your_uncle">Bobs your uncle</a>.</p>
<p>Hope you enjoy <a href="https://www.kitty.cards/">Kitty Cards</a>!</p>
]]></description>
    <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 10: agent-shell</title>
<link>https://xenodium.com/bending-emacs-episode-10-agent-shell</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-10-agent-shell</guid>
    <description><![CDATA[<p>I've just uploaded a new <a href="https://www.youtube.com/@xenodium">Bending Emacs</a> episode:</p>
<p><a href="https://youtu.be/R2Ucr3amgGg">Bending Emacs Episode 10: agent-shell</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=R2Ucr3amgGg" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/R2Ucr3amgGg/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>You may have seen some of my previous posts on <a href="https://github.com/xenodium/agent-shell">agent-shell</a>, a package I built offering a uniform user experience across a diverse set of agents. In this video, I showcase the main <code>agent-shell</code> features. I had lots to cover, so the video is on the longer side of things.</p>
<p>I've showcased much of the content in previous <a href="https://github.com/xenodium/agent-shell">agent-shell</a> posts, so I'll just share links to those instead:</p>
<ul>
<li><a href="https://xenodium.com/agent-shell-0-25-updates">agent-shell 0.25 updates</a>.</li>
<li><a href="https://xenodium.com/agent-shell-016-improvements-melpa">agent-shell 0.17 improvements + MELPA</a>.</li>
<li><a href="https://xenodium.com/agent-shell-0-5-improvements">agent-shell 0.5 improvements</a>.</li>
<li><a href="https://xenodium.com/introducing-agent-shell">Introducing Emacs agent-shell (powered by ACP)</a>.</li>
<li><a href="https://xenodium.com/introducing-acpel">Introducing acp.el</a>.</li>
</ul>
<p>Hope you enjoyed the video!</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/R2Ucr3amgGg">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/R2Ucr3amgGg">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
]]></description>
    <pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 9: World times</title>
<link>https://xenodium.com/bending-emacs-episode-9-world-times</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-9-world-times</guid>
    <description><![CDATA[<p>A new year, a new <a href="https://www.youtube.com/@xenodium">Bending Emacs</a> episode, so here it goes:</p>
<p><a href="https://youtu.be/jY5lx2gHjNA">Bending Emacs Episode 9: Time around the world</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=jY5lx2gHjNA" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/jY5lx2gHjNA/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>Emacs comes with a built-in world clock: <code>M-x world-clock</code></p>
<p>To customize displayed timezones, use:</p>
<pre><code class="language-{.commonlisp">(setq world-clock-list '((&quot;America/New_York&quot; &quot;New York&quot;)
                         (&quot;America/Caracas&quot; &quot;Caracas&quot;)
                         (&quot;Europe/London&quot; &quot;London&quot;)
                         (&quot;Asia/Tokyo&quot; &quot;Tokyo&quot;)))
</code></pre>
<p>Each entry requires a valid timezone string (as per entries in your system's <code>/usr/share/zoneinfo</code>) and a display label.</p>
<p>I wanted a slightly different experience than the built-in command (<a href="https://xenodium.com/emacs-time-zones-mode">more details here</a>), so I built the <a href="https://github.com/xenodium/time-zones">time-zones</a> package.</p>
<p><code>time-zones</code> is <a href="https://melpa.org/#/time-zones">available on MELPA</a>, so you can install with:</p>
<pre><code class="language-{.commonlisp">(use-package time-zones :ensure t)
</code></pre>
<p>Toggle help with the <code>&quot;?&quot;</code> key add cities with the <code>&quot;+&quot;</code> key. Shifting time is possible via the <code>&quot;f&quot;</code> / <code>&quot;b&quot;</code> keys, in addition to a other features available via the <code>&quot;?&quot;</code> help menu.</p>
<p>Hope you enjoyed the video!</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/jY5lx2gHjNA">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/jY5lx2gHjNA">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
<h2>Make it all sustainable</h2>
<p>Enjoying this content or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>My 2025 review as an indie dev</title>
<link>https://xenodium.com/my-2025-review-as-an-indie-dev</link>
<guid isPermaLink="false">https://xenodium.com/my-2025-review-as-an-indie-dev</guid>
    <description><![CDATA[<p>In 2024, I took the leap to go indie full-time. By 2025, that shift enabled me to focus exclusively on building tools I care about, from a blogging platform, iOS apps, and macOS utilities, to Emacs packages. It also gave me the space to write regularly, covering topics like Emacs tips, development tutorials for macOS and iOS, a few cooking detours, and even launching a <a href="https://www.youtube.com/@xenodium">new YouTube channel</a>.</p>
<p>The rest of this post walks through some of the highlights from 2025. If you’ve found my work useful, please consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>.</p>
<p>Off we go…</p>
<h2>Launched a new blogging service</h2>
<p>For well over a decade, my blogging setup consisted of a handful of Elisp functions cobbled together over the years. While they did the job just fine, I couldn't shake the feeling that I could do better, and maybe even offer a blogging platform without the yucky bits of the modern web. At the beginning of the year, <a href="https://xenodium.com/blogging-minus-the-yucky-bits-of-modern-web">I launched LMNO.lol</a>. Today, my <a href="https://xenodium.com">xenodium.com</a> blog proudly runs on <a href="https://lmno.lol">LMNO.lol</a>.</p>
<p><img src="https://xenodium.github.io/images/blogging-minus-the-yucky-bits-of-modern-web/demo.gif" alt=""></p>
<p><a href="https://lmno.lol">LMNO.lol</a> blogs render pretty much anywhere (Emacs and terminals included, of course).</p>
<p><img src="https://xenodium.github.io/images/blogging-minus-the-yucky-bits-of-modern-web/anywhere.gif" alt=""></p>
<p>2026 is a great year to <a href="https://lmno.lol">start a blog</a>! Custom domains totally welcome.</p>
<h2>A journaling/note-taking app that feels like tweeting</h2>
<p>Sure, there are plenty of journaling and note-taking apps out there. For one reason or another, none of them stuck for me (including my own apps). That is, until I learned a thing or two from social media.</p>
<p>With that in mind, <a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">Journelly was born</a>: <em>like tweeting, but for your eyes only</em>. With the right user experience, I felt compelled to write things down all the time. Saving to Markdown and Org markup was the mighty sweet cherry on the cake.</p>
<center>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/icon.png" alt="Journelly app icon" width="180px"/></a>
<br>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="Download on App Store button link" width="180px"/></a>
<br>
<br>
</center>
<p><img src="https://xenodium.github.io/images/journelly-1-3-released/sideways.jpg" alt=""></p>
<h2>Let's learn Japanese</h2>
<p>As a Japanese language learning noob, what better way to procrastinate than by building yet another Kana-practicing iOS app? Turns out, it kinda did the job.</p>
<p>Here's <a href="https://xenodium.com/mochi-invaders-now-on-the-app-store">mochi invaders</a>, a fun way to practice your Kana</p>
<center>
<a href="https://apps.apple.com/app/id6747766176"><img src="https://xenodium.github.io/images/mochi-invaders-now-on-the-app-store/icon.png" alt="Mochi Invaders app icon" width="180px"/></a>
<br>
<a href="https://apps.apple.com/app/id6747766176"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="Download on App Store button link" width="180px"/></a>
<br>
<br>
</center>
<p><img src="https://xenodium.github.io/images/mochi-invaders-now-on-the-app-store/primary.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/mochi-invaders-now-on-the-app-store/secondary.png" alt=""></p>
<h2>A new Emacs-native AI/LLM agent (powered by ACP)</h2>
<p>2025 brought us the likes of Claude Code, Gemini CLI, Goose, Codex, and many more AI/LLM CLI agents. While CLI utilities have their appeal, I wanted a native Emacs integration, so I simply ignored agents for quite some time.</p>
<p>I was initially tempted to write my own Emacs agent, but ultimately decided against it. My hope was that agent providers would somehow converge to offer editor integration, so I could focus on building an Emacs integration while leveraging the solid work from many teams producing agents. With LLM APIs historically fragmented, my hope for agent convergence seemed fairly far-fetched.</p>
<p>To my surprise, ACP (<a href="https://agentclientprotocol.com">Agent Client Protocol</a>) was <a href="https://zed.dev/blog/claude-code-via-acp">announced by Zed and Google folks</a>. This was the cue I had been waiting for, so I set out to build <a href="https://github.com/xenodium/acp.el">acp.el</a>, a UX agnostic elisp library, followed by an actual client: <a href="https://github.com/xenodium/acp.el">agent-shell</a>.</p>
<p><img src="https://xenodium.github.io/images/introducing-agent-shell/agent-shell.png" alt=""></p>
<p>I'm fairly happy with how <code>agent-shell</code>'s been shaping up. This is my most popular package from 2025, receiving <a href="https://github.com/xenodium/agent-shell/issues?q=is%3Aissue">lots of user feedback</a>. If you're curious about the feature-set, I've written about <code>agent-shell</code>'s progress from early on:</p>
<ul>
<li><a href="https://xenodium.com/agent-shell-0-25-updates">agent-shell 0.25 updates</a></li>
<li><a href="https://xenodium.com/agent-shell-016-improvements-melpa">agent-shell 0.17 improvements + MELPA</a></li>
<li><a href="https://xenodium.com/agent-shell-0-5-improvements">agent-shell 0.5 improvements</a></li>
<li><a href="https://xenodium.com/introducing-agent-shell">Introducing Emacs agent-shell (powered by ACP)</a></li>
<li><a href="https://xenodium.com/introducing-acpel">Introducing acp.el</a></li>
<li><a href="https://xenodium.com/so-you-want-acp-for-emacs">So you want ACP (Agent Client Protocol) for Emacs?</a></li>
</ul>
<h2>chatgpt-shell improvements</h2>
<p>While <a href="https://github.com/xenodium/agent-shell">agent-shell</a> is the new kid on the block, <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> received <a href="https://xenodium.com/deepseek-open-router-kagi-and-perplexity-join-the-chat">DeepSeek, Open Router, Kagi, and Perplexity support</a>, in addition to a handful of other improvements and bugfixes.</p>
<h2>A new YouTube channel</h2>
<p>While most of what I share usually ends up as a blog post, this year I decided to try something new. I started the <a href="https://www.youtube.com/@xenodium">Bending Emacs YouTube channel</a> and posted 8 episodes:</p>
<ul>
<li><a href="https://xenodium.com/bending-emacs-episode-8-completing-read">Bending Emacs - Episode 8: completing-read</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-7-eshell-built-in-commands">Bending Emacs - Episode 7: Eshell built-in commands</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-6-overlays">Bending Emacs - Episode 6: Overlays</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-5-ready-player-mode">Bending Emacs - Episode 5: Ready Player Mode</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-4-batch-renaming-files">Bending Emacs - Episode 4: Batch renaming files</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-3-git-clone-the-lazy-way">Bending Emacs - Episode 3: Git clone (the lazy way)</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-2">Bending Emacs - Episode 2: From vanilla to your flavor</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-1">Bending Emacs - Episode 1: Applying CLI utils</a></li>
</ul>
<p>Enjoying the content? Leave me a comment or subscribe to <a href="https://www.youtube.com/@xenodium">my channel</a>.</p>
<h2>My decade with org (Emacs Carnival)</h2>
<p>While I enthusiastically joined the <a href="https://www.emacswiki.org/emacs/Carnival">Emacs Carnival</a>, I didn't quite manage monthly posts. Having said that, when I did participate, I went all in, documenting my <a href="https://xenodium.com/writing-experience-my-decade-with-org">org experience over the last decade</a>. Ok well… I also joined in with my <a href="https://xenodium.com/emacs-elevator-pitch">elevator pitch ;)</a></p>
<h2>Awesome Emacs on macOS</h2>
<p>While migrating workflows to Emacs makes them extra portable across platforms, I've also accumulated a bunch of tweaks <a href="https://xenodium.com/awesome-emacs-on-macos">enhancing your Emacs experience on macOS</a>.</p>
<p><img src="https://xenodium.github.io/images/awesome-emacs-on-macos/icon.png" alt=""></p>
<h2>EverTime for macOS</h2>
<p>While we're talking macOS, I typically like my desktop free from distractions, which includes hiding the status bar.</p>
<p>Having said that, I don't want to lose track of time, and for that, I <a href="https://xenodium.com/evertime-available-via-homebrew">built EverTime</a>, an ever-present floating clock (available via Homebrew).</p>
<p><img src="https://raw.githubusercontent.com/xenodium/evertime/main/screenshots/demo.gif" alt=""></p>
<h2>A new time zone Emacs package</h2>
<p>Emacs ships with a perfectly functional world clock, available via <code>M-x world-clock</code>, but I wanted a little more, so I built <a href="https://github.com/xenodium/time-zones">time-zones</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-time-zones-mode/time-zones.gif" alt=""></p>
<p>Also covered in:</p>
<ul>
<li><a href="https://xenodium.com/time-zones-now-on-melpa">time-zones now on MELPA. Do I have your support?</a></li>
<li><a href="https://xenodium.com/emacs-time-zones-mode">Emacs time-zones</a></li>
</ul>
<h2>A new WhatsApp Emacs client</h2>
<p>For better or worse, I rely on WhatsApp Messenger. Migrating to a different client or protocol just isn't viable for me, so I did the next best thing and built <a href="https://github.com/xenodium/wasabi/">wasabi</a>, an Emacs client ;)</p>
<p>While not a trivial task, <a href="https://github.com/asternic/wuzapi">wuzapi</a> and <a href="https://github.com/tulir/whatsmeow">whatsmeow</a> offered a huge leg up. I wanted tighter Emacs integration, so I <a href="https://github.com/asternic/wuzapi/pulls?q=is%3Apr%20is%3Amerged%20author%3Axenodium%20">upstreamed a handful of patches</a> to add JSON-RPC support, plus easier macOS <a href="https://github.com/asternic/wuzapi?tab=readme-ov-file#homebrew-installation">installation via Homebrew</a>.</p>
<p><img src="https://raw.githubusercontent.com/xenodium/wasabi/main/screenshots/chats.png" alt=""></p>
<p><img src="https://raw.githubusercontent.com/xenodium/wasabi/main/screenshots/chat.png" alt=""></p>
<p>Details covered in a couple of posts:</p>
<ul>
<li><a href="https://xenodium.com/whatsapp-from-you-know-where">WhatsApp from you know where</a></li>
<li><a href="https://xenodium.com/want-a-whatsapp-emacs-client">Want a WhatsApp Emacs client?</a></li>
</ul>
<h2>Spiff that shell up</h2>
<p>While both macOS and iOS offer APIs for generating URL previews, they also let you fetch rich page metadata. I built <a href="https://github.com/xenodium/rinku">rinku</a>, a tiny command-line utility, and showed how to <a href="https://xenodium.com/rinku-cli-link-previews">wire it all up via eshell</a> for a nifty shell experience.</p>
<p><img src="https://xenodium.github.io/images/rinku-cli-link-previews/rinku.gif" alt=""></p>
<p>With similar <code>eshell</code> magic, you can also get a neat <code>cat</code> experience.</p>
<p><img src="https://xenodium.github.io/images/rinku-cli-link-previews/cat.png" alt=""></p>
<h2>At one with your code</h2>
<p>I always liked the idea of generating some sort of art or graphics from a code base, so I built <a href="https://github.com/xenodium/one">one</a>, a utility to transform images into character art using text from your codebase. Also covered in a <a href="https://xenodium.com/at-one-with-your-code">short blog post</a>.</p>
<img src="https://github.com/xenodium/one/blob/main/one.gif?raw=true" width="80%" alt="Screencast converting image to source code art" />
<h2>Emacs can trim your videos too</h2>
<p>Emacs is just about the perfect porcelain for command-line utilities. With little ceremony, you can integrate almost any CLI tool. <a href="https://magit.vc/">Magit</a> remains the gold standard for CLI integration.</p>
<p>While trimming videos doesn't typically spring to mind as an Emacs use case, I was pleasantly <a href="https://xenodium.com/emacs-as-your-video-trimming-tool">surprised by the possibilities</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-as-your-video-trimming-tool/trim.gif" alt=""></p>
<h2>Landing Emacs patches upstream</h2>
<p>While I've built my <a href="https://github.com/sponsors/xenodium">fair share of Emacs packages</a>, I'm still fairly new at submitting Emacs features upstream. This year, I landed my <a href="https://xenodium.com/emacs-send-to-aka-macos-sharing-merged-upstream">send-to (aka sharing on macOS) patch</a>. While the proposal <a href="https://debbugs.gnu.org/cgi/bugreport.cgi?bug=76120">did spark quite the discussion</a>, I'm glad I stuck with it. Both Eli and Stefan were amazingly helpful.</p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-aka-macos-sharing-merged-upstream/context-menu.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-aka-macos-sharing-merged-upstream/send-to.png" alt=""></p>
<p>This year, I also wanted to experiment with dictating into my Emacs text buffers, but unfortunately <a href="https://lists.gnu.org/archive/html/bug-gnu-emacs/2025-03/msg00585.html">dictation had regressed in Emacs 30</a>.</p>
<p>Bummer. But hey, it gave me a new opportunity to submit <a href="https://xenodium.com/macos-dictation-returns-to-emacs-fix-merged">another patch upstream</a>.</p>
<p><img src="https://xenodium.github.io/images/macos-dictation-returns-to-emacs-fix-merged/dictation.webp" alt=""></p>
<h2>Ready Player improvements</h2>
<p><a href="https://github.com/xenodium/ready-player">Ready Player</a>, my Emacs media-playing package <a href="https://github.com/xenodium/ready-player/commits/main/?since=2025-01-01">received further improvements</a> like starring media (via Emacs bookmarks), enabling further customizations, and other bug fixes. Also showcased a <a href="https://xenodium.com/a-tour-of-ready-player-mode">tour of its features</a>.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/open-file.gif" alt=""></p>
<h2>GitHub activity</h2>
<ul>
<li>Commits: 1,095</li>
<li>Issues created: 37</li>
<li>PRs reviewed: 106</li>
<li>Average commits per day: ~3</li>
</ul>
<h2>New GitHub projects</h2>
<ul>
<li><a href="https://github.com/xenodium/EverTime">EverTime</a> - An ever present clock for macOS</li>
<li><a href="https://github.com/xenodium/acp.el">acp.el</a> - An ACP implementation in Emacs lisp</li>
<li><a href="https://github.com/xenodium/agent-shell">agent-shell</a> - A native Emacs buffer to interact with LLM agents powered by ACP</li>
<li><a href="https://github.com/xenodium/diverted">diverted</a> - Identify temporary Emacs diversions and return to original location</li>
<li><a href="https://github.com/xenodium/emacs-materialized-theme">emacs-materialized-theme</a> - An Emacs theme derived from Material</li>
<li><a href="https://github.com/xenodium/homebrew-evertime">homebrew-evertime</a> - EverTime formula for the Homebrew package manager</li>
<li><a href="https://github.com/xenodium/homebrew-one">homebrew-one</a> - Homebrew recipe for one</li>
<li><a href="https://github.com/xenodium/homebrew-rinku">homebrew-rinku</a> - Homebrew recipe for rinku</li>
<li><a href="https://github.com/xenodium/one">one</a> - Transform images into character art using text from your codebase</li>
<li><a href="https://github.com/xenodium/rinku">rinku</a> - Generate link previews from the command line (macOS)</li>
<li><a href="https://github.com/xenodium/time-zones">time-zones</a> - View time at any city across the world in Emacs</li>
<li><a href="https://github.com/xenodium/video-trimmer">video-trimmer</a> - A video-trimming utility for Emacs</li>
<li><a href="https://github.com/xenodium/wasabi">wasabi</a> - A WhatsApp Emacs client powered by wuzapi and whatsmeow</li>
</ul>
<h2>Blog posts</h2>
<ul>
<li><a href="https://xenodium.com/journelly-1-3-released">Journelly 1.3 released: Hello Markdown!</a></li>
<li><a href="https://xenodium.com/agent-shell-0-25-updates">agent-shell 0.25 updates</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-8-completing-read">Bending Emacs - Episode 8: completing-read</a></li>
<li><a href="https://xenodium.com/at-one-with-your-code">At one with your code</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-7-eshell-built-in-commands">Bending Emacs - Episode 7: Eshell built-in commands</a></li>
<li><a href="https://xenodium.com/rinku-cli-link-previews">Rinku: CLI link previews</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-6-overlays">Bending Emacs - Episode 6: Overlays</a></li>
<li><a href="https://xenodium.com/whatsapp-from-you-know-where">WhatsApp from you know where</a></li>
<li><a href="https://xenodium.com/want-a-whatsapp-emacs-client">Want a WhatsApp Emacs client? Will you fund it?</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-5-ready-player-mode">Bending Emacs - Episode 5: Ready Player Mode</a></li>
<li><a href="https://xenodium.com/agent-shell-016-improvements-melpa">agent-shell 0.17 improvements + MELPA</a></li>
<li><a href="https://xenodium.com/time-zones-now-on-melpa">time-zones now on MELPA. Do I have your support?</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-4-batch-renaming-files">Bending Emacs - Episode 4: Batch renaming files</a></li>
<li><a href="https://xenodium.com/emacs-time-zones-mode">Emacs time-zones</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-3-git-clone-the-lazy-way">Bending Emacs - Episode 3: Git clone (the lazy way)</a></li>
<li><a href="https://xenodium.com/agent-shell-0-5-improvements">agent-shell 0.5 improvements</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-2">Bending Emacs - Episode 2: From vanilla to your flavor</a></li>
<li><a href="https://xenodium.com/bending-emacs-episode-1">Bending Emacs - Episode 1: Applying CLI utils</a></li>
<li><a href="https://xenodium.com/introducing-agent-shell">Introducing Emacs agent-shell (powered by ACP)</a></li>
<li><a href="https://xenodium.com/introducing-acpel">Introducing acp.el</a></li>
<li><a href="https://xenodium.com/so-you-want-acp-for-emacs">So you want ACP (Agent Client Protocol) for Emacs?</a></li>
<li><a href="https://xenodium.com/diverted-mode">Diverted mode</a></li>
<li><a href="https://xenodium.com/who-moved-my-text">Who moved my text?</a></li>
<li><a href="https://xenodium.com/dired-buffers-with-media-overlays">Dired buffers with media overlays</a></li>
<li><a href="https://xenodium.com/brisket-recipe">Brisket recipe</a></li>
<li><a href="https://xenodium.com/a-tiny-upgrade-to-the-llm-model-picker">A tiny upgrade to the LLM model picker</a></li>
<li><a href="https://xenodium.com/emacs-elevator-pitch">Emacs elevator pitch</a></li>
<li><a href="https://xenodium.com/emacs-as-your-video-trimming-tool">Emacs as your video-trimming tool</a></li>
<li><a href="https://xenodium.com/macos-dictation-returns-to-emacs-fix-merged">macOS dictation returns to Emacs (fix merged)</a></li>
<li><a href="https://xenodium.com/writing-experience-my-decade-with-org">Writing experience: My decade with Org</a></li>
<li><a href="https://xenodium.com/interactive-ordering-of-dired-items">Interactive ordering of dired items</a></li>
<li><a href="https://xenodium.com/patching-your-homebrews-emacs-plus-macos">Patching your Homebrew's Emacs Plus (macOS)</a></li>
<li><a href="https://xenodium.com/emacs-send-to-aka-macos-sharing-merged-upstream">Emacs send-to (aka macOS sharing) merged upstream</a></li>
<li><a href="https://xenodium.com/mochi-invaders-now-on-the-app-store">Mochi Invaders now on the App Store</a></li>
<li><a href="https://xenodium.com/markdown-is-coming-to-journelly">Markdown is coming to Journelly</a></li>
<li><a href="https://xenodium.com/evertime-available-via-homebrew">EverTime available via Homebrew</a></li>
<li><a href="https://xenodium.com/journelly-1-2-released">Journelly 1.2 released</a></li>
<li><a href="https://xenodium.com/ranking-officer-now-on-the-app-store">Ranking Officer now on the App Store</a></li>
<li><a href="https://xenodium.com/awesome-emacs-on-macos">Awesome Emacs on macOS</a></li>
<li><a href="https://xenodium.com/journelly-1-1-released">Journelly 1.1 released</a></li>
<li><a href="https://xenodium.com/llm-text-chat-is-everywhere-whos-optimizing-ux">LLM text chat is everywhere. Who's optimizing its UX?</a></li>
<li><a href="https://xenodium.com/a-richer-journelly-org-capture-template">A richer Journelly org capture template</a></li>
<li><a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">Journelly: like tweeting but for your eyes only (in plain text)</a></li>
<li><a href="https://xenodium.com/journelly-vs-emacs-why-not-both">Journelly vs Emacs: Why Not Both?</a></li>
<li><a href="https://xenodium.com/the-mac-observer-showcases-journelly">The Mac Observer showcases Journelly</a></li>
<li><a href="https://xenodium.com/journelly-open-for-beta">Journelly open for beta</a></li>
<li><a href="https://xenodium.com/deepseek-open-router-kagi-and-perplexity-join-the-chat">DeepSeek, Open Router, Kagi, and Perplexity join the chat</a></li>
<li><a href="https://xenodium.com/keychron-k3-pro-f1-f12-as-default-macos-keys">Keychron K3 Pro: F1-F12 as default macOS keys</a></li>
<li><a href="https://xenodium.com/e-ink-bookmarks">E-ink bookmarks</a></li>
<li><a href="https://xenodium.com/sourdough-bookmarks">Sourdough bookmarks</a></li>
<li><a href="https://xenodium.com/cardamom-buns-a-yak-shaving-story-plus-recipe">Cardamom Buns recipe</a></li>
<li><a href="https://xenodium.com/a-tour-of-ready-player-mode">A tour of Ready Player Mode</a></li>
<li><a href="https://xenodium.com/a-platform-that-moulds-to-your-needs">A platform that moulds to your needs</a></li>
<li><a href="https://xenodium.com/blogging-minus-the-yucky-bits-of-modern-web">Blogging minus the yucky bits of the modern web</a></li>
</ul>
<p>Hope you enjoyed my 2025 contributions. <a href="https://github.com/sponsors/xenodium">Sponsor</a> the work.</p>
]]></description>
    <pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Journelly 1.3 released: Hello Markdown!</title>
<link>https://xenodium.com/journelly-1-3-released</link>
<guid isPermaLink="false">https://xenodium.com/journelly-1-3-released</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/journelly-1-3-released/markdown.png" alt=""></p>
<center>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px"/></a><br>
<p>Journelly 1.3 available on the App Store</p><br>
</center>
<h2>What is Journelly?</h2>
<p><a href="https://journelly.com/">Journelly</a> feels like tweeting but for your eyes only.</p>
<p>A fresh take on frictionless note-taking or journaling for iOS, powered by plain text (Markdown + Org).</p>
<ul>
<li>Save cooking recipes, movies, music, restaurants, coffee shops…</li>
<li>Jot down your thoughts.</li>
<li>Save your favorite quotes.</li>
<li>Use it as a journal, memo book, or notes.</li>
<li>Write your shopping lists.</li>
<li>Document your travels.</li>
<li>Lots more…</li>
</ul>
<p>Check out <a href="https://journelly.com">journelly.com</a> for details.</p>
<p><img src="https://xenodium.github.io/images/journelly-1-3-released/sideways.jpg" alt=""></p>
<h2>What's new?</h2>
<p>Journelly v1.3 brings Markdown support (the most requested feature), along with Simplified Chinese localization and other enhancements.</p>
<h3>Markdown support</h3>
<p>Journelly <a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">first launched</a> with <a href="https://orgmode.org/worg/org-syntax.html">Org</a> markup support, popular among Emacs enthusiasts. Markdown support has by far been the most requested feature. Thank you to everyone who reached out, shared your interest, and helped beta test early builds.</p>
<p>Whether you're a fan of <a href="https://en.wikipedia.org/wiki/Markdown">Markdown</a> or <a href="https://orgmode.org/">Org-mode</a>, Journelly now lets you store entries in your preferred format. Choose your favorite markup on first launch or via the app menu.</p>
<center>
<img src="https://raw.githubusercontent.com/xenodium/xenodium.github.io/refs/heads/master/images/journelly-1-3-released/welcome.png" alt="welcome.png" width="50%"/>
</center>
<h3>So you like Markdown things?</h3>
<p>While on topic, I also run <a href="https://lmno.lol/">lmno.lol</a>, a Markdown-powered blogging service. Simple and focused, without the frustrating parts of the modern web. Custom domains welcome. My <a href="https://xenodium.com/">xenodium.com</a> blog runs off <a href="https://lmno.lol/">lmno.lol</a>.</p>
<h3>Simplified Chinese (简体中文)</h3>
<p><strong>Simplified Chinese</strong> (简体中文) is now available, joining Journelly's list of supported languages:</p>
<ul>
<li>Simplified Chinese (简体中文)</li>
<li>Danish</li>
<li>Dutch</li>
<li>English</li>
<li>Finnish</li>
<li>French</li>
<li>German</li>
<li>Italian</li>
<li>Japanese</li>
<li>Norwegian</li>
<li>Spanish</li>
<li>Swedish</li>
</ul>
<h3>Home Screen Widget</h3>
<p>A <strong>home screen widget</strong> is now available, offering quick access to three key actions right from the home screen.</p>
<center>
<img src="https://raw.githubusercontent.com/xenodium/xenodium.github.io/refs/heads/master/images/journelly-1-3-released/widget.png" alt="widget.png" width="50%"/>
</center>
<h3>Discoverable mode</h3>
<p>Prefer clear buttons over swipe gestures? You can now enable <strong>Discoverable Mode</strong> under “Menu &gt; View.” This new mode makes features more visible and easier to navigate, perfect for folks favoring more explicit interaction over gestures or subtle hints.</p>
<center>
<img src="https://raw.githubusercontent.com/xenodium/xenodium.github.io/refs/heads/master/images/journelly-1-3-released/discoverable-mode.gif" alt="discoverable-mode.gif" width="50%"/>
</center>
<h3>Org rendering</h3>
<p>For Org users: Journelly now renders both quote and code blocks.</p>
<center>
<img src="https://raw.githubusercontent.com/xenodium/xenodium.github.io/refs/heads/master/images/journelly-1-3-released/blocks.png" alt="blocks.png" width="50%"/>
</center>
<h3>Tidying the list up</h3>
<p>The entry list received a little refresh to make better use of screen space. Bottom-aligned controls also make for easier one-handed use.</p>
<h3>Love Journelly? I need your help</h3>
<p><a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">Since launch</a>, Journelly has remained a <strong>single-payment</strong> app. <strong>No subscriptions</strong>. I get it, subscriptions are no fun.</p>
<p>That said, <strong>sustainable development is tough without regular downloads</strong>. I'm hoping the new Markdown support helps Journelly reach a wider audience.</p>
<p>Help Journelly grow:</p>
<ul>
<li><a href="https://apps.apple.com/app/id6470714669?action=write-review">Leave a review on the App Store</a>.</li>
<li><a href="https://apps.apple.com/app/id6470714669">Share Journelly</a> with your friends.</li>
</ul>
<h3>Thank you</h3>
<p>Hope you enjoy the v1.3 update.</p>
<p>Thank you for using Journelly and supporting indie development 💛💙❤️</p>
]]></description>
    <pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>agent-shell 0.25 updates</title>
<link>https://xenodium.com/agent-shell-0-25-updates</link>
<guid isPermaLink="false">https://xenodium.com/agent-shell-0-25-updates</guid>
    <description><![CDATA[<p>It's been a little while since the last <a href="https://github.com/xenodium/agent-shell">agent-shell</a> blog post <a href="https://xenodium.com/agent-shell-016-improvements-melpa">detailing changes</a>, so we're naturally due another one detailing the latest features.</p>
<h2>What's <code>agent-shell</code>?</h2>
<p>A native <a href="https://www.gnu.org/software/emacs/">Emacs</a> shell to interact with any LLM agent powered by ACP (<a href="https://agentclientprotocol.com/">Agent Client Protocol</a>).</p>
<center>✨ <a href="https://github.com/sponsors/xenodium">Sponsor agent-shell</a> ✨</center>
<h2>So what's new?</h2>
<p>Let's go through the latest changes…</p>
<h3>Viewport/compose (experimental)</h3>
<p>The biggest change is the new experimental viewport/compose mode. While agent-shell's <a href="https://www.masteringemacs.org/article/comint-writing-command-interpreter">comint</a> shell experience has its benefits, some folks may opt for a more familiar buffer experience, that is less shell-like.</p>
<p>There are perhaps 3 defining characteristics in the new viewport/compose feature:</p>
<p><strong>A dedicated compose buffer</strong>: You get a full, multiline buffer dedicated to crafting prompts. I personally find this mode of operation more natural (no need to watch out for accidental submissions via RET), but also opens up the possibility to enable your favourite minor modes that may not play nice with <code>comint</code>. You can launch compose buffers via <code>M-x agent-shell-prompt-compose</code>, edit your prompt, and when you're ready, submit with the familiar <code>C-c C-c</code> binding.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/compose.gif" alt=""></p>
<p><strong>Viewport</strong>: I've <a href="https://xenodium.com/an-experimental-e-shell-pager">experimented with shell viewports before</a> and also added a <a href="https://xenodium.com/a-chatgpt-shell-compose-ux-experiment">similar experience to chatgpt-shell</a>. This compose/viewport UX quickly became my primary way of interacting with non-agent LLMs. This is a read-only buffer typically displaying the latest agent interaction. Use <code>n/p</code> to navigate through current interaction items. Use <code>f/b</code> to switch through pages/interactions.</p>
<p><strong>Auto-modal</strong>: Compose and viewport modes complement each other and offer automatic transition between read-only and editable (compose) buffers. From a viewport, you can always press <code>r</code> to reply to the latest interaction. When replying, you automatically go into edit/compose mode. When submitting via <code>C-c C-c</code>, you automatically transition into viewport (read-only) mode.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/compose-viewport-page.gif" alt=""></p>
<p>While you can use <code>M-x agent-shell-prompt-compose</code> at any time to compose multi-line prompts and send from the shell, to get the <code>compose/viewport</code> hybrid experience, you need to enable with <code>(setq agent-shell-prefer-viewport-interaction t)</code>. From then on, <code>M-x agent-shell</code> will favor the <code>compose/viewport</code> experience. You can always jump between viewport and shell with <code>C-c C-o</code>.</p>
<h3>Prompt queueing (experimental)</h3>
<p><code>agent-shell</code> buffers now offer the ability to queue additional prompts if the agent is busy. Use <code>M-x agent-shell-queue-request</code> and <code>M-x agent-shell-remove-pending-request</code> to queue and remove requests.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/queue.gif" alt=""></p>
<h3>Session model/mode</h3>
<p>You can now change models via <code>M-x agent-shell-set-session-model</code> (<code>C-c C-v</code>), when supported by the agent.</p>
<p>For Anthropic users, we now have <code>agent-shell-anthropic-default-model-id</code> and <code>agent-shell-anthropic-default-session-mode-id</code> to set default agent model and modes. You can view available values by expanding shell handshake items.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/models.png" alt=""></p>
<p>If keen on using defaults for a different agent, <a href="https://github.com/xenodium/agent-shell/issues/new/choose">please file a feature request</a>.</p>
<h3>Set preferred agent</h3>
<p>By default, launching via <code>M-x agent-shell</code> prompts users to select one of the supported agents. You can now skip this by setting your preferred agent (<a href="https://github.com/xenodium/agent-shell/pull/129">thank you Jonathan</a>).</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-new-shell-config (agent-shell-anthropic-make-claude-code-config))
</code></pre>
<h3>Automatic transcripts</h3>
<p>While <a href="https://github.com/xenodium/shell-maker">shell-maker</a> automatically prompts users to save content when killing <code>agent-shell</code> buffers, its integration was a little clunky with agents. Elle Najt's <code>agent-shell</code>-specific implementation is now enable by default, saving Markdown transcripts to <code>project/.agent-shell/transcripts</code>. When launching new shells, you should see a message like:</p>
<pre><code>Created project/.agent-shell/transcripts/2025-12-17-22-07-38.md
</code></pre>
<p>You can always open the current transcript via <code>M-x agent-shell-open-transcript</code>.</p>
<p>To disable the new transcript generation use:</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-transcript-file-path-function nil)
</code></pre>
<h3>MCP servers</h3>
<p>Jonathan Jin introduced <code>agent-shell-mcp-servers</code>, enabling folks to add MCP servers to their agents.</p>
<p>For example:</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-mcp-servers
      '(((name . &quot;notion&quot;)
         (type . &quot;http&quot;)
         (headers . [])
         (url . &quot;https://mcp.notion.com/mcp&quot;))))
</code></pre>
<h3>Buffer search</h3>
<p>You can now search across shell nodes, including collapsed ones. When using <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Isearch.html">isearch</a> (<a href="https://github.com/abo-abo/swiper">swiper</a> too), matching nodes are now automatically expanded.</p>
<h3>DWIM context</h3>
<p>When invoking <code>M-x agent-shell</code>, active region, <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Flymake.html">flymake</a> errors, <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> and <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Image-Mode.html">image</a> buffers are now automatically considered and brought over to <code>agent-shell</code> buffers to be included while crafting prompts.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/compose-region.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/compose-files.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/compose-flymake.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/compose-image.gif" alt=""></p>
<p>There's one more. From a viewport buffer, selecting a region and pressing &quot;r&quot; (for reply) brings the selection over to the compose buffer as <a href="https://www.markdownlang.com/basic/blockquotes.html">blockquoted</a> text.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-25-updates/compose-reply.gif" alt=""></p>
<h3>Cursor support (migrated to Mike Moore's adapter)</h3>
<p>We've migrated Cursor agent support to use Mike Moore's <a href="https://github.com/blowmage/cursor-agent-acp-npm">ACP Adapter</a>.</p>
<p>Install with:</p>
<pre><code class="language-bash">npm install -g @blowmage/cursor-agent-acp
</code></pre>
<h3>New related packages</h3>
<ul>
<li><a href="https://github.com/ultronozm">Paul Nelson</a> built <a href="https://github.com/ultronozm/agent-shell-attention.el">agent-shell-attention.el</a> offering a mode line attention indicator.</li>
<li><a href="https://github.com/nineluj">Julian Hirn</a> built <a href="https://github.com/nineluj/agent-review">agent-review</a> introducing a streamlined workflow.</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li><a href="https://github.com/xenodium/agent-shell/issues/106">#106</a>: Use replace-buffer-contents instead of erase-buffer/insert</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/127">#127</a>: No longer possible to select the Anthropic model used by Claude Code</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/142">#142</a>: [bug] Crash during message streaming: markdown overlay receives nil positions</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/143">#143</a>: gemini 0.17.1 requires authMethod to authenticate (fix by <a href="https://github.com/ag91">Andrea</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/144">#144</a>: Make collapsible indicator keymap customizable</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/145">#145</a>: Unable to enter Plan Mode until after first message is sent</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/150">#150</a>: Warning (undo): Buffer 'Codex Agent @ …' undo info was 25664948 bytes long</li>
<li><a href="https://github.com/xenodium/agent-shell/issues/154">#154</a>: Gemini CLI doesn't need authorization if already logged in</li>
</ul>
<h3>Pull requests</h3>
<p>Thank you to all contributors for these improvements!</p>
<ul>
<li><a href="https://github.com/xenodium/agent-shell/pull/125">#125</a>: Fix error when viewing proposed diffs (<a href="https://github.com/jdpage">Nat Page</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/129">#129</a>: Support setting a preferred agent config (<a href="https://github.com/jinnovation">Jonathan Jin</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/138">#138</a>: Enable specifying MCP server configurations via custom variable (<a href="https://github.com/jinnovation">Jonathan Jin</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/139">#139</a>: Document MCP server config functionality (<a href="https://github.com/jinnovation">Jonathan Jin</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/140">#140</a>: README: Add MELPA badge + expand install instructions (<a href="https://github.com/jinnovation">Jonathan Jin</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/141">#141</a>: Add keybindings to cycle/set session mode (<a href="https://github.com/jinnovation">Jonathan Jin</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/149">#149</a>: Use fixed-pitch for ascii art logos (<a href="https://github.com/hexmode">Mark A. Hershberger</a>)</li>
<li><a href="https://github.com/xenodium/agent-shell/pull/155">#155</a>: Give the new custom flag to gemini for skipping the authorization (<a href="https://github.com/ccqpein">ccQpein</a>)</li>
</ul>
<h3>Lots of other work ❤️😅</h3>
<p>Beyond what's showcased, much love and effort's been poured into polishing the <code>agent-shell</code> experience. Interested in the nitty-gritty? Have a look through the <a href="https://github.com/xenodium/agent-shell/compare/e874872...bd9deb5">122 commits</a> since the last blog post.</p>
<h3>Make the work sustainable</h3>
<p>If <a href="https://github.com/xenodium/agent-shell">agent-shell</a> or <a href="https://github.com/xenodium/acp.el">acp.el</a> are useful to you, please consider <a href="https://github.com/sponsors/xenodium">sponsoring</a> development. LLM tokens aren't free, and neither is the time dedicated to building this stuff ;-)</p>
]]></description>
    <pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 8: completing-read</title>
<link>https://xenodium.com/bending-emacs-episode-8-completing-read</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-8-completing-read</guid>
    <description><![CDATA[<p>Nearly a couple of weeks since the last <a href="https://www.youtube.com/@xenodium">Bending Emacs</a> episode, so here's a new episode:</p>
<p><a href="https://youtu.be/J_WxzZXuTLI">Bending Emacs Episode 8: completing-read</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=J_WxzZXuTLI" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/J_WxzZXuTLI/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>In this video, we take a look at the humble but mighty <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion.html">completing-read</a> function. We can use it to craft our purpose-built tools, whether in pure elisp or to interact with command-line utilities.</p>
<p>Of interest, I also highlighted the great <a href="https://github.com/xuchunyang/elisp-demos">elisp-demos</a> package, which extends your help buffers with sample snippets.</p>
<p>Here are some of the <code>completing-read</code> snippets we played with:</p>
<p>Pick a queen:</p>
<pre><code class="language-{.commonlisp">(completing-read &quot;Pick a Queen: &quot;
                 '(&quot;Queen of Hearts ♥&quot;
                   &quot;Queen of Spades ♠&quot;
                   &quot;Queen of Clubs ♣&quot;
                   &quot;Queen of Diamonds ♦&quot;)
                 ;; predicate
                 nil
                 ;; require match
                 t)
</code></pre>
<p>Our own hashing function with an algo picker:</p>
<pre><code class="language-{.commonlisp">(defun misc/hash-region ()
  (interactive)
  (message &quot;Hash: %s&quot; (secure-hash (intern (completing-read
                                            &quot;Hash type: &quot;
                                            '(md5 sha1 sha224 sha256 sha384 sha512)))
                                   (current-buffer)
                                   (when (use-region-p)
                                     (region-beginning))
                                   (when (use-region-p)
                                     (region-end)))))
</code></pre>
<p>A first look at integrating completing read with a CLI util:</p>
<pre><code class="language-{.commonlisp">(completing-read &quot;Select file: &quot;
                 (string-split (shell-command-to-string &quot;ls -1 ../&quot;) &quot;\n&quot;))
</code></pre>
<p>Also got creative with <a href="https://github.com/lapfelix/BluetoothConnector">BluetoothConnector</a> on macOS and <code>completing-read</code>.</p>
<pre><code class="language-{.commonlisp">(completing-read &quot;Toggle BT connection: &quot;
                 (mapcar (lambda (device)
                           ;; Extract device name
                           (nth 1 (split-string device &quot; - &quot;)))
                         (seq-filter
                          (lambda (line)
                            ;; Keep lines like: af-8c-3b-b1-99-af - Device name
                            (string-match-p &quot;^[0-9a-f]\\{2\\}&quot; line))
                          (split-string (shell-command-to-string &quot;BluetoothConnector&quot;) &quot;\n&quot;))))
</code></pre>
<p>Some of my completing-read uses:</p>
<ul>
<li>
<p><a href="https://xenodium.com/emacs-quick-kill-process">Emacs: quickly killing processes</a>.</p>
</li>
<li>
<p><a href="https://xenodium.com/emacs-insert-and-render-sf-symbols">Emacs: insert and render SF symbols</a>.</p>
</li>
<li>
<p><a href="https://github.com/xenodium/dwim-shell-command/blob/35ca64d529987578dbbdf3f07d34310ee727b4a5/dwim-shell-commands.el#L1357">macOS open with</a>.</p>
</li>
<li>
<p><a href="https://github.com/xenodium/dwim-shell-command/blob/35ca64d529987578dbbdf3f07d34310ee727b4a5/dwim-shell-commands.el#L1339">macOS set default app</a>.</p>
</li>
<li>
<p><a href="https://github.com/xenodium/dwim-shell-command/blob/35ca64d529987578dbbdf3f07d34310ee727b4a5/dwim-shell-commands.el#L1243">macOS share</a> (the unhinged way).</p>
</li>
<li>
<p><a href="https://github.com/xenodium/ready-player">ready-player</a> search.</p>
<p>Hope you enjoyed the video!</p>
</li>
</ul>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/J_WxzZXuTLI">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/J_WxzZXuTLI">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
<h2>Make it all sustainable</h2>
<p>Enjoying this content or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>At one with your code</title>
<link>https://xenodium.com/at-one-with-your-code</link>
<guid isPermaLink="false">https://xenodium.com/at-one-with-your-code</guid>
    <description><![CDATA[<p>While in the mood to <a href="https://xenodium.com/rinku-cli-link-previews">goof around with Emacs, CLI, and image rendering</a>, I've revised an idea to generate some sort of art from your codebase (or any text really). That is, given an image, generate a textual representation, potentially using source code as input.</p>
<p>With that, here's <a href="https://github.com/xenodium/one">one</a>: a utility to transform images into character art using text from your codebase.</p>
<p>Rather than tell you more about it, best to see it in action.</p>
<img src="https://github.com/xenodium/one/blob/main/one.gif?raw=true" width="80%" alt="Screencast converting image to source code art" />
<p>Just a bit of fun. That's all there is to it.</p>
<p>While I've only run it on macOS, <code>one</code>'s written in Go, so should be fairly portable. I'd love to know if you get it running on Linux. The code's on <a href="https://github.com/xenodium/one">GitHub</a>.</p>
<p>If you're on macOS, I've added a <a href="https://brew.sh">Homebrew</a> on <a href="https://github.com/xenodium/homebrew-one">GitHub</a>, so you should just be able to install with:</p>
<pre><code class="language-{.bash">brew install --HEAD xenodium/one/one
</code></pre>
<h2>Make it all sustainable</h2>
<p>Having fun with <code>one</code>? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 7: Eshell built-in commands</title>
<link>https://xenodium.com/bending-emacs-episode-7-eshell-built-in-commands</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-7-eshell-built-in-commands</guid>
    <description><![CDATA[<p>With my recent <a href="https://xenodium.com/rinku-cli-link-previews">rinku post</a> and <a href="https://xenodium.com/bending-emacs-episode-6-overlays">Bending Emacs episode 6</a> both fresh in mind, I figured I may as well make another Bending Emacs episode, so here we are:</p>
<p><a href="https://youtu.be/M6o1N2kfmuc">Bending Emacs Episode 7: Eshell built-in commands</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=M6o1N2kfmuc" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/M6o1N2kfmuc/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>Check out the <a href="https://xenodium.com/rinku-cli-link-previews">rinku post</a> for a rundown of things covered in the video.</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/93wWCroTKnM">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/M6o1N2kfmuc">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
<h2>Make it all sustainable</h2>
<p>Enjoying this content or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Rinku: CLI link previews</title>
<link>https://xenodium.com/rinku-cli-link-previews</link>
<guid isPermaLink="false">https://xenodium.com/rinku-cli-link-previews</guid>
    <description><![CDATA[<p>In my last <a href="https://www.youtube.com/watch?v=77NtPfgr4x0&amp;list=PLudVBwrl_ir84jCQtAzDVtBc_oSIBvdCO&amp;pp=gAQB">Bending Emacs</a> episode, I <a href="https://xenodium.com/bending-emacs-episode-6-overlays">talked about overlays</a> and used them to render link previews in an Emacs buffer.</p>
<p>While the overlays merely render an image, the actual link preview image is generated by <a href="https://github.com/xenodium/rinku">rinku</a>, a tiny command line utility I built recently.</p>
<p><code>Rinku</code> leverages macOS APIs to do the actual heavy lifting, rendering/capturing a view off screen, and saving to disk. Similarly, it can fetch preview metadata, also saving the related thumbnail to disk. In both cases, <code>rinku</code> outputs to JSON.</p>
<p>By default, <code>rinku</code> fetches metadata for you.</p>
<pre><code class="language-{.bash">rinku https://soundcloud.com/shehackedyou
</code></pre>
<p>Returns:</p>
<pre><code class="language-json">{
  &quot;title&quot;: &quot;she hacked you&quot;,
  &quot;url&quot;: &quot;https://soundcloud.com/shehackedyou&quot;,
  &quot;image&quot;: &quot;path/to/preview.png&quot;
}
</code></pre>
<p>In this instance, the image looks a little something like this:</p>
<p><a href="https://soundcloud.com/shehackedyou"><img src="https://github.com/xenodium/rinku/blob/main/thumbnail.png?raw=true" width="300px" alt="Metadata thumbnail of SoundCloud link" /></a></p>
<p>On the other hand, the <code>--render</code> flag generates a preview, very much like the ones you see in native macOS and iOS apps.</p>
<pre><code class="language-{.bash">rinku --render https://soundcloud.com/shehackedyou
</code></pre>
<p>Returns:</p>
<pre><code class="language-json">{
  &quot;image&quot;: &quot;path/to/preview.png&quot;
}
</code></pre>
<p>Similarly, the preview renders as follows:</p>
<p><a href="https://soundcloud.com/shehackedyou"><img src="https://github.com/xenodium/rinku/blob/main/render.png?raw=true" width="300px" alt="Rendered preview of SoundCloud link" /></a></p>
<h2>Eshell superpowers</h2>
<p>While overlays is one way to integrate <code>rinku</code> anywhere in Emacs, I had been meaning to look into what I can do for eshell in particular. <a href="https://xenodium.com/yasnippet-in-emacs-eshell">Eshell is just another buffer</a>, and while overlays could do the job, I wanted a shell-like experience. After all, I already knew we can <a href="https://xenodium.com/wizard-zines-comics-eshell-util">echo images into an eshell buffer</a>.</p>
<p>Before getting to <code>rinku</code> on <code>eshell</code>, there's a related hack I'd been meaning to get to for some time… While we're all likely familiar with the <a href="https://www.man7.org/linux/man-pages/man1/cat.1.html">cat</a> command, I remember being a little surprised to find that <code>eshell</code> offers an alternative <code>cat</code> elisp implementation. Surprised too? Go check it!</p>
<pre><code class="language-{.bash">$ which cat
eshell/cat is a native-comp-function in ‘em-unix.el’.
</code></pre>
<p>Where am I going with this? Well, if eshell's <code>cat</code> command is an elisp implementation, we know its internals are <a href="https://xenodium.com/its-all-up-for-grabs-and-it-compounds">up for grabs</a>, so we can technically extend it to display images too. <code>eshell/cat</code> is just another function, so we can <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html">advice it</a> to add image superpowers.</p>
<p>I was pleasantly surprised at how little code was needed. It basically scans for image arguments to handle within advice and otherwise delegates to <code>eshell</code>'s original <code>cat</code> implementation.</p>
<pre><code class="language-{.commonlisp">(defun adviced:eshell/cat (orig-fun &amp;rest args)
  &quot;Like `eshell/cat' but with image support.&quot;
  (if (seq-every-p (lambda (arg)
                     (and (stringp arg)
                          (file-exists-p arg)
                          (image-supported-file-p arg)))
                   args)
      (with-temp-buffer
        (insert &quot;\n&quot;)
        (dolist (path args)
          (let ((spec (create-image
                       (expand-file-name path)
                       (image-type-from-file-name path)
                       nil :max-width 350
                       :conversion (lambda (data) data))))
            (image-flush spec)
            (insert-image spec))
          (insert &quot;\n&quot;))
        (insert &quot;\n&quot;)
        (buffer-string))
    (apply orig-fun args)))

(advice-add #'eshell/cat :around #'adviced:eshell/cat)
</code></pre>
<p>And with that, we can see our freshly powered-up <code>cat</code> command in action:</p>
<p><img src="https://xenodium.github.io/images/rinku-cli-link-previews/cat.png" alt=""></p>
<p>By now, you may wonder why the <code>cat</code> detour when the post was really about <code>rinku</code>? You see, this is Emacs, and everything compounds! We can now leverage our revamped <code>cat</code> command to give similar <code>eshell</code> superpowers to <code>rinku</code>, by merely adding an <code>eshell/rinku</code> function.</p>
<p>As we now know, <code>rinku</code> outputs things to JSON, so we can use <code>json-read-from-string</code> to parse the process output and subsequently feed the image path to <code>eshell/cat</code>. <code>rinku</code> can also output link titles, so we can show that too whenever possible.</p>
<pre><code class="language-{.commonlisp">(defun eshell/rinku (&amp;rest args)
  &quot;Fetch link preview with rinku and display image inline.

Usage: rinku https://soundcloud.com/shehackedyou
       rinku --render https://soundcloud.com/shehackedyou&quot;
  (unless args
    (error &quot;rinku: no arguments provided&quot;))
  (let* ((output (with-temp-buffer
                   (apply #'call-process &quot;rinku&quot; nil t nil args)
                   (buffer-string)))
         (metadata (condition-case nil
                       (json-read-from-string output)
                     (error nil))))
    (if metadata
        (concat
         (if (map-elt metadata 'image)
             (eshell/cat (map-elt metadata 'image))
           &quot;\n&quot;)
         (when (map-elt metadata 'title)
           (concat (map-elt metadata 'title)
                   &quot;\n\n&quot;)))
      output)))
</code></pre>
<p>With that, we can see the lot in action:</p>
<p><img src="https://xenodium.github.io/images/rinku-cli-link-previews/rinku.gif" alt=""></p>
<p>While non-Emacs users are often puzzled by how frequently we bring user flows and integrations on to our beloved editor, once you learn a little elisp, you start realising how relatively easily things can integrate with one another and pretty much <a href="https://xenodium.com/its-all-up-for-grabs-and-it-compounds">everything is up for grabs</a>.</p>
<h2>Make it all sustainable</h2>
<p>Reckon <code>rinku</code> and these tips will be useful to you? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 6: Overlays</title>
<link>https://xenodium.com/bending-emacs-episode-6-overlays</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-6-overlays</guid>
    <description><![CDATA[<p>The Bending Emacs series continues with a new a new episode.</p>
<p><a href="https://youtu.be/93wWCroTKnM">Bending Emacs Episode 6: Overlays</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=93wWCroTKnM" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/93wWCroTKnM/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>Today we had a quick intro to overlays. Here's the snippet I used for adding snippets:</p>
<pre><code class="language-{.commonlisp">(save-excursion
  (goto-char (point-min))
  (when (search-forward &quot;Hello World&quot; nil t)
    (let* ((start (match-beginning 0))
           (end (match-end 0))
           (ov (make-overlay start end)))
      (overlay-put ov 'face '(:box (:line-width 1 :color &quot;yellow&quot;)))
      ;; (overlay-put ov 'face 'underline)
      ;; (overlay-put ov 'face 'highlight)
      ;; (overlay-put ov 'before-string &quot;🔥 &quot;)
      ;; (overlay-put ov 'after-string  &quot; 🚀&quot;)
      ;; (overlay-put ov 'display  &quot;Howdy Planet&quot;)
      ;; (overlay-put ov 'invisible t)
      ;; (overlay-put ov 'help-echo &quot;Yay overlay!&quot;)
      ;; (overlay-put ov 'mouse-face 'success)
      (overlay-put ov 'category 'overlays)
      (overlay-put ov 'evaporate t)
      ov)))

</code></pre>
<p>Similarly, this is what we used for removing the overlay.</p>
<pre><code class="language-{.commonlisp">(remove-overlays (point-min) (point-max)
                 'category 'overlays)
</code></pre>
<p>Of the experiments, you can find:</p>
<ul>
<li>Redaction snippet <a href="https://xenodium.com/redact-that-buffer">at the related blog post</a>.</li>
<li>Dired media metadata at Ready Player's <a href="https://github.com/xenodium/ready-player/blob/main/ready-player-dired.el">ready-player-dired.el</a>.</li>
<li>Link previews: While I don't have elisp to share for link previews just yet, I did release a tiny thumbnail utility named <a href="https://github.com/xenodium/rinku">rinku</a> ;)</li>
</ul>
<p>Hope you enjoyed the video!</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/93wWCroTKnM">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/93wWCroTKnM">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
<h2>Make it all sustainable</h2>
<p>Enjoying this content or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>WhatsApp from you know where</title>
<link>https://xenodium.com/whatsapp-from-you-know-where</link>
<guid isPermaLink="false">https://xenodium.com/whatsapp-from-you-know-where</guid>
    <description><![CDATA[<p>While there are plenty of messaging alternatives out there, for better or worse, <a href="https://www.whatsapp.com/">WhatsApp</a> remains a necessity for some of us.</p>
<p>With that in mind, I looked for ways to bring WhatsApp messaging to the comfort of my beloved text editor.</p>
<p>As mentioned in <a href="https://xenodium.com/want-a-whatsapp-emacs-client">my initial findings</a>, WhatsApp on Emacs is totally doable with the help of <a href="https://github.com/asternic/wuzapi">wuzapi</a> and <a href="https://github.com/tulir/whatsmeow">whatsmeow</a>, which offer a huge leg up.</p>
<h2>Wasabi joins the chat</h2>
<p>Today, I introduce a super early version of <a href="https://github.com/xenodium/wasabi/">Wasabi</a>, a native Emacs interface for WhatsApp messaging.</p>
<p align="center">
<img src="https://raw.githubusercontent.com/xenodium/wasabi/main/screenshots/chats.png" width="48%" alt="Chats view">
<img src="https://raw.githubusercontent.com/xenodium/wasabi/main/screenshots/chat.png" width="48%" alt="Chat view">
</p>
<h2>Simple install as a feature/goal</h2>
<p>I wanted <code>Wasabi</code> installation/setup to be as simple as possible. Ideally, you install a single Emacs package and off you go.</p>
<p>While leveraging <a href="https://xmpp.org/">XMPP</a> is rather appealing in reusing existing Emacs messaging packages, I felt setting up a WhatsApp gateway or related infrastructure to be somewhat at odds with <code>wasabi</code>'s simple installation goal. Having said that, <a href="https://github.com/asternic/wuzapi">wuzapi</a>/<a href="https://github.com/tulir/whatsmeow">whatsmeow</a> offer a great middle ground. You install a single binary dependency, along with <code>wasabi</code>, and you're ready to go. This isn't too different from the <a href="https://git-scm.com/">git</a> + <a href="https://magit.vc/">magit</a> combo.</p>
<p>As of now, <code>wasabi</code>'s installation/setup boils down to two steps if you're on macOS:</p>
<pre><code class="language-{.commonlisp">(use-package wasabi
  :ensure t
  :vc (:url &quot;https://github.com/xenodium/wasabi&quot; :branch &quot;main&quot;))
</code></pre>
<pre><code class="language-{.bash">brew install asternic/wuzapi/wuzapi
</code></pre>
<p>While you may try <a href="https://brew.sh/">Homebrew</a> on Linux, you're likely to prefer your native package manager. If that fails, <a href="https://github.com/xenodium/wasabi?tab=readme-ov-file#build-wuzapi-from-source">building wuzapi from source</a> is also an option.</p>
<h2>Upstreaming <code>wuzapi</code> patches</h2>
<p>While <code>wuzapi</code> runs as a <a href="https://en.wikipedia.org/wiki/REST">RESTful</a> API service + <a href="https://en.wikipedia.org/wiki/Webhook">webhooks</a>, I wanted to simplify the Emacs integration by using <a href="https://www.jsonrpc.org">json-rpc</a> over standard I/O, enabling us to leverage incoming <code>json-rpc</code> notifications in place of <code>webhooks</code>.</p>
<p>I <a href="https://github.com/asternic/wuzapi/pull/199">floated the idea of adding json-rpc to wuzapi</a> to <code>wuzapi</code>'s author Nicolas, and to my delight, he was keen on it. He's now merged <a href="https://github.com/asternic/wuzapi/pull/199#issuecomment-3534196183">my initial proof of concept</a>, and I followed up with a handful of additional patches (all merged now):</p>
<ul>
<li><a href="https://github.com/asternic/wuzapi/pull/213">Add JSON-RPC 2.0 stdio mode (via -mode=stdio) for communication</a></li>
<li><a href="https://github.com/asternic/wuzapi/pull/217">Expose more HTTP endpoints as JSON-RPCs</a>.</li>
<li><a href="https://github.com/asternic/wuzapi/pull/216">Enable setting a custom data directory via -datadir=/path/to/data</a>.</li>
<li><a href="https://github.com/asternic/wuzapi/pull/222">Add Homebrew recipe/installation</a>.</li>
</ul>
<h2>Early days - But give it a try!</h2>
<p>With the latest <a href="https://github.com/xenodium/wasabi/">Wasabi</a> Emacs package and <a href="https://github.com/asternic/wuzapi">wuzapi</a> binary, you now get the initial WhatsApp experience I've been working towards. At present, you can send/receive messages to/from 1:1 or group chats. You can also download/view images as well as videos. Viewing reactions is also supported.</p>
<p>Needless to say, you may find some initial rough edges in addition to missing features. Having said that, I'd love to hear your feedback and experience. As mentioned <code>Wasabi</code> is currently <a href="https://github.com/xenodium/wasabi/">available on GitHub</a>.</p>
<h2>Reckon Wasabi is worth it?</h2>
<p>I've now put in quite a bit of effort prototyping things, upstreaming changes to <code>wuzapi</code>, and building the first iteration of <a href="https://github.com/xenodium/wasabi/">wasabi</a>. I gotta say, it feels great to be able to quickly message and catch up with different chats from the comfort of Emacs. Having said that, it's taken a lot of work to get here and will require plenty more to get to a polished and featureful experience.</p>
<p>Since going full-time indie dev, I have the flexibility to work on projects of choice, but that's only to an extent. If I cannot make the project sustainable, I'll eventually move to work on something else that is.</p>
<p>If you're keen on <a href="https://github.com/xenodium/wasabi/">Wasabi</a>'s offering, <a href="https://github.com/sponsors/xenodium">please consider sponsoring the effort</a>, and please reach out to voice your interest (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="https://bsky.app/profile/xenodium.bsky.social">Bluesky</a>).</p>
<p>Reckon a WhatsApp Emacs client would help you stay focused at work (less time on your phone)? Ask your employer to <a href="https://github.com/sponsors/xenodium">sponsor it</a> too ;-)</p>
]]></description>
    <pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Want a WhatsApp Emacs client? Will you fund it?</title>
<link>https://xenodium.com/want-a-whatsapp-emacs-client</link>
<guid isPermaLink="false">https://xenodium.com/want-a-whatsapp-emacs-client</guid>
    <description><![CDATA[<p>Like it or not, <a href="https://www.whatsapp.com/">WhatsApp</a> is a necessity for some of us. I wish it weren't the case, but here we are.</p>
<p>Given the circumstances, I wish I could use WhatsApp a little more on my terms. And by that, I mean from an Emacs client, of course. Surely I'm not the only one who feels this way, right? Right?! Fortunately, <a href="https://www.reddit.com/r/emacs/comments/1opy9mp/i_cant_do_without_whatsapp_for_complicated/">I'm not alone</a>.</p>
<p>With that in mind, I've been hard at work prototyping, exploring what's feasible. Spoiler alert: it's totally possible, though will require a fair bit of work.</p>
<p>Thankfully, two wonderful projects offer a huge leg up: <a href="https://github.com/asternic/wuzapi">wuzapi</a> and <a href="https://github.com/tulir/whatsmeow">whatsmeow</a>.</p>
<p><a href="https://github.com/asternic/wuzapi">wuzapi</a> offers a <a href="https://en.wikipedia.org/wiki/REST">REST</a> API on top of <a href="https://github.com/tulir/whatsmeow">whatsmeow</a>, a Go library leveraging WhatsApp's multi-device web API.</p>
<p>Last week, I prototyped sending a WhatsApp message using <code>wuzapi</code>'s <code>REST</code> API.</p>
<p><img src="https://xenodium.github.io/images/want-a-whatsapp-emacs-client/whatsapp-send.gif" alt=""></p>
<p>I got there fairly quickly by onboarding myself on to <code>wuzapi</code> using its web interface and wiring <a href="https://github.com/xenodium/shell-maker">shell-maker</a> to send an HTTP message request via <code>curl</code>. While these two were enough for a quick demo, they won't cut it for a polished Emacs experience.</p>
<p>While I can make REST work, I would like a simpler integration under the hood. REST is fine for outgoing messages, but then I need to integrate webhooks for incoming events. No biggie, can be done, but now I have to deal with two local services opening a couple of ports. Can we simplify a little? Yes we can.</p>
<p>You may have seen me talk about <a href="https://github.com/xenodium/agent-shell">agent-shell</a>, my Emacs package implementing <a href="https://agentclientprotocol.com">Agent Client Protocol (ACP)</a>… Why is this relevant, you may ask? Well, after building a native Emacs <code>ACP</code> implementation, I learned a bit about <a href="https://www.jsonrpc.org/specification">json-rpc</a> over standard I/O. The simplicity here is that we can bring bidirectional communication to an Emacs-owned process. No need for multiple channels handling incoming vs outgoing messages.</p>
<p>So where's this all going?</p>
<p>I've been prototyping some patches on top of <a href="https://github.com/asternic/wuzapi">wuzapi</a> to expose <code>json-rpc</code> over standard I/O (as an alternative to <code>REST</code>). This prototype goes far beyond my initial experiment with sending messages, and yet the Emacs integration is considerably simpler, not to mention looking very promising. Here's a demo showing incoming WhatsApp messages, received via <code>json-rpc</code>, all through a single Emacs-owned process. Look ma, no ports!</p>
<p><img src="https://xenodium.github.io/images/want-a-whatsapp-emacs-client/whatsapp-receive.gif" alt=""></p>
<h2>It's feasible (but still lots to do)</h2>
<p>These early prototypes are encouraging, but we've only scratched the surface. Before you can send and receive messages, you need to onboard users to the WhatsApp Emacs client. That is, you need to create a <code>wuzapi</code> user, manage/connect to a session, authorize via a QR code, and more. You'll want this flow to be realiable and that's just onboarding.</p>
<p>From there, you'll need to manage contacts, chats, multiple message types, incoming notifications… the list goes on. That's just the Emacs side. As mentioned, I've also been patching <code>wuzapi</code>. My plan is to <a href="https://github.com/asternic/wuzapi/issues/196">upstream these changes</a>, rather than maintaining a fork.</p>
<h2>Will you fund the work?</h2>
<p>I've prototyped quite a few things now, including the onboarding experience with QR code scanning. At this point, I feel fairly optimistic about feasibility, which is all pretty exciting! But there's a bunch of work needed. Since going full-time indie dev, I have the time available (for now), but it's hard to justify this effort without aiming for some level of sustainability.</p>
<p>If you're interested in making this a reality, <a href="https://github.com/sponsors/xenodium">please consider sponsoring the effort</a>, and please reach out to voice your interest (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="https://bsky.app/profile/xenodium.bsky.social">Bluesky</a>).</p>
<p>Reckon a WhatsApp Emacs client would help you stay focused at work (less time on your phone)? Ask your employer to <a href="https://github.com/sponsors/xenodium">sponsor it</a> too ;-)</p>
]]></description>
    <pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 5: Ready Player Mode</title>
<link>https://xenodium.com/bending-emacs-episode-5-ready-player-mode</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-5-ready-player-mode</guid>
    <description><![CDATA[<p>I'm now a bit over a month into my Emacs video-making journey. Today I bring a new episode.</p>
<p><a href="https://youtu.be/BjCgo6NC9Zw">Bending Emacs Episode 5: Ready Player Mode</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=BjCgo6NC9Zw" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/BjCgo6NC9Zw/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>Having migrated to mostly playing offline music, in this episode I show how to use <a href="https://github.com/xenodium/ready-player">Ready Player Mode</a> (a package I built) for this purpose.</p>
<p>This is what my <code>Ready Player</code> configuration mostly looks like:</p>
<pre><code class="language-{.commonlisp">(use-package ready-player
  :ensure t
  :custom
  (ready-player-my-media-collection-location &quot;~/Music/Music/Media.localized/Music&quot;)
  :config
  (ready-player-mode +1))
</code></pre>
<p>Note that <code>ready-player-mode</code> adds a global <code>C-c m</code>, which is <a href="https://github.com/xenodium/ready-player?tab=readme-ov-file#global-key-bindingsh">https://github.com/xenodium/ready-player?tab=readme-ov-file#global-key-bindingsh</a></p>
<p>On macOS, I have one additional bit to tweak button icons to use SF Symbols. You'll need to <a href="https://xenodium.com/emacs-insert-and-render-sf-symbols">tweak your fonts too</a>.</p>
<pre><code class="language-{.commonlisp">(set-fontset-font t nil &quot;SF Pro Display&quot; nil 'append)
(ready-player-macos-use-sf-symbols)
</code></pre>
<p>On a related blog post, I gave <a href="https://xenodium.com/a-tour-of-ready-player-mode">a tour of Ready Player Mode</a>.</p>
<p>In the video, I also mentioned <code>dired</code> buffers are at the heard of <code>Ready Player</code>. My <a href="https://xenodium.com/the-dired-abstraction">dired abstraction post</a> shows how to programmatically craft a valid <code>dired</code> buffer. Spoiler alert, it's pretty simple:</p>
<pre><code class="language-{.commonlisp">(let ((default-directory &quot;/absolute/path/to/Music/George Benson&quot;))
  (dired '(&quot;*My fancy m3u list*&quot;
           &quot;Body Talk/01 Dance.mp3&quot;
           &quot;Body Talk/02 When Love Has Grown.mp3&quot;
           &quot;Body Talk/03 Plum.mp3&quot;
           &quot;Original Album Classics/1-01 So What.mp3&quot;
           &quot;Original Album Classics/1-02 The Gentle Rain (From the Film, _The Gentle Rain_).mp3&quot;
           &quot;Original Album Classics/1-03 All Clear.mp3&quot;
           &quot;The Shape Of Things To Come/01 Footin' It.mp3&quot;
           &quot;The Shape Of Things To Come/02 Face It Boy It's Over.mp3&quot;
           &quot;The Shape Of Things To Come/03 Shape Of Things To Come.mp3&quot;)))

</code></pre>
<p>Hope you enjoyed the video!</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/BjCgo6NC9Zw">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/BjCgo6NC9Zw">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
<h2>Make it all sustainable</h2>
<p>Enjoying this content or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>agent-shell 0.17 improvements + MELPA</title>
<link>https://xenodium.com/agent-shell-016-improvements-melpa</link>
<guid isPermaLink="false">https://xenodium.com/agent-shell-016-improvements-melpa</guid>
    <description><![CDATA[<p>While it's only been a few weeks since the <a href="https://xenodium.com/agent-shell-0-5-improvements">last agent-shell post</a>, there are plenty of new updates to share.</p>
<p>What's <a href="https://github.com/xenodium/agent-shell">agent-shell</a> again? A native Emacs shell to interact with any LLM agent powered by ACP (<a href="https://agentclientprotocol.com/">Agent Client Protocol</a>).</p>
<h2>Thank you sponsors</h2>
<p>Before getting to the latest and greatest, I'd like to say thank you to <a href="https://github.com/sponsors/xenodium#sponsors">new and existing sponsors</a> backing my projects.</p>
<p>While the work going in remains largely unsustainable, your contributions are indeed helping me get closer to sustainability. Thank you!</p>
<p>If you benefit from my content and projects, please <a href="https://github.com/sponsors/xenodium">consider sponsoring</a> to make the work sustainable.</p>
<h2>More productive at work?</h2>
<p>Work paying for your LLM tokens and other tools? Why not <a href="https://github.com/sponsors/xenodium">get your employer to sponsor agent-shell</a> also?</p>
<h2>MELPA</h2>
<p>Now on to the very first update… Both <a href="https://melpa.org/#/agent-shell">agent-shell</a> and <a href="https://melpa.org/#/acp">acp.el</a> are now available on MELPA. As such, <code>agent-shell</code> installation now boils down to:</p>
<pre><code class="language-{.commonlisp">(use-package agent-shell :ensure t)
</code></pre>
<h2>New providers</h2>
<p><a href="https://opencode.ai/">OpenCode</a> and <a href="https://github.com/QwenLM/qwen-code">Qwen Code</a> are two of the latest agents to join <a href="https://github.com/xenodium/agent-shell">agent-shell</a>. Both accessible via <code>M-x agent-shell</code> and <code>M-x agent-shell-new-shell</code> through the agent picker, but also directly from <code>M-x agent-shell-opencode-start-agent</code> and <code>M-x agent-shell-qwen-start</code>.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/qwen.png" alt=""></p>
<h2>Send files - Thanks to Ian Davidson</h2>
<p>Adding files as context has seen quite a few improvements in different shapes. Thank you Ian Davidson for contributing embedded context support.</p>
<h3>Send screenshots</h3>
<p>Invoke <code>M-x agent-shell-send-screenshot</code> to take a screenshot and automatically send it over to <code>agent-shell</code>.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/whos-this.webp" alt=""></p>
<h3>Activity Indicator</h3>
<p>A little side-note, did you notice the activity indicator in the header bar? Yep. That's new too.</p>
<h3>@ completion (experimental)</h3>
<p>While <code>@</code> file completion remains experimental, you can enable via:</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-file-completion-enabled t)
</code></pre>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/at-completion.gif" alt=""></p>
<h3>Send files or regions</h3>
<p>From any file you can now invoke <code>M-x agent-shell-send-file</code> to send the current file to <code>agent-shell</code>. If region is selected, region information is sent also. Fancy sending a different file other than current one? Invoke <code>M-x agent-shell-send-file</code> with <code>C-u prefix</code>, or just use <code>M-x agent-shell-send-other-file</code>.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/send-region.gif" alt=""></p>
<h3>Send <code>dired</code> files</h3>
<p><code>M-x agent-shell-send-file</code>, also operates on <code>dired</code> files (selection or region), <a href="https://xenodium.com/emacs-dwim-do-what-i-mean">DWIM style</a> ;-)</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/send-dired.gif" alt=""></p>
<h2>Shorter paths in titles</h2>
<p>You may have noticed paths in section titles are no longer displayed as absolute paths. We're shortening those relative to project roots.</p>
<h2>Shell creation / handling</h2>
<p>While you can invoke <code>M-x agent-shell</code> with <code>C-u</code> prefix to create new shells, <code>M-x agent-shell-new-shell</code> is now available (and more discoverable than <code>C-u</code>).</p>
<h2>Cancelling sessions</h2>
<p>Cancelling prompt sessions (via <code>C-c C-c</code>) is much more reliable now. If you experienced a shell getting stuck after cancelling a session, that's because we were missing part of the protocol implementation. This is now implemented.</p>
<h2>Shell commands</h2>
<p>Use the new <code>M-x agent-shell-insert-shell-command-output</code> to automatically insert shell (ie. bash) command output.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/ping.gif" alt=""></p>
<h2>Markdown transcripts (experimental) - Thanks to Elle Najt</h2>
<p>Initial work for automatically saving markdown transcripts is now in place. We're still iterating on it, but if keen to try things out, you can enable as follows:</p>
<pre><code class="language-{.commonlisp">(setq agent-shell--transcript-file-path-function #'agent-shell--default-transcript-file-path)
</code></pre>
<h2>Configuration</h2>
<h3>Turn off ASCII welcome banners</h3>
<pre><code class="language-{.commonlisp">(setq agent-shell-show-welcome-message nil)
</code></pre>
<h3>Turn off graphical header</h3>
<p>Text header</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-header-style 'text)
</code></pre>
<p>No header</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-header-style nil)
</code></pre>
<h2>Inline display of historical changes - Thanks to Elle Najt</h2>
<p>Applied changes are now displayed inline.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/inline-historical-diffs.png" alt=""></p>
<h2>Session mode - Thanks to Elle Najt</h2>
<p>The new <code>M-x agent-shell-cycle-session-mode</code> and <code>M-x agent-shell-set-session-mode</code> can now be used to change the session mode.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/cycle.webp" alt=""></p>
<h2>Agent capabilities</h2>
<p>You can now find out what capabilities and session modes are supported by your agent. Expand either of the two sections.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/capabilities.png" alt=""></p>
<h2>Accepting/rejecting changes from diff buffer</h2>
<p>Tired of pressing <code>q</code> and <code>y</code> to accept changes from the diff buffer? Now just press <code>y</code> from the diff viewer to accept all hunks.</p>
<p>Same goes for rejecting. No more <code>q</code> and <code>n</code>. Now just press <code>C-c C-c</code> from the diff buffer.</p>
<h2>Transient menu</h2>
<p>We get a new basic transient menu. Currently available via <code>M-x agent-shell-help-menu</code>.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-017-improvements-melpa/transient.png" alt=""></p>
<h2>Contributions</h2>
<p>We got lots of awesome pull requests from wonderful folks. Thank you for your contributions!</p>
<ul>
<li><strong>Arthur Heymans</strong>: Add a Package-Requires header (<a href="https://github.com/xenodium/agent-shell/pull/78">PR</a>).</li>
<li><strong>Elle Najt</strong>: Execute commands in devcontainer (<a href="https://github.com/xenodium/agent-shell/pull/91">PR</a>).</li>
<li><strong>Elle Najt</strong>: Fix Write tool diff preview for new files (<a href="https://github.com/xenodium/agent-shell/pull/109">PR</a>).</li>
<li><strong>Elle Najt</strong>: Inline display of historical changes (<a href="https://github.com/xenodium/agent-shell/pull/92">PR</a>).</li>
<li><strong>Elle Najt</strong>: Live Markdown transcripts (<a href="https://github.com/xenodium/agent-shell/pull/97">PR</a>).</li>
<li><strong>Elle Najt</strong>: Prompt session mode cycling and modeline display (<a href="https://github.com/xenodium/agent-shell/pull/79">PR</a>).</li>
<li><strong>Fritz Grabo</strong>: Devcontainer fallback workspace (<a href="https://github.com/xenodium/agent-shell/pull/95">PR</a>).</li>
<li><strong>Guilherme Pires</strong>: Codex subscription auth (<a href="https://github.com/xenodium/agent-shell/pull/64">PR</a>).</li>
<li><strong>Hordur Freyr Yngvason</strong>: Make qwen authentication optional (<a href="https://github.com/xenodium/agent-shell/pull/87">PR</a>).</li>
<li><strong>Ian Davidson</strong>: Embedded context support (<a href="https://github.com/xenodium/agent-shell/pull/73">PR</a>).</li>
<li><strong>Julian Hirn</strong>: Fix quick-diff window restoration for full-screen (<a href="https://github.com/xenodium/agent-shell/pull/89">PR</a>).</li>
<li><strong>Ruslan Kamashev</strong>: Hide header line altogether (<a href="https://github.com/xenodium/agent-shell/pull/101">PR</a>).</li>
<li><strong><a href="https://github.com/festive-onion">festive-onion</a></strong>: Show Planning mode more reliably (<a href="https://github.com/xenodium/agent-shell/issues/102">PR</a>).</li>
</ul>
<h2>Lots of other work ❤️😅</h2>
<p>Beyond what's been showcased here, much love and effort's been poured into polishing the <code>agent-shell</code> experience. Interested in the nitty-gritty? Have a look through the <a href="https://github.com/xenodium/agent-shell/commits/main/">173 commits</a> since the last blog post.</p>
<h2>Support this work</h2>
<p>If <a href="https://github.com/xenodium/agent-shell">agent-shell</a> or <a href="https://github.com/xenodium/acp.el">acp.el</a> are useful to you, please consider <a href="https://github.com/sponsors/xenodium">sponsoring</a> its development. LLM tokens aren't free, and neither is the time dedicated to building this stuff ;-)</p>
]]></description>
    <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>time-zones now on MELPA. Do I have your support?</title>
<link>https://xenodium.com/time-zones-now-on-melpa</link>
<guid isPermaLink="false">https://xenodium.com/time-zones-now-on-melpa</guid>
    <description><![CDATA[<p>A little over a week ago, I <a href="https://xenodium.com/emacs-time-zones-mode">introduced time-zones</a>, an Emacs utility to easily check city times around the world. Today, I'm happy to report, the package <a href="https://melpa.org/#/time-zones">has been accepted into MELPA</a>.</p>
<p><img src="https://xenodium.github.io/images/time-zones-now-on-melpa/time-zones.gif" alt=""></p>
<p>It's been wonderful to see how well time-zones was <a href="https://www.reddit.com/r/emacs/comments/1oarhkl/a_new_world_clock_package/">received on Reddit</a>.</p>
<p>✓ You asked for MELPA publishing and <a href="https://melpa.org/#/time-zones">I delivered</a>.</p>
<p>✓ You asked for DST display and <a href="https://github.com/xenodium/time-zones/commit/c573e20d0406aa81315b8319722e2946df86cc33">I delivered</a>.</p>
<p>✓ You asked for a UTC picker and <a href="https://github.com/xenodium/time-zones/commit/ec17963ce5e9f676c6f1117c7a11e536b72d7ad7">I delivered</a>.</p>
<p>✓ You asked for UTC offset display and <a href="https://github.com/xenodium/time-zones/commit/b04d0c81b9cf06226a8fde430a4253204ba704b7">I delivered</a>.</p>
<p>✓ You asked for Windows support and <a href="https://github.com/xenodium/time-zones/commit/54ba1151ef6864fe703116532085d653f9b4afc1">I delivered</a>.</p>
<p>✓ You asked for help and bug fixes and <a href="https://github.com/xenodium/time-zones/issues?q=is%3Aissue%20state%3Aclosed">I delivered</a>.</p>
<h2>Will you make the work sustainable?</h2>
<p>Bringing features and improving our beloved text editor takes time and effort. <code>time-zones</code> isn't my first package, I've also published a <a href="https://github.com/sponsors/xenodium">bunch of Emacs packages</a>. Will you help make this work <a href="https://github.com/sponsors/xenodium">sustainable</a>?</p>
]]></description>
    <pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 4: Batch renaming files</title>
<link>https://xenodium.com/bending-emacs-episode-4-batch-renaming-files</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-4-batch-renaming-files</guid>
    <description><![CDATA[<p>I'm now a few weeks into my <a href="https://www.youtube.com/@xenodium/videos">Bending Emacs</a> series. Today I share a new episode.</p>
<p><a href="https://youtu.be/1E0ThCSr8Qw">Bending Emacs Episode 4: Batch renaming files</a></p>
<center>
  <a href="https://www.youtube.com/watch?v=1E0ThCSr8Qw" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/1E0ThCSr8Qw/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>In this video, I show a few ways of batch renaming files.</p>
<p>The covered flows are:</p>
<ul>
<li>Dired <a href="https://emacsdocs.org/docs/emacs/Wdired">editable buffers</a>.</li>
<li><a href="https://github.com/magnars/multiple-cursors.el">Multiple cursors</a> using <a href="https://github.com/fgallina/region-bindings-mode">region-bindings-mode</a> to insert numbers via # (I had a <a href="https://xenodium.com/inserting-numbers-with-emacs-multiple-cursors">tiny blog entry</a> on this).</li>
<li>We can batch rename using <a href="https://emacsdocs.org/docs/emacs/Keyboard-Macros">Keyboard Macros</a> too and insert numbers via <a href="https://emacsdocs.org/docs/emacs/Keyboard-Macro-Counter">macro counters</a>.</li>
<li>While I typically use multiple cursors for batch renaming files, I also experimented with <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> via M-x <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el#L1717">dwim-shell-commands-rename-all</a>.</li>
</ul>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/1E0ThCSr8Qw">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/1E0ThCSr8Qw">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
<h2>Make it all sustainable</h2>
<p>Enjoying this content or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs time-zones</title>
<link>https://xenodium.com/emacs-time-zones-mode</link>
<guid isPermaLink="false">https://xenodium.com/emacs-time-zones-mode</guid>
    <description><![CDATA[<p>Emacs ships with a perfectly functional world clock, available via <code>M-x world-clock</code>. Having said that, there are two things I wish it had:</p>
<ol>
<li>A quick way to interactively add any city (bonus points for fuzzy search).</li>
<li>An easy way to shift the time back and forth.</li>
</ol>
<p>As far as I can tell, these are neither available nor possible on the built-in <code>world-clock</code> (please correct me if otherwise), so when my friend across the world recently asked me for the best time to meet, I knew this was the last nudge I needed to get this done.</p>
<p>With that, I give you <code>M-x time-zones</code> (now on <a href="https://github.com/xenodium/time-zones">GitHub</a>).</p>
<p><img src="https://xenodium.github.io/images/emacs-time-zones-mode/time-zones.gif" alt=""></p>
<p>There isn't much to talk about other than <code>time-zones</code> accomplishes the above tasks very easily without resorting to writing elisp nor accessing via customize, which I seldom use.</p>
<p>As I mentioned, <code>time-zones</code> is on <a href="https://github.com/xenodium/time-zones">GitHub</a> if you'd like to give it a spin. It's super fresh, so please report any issues. Hope you like it.</p>
<h2>Make it all sustainable</h2>
<p>Reckon <code>time-zones</code> will be useful to you? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an indie dev. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 3: Git clone (the lazy way)</title>
<link>https://xenodium.com/bending-emacs-episode-3-git-clone-the-lazy-way</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-3-git-clone-the-lazy-way</guid>
    <description><![CDATA[<p>Continuing on the <a href="https://www.youtube.com/@xenodium/videos">Bending Emacs</a> series, today I share a new episode.</p>
<p><a href="https://youtu.be/oYHlH9NWraM">Bending Emacs Episode 03: Git clone (the lazy way)</a></p>
<p>In this video, I show my latest iteration on an expedited git clone flow.</p>
<center>
  <a href="https://www.youtube.com/watch?v=oYHlH9NWraM" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/oYHlH9NWraM/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>If this topic sounds familiar, I covered it back in 2020 with my <a href="https://xenodium.com/emacs-clone-git-repo-from-clipboard">clone git repo from clipboard</a> post.</p>
<p>My git clone flow consists of copying a git repo URL to the clipboard and subsequently invoking <code>M-x dwim-shell-commands-git-clone-clipboard-url</code>. Everything else is taken care of for you.</p>
<p>I've revisited this <code>git clone</code> command and added a couple of improvements:</p>
<ul>
<li>
<p>Configurability (via <code>dwim-shell-commands-git-clone-dirs</code>). For example:</p>
<pre><code class="language-{.commonlisp">(setq dwim-shell-commands-git-clone-dirs
      '(&quot;~/Downloads&quot;
        &quot;~/Desktop&quot;))
</code></pre>
</li>
<li>
<p>Optional prefixes to change function behavior</p>
<ul>
<li><code>C-u</code>: Pick target location <code>dwim-shell-commands-git-clone-dirs</code>.</li>
<li><code>C-u C-u</code>: Pick any directory.</li>
</ul>
</li>
<li>
<p>Automatically place point/cursor at README file.</p>
</li>
</ul>
<p>I was going to post the snippet here, though may as well point you over to <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el#L1574">GitHub</a> where <code>dwim-shell-commands-git-clone-clipboard-url</code> is more likely to remain up-to-date.</p>
<p>Note that <code>dwim-shell-commands-git-clone-dirs</code> is now <a href="https://github.com/xenodium/dwim-shell-command/tree/main?tab=readme-ov-file#my-toolbox">optionally available</a> as part of my <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> package.</p>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://youtu.be/oYHlH9NWraM">me some comments</a>.</p>
<p>Please go <a href="https://youtu.be/oYHlH9NWraM">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
]]></description>
    <pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>agent-shell 0.5 improvements</title>
<link>https://xenodium.com/agent-shell-0-5-improvements</link>
<guid isPermaLink="false">https://xenodium.com/agent-shell-0-5-improvements</guid>
    <description><![CDATA[<p>While it's only been a few weeks since <a href="https://xenodium.com/introducing-agent-shell">introducing Emacs agent-shell</a>, we've landed <a href="https://github.com/xenodium/agent-shell/commits/main/">nearly 100 commits</a> and enough improvements to warrant a new blog post.</p>
<h2>More agents</h2>
<p><a href="https://github.com/xenodium/agent-shell">agent-shell</a> now includes support for two additional ACP-capable agents:</p>
<ul>
<li>Claude Code</li>
<li>Codex via <a href="https://github.com/cola-io/codex-acp">codex-acp</a> (new)</li>
<li>Gemini CLI</li>
<li>Goose (new)</li>
</ul>
<h2>Unified entry point</h2>
<p>In addition to starting new shells via agent-specific commands, we now have a unified <code>M-x agent-shell</code> entry point, enabling selection from a list of supported agents.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-5-improvements/picker.png" alt=""></p>
<p>The agent-specific commands remain available as usual:</p>
<ul>
<li><code>M-x agent-shell-anthropic-start-claude-code</code></li>
<li><code>M-x agent-shell-openai-start-codex</code></li>
<li><code>M-x agent-shell-google-start-gemini</code></li>
<li><code>M-x agent-shell-goose-start-agent</code></li>
</ul>
<h2>Toggling display</h2>
<p><code>agent-shell</code> now provides basic control to toggle display of shell buffers:</p>
<ul>
<li><code>M-x agent-shell-toggle</code>: Toggles display of the most recently accessed agent (per project).</li>
<li><code>agent-shell-display-action</code>: Controls how agent shells are displayed when activated.</li>
</ul>
<h2>agent-shell-sidebar (new package)</h2>
<p>While <code>agent-shell</code> provides basic display toggling, <a href="https://github.com/cmacrae">Calum MacRae</a> offers a comprehensive sidebar package. Check out <a href="https://github.com/cmacrae/agent-shell-sidebar">agent-shell-sidebar</a>.</p>
<h2>Experimental dev container support (thanks to Fritz Grabo)</h2>
<p><code>agent-shell</code> now has experimental support for running agents inside dev containers. See <a href="https://github.com/xenodium/agent-shell?tab=readme-ov-file#running-agents-in-devcontainers--docker-containers-experimental">docs</a>.</p>
<h2>quick-diff improvements</h2>
<p><code>quick-diff</code> buffers, proposing changes, get a more polished experience. More notably, diffs get context (thanks to David J. Rosenbaum), single-key patch navigation/acceptance, and file names now displayed in header line.</p>
<p><img src="https://xenodium.github.io/images/agent-shell-0-5-improvements/quick-diff.png" alt=""></p>
<h2>Environment variables</h2>
<p>Environment variables can now be loaded from either the Emacs environment, .env files, and/or overridden inline:</p>
<pre><code class="language-{.commonlisp">(setq agent-shell-anthropic-claude-environment
      (agent-shell-make-environment-variables
       :inherit-env t
       :load-env &quot;~/.env&quot;
       &quot;CUSTOM_VAR&quot; &quot;custom_value&quot;))
</code></pre>
<h2>Authentication methods</h2>
<p>Different authentication methods are now supported. For example:</p>
<pre><code class="language-{.commonlisp">;; Login-based auth
(setq agent-shell-anthropic-authentication
      (agent-shell-anthropic-make-authentication :login t))

;; API key auth
(setq agent-shell-anthropic-authentication
      (agent-shell-anthropic-make-authentication
       :api-key (lambda () (auth-source-pass-get &quot;secret&quot; &quot;anthropic-api-key&quot;))))
</code></pre>
<p>Check <code>agent-shell-*-authentication</code> per provider, as available options may differ.</p>
<h2>UX polish</h2>
<p>On the smaller side, but also contributing to overall polish:</p>
<ul>
<li>Single-key permission bindings (y/n/!).</li>
<li>Improved error messages.</li>
<li>Improved task status rendering.</li>
<li>Improved TAB navigation.</li>
</ul>
<h2>Traffic inspection and debugging</h2>
<p>While not technically part of <code>agent-shell</code>, <a href="https://github.com/xenodium/acp.el">acp.el</a>'s traffic inspection has been getting some love to help users diagnose issues.</p>
<h2>Contributions</h2>
<p>Thank you for your contributions!</p>
<ul>
<li>David J. Rosenbaum: Context support in diffs (<a href="https://github.com/xenodium/agent-shell/pull/48">PR</a>).</li>
<li>Fritz Grabo: Dev container support (<a href="https://github.com/xenodium/agent-shell/pull/19">PR</a>).</li>
<li>Grant Surlyn: Doom Emacs installation instructions (<a href="https://github.com/xenodium/agent-shell/pull/37">PR</a>).</li>
<li>Mark A. Hershberger: Goose key improvement (<a href="https://github.com/xenodium/agent-shell/issues/46">PR</a>).</li>
<li>Ruslan Kamashev: Customization group fix (<a href="https://github.com/xenodium/agent-shell/pull/33">PR</a>).</li>
</ul>
<h2>Sponsors</h2>
<p>Thank you to all sponsors. While LLMs aren't everyone's cup of tea, we're seeing editors across the board evolving to accommodate these new LLM tools. In a somewhat similar vein, <a href="https://microsoft.github.io/language-server-protocol/">LSP</a> integration wasn't for everyone, but for those who did want it, Emacs luckily catered to them. Thank you for helping make this project sustainable while also enabling Emacs to cater to all.</p>
<h2>Support this work</h2>
<p>If <a href="https://github.com/xenodium/agent-shell">agent-shell</a> or <a href="https://github.com/xenodium/acp.el">acp.el</a> are useful to you, consider <a href="https://github.com/sponsors/xenodium">sponsoring</a> its development. LLM tokens aren't free, and neither is the time dedicated to building this stuff ;-)</p>
]]></description>
    <pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 2: From vanilla to your flavor</title>
<link>https://xenodium.com/bending-emacs-episode-2</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-2</guid>
    <description><![CDATA[<p>While still finding my footing making Emacs videos, today I'm sharing my second video.</p>
<p><a href="https://www.youtube.com/watch?v=qTumnhiE1c8">Bending Emacs Episode 02: From vanilla to your flavor</a></p>
<p>The video is a little longer than I intended at 14:37, so plan accordingly.</p>
<p>In this video, I show some of my favorite UI customizations, with additional tips and tricks along the way. Like my first video, I'm hoping you find unexpected goodies in there despite being familiar with the general topic.</p>
<center>
  <a href="https://www.youtube.com/watch?v=qTumnhiE1c8" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/qTumnhiE1c8/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>Read on for all supporting material…</p>
<h2>Evaluating elisp</h2>
<p>Showcased a handful of ways to evaluate elisp.</p>
<ul>
<li>
<p>M-x eval-last-sexp</p>
</li>
<li>
<p>M-x eval-expression</p>
</li>
<li>
<p>M-x eval-buffer</p>
</li>
<li>
<p>M-x ielm</p>
</li>
<li>
<p>M-x org-ctrl-c-ctrl-c (Evaluate org source blocks)</p>
<p>Sample snippets:</p>
<pre><code class="language-{.commonlisp">(set-face-attribute 'default nil :background &quot;DarkSlateGray&quot;)
</code></pre>
<pre><code class="language-{.commonlisp">(set-face-attribute 'default nil :background &quot;#212121&quot;)
</code></pre>
</li>
</ul>
<h2>Launching a separate Emacs instance</h2>
<pre><code class="language-{.bash">path/to/emacs/nextstep/Emacs.app/Contents/MacOS/Emacs -Q --init-directory /tmp/secondary/.emacs.d --load path/to/other-emacs.el
</code></pre>
<p>other-emacs.el (minimal, almost vanilla setup):</p>
<pre><code class="language-{.commonlisp">; -*- lexical-binding: t; -*-

(server-force-delete)
(make-directory &quot;/tmp/secondary/&quot; t)
(setq server-socket-dir &quot;/tmp/secondary/&quot;)
(setq server-name &quot;emacs-server&quot;)
(server-start)

(setq package-archives
      '((&quot;melpa&quot; . &quot;https://melpa.org/packages/&quot;)))

(setq package-archive-priorities
      '((&quot;melpa&quot; .  4)))

(require 'package)
(package-initialize)
(mapc #'package-delete (mapcar #'cadr package-alist))

(add-to-list 'custom-theme-load-path &quot;path/to/emacs-materialized-theme&quot;)
</code></pre>
<h2>with-other-emacs macro (ie. evaluate elisp elsewhere)</h2>
<pre><code class="language-{.commonlisp">(defmacro with-other-emacs (&amp;rest body)
  &quot;Evaluate BODY in the current buffer of the other Emacs instance.&quot;
  `(call-process &quot;emacsclient&quot; nil nil nil
                 &quot;--socket-name=/tmp/secondary/emacs-server&quot;
                 &quot;--eval&quot;
                 (prin1-to-string
                  '(with-current-buffer (window-buffer (selected-window))
                     ,@body))))
</code></pre>
<h2>Looking up functions</h2>
<ul>
<li>M-x describe-function (built-in).</li>
<li>M-x helpful-callable (via third-party <a href="https://github.com/Wilfred/helpful">helpful</a> package).</li>
</ul>
<h2>Advicing org-babel-expand-body:emacs-lisp</h2>
<p>We want to extend source blocks to accept the <code>:other-emacs</code> header argument as follows:</p>
<pre><code class="language-org">#+begin_src emacs-lisp :other-emacs t
  (message (propertize &quot;Hello again twin&quot; 'face '(:height 6.0)))
#+end_src
</code></pre>
<p>So we advice <code>org-babel-expand-body:emacs-lisp</code>:</p>
<pre><code class="language-{.commonlisp">(defun adviced:org-babel-expand-body:emacs-lisp:other-emacs (orig-fn body header-args)
  (if (map-elt header-args :other-emacs)
      (format &quot;(with-other-emacs %s)&quot; (funcall orig-fn body header-args))
    (funcall orig-fn body header-args)))

(advice-add #'org-babel-expand-body:emacs-lisp
            :around #'adviced:org-babel-expand-body:emacs-lisp:other-emacs)
</code></pre>
<h2>UI customizations</h2>
<h3>Font (<a href="https://www.jetbrains.com/lp/mono/">JetBrains Mono</a>)</h3>
<pre><code class="language-{.commonlisp">(set-face-attribute 'default nil
                    :height 160 ;; 16pt
                    ;; brew tap homebrew/cask-fonts &amp;&amp; brew install --cask font-jetbrains-mono
                    :family &quot;JetBrains Mono&quot;)
</code></pre>
<h3>Theme (<a href="https://github.com/xenodium/emacs-materialized-theme">Materialized</a>)</h3>
<pre><code class="language-{.commonlisp">(load-theme 'materialized t)
</code></pre>
<h3><a href="https://github.com/kickingvegas/calle24">Calle 24 toolbar</a> (macOS)</h3>
<pre><code class="language-{.commonlisp">(use-package calle24 :ensure t
  :config
  (calle24-install)
  (calle24-refresh-appearance)))
</code></pre>
<h3>Hide toolbar</h3>
<pre><code class="language-{.commonlisp">(tool-bar-mode -1)
</code></pre>
<h3>Titlebar</h3>
<p>No text in title bar</p>
<pre><code class="language-{.commonlisp">(setq-default frame-title-format &quot;&quot;)
</code></pre>
<p>Transparent titlebar (macOS)</p>
<pre><code class="language-{.commonlisp">(set-frame-parameter nil 'ns-transparent-titlebar t)
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
</code></pre>
<h3>Hide scrollbars</h3>
<pre><code class="language-{.commonlisp">(scroll-bar-mode -1)
</code></pre>
<h3>Mode line</h3>
<p><a href="https://github.com/tarsius/minions">Minions</a></p>
<pre><code class="language-{.commonlisp">(use-package minions
  :ensure t
  :custom
  (mode-line-modes-delimiters nil)
  (minions-mode-line-lighter &quot; …&quot;)
  :config
  (minions-mode +1)
  (force-mode-line-update t))
</code></pre>
<p><a href="https://github.com/tarsius/moody">Moody</a></p>
<pre><code class="language-{.commonlisp">(use-package moody
  :ensure t
  :config
  (setq-default mode-line-format
                '(&quot;&quot;
                  mode-line-front-space
                  mode-line-client
                  mode-line-frame-identification
                  mode-line-buffer-identification
                  &quot; &quot;
                  mode-line-position
                  (vc-mode vc-mode)
                  (multiple-cursors-mode mc/mode-line)
                  mode-line-modes
                  mode-line-end-spaces))
  (moody-replace-mode-line-buffer-identification)
  (moody-replace-vc-mode))
</code></pre>
<h3><a href="https://github.com/TeMPOraL/nyan-mode">Nyan Cat</a> (of course)</h3>
<pre><code class="language-{.commonlisp">(use-package nyan-mode
  :ensure t
  :custom
  (nyan-bar-length 10)
  :config
  (nyan-mode +1)))
</code></pre>
<h3>Welcome screen</h3>
<p>A little static welcome screen I cooked up.</p>
<pre><code class="language-{.commonlisp">(defun ar/show-welcome-buffer ()
  &quot;Show *Welcome* buffer.&quot;
  (with-current-buffer (get-buffer-create &quot;*Welcome*&quot;)
    (setq truncate-lines t)
    (setq cursor-type nil)
    (read-only-mode +1)
    (ar/refresh-welcome-buffer)
    (local-set-key (kbd &quot;q&quot;) 'kill-this-buffer)
    (add-hook 'window-size-change-functions
              (lambda (_frame)
                (ar/refresh-welcome-buffer)) nil t)
    (add-hook 'window-configuration-change-hook
              #'ar/refresh-welcome-buffer nil t)
    (switch-to-buffer (current-buffer))))

(defun ar/refresh-welcome-buffer ()
  &quot;Refresh welcome buffer content for WINDOW.&quot;
  (when-let* ((inhibit-read-only t)
              (welcome-buffer (get-buffer &quot;*Welcome*&quot;))
              (window (get-buffer-window welcome-buffer))
              (image-path &quot;~/.emacs.d/emacs.png&quot;)
              (image (create-image image-path nil nil :max-height 300))
              (image-height (cdr (image-size image)))
              (image-width (car (image-size image)))
              (top-margin (floor (/ (- (window-height window) image-height) 2)))
              (left-margin (floor (/ (- (window-width window) image-width) 2)))
              (title &quot;Welcome to Emacs&quot;))
    (with-current-buffer welcome-buffer
      (erase-buffer)
      (setq mode-line-format nil)
      (goto-char (point-min))
      (insert (make-string top-margin ?\n))
      (insert (make-string left-margin ?\ ))
      (insert-image image)
      (insert &quot;\n\n\n&quot;)
      (insert (make-string (- (floor (/ (- (window-width window) (string-width title)) 2)) 1) ?\ ))
      (insert (propertize title 'face '(:height 1.2))))))

(ar/show-welcome-buffer)
</code></pre>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://www.youtube.com/watch?v=qTumnhiE1c8">me some comments</a>.</p>
<p>Please go <a href="https://www.youtube.com/watch?v=qTumnhiE1c8">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll continue making more videos!</p>
]]></description>
    <pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bending Emacs - Episode 1: Applying CLI utils</title>
<link>https://xenodium.com/bending-emacs-episode-1</link>
<guid isPermaLink="false">https://xenodium.com/bending-emacs-episode-1</guid>
    <description><![CDATA[<p>While most of the content I share is typically covered in blog posts, I'm trying something new.</p>
<p>Today, I'll share my first episode of Bending Emacs. This video focuses on how I like to apply (or batch-apply) command line utilities.</p>
<center>
  <a href="https://www.youtube.com/watch?v=77NtPfgr4x0" class="overlayed">
    <!-- Using hqdefault.jpg as maxresdefault.jpg doesn't work for older videos. -->
    <img class="preview" src="https://img.youtube.com/vi/77NtPfgr4x0/hqdefault.jpg" alt="">
    <svg class="center-absolute" version="1.1" viewBox="0 0 68 48" width="65px" alt="play button">
      <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#2d2b2f"></path>
      <path d="M 45,24 27,14 27,34" fill="#fff"></path>
    </svg>
  </a>
</center>
<p>While the video focuses on applying command line utilities, here's a list of all the things I used:</p>
<ol>
<li><a href="https://orgmode.org/">Org mode</a> for the presentation itself.</li>
<li><a href="https://ffmpeg.org/">ffmpeg</a> does the heavy lifting converting videos to gifs.</li>
<li>Asked <a href="https://claude.ai">Claude</a> for the relevant <code>ffmpeg</code> command via <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>'s <code>M-x chatgpt-shell-prompt-compose</code>.</li>
<li>Browsed the video directory via <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> mode.</li>
<li>Previewed video thumbnails via <a href="https://xenodium.com/a-tour-of-ready-player-mode">ready-player</a> mode.</li>
<li>Previewed gifs via <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Image-Mode.html">image mode</a>'s <code>M-x image-toggle-animation</code>.</li>
<li>Validated the <code>ffmpeg</code> command via <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a>.</li>
<li>Applied a <a href="https://github.com/xenodium/dwim-shell-command">DWIM shell command</a> via <code>M-x dwim-shell-command</code>.</li>
<li>Duplicated files from <code>dired</code> via <code>M-x dwim-shell-commands-duplicate</code>.</li>
</ol>
<h2>Want more videos?</h2>
<p>Liked the video? Please let me know. Got feedback? Leave <a href="https://www.youtube.com/watch?v=77NtPfgr4x0">me some comments</a>.</p>
<p>Please go <a href="https://www.youtube.com/watch?v=77NtPfgr4x0">like my video</a>, share with others, and <a href="https://www.youtube.com/@xenodium">subscribe to my channel</a>.</p>
<p>If there's enough interest, I'll make more videos!</p>
]]></description>
    <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Introducing Emacs agent-shell (powered by ACP)</title>
<link>https://xenodium.com/introducing-agent-shell</link>
<guid isPermaLink="false">https://xenodium.com/introducing-agent-shell</guid>
    <description><![CDATA[<p>Not long ago, I <a href="https://xenodium.com/introducing-acpel">introduced acp.el</a>, an Emacs lisp implementation of ACP (<a href="https://agentclientprotocol.com">Agent Client Protocol</a>), the agent protocol <a href="https://zed.dev/blog/claude-code-via-acp">developed between Zed and Google folks</a>.</p>
<p>While I've been happily accessing LLMs from my beloved text editor via <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> (a <a href="https://xenodium.com/a-tiny-upgrade-to-the-llm-model-picker">multi-model</a> package I built), I've been fairly slow on the AI agents uptake. Probably a severe case of <a href="https://knowyourmeme.com/memes/old-man-yells-at-cloud">old-man-shouts-at-cloud</a> sorta thing, but hey I want well-integrated tools in my text editor. When I heard of ACP, I knew this was the thing I was waiting for to play around with agents.</p>
<p>With an early <a href="https://github.com/xenodium/acp.el">acp.el</a> client library in place, I set out to build an Emacs-native agent integration… Today, I have an initial version of <a href="https://github.com/xenodium/agent-shell">agent-shell</a> I can share.</p>
<p><img src="https://xenodium.github.io/images/introducing-agent-shell/agent-shell.png" alt=""></p>
<p><code>agent-shell</code> is a native Emacs shell, powered by <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint-mode</a> (check out Mickey's <a href="https://www.masteringemacs.org/article/comint-writing-command-interpreter">comint article</a> btw). As such, we don't have to dance between char and line modes to interact with things. <code>agent-shell</code> is just a regular Emacs buffer like any other you're used to.</p>
<h2>Agent-agnostic</h2>
<p>Thanks to ACP, we can now build agent-agnostic experiences by simply configuring our clients to communicate with their respective agents using a common protocol. As users, we benefit from a single, consistent experience, powered by any agent of our choice.</p>
<p>Configuring different agents from <code>agent-shell</code> boils down which agent we want running in the comms process. Here's an example of Gemini CLI vs Claude Code configuration:</p>
<pre><code class="language-{.commonlisp">(defun agent-shell-start-gemini-agent ()
  &quot;Start an interactive Gemini CLI agent shell.&quot;
  (interactive)
  (agent-shell--start
   :new-session t
   :mode-line-name &quot;Gemini&quot;
   :buffer-name &quot;Gemini&quot;
   :shell-prompt &quot;Gemini&gt; &quot;
   :shell-prompt-regexp &quot;Gemini&gt; &quot;
   :needs-authentication t
   :authenticate-request-maker (lambda ()
                                 (acp-make-authenticate-request :method-id &quot;gemini-api-key&quot;))
   :client-maker (lambda ()
                   (acp-make-client :command &quot;gemini&quot;
                                    :command-params '(&quot;--experimental-acp&quot;)
                                    :environment-variables (list (format &quot;GEMINI_API_KEY=%s&quot; (agent-shell-google-key)))))))
</code></pre>
<pre><code class="language-{.commonlisp">(defun agent-shell-start-claude-code-agent ()
  &quot;Start an interactive Claude Code agent shell.&quot;
  (interactive)
  (agent-shell--start
   :new-session t
   :mode-line-name &quot;Claude Code&quot;
   :buffer-name &quot;Claude Code&quot;
   :shell-prompt &quot;Claude Code&gt; &quot;
   :shell-prompt-regexp &quot;Claude Code&gt; &quot;
   :client-maker (lambda ()
                   (acp-make-client :command &quot;claude-code-acp&quot;
                                    :environment-variables (list (format &quot;ANTHROPIC_API_KEY=%s&quot; (agent-shell-anthropic-key)))))))
</code></pre>
<p>I've yet to try other agents. If you get another agent running, I'd love to hear about it. Maybe submit a <a href="https://github.com/xenodium/agent-shell/pulls">pull request</a>?</p>
<h2>Traffic</h2>
<p>While I've been relying on my <a href="https://github.com/xenodium/acp.el">acp.el</a> client library, I'm still fairly new to the protocol. I often inspect traffic to see what's going on. After staring at json for far too long, I figured I may as well build some tooling around <a href="https://github.com/xenodium/acp.el">acp.el</a> to make my life easier. I added a traffic buffer for that. From <code>agent-shell</code>, you can invoke it via <code>M-x agent-shell-view-traffic</code>.</p>
<p><img src="https://raw.githubusercontent.com/xenodium/acp.el/refs/heads/main/traffic.gif" alt=""></p>
<h2>Fake agents</h2>
<p>Developing <code>agent-shell</code> against paid agents got expensive quickly. Not only expensive, but my edit-compile-run cycle also became boringly slow waiting for agents. While I knew I wanted some sort of fake agent to work against, I didn't want to craft the fake traffic myself. Remember that traffic buffer I showed ya? Well, I can now save that traffic to disk and replay it later. This enabled me to run problematic sessions once and quickly replay multiple times to fix things. While re-playing has its quirks and limitations, it's done the job for now.</p>
<p>You can see a Claude Code session below, followed by its replayed counterpart via fake infrastructure.</p>
<p><img src="https://xenodium.github.io/images/introducing-agent-shell/claude.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/introducing-agent-shell/fake.png" alt=""></p>
<h2>What's next</h2>
<p>Getting here took quite a bit of work. Having said that, it's only a start. I myself need to get more familiar with agent usage and evolve the package UX however it feels most natural within its new habitat. Lately, I've been experimenting with a quick diff buffer, driven by n/p keys, shown along the permission dialog.</p>
<pre><code class="language-{=org}">#+ATTR_HTML: :width 99%
</code></pre>
<p><a href="https://xenodium.github.io/images/introducing-agent-shell/diff.png"><img src="https://xenodium.github.io/images/introducing-agent-shell/diff.png" alt=""></a></p>
<p>While I've implemented enough parts of the <a href="https://agentclientprotocol.com/protocol/schema">Agent Client Protocol Schema</a> to make the package useful, it's hardly complete. I've yet to fully familiarize myself with most protocol features.</p>
<h2>Take them for a spin</h2>
<p>Both of my new Emacs packages, <a href="https://github.com/xenodium/agent-shell">agent-shell</a> and <a href="https://github.com/xenodium/acp.el">acp.el</a>, are now available on GitHub. As an agent user, go straight to <a href="https://github.com/xenodium/agent-shell">agent-shell</a>. If you're a package author and would like to build an ACP experience, then give <a href="https://github.com/xenodium/acp.el">acp.el</a> a try. Both packages are brand new and may have rough edges. Be sure to file bugs or feature requests as needed.</p>
<h2>Paying for LLM tokens? How about sponsoring your Emacs tools?</h2>
<p>I've been heads down, working on these packages for some time. If you're using cloud LLM services, you're likely already paying for tokens. If you find my work useful, please consider <a href="https://github.com/sponsors/xenodium">routing some of those coins</a> to help fund it. Maybe my tools make you more productive at work? Ask your <a href="https://github.com/sponsors/xenodium">employer to support the work</a>. These packages not only take time and effort, but also cost me money. <a href="https://github.com/sponsors/xenodium">Help fund the work</a>.</p>
]]></description>
    <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Introducing acp.el</title>
<link>https://xenodium.com/introducing-acpel</link>
<guid isPermaLink="false">https://xenodium.com/introducing-acpel</guid>
    <description><![CDATA[<p>I recently <a href="https://xenodium.com/so-you-want-acp-for-emacs">shared my early Emacs experiments with ACP</a>, the <a href="https://agentclientprotocol.com">Agent Client Protocol</a> now supported by <a href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a> and <a href="https://github.com/zed-industries/claude-code-acp">Claude Code</a> LLM agents.</p>
<p>While we can already run these agents from Emacs with the likes of <a href="https://github.com/akermu/emacs-libvterm">vterm</a>, I'm keen to offer an Emacs-native alternative to drive them. To do that, I'm working an a new package: <code>agent-shell</code> (more on this to be shared soon). While this new Emacs agent shell has an opinionated user experience, it uses ACP under the hood. Being a protocol, it's entirely UI-agnostic. For this, I now have an early version available of the <a href="https://github.com/xenodium/acp.el">acp.el</a> library.</p>
<p><code>acp.el</code> implements Agent Client Protocol for Emacs lisp as per <a href="https://agentclientprotocol.com">agentclientprotocol.com</a>. While this library is in its infancy, it's enabling me to carry on with my <code>agent-shell</code> work. <code>acp.el</code> lives as a separate library, is UI-agnostic, and can be used by Emacs package authors to build the their desired ACP-powered agent experience.</p>
<p>You can instantiate an ACP client and send a request as follows:</p>
<pre><code class="language-{.commonlisp">(setq client (acp-make-client :command &quot;gemini&quot;
                              :command-params '(&quot;--experimental-acp&quot;)
                              :environment-variables (when api-key
                                                       (list (format &quot;GEMINI_API_KEY=%s&quot; &quot;your-api-key&quot;)))))

(acp-send-request
 :client client
 :request (acp-make-initialize-request :protocol-version 1)
 :on-success (lambda (response)
               (message &quot;Initialize success: %s&quot; response))
 :on-failure (lambda (error)
               (message &quot;Initialize failed: %s&quot; error)))
</code></pre>
<pre><code class="language-{.commonlisp">((protocolVersion . 1)
 (authMethods . [((id . oauth-personal)
                  (name . Log in with Google)
                  (description . :null))
                 ((id . gemini-api-key)
                  (name . Use Gemini API key)
                  (description . Requires setting the `GEMINI_API_KEY` environment variable))
                 ((id . vertex-ai)
                  (name . Vertex AI)
                  (description . :null))])
 (agentCapabilities (loadSession . :false)
                    (promptCapabilities (image . t)
                                        (audio . t)
                                        (embeddedContext . t))))
</code></pre>
<p>I'm new at using ACP myself, so I've added a special logging buffer to <code>acp.el</code> which enables me to inspect traffic and learn about the exchanges between clients and agents. You can enable logging with:</p>
<pre><code class="language-{.commonlisp">(setq acp-logging-enabled t)
</code></pre>
<p>Look out for the <code>*acp traffic*</code> buffer, which looks a little like this:</p>
<p><img src="https://raw.githubusercontent.com/xenodium/acp.el/refs/heads/main/traffic.gif" alt=""></p>
<p>If you're keen to experiment with ACP in Emacs lisp and build agent-agnostic packages, take a look at <code>acp.el</code> (<a href="https://github.com/xenodium/acp.el">now on GitHub</a>). As mentioned, it's early days for this library, but it's a start. Please file issues and feature requests. If you build anything on top of <code>acp.el</code>, lemme know. I'd love to see it in action.</p>
<h2>Make this work possible</h2>
<p>I'm working on two new Emacs packages: <a href="https://github.com/xenodium/acp.el">acp.el</a> (introduced in this post) and <code>agent-shell</code> (I'll soon share more about that). Please help me make development of these packages <a href="https://github.com/sponsors/xenodium">sustainable</a>. These packages take time and effort, but also cost me money as I have to pay for LLM tokens throughout testing and development. Please <a href="https://github.com/sponsors/xenodium">help fund it</a>.</p>
]]></description>
    <pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>So you want ACP (Agent Client Protocol) for Emacs?</title>
<link>https://xenodium.com/so-you-want-acp-for-emacs</link>
<guid isPermaLink="false">https://xenodium.com/so-you-want-acp-for-emacs</guid>
    <description><![CDATA[<p>Last week, I was delighted to see the <a href="https://zed.dev/blog/claude-code-via-acp">Zed editor shipping beta support for their Claude Code integration</a>. Being an Emacs enthusiast, you may wonder about my excitement. In their demo, the Zed team mentioned the integration is now possible thanks to <a href="https://agentclientprotocol.com/">Agent Client Protocol (ACP)</a>, which they developed in collaboration with Google. This is great news for Emacs users, as it opens the possibilities for deeper native agent integrations in our beloved editor. You can think of ACP as <a href="https://microsoft.github.io/language-server-protocol/">LSP</a> but for LLM agents.</p>
<p>While I have a bunch of <a href="https://github.com/xenodium/chatgpt-shell?tab=readme-ov-file#news">LLM models</a> integrated into <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> (including <a href="https://xenodium.com/chatgpt-shell-goes-offline">local ones</a>), I've yet to make much headway into enabling the models to access smarter context (ie. filesystem or local tools), beyond my <a href="https://www.reddit.com/r/emacs/comments/1mk2c8f">initial tool calling experiment</a>.</p>
<p>Somehow, I wasn't super excited about tool calling, as it felt like these integrations would fall short when compared to more advanced agents like Anthropic's <a href="https://www.anthropic.com/claude-code">Claude Code</a> or Google's <a href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a>. In fact, I haven't been that enthusiastic about these agents, since they offered relatively little API surface to enable deeper Emacs integration (which is where I live!). That is, until <a href="https://agentclientprotocol.com/">ACP</a> came along.</p>
<p>With ACP in mind, I'm much more likely to get on board with Emacs-agent integrations. I can now delegate all that complex agent logic to external tools and focus on building a great Emacs experience I'd be happy with.</p>
<p>And with that, I had an initial go at prototyping a bare minimum but with enough UX shell goodies to get me excited about it. I chose Gemini for this prototype. You can see it all in its minimal glory:</p>
<p><img src="https://xenodium.github.io/images/so-you-want-acp-for-emacs/agent-shell.gif" alt=""></p>
<h2>So how badly do you want ACP support in your beloved Emacs?</h2>
<p>While getting the initials kinda working was relatively straightforward (with everything I already know about building chatgpt-shell), adding support for all ACP features with a delightfully polished Emacs experience will take a bunch of effort. While I'm excited about the prospects, dedicating a chunk of my time to make this happen isn't super feasible. You may have noticed more Emacs-related work/posts from me lately. This is currently possible because I've gone full indie dev. The flexibility is great, but doing Emacs things isn't exactly gonna help pay the bills unless interested folks help <a href="https://github.com/sponsors/xenodium">fund/support the effort</a>.</p>
<p>My shell packages have quite a few enthusiastic users who more often than not, are using my package to talk to paid cloud services from the likes of OpenAI, Anthropic, or Google. I'm looking at you folks! I understand you're sending money to these companies who are providing you with a great service, but also remember the lovely Emacs integrations you use, which also need funding (much more than these well-funded commercial entities). While I'm a fan of chat-like Emacs shells for LLM/agents and would like to build a new agent shell, I also want to dedicate a chunk of this effort to building a UX-agnostic ACP Emacs library (acp.el). This library could be leveraged by me or any other Emacs package author.</p>
<p><code>So how badly do you want ACP support in your beloved Emacs?</code> Enough to take your wallets out and <a href="https://github.com/sponsors/xenodium">help fund it</a>?</p>
]]></description>
    <pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Diverted mode</title>
<link>https://xenodium.com/diverted-mode</link>
<guid isPermaLink="false">https://xenodium.com/diverted-mode</guid>
    <description><![CDATA[<p>James Dyer and I both ran into the same <a href="https://emacs.dyerdwelling.family/emacs/20250826095622-emacs--a-better-way-to-indent-your-entire-buffer-in-emacs/">workflow snag when fixing source indentation</a>. He explains it best:</p>
<blockquote>
<ol>
<li>You’re working in a file with inconsistent indentation</li>
<li>You want to fix the entire buffer’s formatting</li>
<li>You run C-x h (select all) followed by M-x indent-region</li>
<li>Your mark is now at the beginning of the buffer, disrupting your workflow</li>
</ol>
</blockquote>
<p>Naturally, this is Emacs and were both able to patch our editor to smoothen things out.</p>
<p>While I ran into the same <code>indent-region</code> snag after selecting an entire buffer (via <code>mark-whole-buffer</code>), I also faced it with <code>mark-defun</code> and er/expand-region (awesome <a href="https://github.com/magnars/expand-region.el">package</a> btw).</p>
<p>With three cases in mind, I wanted a somewhat generic solution, so I <a href="https://xenodium.com/mark-region-indent-restore-location">built diverted.el</a>, a little minor mode to identify these momentary diversions and try to bring the point back to the original location. Mind you, this was back in 2019 and until James's post, I hadn't heard of anyone else running into a similar snag. Since then, I kept the package as part of my config. James's post gave me the nudge I needed to move <code>diverted.el</code> out of my config and into <a href="https://github.com/xenodium/diverted">its own GitHub repo</a>.</p>
<p>By default, <code>diverted.el</code> recognizes both <code>mark-defun</code> and <code>mark-whole-buffer</code> as diversions, but you can also recognize the likes of <code>er/expand-region</code> via <code>diverted-events</code>. I'm hoping configuring is fairly self-explanatory. To date, I only have <code>mark-whole-buffer</code>, <code>mark-defun</code>, and <code>er/expand-region</code> as recognized diversions.</p>
<pre><code class="language-{.commonlisp">(defcustom diverted-events
  (list
   (make-diverted-event :from 'mark-defun
                        :to 'indent-for-tab-command
                        :breadcrumb (lambda ()
                                      (diverted--pop-to-mark-command 2)))
   (make-diverted-event :from 'mark-whole-buffer
                        :to 'indent-for-tab-command
                        :breadcrumb (lambda ()
                                      (diverted--pop-to-mark-command 2))))
  &quot;Diversion events to look for.

For example:

  (add-to-list 'diverted-events
    (make-diverted-event
      :from 'er/expand-region
      :to 'indent-for-tab-command
      :breadcrumb (lambda ()
                    (diverted--pop-to-mark-command 2))))&quot;
  :type '(repeat sexp)
  :group 'diverted)
</code></pre>
<p>Read on for a little demo…</p>
<h2>Without diverted-mode</h2>
<p>Notice how point is left at the top of the screen after pressing TAB to indent region.</p>
<img src="https://raw.githubusercontent.com/xenodium/diverted/main/demo/before.gif"/>
<h2>With diverted-mode</h2>
<p>Notice how point is left where it was prior to selecting the function and pressing TAB to indent region.</p>
<img src="https://raw.githubusercontent.com/xenodium/diverted/main/demo/after.gif"/>
<p>That's it for today. If you want to give <code>diverted.el</code> a try, head over to <a href="https://github.com/xenodium/diverted">GitHub</a>.</p>
<h2>Make it all sustainable</h2>
<p>Reckon <code>diverted-mode</code> will be useful to you? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Who moved my text?</title>
<link>https://xenodium.com/who-moved-my-text</link>
<guid isPermaLink="false">https://xenodium.com/who-moved-my-text</guid>
    <description><![CDATA[<p>I had an annoying <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> bug where sometimes the compose buffer's svg header would disappear while text was streaming into the Emacs buffer. There are a number of things that could have gone rogue when streaming and post-processing buffer text, so I wasn't quite sure where to start narrowing things down.</p>
<p>I had a feeling I could maybe use something like <code>after-change-functions</code> hook to monitor changes, but that only tells me about the text modified. I wanted to know which of my functions triggered the change, so maybe I could print a few frames from the stack? So that's what I did…</p>
<pre><code class="language-{.commonlisp">(defun my-change-tracker (beg end len)
  (let ((stack (mapcar (lambda (frame)
                         (car (cdr frame)))
                       (backtrace-frames))))
    (message &quot;Buffer %s changed: %d-%d | Stack: %s&quot;
             (buffer-name) beg end
             (take 15 stack)))) ;; Adjust as needed

(add-hook 'after-change-functions 'my-change-tracker nil t)
</code></pre>
<p>Here's an extract from the logs:</p>
<blockquote>
<p>Buffer <strong>claude llm (sonnet-4/Programming)&gt; compose</strong> changed: 496-498 | Stack: (backtrace-frames mapcar let my-change-tracker insert save-excursion let save-current-buffer progn if #[(output) ((setq output (or output )) (if (buffer-live-p buffer) (progn (save-current-buffer (set-buffer buffer) (let ((inhibit-read-only t)) (save-excursion (if orig-region-active (progn (delete-region region-beginning region-end) (setq orig-region-active nil))) (goto-char marker) (insert output) (set-marker marker (+ (length output) (marker-position marker))))))))) ((region-end) (region-beginning) (orig-region-active) (marker . #&lt;marker at 496 in *claude llm (sonnet-4/Programming)&gt; compose*&gt;) (buffer . <strong>claude llm (sonnet-4/Programming)&gt; compose</strong>))] shell-maker–write-reply…</p>
</blockquote>
<p>After increasing the number of logged frames, I started seeing bits of my code and… bingo! I found a very suspicious <code>delete-region</code>. After spotting this, fixing the bug was trivial.</p>
<p>While the bug was annoying, I had been procrastinating on fixing as it could have been a number of things. In this case, printing frames from <code>after-change-functions</code> turned out perfect for narrowing things down. I'll be keeping this in the toolbox. Maybe it can help you too.</p>
<h2>Make it all sustainable</h2>
<p>Learned something new? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Dired buffers with media overlays</title>
<link>https://xenodium.com/dired-buffers-with-media-overlays</link>
<guid isPermaLink="false">https://xenodium.com/dired-buffers-with-media-overlays</guid>
    <description><![CDATA[<p>It's been well over a year now since I've moved most of my music consumption away from streaming. I started purchasing music again, just so I can play offline at any time (and on my terms). That's not so say I don't stream, but that's now purely reserved for discovery. Most playback happens via <a href="https://xenodium.com/a-tour-of-ready-player-mode">Ready Player Mode</a>, a little Emacs player I built when I decided to take playback offline. This post isn't so much about <a href="https://github.com/xenodium/ready-player">Ready Player</a> and more about a recent <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> experience.</p>
<p>I had a directory with a handful of mp3s, which I wanted to split into separate album subdirectories. The challenge being the mp3 file names did not include album names. Sorting this out isn't a big task for a music-organization tool, but my brain quickly went hmmm… if dired displayed album metadata, I could just use that to quickly guide me through all the file management I needed. After all, I already know how to use <a href="https://ffmpeg.org/ffprobe.html">ffprobe</a> to extract relevant metadata, so I could just enhance dired's listing to also show me metadata as overlays. <a href="https://github.com/clemera/dired-git-info">dired-git-info</a> does just that.</p>
<p>With that, <a href="https://github.com/xenodium/ready-player/blob/main/ready-player-dired.el">ready-player-dired-mode</a> was born. After enabling with <code>M-x ready-player-dired-mode</code>, I can easily get on with my tiny file reorg <a href="https://xkcd.com/1319/">without any procrastination whatsoever</a>.</p>
<p><img src="https://xenodium.github.io/images/dired-buffers-with-media-overlays/dired-overlays.gif" alt=""></p>
<p>I've just pushed <a href="https://github.com/xenodium/ready-player/blob/main/ready-player-dired.el">ready-player-dired-mode</a> to <a href="https://github.com/xenodium/ready-player">Ready Player's GitHub repo</a>. It's pretty fresh, so you may (or may not) encounter rough edges.</p>
<h2>Make it all sustainable</h2>
<p>Is <a href="https://github.com/xenodium/ready-player">Ready Player</a> useful to you? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make my work sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">macOS/iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Fri, 29 Aug 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Brisket recipe</title>
<link>https://xenodium.com/brisket-recipe</link>
<guid isPermaLink="false">https://xenodium.com/brisket-recipe</guid>
    <description><![CDATA[<p>On a whim, after seeing a random brisket picture online, I decided today was the day to make my first brisket.</p>
<p><img src="https://xenodium.github.io/images/brisket-recipe/before.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/brisket-recipe/after.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/brisket-recipe/slice.jpg" alt=""></p>
<h2>Ingredients</h2>
<ul>
<li>15g Kosher salt (coarse)</li>
<li>15g Black pepper (coarsely ground)</li>
<li>10g Smoked paprika</li>
<li>5g Chipotle powder</li>
<li>5g Onion granules</li>
<li>5g Garlic granules</li>
<li>2g Cumin seeds, toasted and ground</li>
<li>2g S&amp;B hot mustard powder</li>
<li>5g Brown sugar</li>
</ul>
<h2>Clean</h2>
<p>Rinse and pat dry.</p>
<h2>Sear</h2>
<p>Salt both sides and sear.</p>
<h2>Dry rub</h2>
<p>Crush spices, mix, and apply the rub generously all over the surface of the brisket, pressing gently to ensure it adheres.</p>
<h2>Wrap up</h2>
<p>Wrap up in baking paper, place on tray, and wrap with foil.</p>
<h2>Bake</h2>
<p>Bake at 120°C. Roughly 2-3 hours per kilo.</p>
]]></description>
    <pubDate>Wed, 27 Aug 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A tiny upgrade to the LLM model picker</title>
<link>https://xenodium.com/a-tiny-upgrade-to-the-llm-model-picker</link>
<guid isPermaLink="false">https://xenodium.com/a-tiny-upgrade-to-the-llm-model-picker</guid>
    <description><![CDATA[<p>A little while ago, I added an info header to <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>'s compose buffer. It displays the current model's icon, using the lovely <a href="https://github.com/lobehub/lobe-icons">Lobe Icons 🥨</a>.</p>
<p>With that in place, it was only a matter of time until <code>M-x chatgpt-shell-swap-model</code> got a similar upgrade in my Emacs package. As of chatgpt-shell v2.30.1, you can get the upgrade too.</p>
<p>If you prefer to keep graphics out of model-picking, I got you covered. Set <code>chatgpt-shell-show-model-icons</code> to <code>nil</code>.</p>
<p><img src="https://xenodium.github.io/images/a-tiny-upgrade-to-the-llm-model-picker/model-picker.png" alt=""></p>
<h2>Make it all sustainable</h2>
<p>Is <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> useful to you? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make my work sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">macOS/iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs elevator pitch</title>
<link>https://xenodium.com/emacs-elevator-pitch</link>
<guid isPermaLink="false">https://xenodium.com/emacs-elevator-pitch</guid>
    <description><![CDATA[<p>Me: Have you heard of Emacs?<br>
Me: On the surface, it looks like a text editor…<br>
Me: But really, it's more like a gateway to a world moulded to your needs.<br>
Me: Emacs ships with an <a href="https://www.gnu.org/software/emacs/manual/html_node/calc/RPN-Tutorial.html">RPN calculator</a> and even a <a href="https://www.emacswiki.org/emacs/EmacsDoctor">doctor</a>.<br>
Me: Naturally, it doesn't do everything I want it to do nor how I want it to.<br>
Me: Luckily, I can throw <a href="https://en.wikipedia.org/wiki/Emacs_Lisp">elisp</a> at it and make it do things my way.<br></p>
<p>Stranger: Huh??</p>
<p>Me: Emacs didn't quite do all the things I wanted it to, so…<br>
Me: I made it <a href="https://xenodium.com/a-tour-of-ready-player-mode">play music how I wanted it to</a>.<br>
Me: Control my operating system (<a href="https://xenodium.com/emacs-rotate-my-macos-display">1</a>, <a href="https://xenodium.com/emacs-quick-kill-process">2</a>, <a href="https://xenodium.com/toggle-macos-menu-bar-from-you-know-where">3</a>, <a href="https://xenodium.com/emacs-connect-my-bluetooth-speaker">4</a>).<br>
Me: Help me <a href="https://xenodium.com/a-platform-that-moulds-to-your-needs">learn Japanese</a>.<br>
Me: <a href="https://xenodium.com/emacs-as-your-video-trimming-tool">Trim videos</a>… <a href="https://xenodium.com/trimming-video-screenshots">or video screenshots</a>.<br>
Me: Talk to the LLM robots (<a href="https://github.com/xenodium/chatgpt-shell">1</a>, <a href="https://github.com/xenodium/dall-e-shell">2</a>).<br>
Me: <a href="https://xenodium.com/previewing-swiftui-layouts-in-emacs-revisited">Preview SwiftUI layouts</a>.<br>
Me: <a href="https://xenodium.com/how-i-batch-apply-and-save-one-liners">Batch-apply all sorts of utils</a>.<br>
Me: <a href="https://xenodium.com/emacs-send-to-kindle">Send notes to my Kindle</a>.<br>
Me: <a href="https://xenodium.com/inline-previous-result-and-why-you-should-edebug/">Tweak the debugger</a>.<br>
Me: <a href="https://xenodium.com/yasnippet-in-emacs-eshell">Enhance my shell</a>.<br></p>
<p>Stranger: ??!?</p>
<p>Me: <a href="https://xenodium.com/emacs-dwim-do-what-i-mean">Do what I mean</a>.<br>
Me: Tweak my email client (<a href="https://xenodium.com/mu4e-icons">1</a>, <a href="https://xenodium.com/faster-junk-mail-deletion-with-mu4e">2</a>).<br>
Me: Bring closer macOS integration (<a href="https://xenodium.com/awesome-emacs-on-macos">1</a>, <a href="https://xenodium.com/emacs-send-to-aka-macos-sharing-merged-upstream">2</a>, <a href="https://xenodium.com/open-in-xcode-at-line-number">3</a>, <a href="https://xenodium.com/rm-important-txt-oh-sht">4</a>).<br>
Me: <a href="https://xenodium.com/emacs-scan-this-qrcode">Scan QR codes</a>.<br>
Me: <a href="https://xenodium.com/recordscreenshot-windows-the-lazy-way">Record Screencasts</a>.<br>
Me: <a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">Build iOS apps</a>.<br>
Me: <a href="https://xenodium.com/blogging-minus-the-yucky-bits-of-modern-web">Blog about all sorts of things</a>.<br>
Me: <a href="https://xenodium.com/emacs-org-block-completion-on-melpa">Tailor completion</a>.<br>
Me: Easily <a href="https://xenodium.com/emacs-clone-git-repo-from-clipboard">clone repos</a>.<br>
Me: Use my <a href="https://xenodium.com/my-emacs-eye-candy">preferred eye candy</a>.<br>
Me: <a href="https://xenodium.com/org-babel-objective-c-support">Evaluate Objective-C code</a>.<br></p>
<p>Stranger: Sir…</p>
<p>Me: <a href="https://xenodium.com/writing-experience-my-decade-with-org">Write however I want</a>.<br>
Me: <a href="https://xenodium.com/joining-images-from-the-comfort-of-dired">Stitch images</a>.<br>
Me: <a href="https://lmno.lol/alvaro/its-all-up-for-grabs-and-it-compounds">Make multiple cursors do what I want</a>.<br>
Me: <a href="https://xenodium.com/emacs-dwim-swiper-vs-isearch-vs-phi-search/">Make searching smarter</a>.<br>
Me: <a href="https://xenodium.com/hey-emacs-where-did-i-take-that-photo">Look up where I took photos</a>.<br>
Me: <a href="https://github.com/xenodium/sqlite-mode-extras">SQLite feel like a spreadsheet</a>.<br>
Me: Easily <a href="https://xenodium.com/emacs-insert-and-render-sf-symbols">insert SF Symbols</a>.<br>
Me: Build <a href="https://xenodium.com/emacs-and-emotional-vocab">an emotional zone</a>.<br>
Me: Tweak my file manager (<a href="https://xenodium.com/interactive-ordering-of-dired-items">1</a>, <a href="https://xenodium.com/hide-another-detail">2</a>, <a href="https://xenodium.com/duplicate-this/">3</a>).<br>
Me: <a href="https://xenodium.com/generating-elisp-org-docs/">Generate documentation</a>.<br>
Me: Gosh, I could keep going…<br></p>
<p>Stranger: <a href="https://knowyourmeme.com/memes/sir-this-is-a-wendys">Sir this is a Wendy's</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-elevator-pitch/wendys.png" alt=""></p>
<h2>Emacs Carnival</h2>
<p>This post is part of the <a href="https://www.emacswiki.org/emacs/Carnival">Emacs Carnival</a>, themed <a href="https://takeonrules.com/2025/08/01/emacs-carnival-2025-08-your-elevator-pitch-for-emacs/">&quot;Your Elevator Pitch for Emacs&quot;, hosted by Jeremy Friesen</a>.</p>
<h2>Make it all sustainable</h2>
<p>Learned something new? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs as your video-trimming tool</title>
<link>https://xenodium.com/emacs-as-your-video-trimming-tool</link>
<guid isPermaLink="false">https://xenodium.com/emacs-as-your-video-trimming-tool</guid>
    <description><![CDATA[<p>Marcin ‘mbork’ Borkowski has a nice post showing us how he <a href="https://mbork.pl/2025-08-18_Cutting_clips_from_videos_with_Emacs">trims video clips from our beloved editor</a>. Trimming clips is something I do from time to time, specially when posting a screencast of sorts. Since I don't need much, I typically resort to QuickTime Player's trimming functionality that ships with macOS. While it does the job, ever since I <a href="https://xenodium.com/seek-and-you-shall-find">added a &quot;graphical&quot; seeker to Ready Player Mode</a>, I had been meaning to build a simple video trimming tool of sorts. Marcin's post was just about the right nudge I needed to also give this a go, yielding <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/video-trimmer.el">video-trimmer-mode</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-as-your-video-trimming-tool/trim.gif" alt=""></p>
<p>The solution relies on <a href="https://www.youtube.com/watch?v=9kaIXkImCAM">ffmpeg</a> to do the heavy lifting and is roughly 300 lines of code. I was going to share the entire snippet in this post, though may as well point you to its <a href="https://github.com/xenodium/video-trimmer">repo</a>. I'm likely to tweak it, so you may as well take a look at its latest incarnation.</p>
<h2>Make it all sustainable</h2>
<p>Find <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/video-trimmer.el">video-trimmer-mode</a> useful? Want me to publish to <a href="https://melpa.org">MELPA</a>? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make my work sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">macOS/iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>macOS dictation returns to Emacs (fix merged)</title>
<link>https://xenodium.com/macos-dictation-returns-to-emacs-fix-merged</link>
<guid isPermaLink="false">https://xenodium.com/macos-dictation-returns-to-emacs-fix-merged</guid>
    <description><![CDATA[<p>macOS apps typically benefit from built-in voice dictation input (included as a macOS freebie), with little to no additional work required from app developers.</p>
<p><img src="https://xenodium.github.io/images/macos-dictation-returns-to-emacs-fix-merged/dictation.webp" alt=""></p>
<p>Emacs had supported this capability until relatively recently, when we began seeing reports that <a href="https://lists.gnu.org/archive/html/bug-gnu-emacs/2025-03/msg00585.html">dictation was no longer available as of Emacs 30</a>.</p>
<p>While I have no direct experience with macOS dictation-related APIs, I bisected Emacs 30 changes affecting macOS-related code (typically Objective-C code with .m file extensions). This led me to a seemingly harmless change introducing NSTextInputClient, intended to remove a deprecation warning. From that change onwards, dictation stopped working.</p>
<p>Reverting the change did indeed bring dictation back, but at the cost of re-introducing the deprecation warning. Looking closer at the current NSTextInputClient implementation, I noticed some stubbed-out methods. In particular, <code>selectedRange</code> stood out:</p>
<pre><code class="language-objc">- (NSRange)selectedRange
{
  if (NS_KEYLOG)
    NSLog (@&quot;selectedRange request&quot;);
  return NSMakeRange (NSNotFound, 0);
}
</code></pre>
<p>Turns out implementing <code>selectedRange</code> is all it took to bring dictation back:</p>
<pre><code class="language-diff">diff --git a/src/nsterm.m b/src/nsterm.m
index 003aadb9782..2b34894f36e 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -7413,7 +7413,24 @@ - (NSRange)selectedRange
 {
   if (NS_KEYLOG)
     NSLog (@&quot;selectedRange request&quot;);
-  return NSMakeRange (NSNotFound, 0);
+
+  struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));
+  struct buffer *buf = XBUFFER (w-&gt;contents);
+  ptrdiff_t point = BUF_PT (buf);
+
+  if (NILP (BVAR (buf, mark_active)))
+    {
+      NSUInteger selection_location = point - BUF_BEGV (buf);
+      return NSMakeRange (selection_location, 0);
+    }
+
+  ptrdiff_t mark = marker_position (BVAR (buf, mark));
+  ptrdiff_t region_start = min (point, mark);
+  ptrdiff_t region_end = max (point, mark);
+  NSUInteger selection_location = region_start - BUF_BEGV (buf);
+  NSUInteger selection_length = region_end - region_start;
+
+  return NSMakeRange (selection_location, selection_length);
 }
</code></pre>
<p>Implementing <code>selectedRange</code> didn't just bring dictation back, but now leverages a newer macOS dictation implementation. You can see the slight differences in UI.</p>
<h2>Before</h2>
<p><img src="https://xenodium.github.io/images/macos-dictation-returns-to-emacs-fix-merged/before.jpg" alt=""></p>
<h2>After</h2>
<p><img src="https://xenodium.github.io/images/macos-dictation-returns-to-emacs-fix-merged/after.jpg" alt=""></p>
<h2>Merged upstream</h2>
<p>I've since <a href="https://debbugs.gnu.org/cgi/bugreport.cgi?bug=79070">submitted a patch upstream</a>. I'm happy to report that as of today, the patch is now <a href="https://cgit.git.savannah.gnu.org/cgit/emacs.git/commit/?id=6e64e0bd26b6c0f1c4e90c9bc0df37a2a9ac72da">merged into master</a>. Thank you Gerd Möllmann and Eli Zaretskii for your help! Also big thanks to Stephen Englen, Fritz Grabo, @veer66 and @dotemacs on the fediverse who <a href="https://indieweb.social/@xenodium/114891280426640026">quickly jumped in to help validate the fix</a>.</p>
<p>While we've yet to find out when the next Emacs release will ship, we at least know the fix is coming! If like me, you'd like to get the fix backported to Emacs 30, I've <a href="https://xenodium.com/patching-your-homebrews-emacs-plus-macos">shown you how to do just that on Emacs Plus</a> (my favourite macOS build).</p>
<h2>Make it all sustainable</h2>
<p>Glad macOS dictation is fixed? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make my work sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">macOS/iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Writing experience: My decade with Org</title>
<link>https://xenodium.com/writing-experience-my-decade-with-org</link>
<guid isPermaLink="false">https://xenodium.com/writing-experience-my-decade-with-org</guid>
    <description><![CDATA[<p>While I missed <a href="https://www.emacswiki.org/emacs/Carnival">Emacs Carnival</a>'s <a href="https://christiantietze.de/posts/2025/06/emacs-carnival-2025-06-take-two/">Take two</a>, with this month's prompt being <a href="https://gregnewman.io/blog/emacs-carnival-2025-07-writing-experience/">Writing Experience</a>, I figured I may have a thing or two to share about my <a href="https://orgmode.org/">Org</a> adoption.</p>
<p><a href="https://orgmode.org/">Org mode</a> is often regarded as one of the indispensable <a href="https://www.gnu.org/software/emacs/">Emacs</a> features. A Swiss army of sorts enabling outlining, presentations, task management, agenda, note-taking, blogging, literate programming, the list goes on… At its core, Org features are powered by a versatile markup. Kinda like <a href="https://en.wikipedia.org/wiki/Markdown">Markdown</a> but on steroids. When starting with Org, it's easy to feel lost in the overwhelming <a href="http://doc.norang.ca/org-mode.html">sea of features</a>.</p>
<p>Luckily, we don't have to know or understand all of Org to get started nor ever need to. You get to pick and use what's useful to you at any given time.</p>
<h2>Getting started</h2>
<p>Want to get started with outlines? Easy. Let's say you wanted to start collecting <a href="https://www.python.org/">python</a> idioms, you can start with an entry like:</p>
<pre><code class="language-org">* Python idioms

- Prefer double quotes if escaping single quotes.
- Prefer string interpolation over join. Eg. &quot;'%s'&quot; % member_default.

...
</code></pre>
<p>That's precisely what I did when I started using Org nearly 12 years ago. I created a notes file and added <a href="https://xenodium.com/some-python-idioms">my first entry to collect python 2 idioms</a>. While the idioms may be outdated by now (who knows, it's been many years since I've written any significant amount of python code), but hey that's besides the point. I wanted to start a personal notes file and Org sounded awesome for that.</p>
<p>Over time, my notes file grew in usefulness. The more I wrote, the more I could recall with search. That is, until I was away from my computer. At that point, I figured I could just export my notes to HTML (via <code>M-x org-export-dispatch</code>) and post online. Over time, folks started reaching out about something read in my notes, and so by then I suppose I had accidentally become a blogger.</p>
<h2>Blogging</h2>
<p>In 12 years of &quot;blogging&quot;, my approach hasn't changed much. I still write to <a href="https://raw.githubusercontent.com/xenodium/xenodium.github.io/refs/heads/master/index.org">the very same Org file</a> (beware it's big) I started writing notes to. I found this approach fairly accessible, with little ceremony. When I want to write, I open the usual text file and just write. It wasn't until fairly recently I learned this is often referred to as &quot;<a href="https://mikegrindle.com/posts/obtf">one big text file</a>&quot; (OBTF).</p>
<p>My HTML exporting evolved into hacky <a href="https://en.wikipedia.org/wiki/Emacs_Lisp">elisp</a> cobbled together over time. While the code was nothing to rave about, it did the job just fine for well over a decade. Having said that, it was more of an &quot;it works on my machine&quot; sorta thing. Last year, I finally decided to change my blogging approach and built a blogging platform (in 2024?! I know right?!). Well, the modern web has led us to a sea of tracking, bloat, advertising, the list goes on… I wanted to offer a lightweight blogging alternative with none of the typical crummy bits, so I built <a href="https://LMNO.lol">LMNO.lol</a>. Today, my <a href="https://xenodium.com">xenodium.com</a> blog runs off that.</p>
<h2>Org and Markdown are friends</h2>
<p><a href="https://LMNO.lol">LMNO.lol</a> is powered by Markdown. Wait, what? You may be wondering why an Org fan would build a blogging platform powered by a different markup? In a nutshell, reach. While I remain a faithful Org fan for its capabilities, if I want my blogging platform to appeal to more users, I can't ignore the fact that today Markdown is the prevalent format. Having said that, I wasn't about to give up on Org for personal use. I can actually have my cake and eat it too. You see, I continue writing to Org and convert to Markdown before uploading to <a href="https://LMNO.lol">LMNO.lol</a> via <a href="https://pandoc.org/">pandoc</a>, the Swiss Army tool of file converters.</p>
<h2>Incremental Org adoption</h2>
<h3>Tables</h3>
<p>As you know, my Org adoption started with a very simple outline intended for personal notes, but we know <a href="https://doc.norang.ca/org-mode.html">Org is a universe of its own</a>. I soon learned about <a href="https://orgmode.org/manual/Built_002din-Table-Editor.html">Org tables</a>.</p>
<pre><code class="language-org">| name                 | job              | origin             |
|----------------------+------------------+--------------------|
| Fry                  | Delivery Boy     | Earth              |
| Bender               | Bending Unit     | Earth              |
| Leela                | Captain          | Mutant Underground |
| Professor Farnsworth | Scientist        | Earth              |
| Amy Wong             | Intern           | Mars               |
| Dr. Zoidberg         | Staff Doctor     | Decapod 10         |
| Hermes Conrad        | Bureaucrat       | Earth              |
| Zapp Brannigan       | 25-Star General  | Earth              |
| Mom                  | Owner of MomCorp | Earth              |
| Nibbler              | Leela's pet      | Planet Eternium    |
</code></pre>
<p>I'd keep finding really handy Org tips here and there. Like <a href="https://xenodium.com/org-tip-convert-csv-to-table">converting csv to Org by merely selecting the text</a> from my beloved editor.</p>
<p><img src="https://xenodium.github.io/images/org-tip-convert-csv-to-table/csv-to-org-table.gif" alt=""></p>
<h3>Tasks</h3>
<p>We mentioned Org handling task management, amongst many other things. In a nutshell, tasks in Org are &quot;simple TODO lists&quot;, using special keywords. I got started with Org tasks with something like this:</p>
<pre><code class="language-org">* DONE Call granny
* DONE Post on Reddit
* STARTED Procrastinate some more
* TODO Do your homework
</code></pre>
<p>I say &quot;simple TODO lists&quot; (in quotes) because Org task management is a another universe of its own. You can schedule tasks in all sorts of ways (like recurring), as habits, tag them, refile them, etc. and even get a nice agenda view to interact with.</p>
<p>I don’t have an agenda post on this myself, but <a href="https://christiantietze.de/">Christian Tietze</a> has a wonderful write-up showcasing <a href="https://christiantietze.de/posts/2022/12/updated-org-mode-agenda-display-buffer-alist/">an improved Org-mode agenda display</a>.</p>
<p><img src="https://christiantietze.de/posts/2022/12/updated-org-mode-agenda-display-buffer-alist/2022-12-27_org-agenda.png" alt=""></p>
<h3>Babel</h3>
<p>Moving on from task management, I soon discovered <a href="https://orgmode.org/worg/org-contrib/babel/">babel</a>, another Org super power enabling you to include code snippets. Not too different to Markdown, but I found the ability to evaluate/execute snippets and capture output pretty magical.</p>
<pre><code class="language-org">#+BEGIN_SRC python
  print(&quot;Hello python world&quot;)
#+END_SRC

#+RESULTS:
: Hello python world
</code></pre>
<h2>Adding Objective-C Org babel support</h2>
<p>At the time, I was writing a fair bit of Objective-C code but found babel support was missing. By looking at <code>ob-C.el</code> and <code>ob-java.el</code>, <a href="https://xenodium.com/org-babel-objective-c-support">I figured how to add Objective-C support</a>. Surprisingly, it took very little code and I could now execute Objective-C code just like python from the comfort of an Org buffer.</p>
<pre><code class="language-org">#+BEGIN_SRC objc
  #import &lt;Foundation/Foundation.h&gt;

  int main() {
    NSLog(@&quot;Hello ObjC World&quot;);
    return 0;
  }
#+END_SRC

#+RESULTS:
: Hello ObjC World
</code></pre>
<h2>Adding Org block completion</h2>
<p>With Org code blocks (and babel superpowers), I soon found myself including lots of snippets in my notes. I tried different different input mechanisms and eventually settled on <a href="https://xenodium.com/emacs-org-block-company-completion">writing my own company completion backend</a>.</p>
<p><img src="https://github.com/xenodium/company-org-block/raw/master/hello-company-org-block.gif" alt=""></p>
<p>company-org-block is available on <a href="https://github.com/xenodium/company-org-block">GitHub</a> and <a href="https://melpa.org/#/company-org-block">MELPA</a>.</p>
<p>Later on, with <a href="https://github.com/meliache">Michael Eliachevitch</a>'s help, we got <a href="https://github.com/xenodium/org-block-capf">org-block-capf</a> going.</p>
<p><img src="https://github.com/xenodium/org-block-capf/raw/main/corfu.png" alt=""></p>
<h2>Fitbit API, Org babel, and gnuplot</h2>
<p>I continued having fun with Org babel. You can combine source blocks for different purposes, so I used it to <a href="https://xenodium.com/fitbit-api-org-babel-and-gnuplot">fetch and plot Fitbit data</a> via <a href="http://gnuplot.info/">Gnuplot</a>.</p>
<pre><code class="language-org">#+BEGIN_SRC sh :results table
curl -s -H &quot;Authorization: Bearer TOKEN&quot; https://api.fitbit.com/1/user/USER_ID/body/weight/date/2018-06-09/2018-07-11.json | jq '.[][] | &quot;\(.dateTime) \(.value)&quot;' | sed 's/&quot;//g'
#+END_SRC

#+RESULTS: weight-data
| 2018-06-09 | 65.753 |
| 2018-06-10 | 65.762 |
...
| 2018-07-10 |  64.22 |
| 2018-07-11 |  63.95 |

#+BEGIN_SRC gnuplot :var data=weight-data :exports code :file images/fitbit-api-org-babel-and-gnuplot/weight.png
reset
set title &quot;My recent weight&quot;
set xdata time
set timefmt '%Y-%m-%d'
set format x &quot;%d/%m/%y&quot;
set term png
set xrange ['2018-06-09':'2018-07-11']
plot data u 1:2 with linespoints title 'Weight in Kg'
#+END_SRC
</code></pre>
<p><img src="https://xenodium.github.io/images/fitbit-api-org-babel-and-gnuplot/weight.png" alt=""></p>
<h2>Adding SwiftUI Org babel support</h2>
<p>Having learned that babel can generate images (like <a href="http://gnuplot.info/">Gnuplot</a>), I figured I could have <a href="https://xenodium.com/swiftui-layout-previews-using-emacs-org-blocks">fun with SwiftUI</a> too and built <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a>. Also on <a href="https://melpa.org/#/ob-swiftui">MELPA</a>.</p>
<p><img src="https://xenodium.github.io/images/ob-swiftui-updates/file-render.gif" alt=""></p>
<h2>Adding Org links (DWIM style)</h2>
<p>Notes aren't complete without links to references. I was already using a keyboard shortcut of sorts, but <a href="https://xenodium.com/emacs-dwim-do-what-i-mean">I figured I could make it much smarter</a>. As in <a href="https://en.wikipedia.org/wiki/DWIM">DWIM</a>: Do what I mean. Like automatically fetching link title from the web and other things.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-do-what-i-mean/do-what-i-mean.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-do-what-i-mean/link-this-text.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-do-what-i-mean/edit-link.gif" alt=""></p>
<h2>Scraping useful links</h2>
<p>Comments in posts can be a great source of recommendations (someone asking for books, blogs, etc), so I figured I could get Emacs to <a href="https://xenodium.com/emacs-link-scraping-2021-edition">extract all links from an online post and dump them to an org file</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-link-scraping-2021-edition/scrape.png" alt=""></p>
<h2>Change your MAC address in Org of course</h2>
<p>Cause you never know when you're gonna need it, I randomly saved a snippet to <a href="https://xenodium.com/changing-mac-address-from-org-mode">change your MAC address from the comfort of your Org notes</a>. Execute via <code>C-c C-c</code>.</p>
<pre><code class="language-org">#+begin_src bash :dir /sudo::
  changeMAC() {
      local mac=$(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//')
      ifconfig en0 ether $mac
      ifconfig en0 down
      ifconfig en0 up
      echo &quot;Your new physical address is $mac&quot;
  }

  changeMAC
#+end_src

#+RESULTS:
: Your new physical address is b4:b2:f8:77:bb:87
</code></pre>
<p>By the way, noticed the <code>:dir /sudo::</code> header? It enables executing the snippet as root.</p>
<h2>Generating documentation for your Emacs package</h2>
<p>Having built a handful of Emacs packages, maintaining a README.org documenting commands available (and keeping it up-to-date) was a bit of a chore. I figured you could automate things and generate <a href="https://xenodium.com/generating-elisp-org-docs">a nice Org table documenting your package commands and customizable variables</a>.</p>
<p>When you see <a href="https://github.com/xenodium/chatgpt-shell?tab=readme-ov-file#chatgpt-shell-commands">this table</a> in my GitHub project, you now know how it was generated.</p>
<p><img src="https://xenodium.github.io/images/generating-elisp-org-docs/commands.gif" alt=""></p>
<h2>A noweb detour: the lesser known Org babel glue</h2>
<p>While Org babel's noweb support isn't super widely known, I learned it's <a href="https://xenodium.com/noweb-more-glue-for-your-org-toolbox">great for glueing org babel blocks</a>. I love how Org knowledge (and Emacs benefits really) just keep compounding. I started by just writing a simple Org outline. Remember?</p>
<p><img src="https://xenodium.github.io/images/noweb-more-glue-for-your-org-toolbox/data-chart.gif" alt=""></p>
<h2>LLMs join the babel chat</h2>
<p>In 2023, I <a href="https://xenodium.com/a-chatgpt-emacs-shell">started experimenting with LLMs and Emacs integrations</a>. Naturally, I had to add babel support too, so <a href="https://github.com/xenodium/chatgpt-shell">ob-chatgpt-shell</a> (<a href="https://melpa.org/#/ob-chatgpt-shell">MELPA</a>) and <a href="https://github.com/xenodium/ob-dall-e-shell">ob-dall-e-shell</a> (<a href="https://melpa.org/#/ob-dall-e-shell">MELPA</a>) were <a href="https://xenodium.com/chatgpt-shell-available-on-melpa#dall-e-shell%2C-ob-chatgpt-shell%2C-and-ob-dall-e-shell-(on-melpa-too)">added to the mix</a>.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/babel.png" alt=""></p>
<h2>Smarter Org capture templates</h2>
<p>Your knowledge base is only as useful as its wealth. The more you write, the better. And of course, the less friction, the more likely you are to write more.</p>
<p><a href="https://howardism.org/Technical/Emacs/capturing-intro.html">Org capture</a> is super useful to save your thoughts quickly into an Org file. You can come up with all sorts of templates to expedite the process. In addition to the base structure, I figured I could <a href="https://xenodium.com/a-richer-journelly-org-capture-template">automatically capture my current location, date, time, and weather</a> as part of a note.</p>
<p><img src="https://xenodium.github.io/images/a-richer-journelly-org-capture-template/capture.gif" alt=""></p>
<h2>Presenting in style</h2>
<p>There are no shortages of Emacs packages leveraging Org mode to give presentations (<a href="https://github.com/rlister/org-present">org-present</a> is one of many). I often enjoy <a href="https://daviwil.com">David Wilson</a>'s <a href="https://www.youtube.com/@SystemCrafters">videos</a>. In this one, <a href="https://systemcrafters.net/emacs-tips/presentations-with-org-present/">he shares his presentation setup</a>. I figured it'd be fun to <a href="https://xenodium.com/emacs-org-present-in-style">experiment with <code>org-present</code> to spiff things up</a>. I wanted a sort of smart navigation where items are automatically expanded and collapsed as I <code>&lt;tab&gt;</code> my way through a presentation.</p>
<p><img src="https://xenodium.github.io/images/emacs-org-present-in-style/org-navigate_x1.6.webp" alt=""></p>
<h2>Org as lingua franca</h2>
<p>With my Org usage growing, I felt like I was missing Org support outside of Emacs. Web access to my blog wasn't enough. I wanted to quickly capture things while on the go, so I started building iOS apps revolving around my Emacs and Org usage.</p>
<h3>Journelly (iOS)</h3>
<p><a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">Journelly</a> is my latest iOS app, centered around note-taking and journaling. The app feels like tweeting, but for your eyes only of course. It's powered by Org markup, which can be synced with Emacs via iCloud.</p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/sideways.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/emacs.gif" alt=""></p>
<h3>Flat Habits (iOS)</h3>
<p><a href="https://orgmode.org/manual/Tracking-your-habits.html">Org habits</a> are handy for tracking daily habits. However, it wasn't super practical for me as I often wanted to check things off while on the go (away from Emacs). That led me to build <a href="https://xenodium.com/flat-habits-for-ios">Flat Habits</a>.</p>
<p><img src="https://xenodium.github.io/images/frictionless-org-habits-on-ios/flat_habits.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/flat-habits-meets-org-agenda/flat_agenda.gif" alt=""></p>
<h3>Scratch (iOS)</h3>
<p>While these days I'm using <a href="https://journelly.com/">Journelly</a> to jot down just about anything, before that, I built and used <a href="https://xenodium.com/scratch-a-minimal-scratch-area">Scratch</a> as scratch pad of sorts. No iCloud syncing, but needless to say, it's also powered by Org markup.</p>
<p><img src="https://xenodium.github.io/images/scratch-a-minimal-scratch-area/scratch-download_no_audio_x2.6.webp" alt=""></p>
<h3>Plain Org (iOS)</h3>
<p>For more involved writing, nothing beats Emacs Org mode. But what if I want quick access to my Org files while on the go? <a href="https://plainorg.com/">Plain Org</a> is my iOS solution for that.</p>
<p><img src="https://xenodium.github.io/images/awesome-emacs-on-macos/plain-org.png" alt=""></p>
<h3>LMNO.lol</h3>
<p>While I already mentioned <a href="https://lmno.lol">LMNO.lol</a>, it's been heavily inspired by my Org workflow. You write your notes or blog posts to a single plain text file, sprinkling <a href="https://en.wikipedia.org/wiki/Markdown">Markdown</a> this time around, and just drag and drop it to the web. <a href="https://lmno.lol">LMNO.lol</a> takes care of the rest.</p>
<p><img src="https://xenodium.github.io/images/blogging-minus-the-yucky-bits-of-modern-web/demo.gif" alt=""></p>
<h2>Org bookmarks</h2>
<p>While there is newer content out there, I did capture <a href="https://xenodium.com/org-mode-bookmarks">a handful of Org bookmarks</a> at some point. <a href="https://xenodium.com/org-tips-from-2015-03-18-emacs-hangout/">This one took me down memory lane</a>. <a href="https://sachachua.com/blog/">Sacha Chua</a> used make these really fun videos interviewing Emacs folks, often discussing their Emacs configs. I learned a ton from these videos. That time, Sacha interviewed <a href="https://howardism.org/">Howard Abrams</a>. Gosh, that was over 10 years ago.</p>
<p>Off the top of my head, <a href="https://karl-voit.at/">Karl Voit</a> also comes to mind, <a href="https://karl-voit.at/2017/09/23/orgmode-as-markup-only">for championing Org for years</a>. I know I'm not doing it justice. There are far too many folks I've learned from, who kindly share their knowledge. I've <a href="https://xenodium.com/org-mode-bookmarks">bookmarked some of them</a> in the past.</p>
<p>Naturally, my Org journey wouldn't be possible without <a href="https://orgmode.org">Org mode</a> itself and the incredible work from the authors and maintainers. I've personally donated to their cause and even got my ex-employer to donate multiple times.</p>
<h2>I could keep showing more things…</h2>
<p>You could argue my Org usage is fairly random. Maybe it is. I'd say it's more organic than anything. I more or less started writing outlines and TODO lists, incrementally adopting whatever needed over time. It's up to you how much or little Org you adopt. Whatever you pick is the right answer for you. The Org feature set is just so vast. Some of the things I've tried didn't stick for me like <a href="https://xenodium.com/plotting-ledger-reports-in-org">plotting ledger reports</a> or <a href="https://xenodium.com/spam-blacklisting-with-emacs-org-babel">combating spam</a> through Org, but by trying things I got to discover other things that probably did stick.</p>
<p>I could keep going, showing you more examples of the things I discovered, but in such a vast universe what's useful to me may not be useful to you. With such a diverse toolbox, it's highly likely you'll find just the right tool for your needs.</p>
<p>Ok, we get it. The feature set is rich. But most importantly, your data is saved in plain, transparent text, easily accessible to other tools. Heck, I even wrote my own iOS apps to view and edit Org files on the go. In over ten years of using Org, I've never lost access to my data, and I never will. That alone is the non-negotiable cherry on the cake.</p>
<h2>Make it all sustainable</h2>
<p>Learned something new? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? I am an 👉 indie dev 👈. Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Interactive ordering of dired items</title>
<link>https://xenodium.com/interactive-ordering-of-dired-items</link>
<guid isPermaLink="false">https://xenodium.com/interactive-ordering-of-dired-items</guid>
    <description><![CDATA[<p>Redditor <a href="https://www.reddit.com/user/sauntcartas/">sauntcartas</a> offers a nice solution for <a href="https://www.reddit.com/r/emacs/comments/1m6qode/getting_filenames_from_a_dired_buffer_in_an/">getting Emacs dired filenames in an arbitrary order</a>. I have to say, while relatively rare, this is something I need from time to time. You see, I like to apply batch file operations from the comfort of <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> buffers (via <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>).</p>
<p>Take, for example, <code>M-x dwim-shell-commands-join-images-horizontally</code>. It does what it says on the tin. I can mark a handful of image files via <code>dired</code> and easily join them into a single file. The problem is that the file listing isn't always in the desired order, so this is where custom ordering comes in handy.</p>
<p>I wanted an interactive way of reordering <code>dired</code> items. While <a href="https://www.reddit.com/r/emacs/comments/1m6qode/comment/n4pso9o/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">bouncing ideas</a> with <a href="https://www.reddit.com/user/arthurno1/">arthurno1</a>, it led us to a <a href="https://github.com/rejeep/drag-stuff.el">drag-stuff</a> experience, which I'm already a fan of. While <code>drag-stuff</code> works in most editable buffers, it breaks on <code>dired</code>. For now, I figured I could just write a couple of dired-specific interactive commands to provide a similar dragging experience, and so I did.</p>
<p>We can likely improve the commands a bit, but hey they do the job as is…</p>
<pre><code class="language-{.commonlisp">(defun ar/dired-drag-item-up ()
  &quot;Drag dired item down in buffer.&quot;
  (interactive)
  (unless (dired-get-filename nil t)
    (error &quot;Not a dired draggable item&quot;))
  (when (= (line-number-at-pos) 2)
    (error &quot;Already at top&quot;))
  (let* ((inhibit-read-only t)
         (col (current-column))
         (item-start (line-beginning-position))
         (item-end (1+ (line-end-position)))
         (item (buffer-substring item-start item-end)))
    (delete-region item-start item-end)
    (forward-line -1)
    (beginning-of-line)
    (insert item)
    (forward-line -1)
    (move-to-column col)))

(defun ar/dired-drag-item-down ()
  &quot;Drag dired item down in buffer.&quot;
  (interactive)
  (unless (dired-get-filename nil t)
    (error &quot;Not a dired draggable item&quot;))
  (when (save-excursion
          (forward-line 1)
          (eobp))
    (error &quot;Already at bottom&quot;))
  (let* ((inhibit-read-only t)
         (col (current-column))
         (item-start (line-beginning-position))
         (item-end (1+ (line-end-position)))
         (item (buffer-substring item-start item-end)))
    (delete-region item-start item-end)
    (forward-line 1)
    (beginning-of-line)
    (insert item)
    (forward-line -1)
    (move-to-column col)))
</code></pre>
<p>I gotta say, these <code>dired</code> dragging commands work great with <code>M-x dwim-shell-commands-join-images-horizontally</code>. I bind them to <code>M-&lt;up&gt;</code> and <code>M-&lt;down&gt;</code> same as <code>drag-stuff</code> elsewhere (already in my <a href="https://github.com/xenodium/dotsies/commit/a183363f20118b7cc527e48b36620034a64e2ec9">config</a>).</p>
<pre><code class="language-{.commonlisp">(use-package dired
  :bind (:map dired-mode-map
              (&quot;M-&lt;up&gt;&quot; . ar/dired-drag-item-up)
              (&quot;M-&lt;down&gt;&quot; . ar/dired-drag-item-down)))
</code></pre>
<p>You can see the new <code>dired</code> commands in action.</p>
<p><img src="https://xenodium.github.io/images/interactive-ordering-of-dired-items/dired-reordering.gif" alt=""></p>
<h2>Bonus</h2>
<p>While bouncing ideas with <code>arthurno1</code>, we also came up with another helper to create new <code>dired</code> buffers populated from marked items, maybe needed for those times you want a more focused experience.</p>
<pre><code class="language-{.commonlisp">(defun ar/dired-from-marked-items ()
  &quot;Create a new dired buffer containing only the marked files.

Also allow dragging items up and down via M-&lt;up&gt; and M-x&lt;down&gt;.&quot;
  (interactive)
  (let ((marked-files (dired-get-marked-files))
        (buffer-name (generate-new-buffer-name
                      (format &quot;*%s (selection)*&quot;
                              (file-name-nondirectory
                               (directory-file-name default-directory))))))
    (unless marked-files
      (error &quot;No dired marked files&quot;))
    (dired (cons buffer-name
                 (mapcar (lambda (path)
                           (file-relative-name path default-directory))
                         marked-files)))))
</code></pre>
<p><img src="https://xenodium.github.io/images/interactive-ordering-of-dired-items/new-from-marked.gif" alt=""></p>
<h2>Make it all sustainable</h2>
<p>Learned something new? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Patching your Homebrew's Emacs Plus (macOS)</title>
<link>https://xenodium.com/patching-your-homebrews-emacs-plus-macos</link>
<guid isPermaLink="false">https://xenodium.com/patching-your-homebrews-emacs-plus-macos</guid>
    <description><![CDATA[<p>Patching and building <a href="https://www.gnu.org/software/emacs/">Emacs</a> from source on macOS is fairly straightforward, but what if I'd like to patch my <a href="https://github.com/d12frosted/homebrew-emacs-plus">Emacs Plus Homebrew</a> builds?</p>
<p>Let's cover both ways of patching our favourite editor…</p>
<h2>Patching Emacs upstream sources</h2>
<p>If you'd like to build from the <a href="https://cgit.git.savannah.gnu.org/cgit/emacs.git/log/">master</a> branch, you can check its sources out like so:</p>
<pre><code class="language-{.bash">git clone git://git.sv.gnu.org/emacs.git
cd emacs
</code></pre>
<p>Next, we'll patch Emacs source as needed. For example, I recently <a href="https://debbugs.gnu.org/cgi/bugreport.cgi?bug=79070">wanted to patch src/nsterm.m</a> to see if I could fix a <a href="https://lists.gnu.org/archive/html/bug-gnu-emacs/2025-03/msg00585.html">macOS dictation regression introduced on Emacs 30</a>.</p>
<pre><code class="language-diff">diff --git a/src/nsterm.m b/src/nsterm.m
index 003aadb9782..2b34894f36e 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -7413,7 +7413,24 @@ - (NSRange)selectedRange
 {
   if (NS_KEYLOG)
     NSLog (@&quot;selectedRange request&quot;);
-  return NSMakeRange (NSNotFound, 0);
+
+  struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));
+  struct buffer *buf = XBUFFER (w-&gt;contents);
+  ptrdiff_t point = BUF_PT (buf);
+
+  if (NILP (BVAR (buf, mark_active)))
+    {
+      NSUInteger selection_location = point - BUF_BEGV (buf);
+      return NSMakeRange (selection_location, 0);
+    }
+
+  ptrdiff_t mark = marker_position (BVAR (buf, mark));
+  ptrdiff_t region_start = min (point, mark);
+  ptrdiff_t region_end = max (point, mark);
+  NSUInteger selection_location = region_start - BUF_BEGV (buf);
+  NSUInteger selection_length = region_end - region_start;
+
+  return NSMakeRange (selection_location, selection_length);
 }

 #if defined (NS_IMPL_COCOA) || GNUSTEP_GUI_MAJOR_VERSION &gt; 0 || \

</code></pre>
<p>Now we're ready to configure and build.</p>
<pre><code class="language-{.bash">./autogen.sh
./configure --with-ns --prefix=&quot;$PWD/nextstep/Emacs.app/Contents/MacOS&quot; --enable-locallisppath=&quot;${PWD}/nextstep/Emacs.app/Contents/MacOS&quot;
make install
</code></pre>
<p>We've used <code>nextstep/Emacs.app/Contents/MacOS</code> as our target directory, so we can test our builds from exactly there… and there you have it, your newly built <code>Emacs.app</code>, ready for opening.</p>
<pre><code class="language-{.bash">open nextstep/Emacs.app
</code></pre>
<h2>Patching Emacs Plus</h2>
<p>While patching and building upstream Emacs sources as above is fairly common, patching <a href="https://github.com/d12frosted/homebrew-emacs-plus">Emacs Plus</a> may not be as well known.</p>
<p>I'm a big fan of <a href="https://d12frosted.io/">Boris Buliga</a>'s excellent <a href="https://brew.sh/">Homebrew</a> recipe and use it daily, so it makes sense for me to get acquainted with its patching capabilities.</p>
<p>First we check out the Emacs Plus Homebrew repo:</p>
<pre><code class="language-{.bash">git clone https://github.com/d12frosted/homebrew-emacs-plus.git
cd homebrew-emacs-plus
</code></pre>
<p>At this point, it's worth noting Emacs Plus enables building different Emacs versions (29, 30, and even master). It extends Emacs by applying its own patches at build time. For example, if we'd like to patch Emacs 30, we'll customise the 30 build to apply our own changes.</p>
<p>Remember our <code>src/nsterm.m</code> patch above? We'll rebased it <a href="https://mirror.lyrahosting.com/gnu/emacs/emacs-30.1.tar.gz">against the Emacs 30 tarball</a> and save in the Emacs Plus patches directory:</p>
<pre><code class="language-{.bash">./patches/emacs-30/dictation.patch
</code></pre>
<p>Next we'll need to generate a hash to complete our Emacs 30 patch details:</p>
<pre><code class="language-bash">sha256sum ./patches/emacs-30/dictation.patch
</code></pre>
<p>Now we add our patch details to <code>./Formula/emacs-plus@30.rb</code>:</p>
<pre><code class="language-ruby">local_patch &quot;dictation&quot;, sha: &quot;cb102525bba7385d7d85c52d31101af3d2cbbf076468dacbf505039082ec521c&quot;
</code></pre>
<p>With that, we're ready to build Emacs Plus, which comes with a handy build script. I'm a fan of <a href="https://github.com/SavchenkoValeriy/emacs-icons">Valeriy Savchenko's macOS icons</a>, so I'll throw in the optional icon flag. I should also mention Emacs Plus offers a <a href="https://github.com/d12frosted/homebrew-emacs-plus?tab=readme-ov-file#icons">rich catalog of app icons</a>. Now back to building…</p>
<pre><code class="language-{.bash">HOMEBREW_DEVELOPER=1 ./build 30 --with-savchenkovaleriy-big-sur-curvy-3d-icon
</code></pre>
<p>The build output should look a little something like the following (look out for our applied patch)</p>
<pre><code class="language-{.bash">./Formula/emacs-plus-local.rb --with-savchenkovaleriy-big-sur-curvy-3d-icon
==&gt; Fetching downloads for: emacs-plus-local
==&gt; Fetching emacs-plus-local
==&gt; Downloading https://ftp.gnu.org/gnu/emacs/emacs-30.1.tar.xz
Already downloaded: /Users/alvaro/Library/Caches/Homebrew/downloads/b2b29daf5d872710063495e32b8b5234c2fbfffccec82222b65e7f2b4e7fb4da--emacs-30.1.tar.xz
==&gt; Patching
==&gt; Applying fix-window-role.patch
==&gt; Applying system-appearance.patch
==&gt; Applying round-undecorated-frame.patch
==&gt; Applying dictation.patch     &lt;---- Our patch 🎉
==&gt; ./autogen.sh
==&gt; ./configure --disable-silent-rules --enable-locallisppath=/opt/homebrew/share/emacs/site-lisp --infodir=/opt/homebrew/Cellar/emacs-plus-local/30.1/share/info/emacs --with-native-compilation=aot --with-xml2 --
==&gt; gmake
==&gt; gmake install
==&gt; Injecting PATH value to Emacs.app/Contents/Info.plist
Patching plist at /opt/homebrew/Cellar/emacs-plus-local/30.1/Emacs.app/Contents/Info.plist with following PATH value:


...


==&gt; Caveats
Emacs.app was installed to:
  /opt/homebrew/opt/emacs-plus-local

To link the application to default Homebrew App location:
  osascript -e 'tell application &quot;Finder&quot; to make alias file to posix file &quot;/opt/homebrew/opt/emacs-plus-local/Emacs.app&quot; at posix file &quot;/Applications&quot; with properties {name:&quot;Emacs.app&quot;}'

Your PATH value was injected into Emacs.app/Contents/Info.plist

Report any issues to https://github.com/d12frosted/homebrew-emacs-plus

To start emacs-plus-local now and restart at login:
  brew services start emacs-plus-local
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/emacs-plus-local/bin/emacs --fg-daemon
==&gt; Summary
🍺  /opt/homebrew/Cellar/emacs-plus-local/30.1: 7,470 files, 585.0MB, built in 8 minutes 59 seconds
==&gt; Running `brew cleanup emacs-plus-local`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
alvaro@MacBookPro homebrew-emacs-plus %  osascript -e 'tell application &quot;Finder&quot; to make alias file to posix file &quot;/opt/homebrew/opt/emacs-plus-local/Emacs.app&quot; at posix file &quot;/Applications&quot; with properties {name:&quot;Emacs.app&quot;}'

alias file Emacs.app of folder Applications of startup disk
</code></pre>
<p>At this point, your brand new patched Emacs Plus is ready for opening:</p>
<pre><code class="language-{.bash">open /opt/homebrew/opt/emacs-plus-local/Emacs.app
</code></pre>
<p>Notice how <code>Emacs.app</code> is saved under emacs-plus-<code>local</code>, which is different from the default location: emacs-plus. In other words, your patched and regular builds can coexist.</p>
<p>I've pushed the changes to my <a href="https://github.com/xenodium/homebrew-emacs-plus">Emacs Plus fork</a>. If keen to take a closer look, check out the <a href="https://github.com/xenodium/homebrew-emacs-plus/commit/2823118f934162bf8757e03bd884e5abd9c25c56">git commit</a>. Should this change be sent to Emacs Plus in a pull request? Maybe not just yet. We'll <a href="https://debbugs.gnu.org/cgi/bugreport.cgi?bug=79070">try to get it admitted upstream first</a>.</p>
<p>Now you know at least two ways of building and patching Emacs on macOS. There are more, but these are my favourite two.</p>
<h2>Make it all sustainable</h2>
<p>Learned something new? Enjoying this <a href="https://xenodium.com/">blog</a> or <a href="https://github.com/xenodium">my projects</a>? Help make it sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨</p>
<p>Need a blog? <a href="https://lmno.lol">I can help with that</a>. Maybe buy my <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS apps</a> too ;)</p>
]]></description>
    <pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs send-to (aka macOS sharing) merged upstream</title>
<link>https://xenodium.com/emacs-send-to-aka-macos-sharing-merged-upstream</link>
<guid isPermaLink="false">https://xenodium.com/emacs-send-to-aka-macos-sharing-merged-upstream</guid>
    <description><![CDATA[<p>Back in February, <a href="https://indieweb.social/@xenodium/113962578532697485">I asked folks on the Fediverse if I should try to contribute native macOS sharing to Emacs upstream</a>. While folks were keen on the sharing feature, there were reservations about whether or not a macOS-only patch would be welcome upstream.</p>
<p>While my chances of success sounded fairly low, I figured I had to at least try before giving up… and I have to say, I'm glad I gave it a chance. <a href="https://cgit.git.savannah.gnu.org/cgit/emacs.git/commit/?id=813013691a9997cbdd483e1e5cef39453ac07d6d">Yesterday, my patch was finally merged upstream</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-aka-macos-sharing-merged-upstream/context-menu.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-aka-macos-sharing-merged-upstream/send-to.png" alt=""></p>
<p>That's not to say the patch did not face its challenges. <a href="https://debbugs.gnu.org/cgi/bugreport.cgi?bug=76120">The proposal sparked quite the discussion</a> (you may need an extra large coffee to get through all messages). Frankly, my hopes of landing the patch after initial feedback quickly shrank to almost non-existent. Having said that, <strong>I really have to give huge credit and thanks to both Eli Zaretskii and Stefan Kangas for their help here.</strong> Without their steering, navigating the more turbulent parts of the discussion, I really would have had no chance of getting anywhere and simply would have just given up.</p>
<p>If you're wondering what was controversial about the patch, <a href="https://www.gnu.org/">GNU</a> guidelines discourage adding features targeting <a href="https://www.gnu.org/philosophy/categories.html">non-free</a> operating systems <a href="https://www.gnu.org/prep/maintain/maintain.html#Non_002dGNU_002donly-Features">before it can be made available for GNU/Linux</a>. While the patch could be easily reworked to expose the native capabilities available for each platform, there's plenty of room for interpretation as to whether a rework is considered enough to satisfy the guideline. Most of the <a href="https://debbugs.gnu.org/cgi/bugreport.cgi?bug=76120">discussion</a> was centered around this topic. Once the thread was refocused around shaping the patch, I received super constructive feedback and the patch was indeed reworked to cater for different platforms. We also agreed to rename the feature from &quot;share&quot; to &quot;send&quot;. To my surprise, even <a href="https://en.wikipedia.org/wiki/Richard_Stallman">RMS</a> also chimed in on the patch discussion. Achievement unlocked?!</p>
<p>While one may or may not agree with GNU's guideline, I'm particularly grateful to the <a href="https://www.fsf.org/">Free Software Foundation</a>, the <a href="https://www.gnu.org/">GNU project</a>, and the wider open source community for building honest software that respects freedom and privacy, especially in this day and age.</p>
<p>I'm a huge <a href="https://www.gnu.org/software/emacs/">Emacs</a> fan. I frequently write about it, share tips/tricks, and even build/publish my own packages. In a perfect world, I would also run GNU/Linux exclusively (I did for many years), but nuance requires that I live in a mixed environment (open source + proprietary software), running macOS. I'm thankful for the parts I can control/modify (including Emacs).</p>
<p>When proposing my patch upstream, my intention was to offer the best possible Emacs experience for this particular feature (via native macOS APIs). In most Emacs patches, native changes aren't necessary. But for the rare instances where I'm unable to carry out all the necessary work for different platforms, I'm hoping I can work with other Emacs enthusiasts with complementary skills and strive to find common ground where my contribution raises the tide in a way that helps lift all boats (even if just a little), so to speak. That is, if I'm allowed to ;)</p>
<p>Emacs <code>send-to</code> is now accessible on the <a href="https://cgit.git.savannah.gnu.org/cgit/emacs.git/log/">master branch</a> via <code>M-x context-menu-mode</code> (right click and select &quot;Send to…&quot;), directly via <code>M-x send-to</code>, and can be applied to dired files, current buffer (with associated file), and selected text region.</p>
<p>File handling is configurable per platform via <code>send-to-handlers</code>.</p>
<pre><code class="language-{.commonlisp">(defvar-local send-to-handlers '(((:supported . send-to--ns-supported-p)
                                  (:collect . send-to--collect-items)
                                  (:send . send-to--ns-send-items))
                                 ((:supported . send-to--open-externally-supported-p)
                                  (:collect . send-to--collect-items)
                                  (:send . send-to--open-externally)))
  &quot;A list of handlers that may be able to send files to applications or services.

Sending is handled by the first supported handler from `send-to-handlers' whose
`:supported' function returns non-nil.

Handlers are of the form:

((:supported . `is-supported-p')
 (:collect . `collect-items')
 (:send . `send-items'))

(defun is-supported-p ()
  \&quot;Return non-nil for platform supporting send capability.\&quot;
  ...)

(defun collect-items ()
  \&quot;Return a list of items to be sent.

Items are strings and will be sent as text unless they are local file
paths known to exist. In these instances, files will be sent instead.\&quot;
  ...)

(defun send-to--send-items (items)
  \&quot;Send ITEMS.\&quot;
  ...)&quot;)
</code></pre>
<p>The merged patch currently ships with two handlers. A native macOS handler, powered by <a href="https://developer.apple.com/documentation/appkit/nssharingservicepicker">NSSharingServicePicker</a>, and a more generic one driven by the <a href="https://github.com/emacs-mirror/emacs/blob/e35e18ac18cfa968978ec7fbfa59432fc1852178/etc/NEWS#L2675">new shell-command-do-open</a>.</p>
<p>With <code>send-to-handlers</code> now configurable, it opens up the possibility to expose all sorts of neat integrations like <a href="https://developer.android.com/training/sharing/send">Android intents</a>, <a href="https://github.com/carldotac/kdeconnect.el">KDE Connect</a>, <a href="https://github.com/GSConnect/gnome-shell-extension-gsconnect">GSConnect</a>, and so on… If you write a <code>send-to-handler</code>, I'd love to hear about it.</p>
<p>If you're on macOS and happen to find the new <code>send-to</code>'s native sharing useful, you now know that exposing that little dialog took a non-trivial amount of effort, a turbulent discussion, and 5 months to land in your beloved Emacs. I'll just <a href="https://github.com/sponsors/xenodium">leave this here</a> ;)</p>
]]></description>
    <pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mochi Invaders now on the App Store</title>
<link>https://xenodium.com/mochi-invaders-now-on-the-app-store</link>
<guid isPermaLink="false">https://xenodium.com/mochi-invaders-now-on-the-app-store</guid>
    <description><![CDATA[<p>As a beginner learner of Japanese, I still need regular practice reading <a href="https://en.wikipedia.org/wiki/Kana">Kana</a> (<a href="https://en.wikipedia.org/wiki/Hiragana">Hiragana</a> and <a href="https://en.wikipedia.org/wiki/Katakana">Katakana</a>). Rather than using one of the countless existing resources, I decided to build my own little Space-Invaders-style game. No doubt I was procrastinating, but learning <a href="https://developer.apple.com/documentation/spritekit">SpriteKit</a> and building the app involved a fair bit of app testing, so I ended up learning while erm procrastinating. That's a win, right? Right?</p>
<p>As of today <a href="https://apps.apple.com/app/id6747766176">Mochi Invaders</a> is available on the App Store.</p>
<center>
  <a href="https://apps.apple.com/app/id6747766176"><img src="https://xenodium.github.io/images/mochi-invaders-now-on-the-app-store/icon.png" alt="Mochi Invaders app icon" width="180px"/></a>
  <br>
  <a href="https://apps.apple.com/app/id6747766176"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="Download on App Store button link" width="180px"/></a>
  <br>
</center>
<p><img src="https://xenodium.github.io/images/mochi-invaders-now-on-the-app-store/primary.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/mochi-invaders-now-on-the-app-store/secondary.png" alt=""></p>
]]></description>
    <pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Markdown is coming to Journelly</title>
<link>https://xenodium.com/markdown-is-coming-to-journelly</link>
<guid isPermaLink="false">https://xenodium.com/markdown-is-coming-to-journelly</guid>
    <description><![CDATA[<p>✨UPDATE✨ Journelly v1.3 <a href="https://xenodium.com/journelly-1-3-released">launched with Markdown support</a>.</p>
<p>When <a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">Journelly launched</a>, I <a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only#no-lock-in-(powered-by-org-plain-text)">asked users to get in touch</a> if they were interested in Markdown support.</p>
<p>Since then, Markdown has by far been the most requested feature.</p>
<p>Today, I’m excited to share that Journelly beta builds now include initial Markdown support! If you’ve been in touch, you likely already have access. If not, <a href="mailto:journelly+markdown@xenodium.com?subject=I'm%20interested%20Markdown%20for%20Journelly&amp;body=Just%20want%20to%20register%20my%20interest%20in%20Markdown%20support%20for%20Journelly">let me know you’re interested</a>.</p>
<p>Journelly still defaults to Org as its preferred markup, but you can now switch to Markdown from the welcome screen or the menu.</p>
<p><img src="https://xenodium.github.io/images/markdown-is-coming-to-journelly/md.png" alt=""></p>
<p>While Org is my own markup of choice, it remains fairly niche. As I work to build a sustainable iOS app as a full-time indie developer, I need to reach a wider audience, without resorting to subscriptions. Luckily, I think we can have our cake and eat it too.</p>
<p>Here's how I see Journelly's audience breaking down:</p>
<h2>For anyone who just wants to write (regardless of markup)</h2>
<p>This has always been Journelly’s main goal. I've worked hard to keep the serialization format in the background, focusing instead on delivering a smooth, friction-free experience. The primary goal: just write.</p>
<p>I think this is working well. <a href="https://ellanew.com/">Ellane</a>'s post sums it up: <a href="https://ellanew.com/ptpl/157-2025-05-19-journelly-is-org-for-those-who-dont-do-org">Journelly is the iOS Org App You’ll Love (Even if You Don’t Do Org)</a>.</p>
<p>If you just want a quick way to take notes or journal privately, Journelly already offers that. Adding quick notes, ideas, recipes, checklists, music, links, etc. is really easy and fast even if you don't do org (<a href="https://krrd.ing/blog/journelly-update/">Brandon says so too</a>).</p>
<h2>Org mode enthusiasts</h2>
<p>I got this one pretty well-covered also. I'm an Emacs org mode enthusiast myself and regularly <a href="https://xenodium.com/a-richer-journelly-org-capture-template">share my Journelly entries between my iPhone and Mac</a>. You don't need to take my word for it though. jcs is a seasoned Emacs enthusiast. <a href="https://irreal.org/blog/?s=Journelly">From Irreal, he's covered Journelly pretty well</a>. While <a href="https://journelly.com/">journelly.com</a> quotes and links to posts from happy users, I've been collecting posts from different users. I should share a post with all of them too!</p>
<h2>Markdown enthusiasts</h2>
<p>Which brings me back to this post: there are a lot of Markdown users out there. While Journelly’s UX has caught the interest of some Markdown fans, many prefer to stick with their favorite format. Your interest was heard! I did say, <a href="https://xenodium.com/journelly-for-ios">the more requests I get, the sooner I'll get Markdown support out the door</a>, and so here we are.</p>
<p>You can now try Markdown support via TestFlight. I look forward to your feedback.</p>
<p>New to Journelly and want to join the Markdown beta? <a href="mailto:journelly+markdown@xenodium.com?subject=I'm%20interested%20Markdown%20for%20Journelly&amp;body=Just%20want%20to%20register%20my%20interest%20in%20Markdown%20support%20for%20Journelly">Get in touch.</a></p>
]]></description>
    <pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>EverTime available via Homebrew</title>
<link>https://xenodium.com/evertime-available-via-homebrew</link>
<guid isPermaLink="false">https://xenodium.com/evertime-available-via-homebrew</guid>
    <description><![CDATA[<p>I typically like my macOS desktop free from distractions, which includes hiding the status bar.</p>
<p>Having said that, I don't want to lose track of time, and for that, I built a tiny ever-present floating clock.</p>
<p><img src="https://raw.githubusercontent.com/xenodium/evertime/main/screenshots/demo.gif" alt=""></p>
<p>While it's been a while since I built this clock, it's only now that I decided to make it available via <a href="https://brew.sh/">Homebrew</a>.</p>
<p><a href="https://github.com/xenodium/EverTime">EverTime</a> lives in its own <a href="https://github.com/xenodium/EverTime">GitHub repository</a> and can be installed with:</p>
<pre><code class="language-{.bash">brew install --HEAD xenodium/evertime/evertime
</code></pre>
<p>In addition to using EverTime, I also like enabling &quot;Announce the time&quot; under macOS System Settings, which announces the time every hour.</p>
<p>Like <a href="https://github.com/xenodium/EverTime">EverTime</a>? Consider ✨<a href="https://github.com/sponsors/xenodium">sponsoring me</a>✨ or buying ✨<a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">my apps</a>✨.</p>
]]></description>
    <pubDate>Sun, 15 Jun 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Journelly 1.2 released</title>
<link>https://xenodium.com/journelly-1-2-released</link>
<guid isPermaLink="false">https://xenodium.com/journelly-1-2-released</guid>
    <description><![CDATA[<h2>What's new?</h2>
<p>Journelly v1.2 focuses exclusively on improving app accessibility.</p>
<p>In particular:</p>
<ul>
<li>Improved <a href="https://support.apple.com/en-gb/guide/iphone/iph3e2e415f/ios">VoiceOver</a> navigation and general app experience.</li>
<li>Improved edit layout when &quot;Settings &gt; Accessibility &gt; Display &amp; Text Size &gt; Button Shapes&quot; is enabled.</li>
</ul>
<p>Huge thanks to <a href="https://indieweb.social/@Yvonnezed@mastodon.au">Yvonne Thompson</a> for all her help shaping this release. VoiceOver support is in way better shape as a result.</p>
<center>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/icon.png" alt="Journelly app icon" width="180px"/></a><br>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="Download on App Store button link" width="180px"/></a><br>
<p>Journelly 1.2 available on the App Store</p>
</center>
<h2>What is Journelly?</h2>
<p><a href="https://journelly.com/">Journelly</a> feels like tweeting but for your eyes only.</p>
<p>A fresh take on frictionless note-taking for iOS, powered by Org plain text.</p>
<ul>
<li>Save cooking recipes, movies, music, restaurants, coffee shops…</li>
<li>Jot down your thoughts.</li>
<li>Save your favorite quotes.</li>
<li>Use it as a journal, memo book, or notes.</li>
<li>Write your shopping lists.</li>
<li>Document your travels.</li>
<li>Lots more…</li>
</ul>
<p>Check out <a href="https://journelly.com">journelly.com</a> for details.</p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/sideways.jpg" alt=""></p>
]]></description>
    <pubDate>Thu, 12 Jun 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ranking Officer now on the App Store</title>
<link>https://xenodium.com/ranking-officer-now-on-the-app-store</link>
<guid isPermaLink="false">https://xenodium.com/ranking-officer-now-on-the-app-store</guid>
    <description><![CDATA[<p>With a handful of apps on the App Store, I like to keep an eye on their rankings and user reviews from around the world. I don't need much. Just a quick glance.</p>
<p>A few of weeks ago, it just dawned on me that my Mac's status bar is likely the perfect place to keep this glanceable information handy. And with that, I built Ranking Officer. A little utility to do just that.</p>
<p><img src="https://xenodium.github.io/images/ranking-officer-now-on-the-app-store/ranking-officer.gif" alt=""></p>
<p>I wasn't too sure if this app would make it to the App Store. To my delight, Apple reviewed and accepted on its first submission.</p>
<p>As of today, you can install Ranking Officer from the App Store.</p>
<center>
<a href="https://apps.apple.com/us/app/ranking-officer/id6746378992"><img src="https://xenodium.github.io/images/ranking-officer-now-on-the-app-store/icon.png" alt="download-on-app-store.png" width="180px"/></a>
<h1>Ranking Officer</h1>
<br>
<a href="https://apps.apple.com/us/app/ranking-officer/id6746378992"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px"></a>
<br>
</center>
<p>You can now stay up to date on your app’s rankings and user reviews from around the world, right from your Mac's status bar.</p>
<ul>
<li>Get the latest ranking and review data, updated every hour.</li>
<li>Monitor as many apps as you like (there’s no limit).</li>
<li>No login or personal details required.</li>
<li>No subscription necessary.</li>
</ul>
<p>Just add your apps using their App Store URLs and get tracking.</p>
<center>
<br>
<h1>Good luck with your apps!</h1>
<br>
<h1>🍀🤞⭐🎋🧧🏮🪙🐞🎰🐘</h1>
</center>
]]></description>
    <pubDate>Mon, 02 Jun 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Awesome Emacs on macOS</title>
<link>https://xenodium.com/awesome-emacs-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/awesome-emacs-on-macos</guid>
    <description><![CDATA[<p>Update: Added macOS Trash integration.</p>
<p>While GNU/Linux had been my operating system of choice for many years, these days I'm primarily on macOS. Lucky for me, I spend most of my time in Emacs itself (or a web browser), making the switch between operating systems a relatively painless task.</p>
<p>I build <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">iOS and macOS apps</a> for a living, so naturally I've accumulated a handful of macOS-Emacs integrations and tweaks over time. Below are some of my favorites.</p>
<h2>Emacs Plus</h2>
<p>For starters, I should mention I run Emacs on macOS via the excellent <a href="https://github.com/d12frosted/homebrew-emacs-plus">Emacs Plus</a> <a href="https://brew.sh/">homebrew</a> recipe. These are the options I use:</p>
<pre><code class="language-{.bash">brew install emacs-plus@30 --with-no-frame-refocus --with-native-comp --with-savchenkovaleriy-big-sur-curvy-3d-icon
</code></pre>
<h2>Valeriy Savchenko's icons</h2>
<p><a href="https://github.com/SavchenkoValeriy">Valeriy Savchenko</a> has created some wonderful <a href="https://github.com/SavchenkoValeriy/emacs-icons">macOS Emacs icons</a>. These days, I use his <a href="https://github.com/SavchenkoValeriy/emacs-icons?tab=readme-ov-file#curvy-3d-rendered-icon">curvy 3D rendered icon</a>, which I get via Emacs Plus's <code>--with-savchenkovaleriy-big-sur-curvy-3d-icon</code> option.</p>
<p><img src="https://xenodium.github.io/images/awesome-emacs-on-macos/icon.png" alt=""></p>
<h2>Modifiers</h2>
<p>It's been a long while since I've settled on using macOS's Command (⌘) as my Emacs Meta key. For that, you need:</p>
<pre><code class="language-{.commonlisp">(setq mac-command-modifier 'meta)
</code></pre>
<p>At the same time, I've disabled the ⌥ key to avoid inadvertent surprises.</p>
<pre><code class="language-{.commonlisp">(setq mac-option-modifier 'none)
</code></pre>
<h2>Enabling Control-Meta(⌘)-D</h2>
<p>After setting ⌘ as Meta key, I discovered C-M-d is not available to Emacs for binding keys. There's a <a href="https://xenodium.com/enabling-control-meta-d-on-macos">little workaround</a>:</p>
<pre><code class="language-{.bash">defaults write com.apple.symbolichotkeys AppleSymbolicHotKeys -dict-add 70 '&lt;dict&gt;&lt;key&gt;enabled&lt;/key&gt;&lt;false/&gt;&lt;/dict&gt;'
</code></pre>
<h2>Frames</h2>
<p>You may have noticed the <code>--with-no-frame-refocus</code> Emacs Plus option. I didn't like Emacs refocusing other frames when closing one, so I <a href="https://xenodium.com/no-emacs-frame-refocus-on-macos">sent a tiny patch over to Emacs Plus</a>, which gave us that option.</p>
<p>I also prefer reusing existing frames whenever possible.</p>
<pre><code class="language-{.commonlisp">(setq ns-pop-up-frames nil)
</code></pre>
<h2>Visual tweaks</h2>
<p>Most of my visual tweaks have been documented in my <a href="https://xenodium.com/my-emacs-eye-candy">Emacs eye candy post</a>. For macOS-specific things, read on…</p>
<p>It's been a while since I've added this, though vaguely remember needing it to fix mode line rendering artifacts.</p>
<pre><code class="language-{.commonlisp">(setq ns-use-srgb-colorspace nil)
</code></pre>
<p>I like using a transparent title bar and these two settings gave me just that:</p>
<pre><code class="language-{.commonlisp">(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark))
</code></pre>
<p>I want a menu bar like other macOS apps, so I enable with:</p>
<pre><code class="language-{.commonlisp">(use-package menu-bar
  :config
  (menu-bar-mode +1))
</code></pre>
<p><img src="https://xenodium.github.io/images/awesome-emacs-on-macos/menu-bar.webp" alt=""></p>
<h2>Emoji picker (a freebie!)</h2>
<p>If you got a more recent Apple keyboard, you can <a href="https://xenodium.com/emacs-freebie-macos-emoji-picker">press the 🌐 key to insert emojis</a> from anywhere, including Emacs. If you haven't got this key, you can always <code>M-x ns-do-show-character-palette</code>, which launches the very same dialog.</p>
<p>Also check out Charles Choi's <a href="http://yummymelon.com/devnull/macos-native-emoji-picking-in-emacs-from-the-edit-menu.html">macOS Native Emoji Picking in Emacs from the Edit Menu</a>.</p>
<h2>Longing long press for accents?</h2>
<p>If you prefer Apple's long-press approach to inserting accents or other special characters, I got <a href="https://xenodium.com/an-accentuated-emacs-experiment">an Emacs version of that</a>.</p>
<p><img src="https://xenodium.github.io/images/an-accentuated-emacs-experiment/accentuated.webp" alt=""></p>
<h2>Rotate macOS display</h2>
<p>I wanted to rotate my monitor from the comfort of M-x, so I <a href="https://lmno.lol/alvaro/emacs-rotate-my-macos-display">made Emacs do it</a>.</p>
<h2>Open with</h2>
<p>While there are different flavors of &quot;open with default macOS app&quot; commands out there (ie. crux-open-with as part of Bozhidar Batsov's <a href="https://github.com/bbatsov/crux">crux</a>), I wanted one that <a href="https://lmno.lol/alvaro/emacs-open-with-macos-app">let me choose a specific macOS app</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-open-with-macos-app/open-with_x2.webp" alt=""></p>
<h2>Open in Xcode (at line number)</h2>
<p>Shifting from Emacs to Xcode via &quot;Open with&quot; is simple enough, but don't you want to also <a href="https://xenodium.com/open-in-xcode-at-line-number">visit the very same line</a>?</p>
<h2>SF Symbols (for work)</h2>
<p>Apple offers <a href="https://developer.apple.com/sf-symbols/">SF Symbols</a> on all their platforms, so why not enable <a href="https://xenodium.com/emacs-insert-and-render-sf-symbols">Emacs to insert and render them?</a></p>
<p>This is particulary handy if you do any sort of iOS/macOS development, enabling you to insert SF Symbols using your favorite completion framework. I happen to remain a faithful <a href="https://github.com/abo-abo/swiper">ivy</a> user.</p>
<p><img src="https://xenodium.github.io/images/emacs-insert-and-render-sf-symbols/sf-insert-trimmed_x1.8.webp" alt=""></p>
<h2>SF Symbols (for fun)</h2>
<p>Speaking of enabling SF Symbol rendering, you can also use them to spiff your Emacs up. Check out Charles Choi's <a href="https://github.com/kickingvegas/calle24">Calle 24</a> for a great-looking Emacs toolbar. Also, Christian Tietze shows how to <a href="https://christiantietze.de/posts/2022/12/sf-symbols-emacs-tab-numbers/">use SF Symbols as Emacs tab numbers</a>.</p>
<h2>Quick kill</h2>
<p>While macOS's Activity Monitor does a fine job killing processes, I wanted something a little speedier, so I went with a <a href="https://lmno.lol/alvaro/emacs-quick-kill-process">killing solution leveraging Emacs completions</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-quick-kill-process/kill_x1.8.webp" alt=""></p>
<h2>SwiftUI a la org babel</h2>
<p>Having learned how simple it was to <a href="https://xenodium.com/org-babel-objective-c-support">enable Objective-C babel support</a>, I figured I could do something a little more creative with SwiftUI, so I published <a href="https://lmno.lol/alvaro/ob-swiftui-updates">ob-swiftui</a> on MELPA.</p>
<p><img src="https://xenodium.github.io/images/ob-swiftui-updates/file-render.gif" alt=""></p>
<h2>Changing macOS default apps</h2>
<p>I found the nifty <a href="https://github.com/moretension/duti">duti</a> command-line tool to change default macOS applications super handy, but could never remember its name when I needed it. And so I decided to bring it into <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> as part of my <a href="https://github.com/xenodium/dwim-shell-command/tree/main?tab=readme-ov-file#build-a-rich-toolbox-or-use-mine">toolbox</a>.</p>
<p><img src="https://xenodium.github.io/images/hey-emacs-change-the-default-macos-app-for/set-default_x1.3.webp" alt=""></p>
<p>I got a bunch of handy helpers in <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a> (specially all the image/video helpers via ffmpeg and imagemagick). Go check <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>. There's loads in there, but here are my macOS-specific commands:</p>
<ul>
<li>dwim-shell-commands-macos-add-to-photos</li>
<li>dwim-shell-commands-macos-bin-plist-to-xml</li>
<li>dwim-shell-commands-macos-caffeinate</li>
<li>dwim-shell-commands-macos-convert-to-mp4</li>
<li>dwim-shell-commands-macos-empty-trash</li>
<li>dwim-shell-commands-macos-install-iphone-device-ipa</li>
<li>dwim-shell-commands-macos-make-finder-alias</li>
<li>dwim-shell-commands-macos-ocr-text-from-desktop-region</li>
<li>dwim-shell-commands-macos-ocr-text-from-image</li>
<li>dwim-shell-commands-macos-open-with</li>
<li>dwim-shell-commands-macos-open-with-firefox</li>
<li>dwim-shell-commands-macos-open-with-safari</li>
<li>dwim-shell-commands-macos-reveal-in-finder</li>
<li>dwim-shell-commands-macos-screenshot-window</li>
<li>dwim-shell-commands-macos-set-default-app</li>
<li>dwim-shell-commands-macos-share</li>
<li>dwim-shell-commands-macos-start-recording-window</li>
<li>dwim-shell-commands-macos-abort-recording-window</li>
<li>dwim-shell-commands-macos-end-recording-window</li>
<li>dwim-shell-commands-macos-toggle-bluetooth-device-connection</li>
<li>dwim-shell-commands-macos-toggle-dark-mode</li>
<li>dwim-shell-commands-macos-toggle-display-rotation</li>
<li>dwim-shell-commands-macos-toggle-menu-bar-autohide</li>
<li>dwim-shell-commands-macos-version-and-hardware-overview-info</li>
</ul>
<h2>Toggle dark mode</h2>
<p>Continuing on the <code>dwim-shell-commands</code> family, I should also mention <code>dwim-shell-commands-macos-toggle-dark-mode</code>.</p>
<p>While I hardly ever change my Emacs theme, I do toggle macOS dark mode from time to time to test macOS or web development.</p>
<p><img src="https://xenodium.github.io/images/awesome-emacs-on-macos/dark-toggle.gif" alt=""></p>
<h2>Menu bar auto hide</h2>
<p>One last <code>dwim-shell-command</code>… One that showcases <a href="https://xenodium.com/toggle-macos-menu-bar-from-you-know-where">toggling the macOS menu bar (autohide)</a>.</p>
<p><img src="https://xenodium.github.io/images/toggle-macos-menu-bar-from-you-know-where/autohide.webp" alt=""></p>
<h2>Connect to your Bluetooth speaker</h2>
<p>While this didn't quite stick for me, it was a fun experiment to <a href="https://lmno.lol/alvaro/emacs-connect-my-bluetooth-speaker">add Emacs into the mix</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-connect-my-bluetooth-speaker/connect-disconnect.gif" alt=""></p>
<h2>Eshell</h2>
<p>This is just a little fun banner I see whenever I launch <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a>.</p>
<p><img src="https://xenodium.github.io/images/awesome-emacs-on-macos/eshell.png" alt=""></p>
<p>This is all you need:</p>
<pre><code class="language-{.commonlisp">(use-package em-banner
  :custom
  (eshell-banner-message &quot;
\x1b[32m                             'c.                    \x1b[0m
\x1b[32m                          ,xNMM.                    \x1b[0m
\x1b[32m                        .OMMMMo                     \x1b[0m
\x1b[32m                        OMMM0,                      \x1b[0m
\x1b[32m              .;loddo:' loolloddol;.                \x1b[0m
\x1b[32m            cKMMMMMMMMMMNWMMMMMMMMMM0:              \x1b[0m
\x1b[33m          .KMMMMMMMMMMMMMMMMMMMMMMMWd.              \x1b[0m
\x1b[33m          XMMMMMMMMMMMMMMMMMMMMMMMX.                \x1b[0m
\x1b[31m        ;MMMMMMMMMMMMMMMMMMMMMMMM:                  \x1b[0m
\x1b[31m        :MMMMMMMMMMMMMMMMMMMMMMMM:                  \x1b[0m
\x1b[31m        .MMMMMMMMMMMMMMMMMMMMMMMMX.                 \x1b[0m
\x1b[31m         kMMMMMMMMMMMMMMMMMMMMMMMMWd.               \x1b[0m
\x1b[35m          .XMMMMMMMMMMMMMMMMMMMMMMMMMMk             \x1b[0m
\x1b[35m           .XMMMMMMMMMMMMMMMMMMMMMMMMK.             \x1b[0m
\x1b[34m             kMMMMMMMMMMMMMMMMMMMMMMd               \x1b[0m
\x1b[34m              ;KMMMMMMMWXXWMMMMMMMk.                \x1b[0m
\x1b[34m                .cooc,.    .,coo:.                  \x1b[0m

\x1b[34m                        _/                  _/  _/  \x1b[0m
\x1b[34m     _/_/      _/_/_/  _/_/_/      _/_/    _/  _/   \x1b[0m
\x1b[34m  _/_/_/_/  _/_/      _/    _/  _/_/_/_/  _/  _/    \x1b[0m
\x1b[34m _/            _/_/  _/    _/  _/        _/  _/     \x1b[0m
\x1b[34m  _/_/_/  _/_/_/    _/    _/    _/_/_/  _/  _/      \x1b[0m


&quot;))
</code></pre>
<h2>Screencasts</h2>
<p>I wanted a quick way to record or take screenshots of macOS windows, so I now have <a href="https://xenodium.com/recordscreenshot-windows-the-lazy-way">my lazy way</a>, leveraging <a href="https://github.com/xenodium/macosrec">macosrec</a>, a recording command line utility I built. Invoked via <code>M-x</code> of course.</p>
<h2>Eglot (LSP) for iOS/macOS dev</h2>
<p>If you want any sort of code completion for your macOS projects, you'd be happy to know that eglot works out of the box.</p>
<pre><code class="language-{.commonlisp">(use-package eglot
  :ensure t
  :hook (swift-mode . eglot-ensure)
  :config
  (message &quot;warning: `jsonrpc--log-event' is ignored.&quot;)
  (fset #'jsonrpc--log-event #'ignore)
  (add-to-list 'eglot-server-programs '(swift-mode . (&quot;/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/sourcekit-lsp&quot;))))
</code></pre>
<h2>Search and play (Music app)</h2>
<p>This is another experiment that didn't quite stick, but I played with <a href="https://lmno.lol/alvaro/emacs-searchplay-music-macos">controlling the Music app's playback</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-searchplay-music-macos/music_search.gif" alt=""></p>
<p>While I still purchase music via Apple's Music app, I now play directly from Emacs via <a href="https://xenodium.com/a-tour-of-ready-player-mode">Ready Player Mode</a>. I'm fairly happy with this setup, having scratched that itch with my own package.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/open-file.gif" alt=""></p>
<p>By the way, those buttons also leverage SF Symbols on macOS.</p>
<h2>Reveal -&gt; all &lt;- in Finder</h2>
<p>While there are plenty of solutions out there leveraging the <code>open</code> command line tool to reveal files in macOS's Finder, I wanted one that revealed multiple files in one go. For that, I <a href="https://xenodium.com/native-emacsmacos-ux-integrations-via-swift-modules">leveraged</a> the awesome <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">emacs-swift-module</a>, also by <a href="https://github.com/SavchenkoValeriy">Valeriy Savchenko</a>.</p>
<p><img src="https://xenodium.github.io/images/native-emacsmacos-ux-integrations-via-swift-modules/reveal.webp" alt=""></p>
<h2>Use the macOS Trash</h2>
<p>The macOS trash has saved my bacon in more than one occasion. <a href="https://xenodium.com/rm-important-txt-oh-sht/">Make Emacs aware of it</a>. Also check out <code>M-x dwim-shell-commands-macos-empty-trash</code>.</p>
<p><img src="https://xenodium.github.io/images/rm-important-txt-oh-sht/recovered_x1.6.webp" alt=""></p>
<h2>Build your own macOS utils</h2>
<p>While elisp wasn't in my top languages to learn back in the day, I sure am glad I finally bit the bullet and learned a thing or two. This opened many possibilities. I now see Emacs as a platform to build utilities and tools off of. A <a href="https://xenodium.com/its-all-up-for-grabs-and-it-compounds">canvas of sorts</a>, to be leveraged in and out of the editor.</p>
<p>For example, you could <a href="https://lmno.lol/alvaro/building-your-own-bookmark-launcher">build your own bookmark launcher</a> and invoke from anywhere on macOS.</p>
<p><img src="https://xenodium.github.io/images/building-your-own-bookmark-launcher/launcher.gif" alt=""></p>
<h2>Emacs as default email composer</h2>
<p>Turns out you can also <a href="https://xenodium.com/mu4e-as-macos-mail-composer">make Emacs your default email composer</a>.</p>
<h2>Emacs key bindings everywhere</h2>
<p>While not exactly an Emacs tweak itself, I wanted to extend Emacs bindings into other macOS apps. In particular, I wanted <a href="https://lmno.lol/alvaro/improved-ctrl-p-ctrl-n-macos-movement">more reliable Ctrl-n/p usage everywhere</a>, which I achieved via <a href="https://karabiner-elements.pqrs.org/">Karabiner-Elements</a>. I also mapped <code>C-g</code> to <code>Esc</code>, which really feels just great! I can now cancel things, dismiss menus, dialogs, etc. everywhere.</p>
<h2>Org as lingua franca</h2>
<p>With my Emacs usage growing over time, it was a matter of time until I discovered org mode. This blog is well over 11 years old now, yet still powered by the <a href="https://raw.githubusercontent.com/xenodium/xenodium.github.io/refs/heads/master/index.org">very same org file</a> (beware, this file is big).</p>
<p>With my org usage growing, I felt like I was missing org support outside of Emacs. And so I started building iOS apps revolving around my Emacs usage.</p>
<h3>Journelly (iOS)</h3>
<p><a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">Journelly</a> is my latest iOS app, centered around note-taking and journaling. The app feels like tweeting, but for your eyes only of course. It's powered by org markup, which can be synced with Emacs via iCloud.</p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/sideways.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/emacs.gif" alt=""></p>
<h3>Flat Habits (iOS)</h3>
<p><a href="https://orgmode.org/manual/Tracking-your-habits.html">Org habits</a> are handy for tracking daily habits. However, it wasn't super practical for me as I often wanted to check things off while on the go (away from Emacs). That led me to build <a href="https://xenodium.com/flat-habits-for-ios">Flat Habits</a>.</p>
<p><img src="https://xenodium.github.io/images/frictionless-org-habits-on-ios/flat_habits.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/flat-habits-meets-org-agenda/flat_agenda.gif" alt=""></p>
<h3>Scratch (iOS)</h3>
<p>While these days I'm using <a href="https://journelly.com/">Journelly</a> to jot down just about anything, before that, I built and used <a href="https://xenodium.com/scratch-a-minimal-scratch-area">Scratch</a> as scratch pad of sorts. No iCloud syncing, but needless to say, it's also powered by org markup.</p>
<p><img src="https://xenodium.github.io/images/scratch-a-minimal-scratch-area/scratch-download_no_audio_x2.6.webp" alt=""></p>
<h3>Plain Org (iOS)</h3>
<p>For more involved writing, nothing beats Emacs org mode. But what if I want quick access to my org files while on the go? <a href="https://plainorg.com/">Plain Org</a> is my iOS solution for that.</p>
<p><img src="https://xenodium.github.io/images/awesome-emacs-on-macos/plain-org.png" alt=""></p>
<h2>Found this post useful?</h2>
<p>I'll keep looking for other macOS-related tips and update this post in the future.</p>
<p>In the meantime, consider ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨ this content, <a href="https://github.com/sponsors/xenodium">my Emacs packages</a>, <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">buying my apps</a>, or just <a href="https://apps.apple.com/us/app/fresh-eyes/id6480411697">taking care of your eyes</a> ;)</p>
]]></description>
    <pubDate>Tue, 27 May 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Journelly 1.1 released</title>
<link>https://xenodium.com/journelly-1-1-released</link>
<guid isPermaLink="false">https://xenodium.com/journelly-1-1-released</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/journelly-1-1-released/hello.png" alt=""></p>
<center>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px"/></a><br>
<p>Journelly 1.1 available on the App Store</p>
</center>
<h2>What is Journelly?</h2>
<p><a href="https://journelly.com/">Journelly</a> feels like tweeting but for your eyes only.</p>
<p>A fresh take on frictionless note-taking for iOS, powered by Org plain text.</p>
<ul>
<li>Save cooking recipes, movies, music, restaurants, coffee shops…</li>
<li>Jot down your thoughts.</li>
<li>Save your favorite quotes.</li>
<li>Use it as a journal, memo book, or notes.</li>
<li>Write your shopping lists.</li>
<li>Document your travels.</li>
<li>Lots more…</li>
</ul>
<p>Check out <a href="https://journelly.com">journelly.com</a> for details.</p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/sideways.jpg" alt=""></p>
<h2>What's new?</h2>
<p>Journelly v1.1 is the first release since <a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">launching</a>. It adds support for 10 new languages and delivers the first round of feature requests and bug fixes.</p>
<h3>New features</h3>
<ul>
<li>New languages:
<ul>
<li>Danish</li>
<li>Dutch</li>
<li>Finnish</li>
<li>French</li>
<li>German</li>
<li>Italian</li>
<li>Japanese</li>
<li>Norwegian</li>
<li>Spanish</li>
<li>Swedish</li>
</ul>
</li>
<li>Easily add hashtags using the new picker (most requested feature).</li>
<li>Hashtags are now highlighted in the editor.</li>
<li>Automatically capture selected text in Safari.</li>
<li>Paste images directly from the clipboard.</li>
<li>Tap on email addresses to compose a new message.</li>
<li>New context menu options:
<ul>
<li>Set location as Home.</li>
<li>Open location in Maps.</li>
<li>Copy text.</li>
</ul>
</li>
<li>iPad keyboard shortcuts
<ul>
<li>⌘-N Create a new Entry</li>
<li>⌘-S Save the current Entry</li>
<li>↑/↓ Select entry in list</li>
<li>↵ Edit selected entry</li>
</ul>
</li>
<li>Uses the full date format based on your locale.</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>Prevents the Esc key from discarding unsaved changes.</li>
<li>Resolves incorrect link icon colors in Light Mode.</li>
<li>The About screen is now available on fresh installs.</li>
<li>Fixes issue where the navigation bar became inaccessible when viewing markup.</li>
<li>Locations are now only clickable when valid coordinates are available.</li>
</ul>
<h2>A happy Journelly user</h2>
<p>Just as I'm getting ready to announce Journelly's 1.1 release, <a href="https://ellanew.com/about">Ellane</a> (from <a href="https://ellanew.com">ellanew.com</a>) shared a wonderful blog post on her experience using version 1.0:</p>
<p><a href="https://ellanew.com/ptpl/157-2025-05-19-journelly-is-org-for-those-who-dont-do-org">Journelly is the Org App You’ll Love (Even if You Don’t Do Org)</a>.</p>
<p>I'm particulary excited to hear from Ellane given her <a href="https://ellanew.com/ptpl">Plain Text; Paper, Less</a> philosophy.</p>
<center>
<small>
<p>"It’s the perfect mix of simplicity and low-tech plain text wizardry"</p>
<p>"It takes a very particular set of features for a new app to impress me enough to hit the purchase button as fast as I did with Journelly."</p>
<p>"Journelly is the first Org-powered app I’ve seen that lays out the welcome mat for people who don’t even know what Org is, never mind how to use it."</p>
<a href="https://ellanew.com/ptpl/157-2025-05-19-journelly-is-org-for-those-who-dont-do-org">Ellane / ellanew.com</a>
</small>
</center>
<p>As an <a href="https://orgmode.org/">org mode</a> enthusiast myself, I'm delighted to hear Journelly is paving a gentle road for org newcomers.</p>
<p>Ellane's post also has a great list of features requests. Lucky for me, I can report at least two of them are covered by today's release:</p>
<ul>
<li>The new hashtag picker.</li>
<li>Pasting images from the clipboard.</li>
</ul>
<p>Be sure to check out <a href="https://ellanew.com/ptpl/157-2025-05-19-journelly-is-org-for-those-who-dont-do-org">Ellane's post</a>, as she covers many details I'm not mentioning here. But lemme share one last tip I learned from her post today…</p>
<h2>Ellane's iCloud tip</h2>
<p>Today I learned something new from Ellane’s <a href="https://ellanew.com/ptpl/157-2025-05-19-journelly-is-org-for-those-who-dont-do-org">post</a>: you can Control-click the Journelly iCloud Drive folder on your Mac and select &quot;Keep Downloaded&quot; to ensure your notes are always available offline. Super handy, specially for those of us using Emacs on macOS.</p>
<h2>Markdown enthusiast? Enquire within</h2>
<p>Currently, Journelly stores entries in Org plain text format, but Markdown support is on the way. Interested in Markdown? <a href="mailto:journelly+markdown@xenodium.com?subject=I'm%20interested%20Markdown%20for%20Journelly&amp;body=Just%20want%20to%20register%20my%20interest%20in%20Markdown%20support%20for%20Journelly">Please reach out</a>. Early support is already available on beta builds. Lemme know if you'd like to join the TestFlight group.</p>
<p>On the topic of Markdown: I also run <a href="https://lmno.lol/">lmno.lol</a>, a Markdown-powered blogging service. Simple and focused, without the frustrating parts of the modern web. Custom domains are welcome too! My <a href="https://xenodium.com/">xenodium.com</a> blog runs off <a href="https://lmno.lol/">lmno.lol</a>.</p>
]]></description>
    <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>LLM text chat is everywhere. Who’s optimizing its UX?</title>
<link>https://xenodium.com/llm-text-chat-is-everywhere-whos-optimizing-ux</link>
<guid isPermaLink="false">https://xenodium.com/llm-text-chat-is-everywhere-whos-optimizing-ux</guid>
    <description><![CDATA[<p>When it comes to programming LLM tools, I've seen modes of interaction in the form of code completion, patch application, improvement suggestions, and text chat amongst others. Text chat is everywhere.</p>
<p>In the context of text chat UX, I haven't really come across huge differentiators across offerings. That's not to say they don't exist. The landscape moves fast and there are far too many products out there for me to check out, thus my question to you is…</p>
<h2>Who's optimizing or innovating LLM text chat UX?</h2>
<p>While there are plenty of new agents and model capabilities that are interesting in their own right, in the context of chat UX, I'm more interested in finding your favorite UX features. What are they? What do you love about them? Why? Do they feel like they reached or are close to reaching an optimal experience? On the other hand, what do you find that's rough about them? Tiny friction here and there? I'd love to know: <a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="https://bsky.app/profile/xenodium.bsky.social">Bluesky</a>.</p>
<h2>Chat as a shell, is it keyboard optimized?</h2>
<p>Back in 2023, I released the <a href="https://xenodium.com/a-chatgpt-emacs-shell">first version of chatgpt-shell</a>. To me, LLM chats felt like the perfect candidates to be implemented as shells. After all, aren't they just <a href="https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop">REPL</a>s of sorts?</p>
<ol>
<li>Reads user input</li>
<li>Evaluates the input</li>
<li>Prints the result</li>
<li>Loops back to read more input</li>
</ol>
<p>While this mode of LLM interaction served me well for some time, I couldn't shake the feeling there were tiny improvements to be made to shed a little friction here and there.</p>
<h2>TAB navigation</h2>
<p>Not all LLM output is equal. I want to quickly jump to more interesting items like code blocks or links (via keyboard of course). Sure, I can search to navigate around, but don't we have better patterns already? Don't we often just TAB our way around apps and web pages?</p>
<p>With that, I added TAB and Shift-TAB navigation to chatgpt-shell.</p>
<h2>Editable vs read-only (why not both?)</h2>
<p>Most LLM text chat interfaces I've come across are made up of two components: the input text-box and the history of input requests along with their corresponding LLM outputs. While using the text-box, keyboard shortcuts are somewhat limited to modifier key shortcuts. I'd love to have a richer menu of options available or ways to quickly ask for things, without explicitly having to request a different interaction mode nor a menu of sorts. Circumstances aren't that different in a shell when you have to switch between character and line mode. In a way, the clunkiness intensifies when you'd like to input multi-line text through your shell. You better watch out for that muscle memory and avoid pressing enter prematurely while you intended to add a newline… Too late. Your incomplete request is already on its way.</p>
<p>With all this in mind, it's easy to dismiss shell foundations given their quirks. The thing is, we don't have to throw the baby out with the bathwater. What we need is a veneer of sorts, automatically switching between edit and view mode just when you need it.</p>
<h2>Reducing history noise</h2>
<p>While I want to have access to my LLM chat history (ie. the context), I'm hardly ever interested in seeing anything but the last LLM response. An always-present history feels like constant noise to me. If I want to see the history, I'd like to actively ask for it. Remember that veneer of sorts? Well, can't it act as viewport too? …showing me only the very last response. Want access to previous entries? Can it act as a pager also? One interaction per page (request + response). But if I really want to open the history floodgates, just give me access to the &quot;raw&quot; shell… and so I started <a href="https://xenodium.com/an-experimental-e-shell-pager">experimenting with pagers of sorts</a>.</p>
<h2>One chat interface to rule them all</h2>
<p>With my initial chatgpt-shell implementation, I envisioned multi-model chat support would be possible by isolating shell logic into a separate package (<a href="https://xenodium.com/a-chatgpt-shell-compose-ux-experiment">shell-maker</a>) and let folks build whichever LLM chat they'd like (adding support for their favorite model).</p>
<p>While new shells started popping up here and there, I didn't foresee minor shell UX differences affecting general user experience. Learning the quirks of each new shell felt like unnecessary friction in developing muscle memory. I also became dependent on chatgpt-shell features, which I often missed when using some of the other shells. In the end, I bit the bullet and <a href="https://xenodium.com/chatgpt-shell-goes-multi-model">made chatgpt-shell go multi-model</a>.</p>
<h2>Tying it all together</h2>
<p>TAB navigation, a smart veneer, a viewport, paging, optional access to chat history, a transient menu, a single interface driving different models, and a bunch of other tweaks currently make up chatgpt-shell's compose experience, available via Emacs's <code>M-x chatgpt-shell-prompt-compose</code> command or my preferred key binding: <code>C-c C-e</code>.</p>
<p>Today, I bring another tweak. Compose buffers get a brand new header presenting all relevant shell details including model and paging information.</p>
<p><img src="https://xenodium.github.io/images/llm-text-chat-is-everywhere-whos-optimizing-ux/compose-header.gif" alt=""></p>
<p>The new compose header is now available in the latest MELPA package version. Invoke <code>M-x chatgpt-shell-prompt-compose</code> and off you go. It's pretty fresh, so please report issues.</p>
<h2>Back to the original question…</h2>
<p>What are some of the text chat UX features you love? Bonus points if they are keyboard driven. I'd love to hear: <a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="https://bsky.app/profile/xenodium.bsky.social">Bluesky</a>.</p>
]]></description>
    <pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A richer Journelly org capture template</title>
<link>https://xenodium.com/a-richer-journelly-org-capture-template</link>
<guid isPermaLink="false">https://xenodium.com/a-richer-journelly-org-capture-template</guid>
    <description><![CDATA[<p>In addition to including user content, <a href="https://journelly.com/">Journelly</a> entries typically bundle a few extra details like timestamp, location, and weather information, which look a little something like this:</p>
<p><img src="https://xenodium.github.io/images/a-richer-journelly-org-capture-template/rice-guys.jpg" alt=""></p>
<p>Behind the scenes, Journelly entries follow a fairly simple org structure:</p>
<pre><code class="language-org">* [2025-04-23 Wed 13:24] @ Waterside House
:PROPERTIES:
:LATITUDE: 51.518714352892665
:LONGITUDE: -0.17575820941499262
:WEATHER_TEMPERATURE: 11.4°C
:WEATHER_CONDITION: Mostly Cloudy
:WEATHER_SYMBOL: cloud
:END:
Try out Rice Guys #food #london on Wednesdays in Paddington

[[file:Journelly.org.assets/images/C5890C25-5575-4F52-80D9-CE0087E9986C.jpg]]
</code></pre>
<p>While out and capturing entries from my iPhone, I rely on Journelly to leverages iOS location and weather APIs to include relevant information. On the other hand, when capturing from my Macbook, I rely on a basic Emacs org capture template (very similar to <a href="https://baty.net/posts/2025/04/journelly-org-mode-backed-journaling-for-i-os/">Jack Baty's</a>):</p>
<pre><code class="language-{.commonlisp">(setq org-capture-templates
      '((&quot;j&quot; &quot;Journelly&quot; entry (file &quot;path/to/Journelly.org&quot;)
         &quot;* %U @ Home\n%?&quot; :prepend t)))
</code></pre>
<p>These templates yield straightforward entries like:</p>
<pre><code class="language-org">* [2025-05-16 Fri 12:42] @ Home
A simple entry from my Macbook.
</code></pre>
<p>I've been using this capture template for some time. It does a fine job, though you'd notice location and weather info aren't captured. No biggie, since the location of my laptop isn't typically relevant, but hey today seemed like a perfect day to get <a href="https://xkcd.com/356/">nerd snipped</a> by <a href="https://bsky.app/profile/natharari.bsky.social/post/3lpbkzcduo223">@natharari</a>.</p>
<p>And so, off I went, to look for a utility to capture location from the command line. I found <a href="https://github.com/fulldecent/corelocationcli">CoreLocationCLI</a>, which leverages the equivalent macOS location APIs. As a bonus, the project seemed active (modified only a few days ago).</p>
<p>Installing CoreLocationCLI via <a href="https://brew.sh/">Homebrew</a> was a breeze:</p>
<pre><code class="language-{.bash">brew install corelocationcli
</code></pre>
<p>The first time you run corelocationcli, you'll get an message like:</p>
<pre><code>&quot;CoreLocationCLI&quot; can't be opened because it is from an unidentified developer...
</code></pre>
<p>You'll need to follow <a href="https://github.com/fulldecent/corelocationcli">CoreLocationCLI</a>'s instructions:</p>
<pre><code>To approve the process and allow CoreLocationCLI to run, go to System Settings ➡️ Privacy &amp; Security ➡️ General, and look in the bottom right corner for a button to click.
</code></pre>
<p>After approving the process, I ran into a snag:</p>
<pre><code class="language-{.bash">$ CoreLocationCLI
CoreLocationCLI: ❌ The operation couldn’t be completed. (kCLErrorDomain error 0.)
</code></pre>
<p>Lucky for me, the <a href="https://github.com/fulldecent/corelocationcli">README</a> had the solution:</p>
<pre><code class="language-{.bash">Note for Mac users: make sure Wi-Fi is turned on. Otherwise you will see kCLErrorDomain error 0.
</code></pre>
<p>Oddly, my WiFi was turned on, so I went ahead and toggled it. Success:</p>
<pre><code class="language-{.bash">$ CoreLocationCLI
51.51871 -0.17575
</code></pre>
<p>We can start by wrapping this command-line utility to return coordinates along with reverse geolocation (ie. description):</p>
<pre><code class="language-{.commonlisp">(defun journelly-get-location ()
  &quot;Get current location.

Return in the form:

`((lat . 51.51871)
  (lon . -0.17575)
  (description . \&quot;Sunny House\&quot;))

Signals an error if the location cannot be retrieved.&quot;
  (unless (executable-find &quot;CoreLocationCLI&quot;)
    (error &quot;Needs CoreLocationCLI (try brew install corelocationcli)&quot;))
  (with-temp-buffer
    (if-let ((exit-code (call-process &quot;CoreLocationCLI&quot; nil t nil
                                      &quot;--format&quot; &quot;%latitude\t%longitude\t%thoroughfare&quot;))
             (success (eq exit-code 0))
             (parts (split-string (buffer-string) &quot;\t&quot;)))
        `((lat . ,(string-to-number (nth 0 parts)))
          (lon . ,(string-to-number (nth 1 parts)))
          (description . ,(string-trim (nth 2 parts))))
      (error &quot;No location available&quot;))))
</code></pre>
<p>A quick check shows it's working as expected.</p>
<pre><code class="language-{.commonlisp">(journelly-get-location)
</code></pre>
<pre><code class="language-{.commonlisp">'((lat . 51.51871)
  (lon . -0.17575)
  (description . &quot;Waterside House&quot;))
</code></pre>
<p>Now that we're able to get the current location, we need a way to fetch weather info. I discarded using WeatherKit on macOS for its dependence on a developer account and obtaining an API key. No worries, I found the great <a href="https://api.met.no/">MET Norway API</a> which is freely available without the need for keys.</p>
<pre><code class="language-{.commonlisp">(defun journelly-fetch-weather (lat lon)
  &quot;Fetch weather data from MET Norway API for LAT and LON.

Return the parsed JSON object.&quot;
  (let* ((url (format &quot;https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=%s&amp;lon=%s&quot; lat lon))
         (args (list &quot;-s&quot; url)))
    (with-temp-buffer
      (apply #'call-process &quot;curl&quot; nil t nil args)
      (goto-char (point-min))
      (json-parse-buffer :object-type 'alist))))
</code></pre>
<p>We can take it for a spin with:</p>
<pre><code class="language-{.commonlisp">(journelly-fetch-weather 51.51871 -0.17575)
</code></pre>
<p>We get a nice object with a chunky time series (cropped for readability):</p>
<pre><code class="language-{.commonlisp">((type . &quot;Feature&quot;)
 (geometry (type . &quot;Point&quot;) (coordinates . [-0.1758 51.5187 30]))
 (properties
  (meta (updated_at . &quot;2025-05-16T11:17:44Z&quot;)
        (units (air_pressure_at_sea_level . &quot;hPa&quot;)
               (air_temperature . &quot;celsius&quot;)
               (cloud_area_fraction . &quot;%&quot;)
               (precipitation_amount . &quot;mm&quot;) (relative_humidity . &quot;%&quot;)
               (wind_from_direction . &quot;degrees&quot;) (wind_speed . &quot;m/s&quot;)))
  (timeseries
   . [((time . &quot;2025-05-16T12:00:00Z&quot;)
       (data
        (instant
         (details (air_pressure_at_sea_level . 1025.6)
                  (air_temperature . 18.0) (cloud_area_fraction . 4.7)
                  (relative_humidity . 44.2)
                  (wind_from_direction . 17.6) (wind_speed . 3.6)))
        (next_12_hours (summary (symbol_code . &quot;fair_day&quot;)) (details))
        (next_1_hours (summary (symbol_code . &quot;clearsky_day&quot;))
                      (details (precipitation_amount . 0.0)))
        (next_6_hours (summary (symbol_code . &quot;clearsky_day&quot;))
                      (details (precipitation_amount . 0.0)))))

      ...


     ((time . &quot;2025-05-26T00:00:00Z&quot;)
       (data
        (instant
         (details (air_pressure_at_sea_level . 1007.3)
                  (air_temperature . 12.6)
                  (cloud_area_fraction . 28.1)
                  (relative_humidity . 91.3)
                  (wind_from_direction . 258.7) (wind_speed . 3.5)))))])))

</code></pre>
<p>Journelly entries need only a tiny subset of the returned object, so let's add a helper to extract and format as preferred.</p>
<pre><code class="language-{.commonlisp">(defun journelly-fetch-weather-summary (lat lon)
  &quot;Fetch weather data from MET Norway API for LAT and LON.

Return in the form:

 '((temperature . \&quot;16.9°C\&quot;)
   (symbol . \&quot;cloudy\&quot;)).&quot;
  (let* ((data (journelly-fetch-weather lat lon))
         (now (current-time))
         (entry (seq-find
                 (lambda (entry)
                   (let-alist entry
                     (time-less-p now (date-to-time .time))))
                 (let-alist data
                   .properties.timeseries)))
         (unit (let-alist data
                 .properties.meta.units.air_temperature)))
    (unless entry
      (error &quot;Couldn't fetch weather data&quot;))
    (let-alist entry
      `((temperature . ,(format &quot;%.1f%s&quot;
                                .data.instant.details.air_temperature
                                (cond
                                 ((string= unit &quot;celsius&quot;) &quot;°C&quot;)
                                 ((string= unit &quot;fahrenheit&quot;) &quot;°F&quot;)
                                 (t (concat &quot; &quot; unit)))))
        (symbol . ,(alist-get 'symbol_code .data.next_1_hours.summary))))))
</code></pre>
<p>We can take it for a spin with:</p>
<pre><code class="language-{.commonlisp">(journelly-fetch-weather-summary 51.51871 -0.17575)
</code></pre>
<p>Nice! Look at that weather, it's a sign I should finish writing and go outside!</p>
<pre><code class="language-{.commonlisp">'((temperature . &quot;19.0°C&quot;)
  (symbol . &quot;clearsky_day&quot;))
</code></pre>
<p>I really should go outside, but I'm just so close now… Or so I thought! That symbol (ie. &quot;clearsky_day&quot;) isn't recognizable by Journelly, which relies on <a href="https://developer.apple.com/sf-symbols/">SF Symbols</a> returned by <a href="https://developer.apple.com/weatherkit/">WeatherKit</a>. I need a mapping of sorts between these symbols. Gosh, I do need to go outside. Let's speed things along. This is a perfect task for a robot! Whipped <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> out and asked the LLM robots to take on this grunt work, who gave me:</p>
<pre><code class="language-json">{
  &quot;clearsky_day&quot;: &quot;sun.max&quot;,
  &quot;clearsky_night&quot;: &quot;moon.stars&quot;,
  &quot;clearsky_polartwilight&quot;: &quot;sun.horizon&quot;,
  ...
  &quot;snowshowers_and_thunder_day&quot;: &quot;cloud.sun.bolt.snow&quot;,
  &quot;snowshowers_and_thunder_night&quot;: &quot;cloud.moon.bolt.snow&quot;,
  &quot;thunderstorm&quot;: &quot;cloud.bolt&quot;
}
</code></pre>
<p>We're in elisp land so who wants json? Hey robot, I need an alist:</p>
<p><img src="https://xenodium.github.io/images/a-richer-journelly-org-capture-template/chatgpt-shell.png" alt=""></p>
<p>Won't the LLM make mapping errors? Most certainly! But for now, I'm just getting a rough prototype and I need to get moving if I want to go outside!</p>
<p>We plug our mapping into an elisp function</p>
<pre><code class="language-{.commonlisp">(defun journelly-resolve-metno-to-sf-symbol (symbol)
  &quot;Resolve Met.no weather SYMBOL strings to a corresponding SF Symbols.&quot;
  (let ((symbols '((&quot;clearsky_day&quot; . &quot;sun.max&quot;)
                   (&quot;clearsky_night&quot; . &quot;moon.stars&quot;)
                   (&quot;clearsky_polartwilight&quot; . &quot;sun.horizon&quot;)
                   ...
                   (&quot;snowshowers_and_thunder_day&quot; . &quot;cloud.sun.bolt.snow&quot;)
                   (&quot;snowshowers_and_thunder_night&quot; . &quot;cloud.moon.bolt.snow&quot;)
                   (&quot;thunderstorm&quot; . &quot;cloud.bolt&quot;))))
    (map-elt symbols symbol)))
</code></pre>
<p>Does it work? Kinda seems like it.</p>
<pre><code class="language-{.commonlisp">(journelly-resolve-metno-to-sf-symbol
 (map-elt (journelly-fetch-weather-summary 51.51871 -0.17575) 'symbol))
</code></pre>
<pre><code class="language-{.commonlisp">&quot;sun.max&quot;
</code></pre>
<p>We got everything we need now, let's put the bits together:</p>
<pre><code class="language-{.commonlisp">(defun journelly-generate-metadata ()
  (let* ((location (journelly-get-location))
         (weather (journelly-fetch-weather-summary
                   (map-elt location 'lat)
                   (map-elt location 'lon))))
    (format &quot;%s
:PROPERTIES:
:LATITUDE: %s
:LONGITUDE: %s
:WEATHER_TEMPERATURE: %s
:WEATHER_SYMBOL: %s
:END:&quot;
            (or (map-elt location 'description) &quot;-&quot;)
            (map-elt location 'lat)
            (map-elt location 'lon)
            (alist-get 'temperature weather)
            (journelly-resolve-metno-to-sf-symbol
             (alist-get 'symbol weather)))))
</code></pre>
<p>Lovely, we now get the metadata we need in the expected format.</p>
<pre><code class="language-{.commonlisp">Waterside House
:PROPERTIES:
:LATITUDE: 51.51871
:LONGITUDE: -0.17575
:WEATHER_TEMPERATURE: 18.5°C
:WEATHER_SYMBOL: sun.max
:END:
</code></pre>
<p>Damn, the temperature is dropping. I really do need to go outside. So close now!</p>
<p>All we have to do is plug our <code>journelly-generate-metadata</code> function into our org template and… Bob's your uncle!</p>
<pre><code class="language-{.commonlisp">(setq org-capture-templates
      '((&quot;j&quot; &quot;Journelly&quot; entry (file &quot;path/to/Journelly.org&quot;)
         &quot;* %U @ %(journelly-generate-metadata)\n%?&quot; :prepend t)))
</code></pre>
<p>We can now invoke our trusty <code>M-x org-capture</code> and off we go…</p>
<p><img src="https://xenodium.github.io/images/a-richer-journelly-org-capture-template/capture.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/a-richer-journelly-org-capture-template/journelly.jpeg" alt=""></p>
<p>While the code currently lives in my Emacs config, it's <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/journelly.el">available on GitHub</a>. If you do take it for a spin, it may crash and burn. I blame the weather. In the UK, when sunny, you rush to go outside! 🌞🏃‍♂️💨</p>
]]></description>
    <pubDate>Fri, 16 May 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Journelly: like tweeting but for your eyes only (in plain text)</title>
<link>https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only</link>
<guid isPermaLink="false">https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only</guid>
    <description><![CDATA[<p>On iOS, we're spoiled for choice when it comes to note-taking, journaling, or social media apps. In note-taking alone, I've flip-flopped back and forth between different note-taking and journaling apps. For one reason or another, none would stick. My initial attempt at building such an app faded just the same. That is, until I realized what I really wanted was a cocktail of sorts, combining user experiences from all three kinds. Only then, I finally gained some traction and Journelly was truly born.</p>
<p>I'm happy to share that, as of today, Journelly is generally available on the App Store. Check out <a href="https://journelly.com">journelly.com</a> for all app details or just read on…</p>
<center>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/icon.png" alt="download-on-app-store.png" width="180px"/></a><br><br>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px"/></a>
</center>
<h2>Like tweeting, but for your eyes only</h2>
<p>While bringing social to note-taking was categorically never a goal, we got a thing or two we can draw from social media apps. They make it remarkably easy to browse and just share stuff.</p>
<p>All my previous mobile note-taking attempts failed to stick around almost exclusively because of friction. By bringing a social-media-like feed to my notes and making it remarkably easy to just add and search for things, app stickiness quickly took off.</p>
<p>Of course, these being my personal notes, privacy is non-negotiable. With Journelly being offline by default, combining elements from note-taking, journaling, and social media apps, I came to think of Journelly's experience as &quot;tweeting but for your eyes only&quot;.</p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/sideways.jpg" alt=""></p>
<h2>Is it a notes app? Journaling app? It's whatever you want it to be…</h2>
<p>I like how journaling apps automatically bundle timestamps with your entries and maybe additional information like location or even weather details. At the same time, splitting my writing between two apps (quick notes vs. journaling) always felt like unnecessary friction. Even having to decide which app to launch felt like a deterrent.</p>
<p>While my typical Journelly use-case hops between taking notes, journaling, today's grocery shopping list, saving a few links from the web, music, movies, the list goes on… jcs from <a href="https://irreal.org/blog/">Irreal</a> puts it best: &quot;<a href="https://irreal.org/blog/?p=12908">Journelly is a bit of a shape shifter</a>.&quot; With just enough structure (but not too much), Journelly can serve all sorts of use-cases.</p>
<h2>No lock-in (powered by org plain text)</h2>
<p>While I want a smooth mobile note-taking experience, I also don't want my notes to live in a data island of sorts. I'm a fan of plain text. I've been writing my notes and blog posts at <a href="https://xenodium.com/">xenodium.com</a> using <a href="https://orgmode.org/worg/org-syntax.html">Org</a> plain text for well over a decade now, so my solution naturally had to have some plain text thrown at it.</p>
<p>Journelly stores entries using <a href="https://orgmode.org/worg/org-syntax.html">Org</a> markup for now, but <a href="https://www.markdownguide.org/basic-syntax/">Markdown</a> is coming too (UPDATE: <a href="https://xenodium.com/journelly-1-3-released">launched</a>). Interested in Markdown support? <a href="mailto:journelly+markdown@xenodium.com?subject=I'm%20interested%20Markdown%20for%20Journelly&amp;body=Just%20want%20to%20register%20my%20interest%20in%20Markdown%20support%20for%20Journelly">Please reach out</a>. The more requests I receive, the sooner I'll get it out the door. Oh, and since we're talking Markdown, I also launched <a href="https://lmno.lol/">lmno.lol</a>, a Markdown-powered blogging service (minus the yucky bits of the modern web). Custom domains are welcome too. My <a href="https://xenodium.com/">xenodium.com</a> blog runs off <a href="https://lmno.lol/">lmno.lol</a>.</p>
<p>Is it really powered by Org markup? Go ahead and fire up your beloved <a href="https://www.gnu.org/software/emacs/">Emacs</a>, <a href="https://www.vim.org/">Vim</a>, <a href="https://neovim.io/">Neovim</a>, <a href="https://code.visualstudio.com/">VS Code</a>, <a href="https://www.sublimetext.com/">Sublime Text</a>, <a href="https://zed.dev/">Zed</a>… and take a peek. It's just text.</p>
<p><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/emacs.gif" alt=""></p>
<p>Having shown you all of that, this is all just cherry on the implementation cake. You need not know anything about markups to use Journelly. Just open the app and start writing.</p>
<h2>iCloud syncing (optional)</h2>
<p>While Journelly is offline by default, you may optionally sync with other devices via iCloud.</p>
<p>Folks have reported using <a href="https://workingcopy.app">Working Copy</a>, <a href="https://github.com/pixelspark/sushitrain">Sushitrain</a>, or <a href="https://mobiussync.com">Möbius Sync</a> for syncing, though your mileage may vary. As of v1, I can only offer iCloud as the officially supported provider.</p>
<h2>Searching + hashtags</h2>
<p>There's little structure enforced on Journelly entries. Write whatever you want. If you want some categorization, sprinkle entries with your favorite hashtags. They're automatically actionable on tap, enabling quick searches in the future.</p>
<h2>Thank you beta testers!</h2>
<p>Nearly 300 folks signed up to <a href="https://xenodium.com/journelly-open-for-beta">Journelly's TestFlight</a>. Thank you for testing, reporting issues, and all the great suggestions. While many of your feature requests made it to the launch, I've had to defer quite few to enable the v1 release. The good news is I now have a healthy backlog I can work on to bring features over time.</p>
<h2>Support indie development</h2>
<p>The <a href="https://www.apple.com/app-store/">App Store</a> is a crowded place. Building ✨sustainable✨ iOS apps is quite the challenge, especially when doing right by the user. Journelly steers clear of ads, tracking, distractions, bloat, lock-in, and overreaching permissions. It embraces open formats like <a href="https://orgmode.org">Org</a> markup, safeguarding the longevity of your data.</p>
<p>Support independent development.</p>
<center>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/icon.png" alt="download-on-app-store.png" width="180px"/></a><br><br>
<a href="https://apps.apple.com/app/id6470714669"><img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px"/></a>
<br><br>
<center>
  <a href='https://lmno.lol'>
    <img alt='LMNO.lol' height="40" src='https://xenodium.github.io/images/journelly-like-tweeting-but-for-your-eyes-only/lmno-icon.png'>
  </a>
  <a href='https://plainorg.com'>
    <img alt='Plain Org' width="40" height="40" src='https://plainorg.github.io/favicon.ico'>
  </a>
  <a href='https://apps.apple.com/app/id1671420139'>
    <img alt='Scratch' width="40" height="40" src='https://xenodium.github.io/images/scratch-a-minimal-scratch-area/scratch_icon.png'>
  </a>
  <a href='https://flathabits.com'>
    <img alt='Flat Habits' width="40" height="40" src='https://flathabits.github.io/favicon.ico'>
  </a>
  <a href='https://apps.apple.com/app/id6480411697'>
    <img alt='Fresh Eyes' width="40" height="40" src='https://xenodium.github.io/images/fresh-eyes-now-on-the-app-store/fresh_eyes_icon.png'>
  </a>
</center>
</center>
]]></description>
    <pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Journelly vs Emacs: Why Not Both?</title>
<link>https://xenodium.com/journelly-vs-emacs-why-not-both</link>
<guid isPermaLink="false">https://xenodium.com/journelly-vs-emacs-why-not-both</guid>
    <description><![CDATA[<p><a href="https://indieweb.social/@jtr@fosstodon.org">JTR</a> recently <a href="https://taonaw.com/2025/04/01/irreal-likes-ramrezs-journelly-irrealorg.html">posted</a> an interesting question in response to Irreal's <a href="https://irreal.org/blog/?p=12880">post</a> wondering <a href="https://taonaw.com/2025/04/01/irreal-likes-ramrezs-journelly-irrealorg.html">why he feels the need to use something that is not Emacs for quick notes?</a> While I'm in no position to speak on behalf of Irreal, I am the Ramírez building this Journelly app JTR speaks of ;-)</p>
<p>From my perspective as the author, I'm building this app to fill a void I have, complementing my org-mode usage. In my opinion, it's not a question of whether to use Journelly over Emacs. I freakin' love Emacs org. I don't want to give it up. If the apps speak to each other, the question I'd rather ask is: why not use both?</p>
<p>When I’m on my computer, nearly all my writing goes through org-mode. I’ve been an org fan for well over a decade. My blog is powered by a <a href="https://raw.githubusercontent.com/xenodium/xenodium.github.io/refs/heads/master/index.org">single org file</a> (be warned, it's a chunky file).</p>
<p>It's no secret I'm also an Emacs fan. I love how this platform <a href="https://xenodium.com/a-platform-that-moulds-to-your-needs">moulds to my needs</a>. But when I’m on the go and on my iPhone, I want a different experience — quick mobile access, minimal ceremony, optimized for smaller touch screens. I want to capture quick notes on the go, with as little friction as possible. Optionally, I want to include photos, lists, checklists, location, weather, timestamps… I also want this experience to feel like other well-integrated iOS apps. The way I like to put it is: Journelly sorta feels like tweeting, but for your eyes only.</p>
<p><img src="https://xenodium.github.io/images/journelly-vs-emacs-why-not-both/journelly.gif" alt=""></p>
<p>At the same time, I don’t want my mobile note-taking experience to live in a data island. After all, I'm still an org fan. So… why not use both apps? My goal for Journelly is to provide a mobile-optimized experience that happens to speak org and thus complement my existing org usage.</p>
<p><img src="https://xenodium.github.io/images/journelly-vs-emacs-why-not-both/storage.jpg" alt=""></p>
<p>While Journelly is offline by default, you may choose a different location for your data, enabling you to access it from your beloved editor.</p>
<p><img src="https://xenodium.github.io/images/journelly-vs-emacs-why-not-both/emacs.png" alt=""></p>
<p>Back to the original question: why use another tool for quick notes other than Emacs? Journelly isn't meant to replace Emacs, but rather complement it. In a way, Journelly isn't that different from Beorg, which was mentioned in JTR's post. Both apps speak org on iOS. It just so happens the apps offer slightly different targeted experiences. While Beorg is perhaps more geared toward task lists and calendars, Journelly focuses on short and quick notes.</p>
<p>Journelly is still in beta, though lucky for me, <a href="https://www.macobserver.com/tips/round-ups/journelly-journal-app-ios/">Mac Observer showcased a thorough review</a>. If keen to join the beta group, reach out at journelly/./invite/@/xenodium.com or <a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="https://bsky.app/profile/xenodium.bsky.social">Bluesky</a>.</p>
<p>P.S. Emacs org continues to be, and likely always will be, my writing epicentre. I now have three revolving <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">org-based apps on the App Store</a>, with Journelly soon to become the fourth one. if interested, check out <a href="https://xenodium.com/the-org-bundle">my org bundle</a>.</p>
]]></description>
    <pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>The Mac Observer showcases Journelly</title>
<link>https://xenodium.com/the-mac-observer-showcases-journelly</link>
<guid isPermaLink="false">https://xenodium.com/the-mac-observer-showcases-journelly</guid>
    <description><![CDATA[<p><a href="https://www.macobserver.com">The Mac Observer</a> is showcasing <a href="https://www.macobserver.com/tips/round-ups/journelly-journal-app-ios/">Monday App Finder: Journelly, a Twitter-Like Journal for iOS</a>.</p>
<pre><code class="language-{=org}">#+ATTR_HTML: :width 70%
</code></pre>
<p><a href="https://www.macobserver.com/wp-content/uploads/2025/03/iOS-18-default-wallpaper-with-app-list-and-the-Journaly-journal-app-icon-highlighted.png"><img src="https://www.macobserver.com/wp-content/uploads/2025/03/iOS-18-default-wallpaper-with-app-list-and-the-Journaly-journal-app-icon-highlighted.png" alt=""></a></p>
<p><a href="https://www.macobserver.com/author/bemfica_deoliva/">Bemfica de Oliva</a> does a wonderful rundown of Journelly's features and capabilities, much better than anything else I've posted before. They even mentioned <a href="https://orgmode.org">Org</a> markup and <a href="https://www.gnu.org/software/emacs/">Emacs</a> text editor, for those who want to drop down to its plain text storage. A nice treat, as these aren't typically showcased in the space.</p>
<p>If you're curious about what Journelly can do, check out Bemfica's <a href="https://www.macobserver.com/tips/round-ups/journelly-journal-app-ios/">post</a>. Alternatively, if you just want to play with it, <a href="https://xenodium.com/journelly-open-for-beta">join the TestFlight beta group</a>.</p>
]]></description>
    <pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Journelly open for beta</title>
<link>https://xenodium.com/journelly-open-for-beta</link>
<guid isPermaLink="false">https://xenodium.com/journelly-open-for-beta</guid>
    <description><![CDATA[<p>UPDATE: Journelly is <a href="https://xenodium.com/journelly-like-tweeting-but-for-your-eyes-only">now on the App Store</a>.</p>
<p>I've reignited Journelly, my note-taking/journaling project. The iOS app is coming along nicely.</p>
<p>I've been using Journelly daily. The best I can describe the experience is: &quot;kinda like tweeting but for my eyes only&quot;.</p>
<p><img src="https://xenodium.github.io/images/journelly-open-for-beta/journelly.jpeg" alt=""></p>
<p>Journelly automatically includes date and time in your entries. Optionally, it'll also include location and weather details.</p>
<p>For now, your entries can include text, images, checkboxes, bullets, and links.</p>
<p>While entering items orally isn't yet possible <a href="https://irreal.org/blog/?p=12842">as per Irreal's post</a>, you can use the standard keyboard button to dictate text.</p>
<p><img src="https://xenodium.github.io/images/journelly-open-for-beta/add.jpeg" alt=""></p>
<h2>Powered by plain text (org markup)</h2>
<p>If you're an Emacs org mode fan, you'll be happy to know that Journelly stores data as plain text, using org to structure its entries.</p>
<p>If you're unfamiliar with these things, you don't need to learn any of it to use the app. It's just what's under the hood.</p>
<pre><code class="language-org">* [2025-02-26 Wed 13:55] @ Distillery Lane
:PROPERTIES:
:LATITUDE: 51.488644146827866
:LONGITUDE: -0.22292387343051026
:WEATHER_TEMPERATURE: 8.69°C
:WEATHER_CONDITION: Rain
:WEATHER_SYMBOL: cloud.rain
:END:
- [X] Try out Pad Thai Story in Hammersmith

[[file:Journelly.org.assets/images/4F0F3923-675A-461E-9B02-63CEDE76C765.jpg]]
</code></pre>
<h2>Join the beta group</h2>
<p>Want to give Journelly a try? Join the TestFlight beta group. Send me an email address (any would do) for the TestFlight invite.</p>
<p>You can reach out at journelly/./invite/@/xenodium.com or <a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="https://bsky.app/profile/xenodium.bsky.social">Bluesky</a>.</p>
]]></description>
    <pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>DeepSeek, Open Router, Kagi, and Perplexity join the chat</title>
<link>https://xenodium.com/deepseek-open-router-kagi-and-perplexity-join-the-chat</link>
<guid isPermaLink="false">https://xenodium.com/deepseek-open-router-kagi-and-perplexity-join-the-chat</guid>
    <description><![CDATA[<p>Back in November, <a href="https://xenodium.com/deepseek-open-router-kagi-and-perplexity-join-the-chat">I announced the chatgpt-shell Emacs package going offline</a>. In real terms, it meant adding <a href="https://ollama.com/">Ollama</a> support after <a href="https://xenodium.com/chatgpt-shell-goes-multi-model">chatgpt-shell went multi-model</a>. Since then, support for a handful of providers and models has been added.</p>
<p>While <a href="https://www.deepseek.com/">DeepSeek</a> is the latest joinee, <a href="https://openrouter.ai/">Open Router</a> (thank you <a href="https://github.com/xenodium/chatgpt-shell/pull/276">djr7C4</a>), <a href="https://kagi.com/summarizer/index.html">Kagi summarizer</a>, and <a href="https://perplexity.ai/">Perplexity</a> are also a model-swap away.</p>
<p><a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> is <a href="https://melpa.org/#/chatgpt-shell">nearing 30K MELPA downloads</a>. Are you a happy user? Consider making this project sustainable by ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨.</p>
<p><img src="https://xenodium.github.io/images/deepseek-open-router-kagi-and-perplexity-join-the-chat/models.png" alt=""></p>
]]></description>
    <pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Keychron K3 Pro: F1-F12 as default macOS keys</title>
<link>https://xenodium.com/keychron-k3-pro-f1-f12-as-default-macos-keys</link>
<guid isPermaLink="false">https://xenodium.com/keychron-k3-pro-f1-f12-as-default-macos-keys</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/keychron-k3-pro-f1-f12-as-default-macos-keys/keyboard.jpg" alt=""></p>
<p>After resetting my <a href="https://www.keychron.uk/products/keychron-k3-pro-qmk-via-wireless-custom-mechanical-keyboard">Keychron K3 Pro</a>, my F1 to F12 keys were no longer my default macOS keys. The entire row was defaulting to macOS's special keys (i.e. Mission Control, Launch Pad, Volume, etc). At first, I thought I may just need to revisit the macOS setting &quot;Use F1, F2, etc keys as standard function keys&quot;, yet toggling the setting made no difference.</p>
<p><img src="https://xenodium.github.io/images/keychron-k3-pro-f1-f12-as-default-macos-keys/settings.png" alt=""></p>
<p>Turns out, I had remapped those keys long ago and simply forgot about it. Factory resetting my keyboard got rid of this customization. This post is a reminder for my future self, and anyone else looking to remap their F1-F12 keys.</p>
<h2>Save your current layout</h2>
<p>Via <a href="https://usevia.app">https://usevia.app</a>, I saved my current keyboard layout (the out-of-box layout) and named it <code>k3_pro_ansi_white(before).json</code>.</p>
<p><img src="https://xenodium.github.io/images/keychron-k3-pro-f1-f12-as-default-macos-keys/save.png" alt=""></p>
<h2>Apply your changes</h2>
<p>I made a second copy of the layout and named it <code>k3_pro_ansi_white(after).json</code>. In this new file, I located the two layers (first and second) and simply swapped the two row chunks using a text editor.</p>
<p>The diff looks a little something like this:</p>
<pre><code>--- k3_pro_ansi_white(before).json    2025-02-20 09:44:03
+++ k3_pro_ansi_white(after).json 2025-02-20 09:43:59
@@ -5,18 +5,18 @@
   &quot;layers&quot;: [
     [
       &quot;KC_ESC&quot;,
-      &quot;KC_BRID&quot;,
-      &quot;KC_BRIU&quot;,
-      &quot;CUSTOM(4)&quot;,
-      &quot;CUSTOM(5)&quot;,
-      &quot;BL_DEC&quot;,
-      &quot;BL_INC&quot;,
-      &quot;KC_MPRV&quot;,
-      &quot;KC_MPLY&quot;,
-      &quot;KC_MNXT&quot;,
-      &quot;KC_MUTE&quot;,
-      &quot;KC_VOLD&quot;,
-      &quot;KC_VOLU&quot;,
+      &quot;KC_F1&quot;,
+      &quot;KC_F2&quot;,
+      &quot;KC_F3&quot;,
+      &quot;KC_F4&quot;,
+      &quot;KC_F5&quot;,
+      &quot;KC_F6&quot;,
+      &quot;KC_F7&quot;,
+      &quot;KC_F8&quot;,
+      &quot;KC_F9&quot;,
+      &quot;KC_F10&quot;,
+      &quot;KC_F11&quot;,
+      &quot;KC_F12&quot;,
       &quot;CUSTOM(8)&quot;,
       &quot;KC_DEL&quot;,
       &quot;BL_STEP&quot;,
@@ -103,18 +103,18 @@
     ],
     [
       &quot;KC_TRNS&quot;,
-      &quot;KC_F1&quot;,
-      &quot;KC_F2&quot;,
-      &quot;KC_F3&quot;,
-      &quot;KC_F4&quot;,
-      &quot;KC_F5&quot;,
-      &quot;KC_F6&quot;,
-      &quot;KC_F7&quot;,
-      &quot;KC_F8&quot;,
-      &quot;KC_F9&quot;,
-      &quot;KC_F10&quot;,
-      &quot;KC_F11&quot;,
-      &quot;KC_F12&quot;,
+      &quot;KC_BRID&quot;,
+      &quot;KC_BRIU&quot;,
+      &quot;CUSTOM(4)&quot;,
+      &quot;CUSTOM(5)&quot;,
+      &quot;BL_DEC&quot;,
+      &quot;BL_INC&quot;,
+      &quot;KC_MPRV&quot;,
+      &quot;KC_MPLY&quot;,
+      &quot;KC_MNXT&quot;,
+      &quot;KC_MUTE&quot;,
+      &quot;KC_VOLD&quot;,
+      &quot;KC_VOLU&quot;,
       &quot;KC_TRNS&quot;,
       &quot;KC_TRNS&quot;,
       &quot;BL_TOGG&quot;,
</code></pre>
<p>Similarly, here's side-by-side look via Emacs ediff:</p>
<p><img src="https://xenodium.github.io/images/keychron-k3-pro-f1-f12-as-default-macos-keys/after-1.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/keychron-k3-pro-f1-f12-as-default-macos-keys/after-2.png" alt=""></p>
<h2>Load your modified layout</h2>
<p>Now that we have <code>k3_pro_ansi_white(after).json</code> with our changes, all that's left is loading through <a href="https://usevia.app">https://usevia.app</a>. You are now done.</p>
<p><img src="https://xenodium.github.io/images/keychron-k3-pro-f1-f12-as-default-macos-keys/load.png" alt=""></p>
<p>While F1-F12 keys should now be available by default. To access your macOS special keys use the <code>fn</code> key.</p>
<p>Enjoy your F1-F12 default keys!</p>
<h2>Final <code>k3_pro_ansi_white(after).json</code></h2>
<p>In case you'd like to see the entire content of <code>k3_pro_ansi_white(after).json</code>, here it is:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Keychron K3 Pro ANSI White&quot;,
  &quot;vendorProductId&quot;: 875823667,
  &quot;macros&quot;: [&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;],
  &quot;layers&quot;: [
    [
      &quot;KC_ESC&quot;,
      &quot;KC_F1&quot;,
      &quot;KC_F2&quot;,
      &quot;KC_F3&quot;,
      &quot;KC_F4&quot;,
      &quot;KC_F5&quot;,
      &quot;KC_F6&quot;,
      &quot;KC_F7&quot;,
      &quot;KC_F8&quot;,
      &quot;KC_F9&quot;,
      &quot;KC_F10&quot;,
      &quot;KC_F11&quot;,
      &quot;KC_F12&quot;,
      &quot;CUSTOM(8)&quot;,
      &quot;KC_DEL&quot;,
      &quot;BL_STEP&quot;,
      &quot;KC_GRV&quot;,
      &quot;KC_1&quot;,
      &quot;KC_2&quot;,
      &quot;KC_3&quot;,
      &quot;KC_4&quot;,
      &quot;KC_5&quot;,
      &quot;KC_6&quot;,
      &quot;KC_7&quot;,
      &quot;KC_8&quot;,
      &quot;KC_9&quot;,
      &quot;KC_0&quot;,
      &quot;KC_MINS&quot;,
      &quot;KC_EQL&quot;,
      &quot;KC_BSPC&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_PGUP&quot;,
      &quot;KC_TAB&quot;,
      &quot;KC_Q&quot;,
      &quot;KC_W&quot;,
      &quot;KC_E&quot;,
      &quot;KC_R&quot;,
      &quot;KC_T&quot;,
      &quot;KC_Y&quot;,
      &quot;KC_U&quot;,
      &quot;KC_I&quot;,
      &quot;KC_O&quot;,
      &quot;KC_P&quot;,
      &quot;KC_LBRC&quot;,
      &quot;KC_RBRC&quot;,
      &quot;KC_BSLS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_PGDN&quot;,
      &quot;KC_CAPS&quot;,
      &quot;KC_A&quot;,
      &quot;KC_S&quot;,
      &quot;KC_D&quot;,
      &quot;KC_F&quot;,
      &quot;KC_G&quot;,
      &quot;KC_H&quot;,
      &quot;KC_J&quot;,
      &quot;KC_K&quot;,
      &quot;KC_L&quot;,
      &quot;KC_SCLN&quot;,
      &quot;KC_QUOT&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_ENT&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_HOME&quot;,
      &quot;KC_LSFT&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_Z&quot;,
      &quot;KC_X&quot;,
      &quot;KC_C&quot;,
      &quot;KC_V&quot;,
      &quot;KC_B&quot;,
      &quot;KC_N&quot;,
      &quot;KC_M&quot;,
      &quot;KC_COMM&quot;,
      &quot;KC_DOT&quot;,
      &quot;KC_SLSH&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_RSFT&quot;,
      &quot;KC_UP&quot;,
      &quot;KC_END&quot;,
      &quot;KC_LCTL&quot;,
      &quot;CUSTOM(0)&quot;,
      &quot;CUSTOM(2)&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_SPC&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;CUSTOM(3)&quot;,
      &quot;MO(1)&quot;,
      &quot;KC_RCTL&quot;,
      &quot;KC_LEFT&quot;,
      &quot;KC_DOWN&quot;,
      &quot;KC_RGHT&quot;
    ],
    [
      &quot;KC_TRNS&quot;,
      &quot;KC_BRID&quot;,
      &quot;KC_BRIU&quot;,
      &quot;CUSTOM(4)&quot;,
      &quot;CUSTOM(5)&quot;,
      &quot;BL_DEC&quot;,
      &quot;BL_INC&quot;,
      &quot;KC_MPRV&quot;,
      &quot;KC_MPLY&quot;,
      &quot;KC_MNXT&quot;,
      &quot;KC_MUTE&quot;,
      &quot;KC_VOLD&quot;,
      &quot;KC_VOLU&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;BL_TOGG&quot;,
      &quot;KC_TRNS&quot;,
      &quot;CUSTOM(11)&quot;,
      &quot;CUSTOM(12)&quot;,
      &quot;CUSTOM(13)&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;BL_TOGG&quot;,
      &quot;BL_STEP&quot;,
      &quot;BL_INC&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;BL_DEC&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;CUSTOM(14)&quot;,
      &quot;MAGIC_TOGGLE_NKRO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;
    ],
    [
      &quot;KC_ESC&quot;,
      &quot;KC_F1&quot;,
      &quot;KC_F2&quot;,
      &quot;KC_F3&quot;,
      &quot;KC_F4&quot;,
      &quot;KC_F5&quot;,
      &quot;KC_F6&quot;,
      &quot;KC_F7&quot;,
      &quot;KC_F8&quot;,
      &quot;KC_F9&quot;,
      &quot;KC_F10&quot;,
      &quot;KC_F11&quot;,
      &quot;KC_F12&quot;,
      &quot;KC_PSCR&quot;,
      &quot;KC_DEL&quot;,
      &quot;BL_STEP&quot;,
      &quot;KC_GRV&quot;,
      &quot;KC_1&quot;,
      &quot;KC_2&quot;,
      &quot;KC_3&quot;,
      &quot;KC_4&quot;,
      &quot;KC_5&quot;,
      &quot;KC_6&quot;,
      &quot;KC_7&quot;,
      &quot;KC_8&quot;,
      &quot;KC_9&quot;,
      &quot;KC_0&quot;,
      &quot;KC_MINS&quot;,
      &quot;KC_EQL&quot;,
      &quot;KC_BSPC&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_PGUP&quot;,
      &quot;KC_TAB&quot;,
      &quot;KC_Q&quot;,
      &quot;KC_W&quot;,
      &quot;KC_E&quot;,
      &quot;KC_R&quot;,
      &quot;KC_T&quot;,
      &quot;KC_Y&quot;,
      &quot;KC_U&quot;,
      &quot;KC_I&quot;,
      &quot;KC_O&quot;,
      &quot;KC_P&quot;,
      &quot;KC_LBRC&quot;,
      &quot;KC_RBRC&quot;,
      &quot;KC_BSLS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_PGDN&quot;,
      &quot;KC_CAPS&quot;,
      &quot;KC_A&quot;,
      &quot;KC_S&quot;,
      &quot;KC_D&quot;,
      &quot;KC_F&quot;,
      &quot;KC_G&quot;,
      &quot;KC_H&quot;,
      &quot;KC_J&quot;,
      &quot;KC_K&quot;,
      &quot;KC_L&quot;,
      &quot;KC_SCLN&quot;,
      &quot;KC_QUOT&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_ENT&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_HOME&quot;,
      &quot;KC_LSFT&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_Z&quot;,
      &quot;KC_X&quot;,
      &quot;KC_C&quot;,
      &quot;KC_V&quot;,
      &quot;KC_B&quot;,
      &quot;KC_N&quot;,
      &quot;KC_M&quot;,
      &quot;KC_COMM&quot;,
      &quot;KC_DOT&quot;,
      &quot;KC_SLSH&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_RSFT&quot;,
      &quot;KC_UP&quot;,
      &quot;KC_END&quot;,
      &quot;KC_LCTL&quot;,
      &quot;KC_LGUI&quot;,
      &quot;KC_LALT&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_SPC&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_RALT&quot;,
      &quot;MO(3)&quot;,
      &quot;KC_RCTL&quot;,
      &quot;KC_LEFT&quot;,
      &quot;KC_DOWN&quot;,
      &quot;KC_RGHT&quot;
    ],
    [
      &quot;KC_TRNS&quot;,
      &quot;KC_BRID&quot;,
      &quot;KC_BRIU&quot;,
      &quot;CUSTOM(6)&quot;,
      &quot;CUSTOM(7)&quot;,
      &quot;BL_DEC&quot;,
      &quot;BL_INC&quot;,
      &quot;KC_MPRV&quot;,
      &quot;KC_MPLY&quot;,
      &quot;KC_MNXT&quot;,
      &quot;KC_MUTE&quot;,
      &quot;KC_VOLD&quot;,
      &quot;KC_VOLU&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;BL_TOGG&quot;,
      &quot;KC_TRNS&quot;,
      &quot;CUSTOM(11)&quot;,
      &quot;CUSTOM(12)&quot;,
      &quot;CUSTOM(13)&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;BL_TOGG&quot;,
      &quot;BL_STEP&quot;,
      &quot;BL_INC&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;BL_DEC&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;CUSTOM(14)&quot;,
      &quot;MAGIC_TOGGLE_NKRO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_NO&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;,
      &quot;KC_TRNS&quot;
    ]
  ],
  &quot;encoders&quot;: []
}

</code></pre>
]]></description>
    <pubDate>Thu, 20 Feb 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>E-ink bookmarks</title>
<link>https://xenodium.com/e-ink-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/e-ink-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://giuliomagnifico.blog/post/2024-09-13-cpiartframe/">cPiArtFrame</a>.</li>
<li><a href="https://www.reddit.com/r/eink/s/g6IMhIzWO9">DIY E-Ink clock update with more faces, github repo &amp; full youtube tutorial</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=40607889">Show HN: E-Paper 7-color display showing the current weather | Hacker News</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sourdough bookmarks</title>
<link>https://xenodium.com/sourdough-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sourdough-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.reddit.com/r/Sourdough/comments/1ig9nnu/handy_little_guide">Reading crumbs structure: fermentation</a>.</li>
<li><a href="https://www.reddit.com/r/Sourdough/comments/1i9uhyr/todays_loaf_and_some_advice_after_making_100/">Todays loaf and some advice after making 100+ loaves over 6 years</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cardamom Buns recipe</title>
<link>https://xenodium.com/cardamom-buns-a-yak-shaving-story-plus-recipe</link>
<guid isPermaLink="false">https://xenodium.com/cardamom-buns-a-yak-shaving-story-plus-recipe</guid>
    <description><![CDATA[<h2>Buns</h2>
<ul>
<li>150 ml milk</li>
<li>2 tsp instant yeast (2.25 tsp active-dry yeast, 17.5g fresh yeast)</li>
<li>1 large egg</li>
<li>1 egg yolk</li>
<li>50 grams sugar</li>
<li>1/2 tsp vanilla extract</li>
<li>1/2 tsp ground cardamom</li>
<li>1/2 tsp salt</li>
<li>375 grams all-purpose or bread flour</li>
<li>57 grams unsalted butter, softened</li>
</ul>
<h2>Filling</h2>
<ul>
<li>71 grams unsalted butter, softened</li>
<li>65 grams brown sugar</li>
<li>1.5 tsp ground cardamom</li>
<li>Pinch of salt</li>
</ul>
]]></description>
    <pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A tour of Ready Player Mode</title>
<link>https://xenodium.com/a-tour-of-ready-player-mode</link>
<guid isPermaLink="false">https://xenodium.com/a-tour-of-ready-player-mode</guid>
    <description><![CDATA[<p><a href="https://github.com/xenodium/ready-player">Ready Player Mode</a>, which began as a <a href="https://www.reddit.com/r/emacs/comments/1dtnjy7/is_there_imageview_but_for_audio/">tiny media-viewing experiment</a>, has now become my daily music player.</p>
<p>Along the way, I moved from regular daily streaming to buying and playing music offline, relying on the odd streaming service exclusively for discovery. This setup's been working great so far. I get unrestricted playback (for life) with the occasional discovery session whenever I see fit.</p>
<h2>Setup</h2>
<p><code>Ready Player Mode</code> runs in Emacs. You install it, enable its minor mode (for media recognition), and you're ready to go.</p>
<pre><code class="language-{.commonlisp">(use-package ready-player
  :ensure t
  :config
  (ready-player-mode +1))
</code></pre>
<p><code>Ready Player Mode</code> will try to use either <a href="https://mpv.io/">mpv</a>, <a href="https://www.videolan.org/vlc/">vlc</a>, <a href="https://ffmpeg.org/ffplay.html">ffplay</a>, or <a href="https://en.wikipedia.org/wiki/MPlayer">mplayer</a> (in that order) to play media, but mpv works best.</p>
<h2>Ready to go</h2>
<p>Post setup, you can open media files like any other text file and Emacs will just play it for you. Say, open a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> buffer, navigate to a file, and open as usual.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/open-file.gif" alt=""></p>
<h2>Buttons vs key bindings</h2>
<p>If buttons are your cup of tea, use <code>tab</code> or <code>backtab</code> to navigate around.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/buttons.gif" alt=""></p>
<p>Alternatively, single-key bindings are available. You can find them all in the transient help menu, via the <code>?</code> binding.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/transient.png" alt=""></p>
<h2>Global key bindings</h2>
<p>Global key bindings are available, so you can interact with the player without switching buffers.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/global.png" alt=""></p>
<p>Global bindings are under the <code>C-c m</code> prefix.</p>
<hr>
<p>C-c m SPC   Toggle play/stop of media.
C-c m r     Cycle through repeat settings: file, directory, off.
C-c m m     Toggle switching between player buffer and previous buffer.
C-c m s     Toggle shuffle setting.
C-c m a     Toggle autoplay setting.
C-c m n     Open the next media file in the same directory.
C-c m c     Open my media collection.
C-c m i     Show playback info in the echo area.
C-c m p     Open the previous media file in the same directory.
C-c m /     Search the `dired' playlist for playback (experimental).</p>
<hr>
<p>If you prefer to use other bindings, disable default ones with:</p>
<pre><code class="language-{.commonlisp">(setq ready-player-set-global-bindings nil)
</code></pre>
<h2>Open externally</h2>
<p>You can always open the currently played file externally, using your system default player. This is bound to the <code>e</code> key.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/external.png" alt=""></p>
<h2>Repeat, shuffle, and autoplay</h2>
<p>Repeat, shuffle, and autoplay should do what you'd expect and can be toggled via <code>r</code> <code>s</code> and <code>a</code> keys.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/repeat-shuffle-autoplay.gif" alt=""></p>
<h2>Play current directory</h2>
<p>By default, <code>Ready Player</code> will continue playing other media found in the current directory. Use <code>n</code> and <code>p</code> bindings to move through different tracks.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/next.gif" alt=""></p>
<h2>Seek</h2>
<p><code>Ready Player</code> works best with <a href="https://mpv.io/">mpv</a> player. If you have it installed, you can seek through tracks.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/seek.gif" alt=""></p>
<h2>Play your collection</h2>
<p><code>Ready Player</code> can remember your music collection, but needs a tiny addition to the existing setup via the <code>ready-player-my-media-collection-location</code> variable.</p>
<pre><code class="language-{.commonlisp">(use-package ready-player
  :custom
  (ready-player-my-media-collection-location &quot;~/path/to/your/music/collection&quot;)
  :config
  (ready-player-mode +1))
</code></pre>
<p>Your music collection is now available via the home button.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/home.png" alt=""></p>
<h2>Index + search</h2>
<p>Your music collection is automatically indexed. Same for the currently played directory, so you can search for tracks.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/magnifying.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/search.png" alt=""></p>
<h2>Bookmarking</h2>
<p>This is a new feature inspired by <a href="https://functional.cafe/@tristanC/113896948267754737">tristanC's use</a> of <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Bookmarks.html">Emacs bookmarks</a> with <code>Ready Player.</code> Bookmarks are now displayed and toggled from the player interface.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/bookmark.gif" alt=""></p>
<p>Bookmarks are searchable too.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/search-bookmark.png" alt=""></p>
<h2>Download album cover</h2>
<p>Missing album cover? Download it via <code>M-x ready-player-download-album-artwork</code>.</p>
<p><img src="https://xenodium.github.io/images/a-tour-of-ready-player-mode/artwork.gif" alt=""></p>
<h2>Embracing <code>dired</code></h2>
<p>I mentioned playing media from current directory or your music collection, but <code>Ready Player</code> is really just playing media from a <code>dired</code> buffer. If you can craft a <code>dired</code> buffer, <code>Ready Player</code> <a href="https://lmno.lol/alvaro/the-dired-abstraction">should be able to play it</a>. Think <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired-and-Find.html">find-dired</a>.</p>
<h2>Advanced features</h2>
<p><code>Ready Player</code> should be umm… ready to play with little configuration. If you want further customizations, check out its <a href="https://github.com/xenodium/ready-player?tab=readme-ov-file#all-customizations">documentation</a>.</p>
<p>Enjoy your unrestricted music offline, now and forever!</p>
<p>✨<a href="https://github.com/sponsors/xenodium">sponsor</a>✨ this project.</p>
]]></description>
    <pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A platform that moulds to your needs</title>
<link>https://xenodium.com/a-platform-that-moulds-to-your-needs</link>
<guid isPermaLink="false">https://xenodium.com/a-platform-that-moulds-to-your-needs</guid>
    <description><![CDATA[<p>Emacs users may be known for bringing in all sorts of diverse workflows into their beloved text editor. From the outside, I get how odd this may seem. We often treat our text editor as a platform of sorts to do our email, web browsing, calendars, project management, chat… the list goes on.</p>
<p>Take email, as an example. Back in 2018 I thought &quot;<a href="https://lmno.lol/alvaro/trying-out-mu4e-and-offlineimap">managing email from Emacs… surely that's crazy-talk</a>&quot;, yet I gave it a try just in case. 7 years later and I never looked back. I still use the excellent <a href="https://djcbsoftware.nl/code/mu/mu4e.html">mu4e</a> client.</p>
<p>As you become more accustomed to Emacs, you may find yourself wishing you could navigate other tasks just as efficiently. But this doesn't happen right away. The editor starts moulding to your needs, initially as you copy others's code/configurations, but this can only take you so far. Emacs truly does mould to your own needs, once you start learning a little <a href="https://www.gnu.org/software/emacs/manual/elisp.html">elisp</a>.</p>
<p>When comparing <code>elisp</code> to modern languages, one may be tempted to dismiss it as a niche language from another era. While both of those things may be true, its moulding and glueing capabilities remain just as relevant and powerful today, even in the <a href="https://en.wikipedia.org/wiki/Large_language_model">LLM</a> era.</p>
<p>Take a random workflow like extracting vocabulary from a Japanese class paper handout. While it may seem far-fetched for Emacs to handle this, it's actually fairly straightforward with a little elisp glue. Often, this consists of finding some crucial utilities and glueing them up.</p>
<p><img src="https://xenodium.github.io/images/a-platform-that-moulds-to-your-needs/lookup.gif" alt=""></p>
<h2>Take a screenshot</h2>
<p>I'm mostly on macOS, so I can use the built-in <a href="https://support.apple.com/en-us/102646">screencapture</a> utility to capture the screen and save to a file.</p>
<pre><code class="language-{.commonlisp">(call-process &quot;/usr/sbin/screencapture&quot; nil nil nil &quot;-i&quot; &quot;path/to/screenshot.png&quot;)
</code></pre>
<h2>Get an LLM to OCR things for ya</h2>
<p>These days, there are no shortages of neither large language models nor Emacs clients. I built one: <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>, so I feed the screenshot to <code>chatgpt-shell-lookup</code>, giving it a prompt like:</p>
<pre><code class="language-org">1. Fill out an org mode table using this format as an example:

|----------+----------+-------+--------+---------+------|
| Hiragana | Katakana | Kanji | Romaji | English | Tags |
|----------+----------+-------+--------+---------+------|
|          |          |       |        |         |      |
|----------+----------+-------+--------+---------+------|

2. Fill out Hiragana or Katakana when appropriate. Never both.
3. Fill out Kanji when appropriate.
4. Show long romaji vowels (i.e. ō).
5. DO NOT use Markdown source blocks.
6. DO NOT add any text or explanations outside the org table.
</code></pre>
<p>Be sure to always check LLM output ;)</p>
<h2>Let org do its thing</h2>
<p>Since I requested <a href="https://orgmode.org/">org</a> markup from the LLM, I can use <code>org-mode</code> to navigate cells and tweak data as needed. The output I get looks a little something like this:</p>
<pre><code class="language-org">| Hiragana               | Katakana   | Kanji                | Romaji               | English               | #Tags              |
|------------------------+------------+----------------------+----------------------+-----------------------+--------------------|
| べんきょう を します   |            | 勉強 を します       | benkyō o shimasu     | study                 | #study             |
...
| かいもの を します     |            | 買い物 を します     | kaimono o shimasu    | shop                  | #shopping          |
...
</code></pre>
<h2>Sarasa Gothic (detour)</h2>
<p>More of a side-note than anything… As a beginner Japanese learner, I quickly discovered I needed a font supporting my new rendering needs. I found <a href="https://picaq.github.io/sarasa/">Sarasa Gothic Mono</a>, a lovely font (thanks to this <a href="https://www.reddit.com/r/emacs/comments/1hgi7cj/recommendation_for_a_font_for_japanesechinese/">Reddit post</a>).</p>
<h2>More elisp glue</h2>
<p>Now that I got my Japanese vocabulary in org format, I can continue leveraging elisp to glue other things from my target workflow, like iterating over the table and generating a <a href="https://en.wikipedia.org/wiki/Tab-separated_values">tsv</a> with my new vocabulary:</p>
<pre><code class="language-{.commonlisp">(while (org-at-table-p)
  (let* ((front ...)
         (hiragana (org-table-get-field 1))
         (katakana (org-table-get-field 2))
         (kanji (org-table-get-field 3))
         (romaji (org-table-get-field 4))
         (meaning (org-table-get-field 5))
         (tags (org-table-get-field 6)))
    (with-current-buffer output-buffer
      (insert (format &quot;%s\t%s\t%s\t%s\t%s\t%s\t%s\n&quot;
                      front
                      hiragana
                      katakana
                      kanji
                      romaji
                      meaning
                      (replace-regexp-in-string &quot;#&quot; &quot;&quot; tags)))))
  (forward-line 1))
</code></pre>
<pre><code class="language-example">べんきょう を します   べんきょう を します     勉強 を します    benkyō o shimasu    study   study
...
かいもの を します    かいもの を します      買い物 を します   kaimono o shimasu   shop    shopping
...
</code></pre>
<h2>Anki</h2>
<p>So where is all this elisp glueing going? Now that I have my new vocabulary in a .tsv table, I can feed it to <a href="https://apps.ankiweb.net/">Anki</a>, the popular spaced repetition app. While there are a handful of existing <a href="https://lmno.lol/alvaro/anki-bookmarks">Anki Emacs packages</a>, converting with an elisp loop was simple enough and gave me lots of freedom on how to structure my cards.</p>
<h2>iPhone</h2>
<p>Once I got the new vocabulary imported into Anki, I can subsequently sync it over to the iPhone. In some way, you can say that a bit of elisp glue here and there facilitated the entire workflow.</p>
<p>By the way, now you know why there's a random <a href="https://github.com/xenodium/chatgpt-shell/blob/9c896feda89a2a879de807a5bd652beec7d6a3f6/chatgpt-shell.el#L1896">chatgpt-shell-japanese-lookup</a> function included in <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>.</p>
<p><img src="https://xenodium.github.io/images/a-platform-that-moulds-to-your-needs/anki.jpeg" alt=""></p>
<h2>Learn elisp</h2>
<p>While Emacs and elisp may not be the most fashionable pair, they sure fill a huge void for me. They provide a platform that can easily mould to my specific needs.</p>
<p>If you're an Emacser and have been shying away from learning elisp, do yourself a favour and get your toes dipped. You'll be glad to.</p>
<p>Soon enough, you'll enable workflows that mould exactly to the way you like things to work. In other words, they simply <a href="https://lmno.lol/alvaro/emacs-dwim-do-what-i-mean">do what ✨you✨ mean</a> ;)</p>
]]></description>
    <pubDate>Tue, 21 Jan 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Blogging minus the yucky bits of the modern web</title>
<link>https://xenodium.com/blogging-minus-the-yucky-bits-of-modern-web</link>
<guid isPermaLink="false">https://xenodium.com/blogging-minus-the-yucky-bits-of-modern-web</guid>
    <description><![CDATA[<p>Happy New Year! If you follow <a href="https://lmno.lol/alvaro">my blog</a>, you may have noticed that I've been hosting it on <a href="https://lmno.lol">lmno.lol</a> for a while now, a blogging service I built (invitation-only until now).</p>
<pre><code class="language-{=org}">#+ATTR_HTML: :width 90%
</code></pre>
<p><a href="https://lmno.lol"><img src="https://xenodium.github.io/images/blogging-minus-the-yucky-bits-of-modern-web/lmno.png" alt=""></a></p>
<h2>Why build a blogging platform</h2>
<p>There's been a resurgence in blogging of sorts. Wonderful in itself, but the popular platforms are fairly erm unfriendly to their readers.</p>
<p>These days, search results might lead you to an interesting blog post, but you're greeted with messages like:</p>
<blockquote>
<p>“The author made this story available to ^^^^^^ members only. If you’re new to ^^^^^^, create a new account to read this story on us.”</p>
</blockquote>
<p>Kinda strange for a platform to offload blame onto its users.</p>
<p>In one instance, I bit the bullet. Created an account, logged in, only to find out the specific post was reserved to paying members. “Alright,” I thought, “let’s do this.” Sadly, when I finally arrived, the content was a bit of a letdown. After all those hoops…</p>
<p>Meanwhile, both <a href="https://privacybadger.org/">Privacy Badger</a> and <a href="https://ublockorigin.com/">uBlock Origin</a> were going haywire. Great, this thing is tracking me too. At least the site is lean… I kid, of course not.</p>
<p>So that's that. Off I went to build a blogging platform to exclude the yucky bits the modern web has brought to our blogs.</p>
<h2>My blogging journey</h2>
<p>I'm what you may call an accidental blogger. Sometime ago, I started jotting notes using plain text file sprinkled with <a href="https://orgmode.org/">org markup</a>. I'd use my <a href="https://www.gnu.org/software/emacs/">text editor</a> for both writing and recall. It worked well when in front of my computer, not so much when on the move or sharing things with anyone. By that point, I decided to export my notes to HTML and post online. Over time, folks started reaching out about something read in my notes, errrm blog posts, and so by then I suppose I had become a blogger.</p>
<p>In 11 years of blogging, my approach hasn't changed much. I still write to the very same plain text file I used to write my notes to. I found this approach fairly accessible, with little ceremony. When I want to write, I open the usual text file and just write. HTML exporting consisted of hacky <a href="https://en.wikipedia.org/wiki/Emacs_Lisp">elisp</a> cobbled together over time. While the code was nothing to rave about, it did the job just fine over the years. Having said that, it was more of a &quot;it works on my machine&quot; sorta thing.</p>
<h2>Enter lmno.lol</h2>
<p><a href="https://lmno.lol">lmno.lol</a> is heavily inspired by the same workflow. You write your notes or blog posts to a single plain text file, sprinkling <a href="https://en.wikipedia.org/wiki/Markdown">Markdown</a> this time around, and just drag and drop it to the web.</p>
<p><code>lmno.lol</code> takes care of the rest.</p>
<p><img src="https://xenodium.github.io/images/blogging-minus-the-yucky-bits-of-modern-web/demo.gif" alt=""></p>
<h2>A Little blast from the past</h2>
<p>Remember <a href="https://www.asciiart.eu/">ASCII art</a>? <a href="http://www.figlet.org/">Figlet</a>? You can bring back some of that nostalgic web by adding a banner to your blog.</p>
<p><code>lmno.lol</code> enables that via text art banners. What would you add?</p>
<pre><code class="language-markdown"># blog-text-art-banner

 /$$$$$$$                            /$$
| $$__  $$                          | $$
| $$  \ $$  /$$$$$$  /$$$$$$$   /$$$$$$$  /$$$$$$   /$$$$$$
| $$$$$$$/ /$$__  $$| $$__  $$ /$$__  $$ /$$__  $$ /$$__  $$
| $$__  $$| $$$$$$$$| $$  \ $$| $$  | $$| $$$$$$$$| $$  \__/
| $$  \ $$| $$_____/| $$  | $$| $$  | $$| $$_____/| $$
| $$  | $$|  $$$$$$$| $$  | $$|  $$$$$$$|  $$$$$$$| $$
|__/  |__/ \_______/|__/  |__/ \_______/ \_______/|__/
</code></pre>
<h2>Read anywhere</h2>
<p>Needless to say, this platform has no tracking, ads, or paywalls. It also tries to stay away from bloat and uses JavaScript for optional features only. If you're wondering, all blogs include <a href="https://en.wikipedia.org/wiki/RSS">RSS FEEDS</a> with full content.</p>
<p>Blogs render wonderfully pretty much anywhere.</p>
<p><img src="https://xenodium.github.io/images/blogging-minus-the-yucky-bits-of-modern-web/anywhere.gif" alt=""></p>
<h2>Help sustain a better web</h2>
<p>We have plenty of <a href="https://lmno.lol/blog/feature-requests">features we’d like to add</a>. We host blogs for a small fee ($1.50 per month). This fee helps us cover hosting expenses, maintain and develop features, and keep the platform running smoothly. That’s the entirety of our transaction—no ads, no tracking, no selling of user data.</p>
<p>There are no paywalls here. You can read fully and freely. However, please consider becoming a paying customer, even if you don’t plan to blog yourself. Your support ensures the platform remains sustainable and independent.</p>
<p>As a paying customer, you’ll also get to reserve your own blog handle. By doing so, you not only support the platform but also promote an inclusive internet experience that is fast, smooth, and free of constant tracking, intrusive advertising, paywalls, and data collection.</p>
<p>By supporting services like <code>lmno.lol</code>, you prove like-minded services are not only possible but fully sustainable without deceitful tech.</p>
<p>I hope you like <a href="https://lmno.lol">lmno.lol</a>. Happy blogging!</p>
]]></description>
    <pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>symbol-overlay-mc now on MELPA</title>
<link>https://xenodium.com/symbol-overlay-mc-now-on-melpa</link>
<guid isPermaLink="false">https://xenodium.com/symbol-overlay-mc-now-on-melpa</guid>
    <description><![CDATA[<p>Some time ago, I wrote about <a href="https://xenodium.com/its-all-up-for-grabs-and-it-compounds/">adding multiple cursor support to symbol-overlay</a> by gluing the two packages together. If you're keen to learn how to bend Emacs to your way, have a look at that post.</p>
<p><img src="https://xenodium.github.io/images/its-all-up-for-grabs-and-it-compounds/symbol-overlay-meets-multiple-cursors.gif" alt=""></p>
<p>Later on, in a &quot;Multiple cursors - how and why?&quot; <a href="https://www.reddit.com/r/emacs/comments/1h321x2/multiple_cursors_how_and_why">Reddit post</a>, I showcased the overlay usage. <a href="https://www.mavit.org.uk">Peter Oliver</a> asked <a href="https://www.reddit.com/r/emacs/comments/1h321x2/comment/m06x676/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">if the package could be submitted to MELPA</a>. To my delight, he also volunteered to <a href="https://github.com/melpa/melpa/pull/9267">take on the submission</a>.</p>
<p>Unfortunately, I had failed to check back on the MELPA submission until today. I'm happy to report that, thanks to Peter, <code>symbol-overlay-mc</code> <a href="https://melpa.org/#/symbol-overlay-mc">is now on MELPA</a>.</p>
<p>Happy symbol-overlay-multiple-cursors editing! ;)</p>
]]></description>
    <pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hello emacs.tv</title>
<link>https://xenodium.com/hello-emacstv</link>
<guid isPermaLink="false">https://xenodium.com/hello-emacstv</guid>
    <description><![CDATA[<p>A few days ago, <a href="https://sachachua.com/blog/">Sacha Chua</a> mentioned how <a href="https://social.sachachua.com/@sacha/statuses/01JF94JQQNNRXMTKN3Y1774TFP">cool it would be to have an Emacs video index</a> like <a href="https://www.rubyvideo.dev/topics">Ruby Video</a>. I mentioned how I had similarly considered a low-tech solution, maybe powered by plain text (bonus points for <a href="https://orgmode.org/">org mode</a> of course).</p>
<p>A little later, Sacha <a href="https://social.sachachua.com/@sacha/statuses/01JFG5T3C6E88362DRDZN9ANA6">shared a preliminary video feed dump</a>, in org! With that, I wrote the <a href="https://indieweb.social/@xenodium/113682069315989397">first experiment to render the org feed</a> and <a href="https://emacs.tv/">emacs.tv</a> was born.</p>
<p><img src="https://xenodium.github.io/images/hello-emacstv/screenshot.png" alt=""></p>
<p><a href="https://emacs.tv/">emacs.tv</a> is merely a few days old. Powered by an org feed (rendered client-side), but we can fetch and render in all sorts of ways. <a href="https://emacs.tv/">emacs.tv</a> brings it to the web, though I'm sure we can come up with all sorts of Emacs integrations. A new major mode? Or maybe convert the org feed to rss and plug into <a href="https://github.com/skeeto/elfeed">elfeed</a>?</p>
<p>This is what a feed entry looks like:</p>
<pre><code class="language-org">* EmacsConf.org: How we use Org Mode and TRAMP to organize and run a multi-track conference :emacsconf:emacsconf2023:org:tramp:
:PROPERTIES:
:DATE: 2023-12-03
:URL: https://emacsconf.org/2023/talks/emacsconf
:MEDIA_URL: https://media.emacsconf.org/2023/emacsconf-2023-emacsconf--emacsconforg-how-we-use-org-mode-and-tramp-to-organize-and-run-a-multitrack-conference--sacha-chua--main.webm
:YOUTUBE_URL: https://www.youtube.com/watch?v=uTregv3rNl0
:TOOBNIX_URL: https://toobnix.org/w/eX2dXG3xMtUHuuBz4fssGT
:TRANSCRIPT_URL: https://media.emacsconf.org/2023/emacsconf-2023-emacsconf--emacsconforg-how-we-use-org-mode-and-tramp-to-organize-and-run-a-multitrack-conference--sacha-chua--main.vtt
:SPEAKERS: Sacha Chua
:SERIES: EmacsConf 2023
:END:
</code></pre>
<h2>We need your help</h2>
<p>As mentioned, this is a new project. It's a good start, but it can only get better with your help.</p>
<h3>Submit more content</h3>
<p>Sacha kickstarted a <a href="https://raw.githubusercontent.com/emacstv/emacstv.github.io/refs/heads/main/videos.org">wonderful video feed,</a> a collection of 1715 videos as of today. We need more. Are your published videos missing? Reckon other videos should be listed? Please help by <a href="https://github.com/emacstv/emacstv.github.io#add-videos">submitting</a> new entries.</p>
<h3>Improve our tagging</h3>
<p>Many of the listed videos could use more tags. Please help us by tagging content in <a href="https://raw.githubusercontent.com/emacstv/emacstv.github.io/refs/heads/main/videos.org">video.org</a> and submit a <a href="https://github.com/emacstv/emacstv.github.io/pulls">pull request</a>.</p>
<h3>Take it for a spin</h3>
<p>Or maybe just take <a href="https://emacs.tv/">emacs.tv</a> for a spin and <a href="https://github.com/emacstv/emacstv.github.io/issues">give us some feedback</a>.</p>
<p>Happy holidays! 🎄☃️</p>
]]></description>
    <pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>An experimental (e)shell pager</title>
<link>https://xenodium.com/an-experimental-e-shell-pager</link>
<guid isPermaLink="false">https://xenodium.com/an-experimental-e-shell-pager</guid>
    <description><![CDATA[<p>These days, my LLM interactions primarily take place via <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>'s compose UX. I've grown fond of this hybrid style of interaction. On sharing the <a href="https://bsky.app/profile/xenodium.bsky.social/post/3lco3ggkk4c2r">latest incarnation</a>, <a href="https://bsky.app/profile/jllw.bsky.social">jllw</a> asked about the possibility to <a href="https://bsky.app/profile/jllw.bsky.social/post/3lcpb6ygkws2v">port to comint shells</a>.</p>
<p>With <a href="https://bsky.app/profile/jllw.bsky.social">jllw</a>'s great idea in mind, I set out to prototype an <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a> pager, my preferred shell.</p>
<p>The initial results ain't too shabby:</p>
<p><img src="https://xenodium.github.io/images/an-experimental-e-shell-pager/shell-pager.gif" alt=""></p>
<p>While you can easily flip through all <code>eshell</code> commands and outputs (via single-character n/p bindings), you can also compose and fire off new commands using a magit-style approach. That is, craft your desired command and C-c C-c to send it off.</p>
<p>The prototype is currently focused on <code>eshell</code>, but it can be easily ported to <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Mode.html">comint</a> and other shells by writing new <code>shell-maker</code> configs:</p>
<pre><code class="language-{.commonlisp">(shell-pager--make-config
 :shell-buffer buffer
 :page-buffer (shell-pager--buffer)
 :next #'shell-pager--eshell-next
 :previous #'shell-pager--eshell-previous
 :current #'shell-pager--eshell-current-item
 :subscribe #'shell-pager--eshell-subscribe
 :unsubscribe #'shell-pager--eshell-unsubscribe
 :submit #'shell-pager--eshell-submit
 :interrupt #'shell-pager--eshell-interrupt)
</code></pre>
<p><code>shell-pager</code>'s super <a href="https://github.com/xenodium/shell-pager">rough/experimental code is now on GitHub</a>.</p>
<p>It's been a fun experiment so far. Time will tell, whether or not <code>shell-pager</code> can replace most of my <code>eshell</code> interactions. The good news is that this isn't an all or nothing sorta thing. <code>shell-pager</code> complements <code>eshell</code>, so I can always jump back to eshell itself and continue with the very same shell history.</p>
]]></description>
    <pubDate>Mon, 09 Dec 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>LLM chat navigation</title>
<link>https://xenodium.com/llm-chat-navigation</link>
<guid isPermaLink="false">https://xenodium.com/llm-chat-navigation</guid>
    <description><![CDATA[<p>LLM chats are often handy for refining answers to a question or task, part of a bigger goal. Navigating the chat transcript, copying and pasting, can be a frequent operation in the bigger goal. If we can do it more efficiently, the better.</p>
<p>While <a href="https://github.com/xenodium/chatgpt-shell/issues">chatgpt-shell</a> offered <code>chatgpt-shell-next-item</code> and <code>chatgpt-shell-previous-item</code> commands, it had a few rough edges which prevented me from fully adopting. The default bindings <code>C-c C-n</code> and <code>C-c C-p</code> didn't exactly help either, making repeated navigation fairly clunky. <a href="https://karthinks.com/software/it-bears-repeating/">repeat-mode</a> would have helped a little, yet I was yearning for a familiar experience… more like <code>tab</code> and <code>Shift-tab</code> in web browsers.</p>
<p>While shells often <code>tab</code>-complete commands and/or arguments, I'm not super convinced <code>tab</code> completion is a good candidate for an LLM Emacs shell. Having said that, searching for previous prompts a la <code>Ctr-r</code> is indeed a handy feature and already supported in <a href="https://github.com/xenodium/chatgpt-shell/issues">chatgpt-shell</a> (via <code>M-r</code>).</p>
<p>This is all to say that the with the latest <code>chatgpt-shell</code> navigation changes (using <code>&lt;tab&gt;</code> and <code>&lt;backtab&gt;</code> bindings), the <code>chatgpt-shell</code> experience feels way more natural. You can see it in action…</p>
<p><img src="https://xenodium.github.io/images/llm-chat-navigation/shell.gif" alt=""></p>
<p>Tab navigation jumps between prompts, links, and code blocks. You may have noticed code blocks are automatically selected, in case you want to quickly copy and paste elsewhere.</p>
<p>This mode of navigation is also present in the <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-multi-model#a-shell-hybrid">compose UX</a> (via M-x <code>chatgpt-shell-prompt-compose</code>). In addition to <code>&lt;tab&gt;</code> and <code>&lt;backtab&gt;</code>, you can use <code>n</code> and <code>p</code> bindings (post prompt submission).</p>
<p><img src="https://xenodium.github.io/images/llm-chat-navigation/compose-tab.gif" alt=""></p>
<p>Give the new navigation a try. See how it feels. Some of it is fairly fresh, so <a href="https://github.com/xenodium/chatgpt-shell/issues/new">please file bugs if needed</a>.</p>
]]></description>
    <pubDate>Thu, 05 Dec 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Awesome elisp</title>
<link>https://xenodium.com/awesome-elisp</link>
<guid isPermaLink="false">https://xenodium.com/awesome-elisp</guid>
    <description><![CDATA[<p>A few days ago, redditor <a href="https://www.reddit.com/user/gollyned">gollyned</a> asked about <a href="https://www.reddit.com/r/emacs/comments/1h4eos1/best_practices_developing_on_top_of_modern_elisp/">best practices: developing on top of modern elisp packages</a>. It reminded of my <a href="https://lmno.lol/alvaro/modern-elisp-libraries">modern Emacs lisp libraries</a> post, which I shared with them.</p>
<p>While my post is roughly 4.5 years old, these days I continue to reach out to the likes of <a href="https://nicolas.petton.fr/ressources/emacsconf2015/">seq.el</a>, <a href="https://nicolas.petton.fr/ressources/emacsconf2015/">map.el</a>, <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/subr-x.el">subr-x.el</a> and <a href="https://endlessparentheses.com/new-on-elpa-and-in-emacs-25-1-let-alist.html">let-alist.el</a> on a regular basis. My post also <a href="https://lmno.lol/alvaro/modern-elisp-libraries">shared some great third party options</a>. Maybe my post could use an update? Happy to take suggestions.</p>
<p>A few days later, I ran into <a href="https://github.com/p3r7/awesome-elisp">awesome-elisp</a>, which aggregates a ton of resources to check out. Funnily enough, <a href="https://lmno.lol/alvaro/emacs-lisp-bookmarks">I had bookmarked it a long while ago</a> and simply forgot about it. On a somewhat related note, when I reviewed my old list of bookmarks, I didn't have Yoo Box's <a href="https://yoo2080.wordpress.com/2014/07/04/it-is-not-hard-to-read-lisp-code/">it is not hard to read Lisp code</a> bookmarked, which changed the way I viewed and read elisp code (spoiler alert, as a tree). I remember how well this approach also translated to languages like Objective-C, enabling me to inline more things without worrying too much.</p>
<p>In any case, the <a href="https://www.reddit.com/r/emacs/comments/1h4eos1/best_practices_developing_on_top_of_modern_elisp/">reddit post</a> was another reminder for me to go and check out some of those bookmarks I never got to read, including the <a href="https://github.com/p3r7/awesome-elisp">awesome-elisp</a> one.</p>
]]></description>
    <pubDate>Wed, 04 Dec 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>ob-chatgpt-shell goes multi-model too</title>
<link>https://xenodium.com/ob-chatgpt-shell-goes-multi-model-too</link>
<guid isPermaLink="false">https://xenodium.com/ob-chatgpt-shell-goes-multi-model-too</guid>
    <description><![CDATA[<p>A week ago, I announced <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-multi-model">chatgpt-shell going multi-model</a>. What I failed to mention is that because <a href="https://github.com/xenodium/ob-chatgpt-shell">ob-chatgpt-shell</a> (its <a href="https://orgmode.org/worg/org-contrib/babel/intro.html">org babel</a> Emacs cousin) relies on <code>chatgpt-shell</code>, this <code>babel</code> package has now gone multi-model also.</p>
<p><img src="https://xenodium.github.io/images/ob-chatgpt-shell-goes-multi-model-too/babel-multi-model.gif" alt=""></p>
<p><code>ob-chatgpt-shell</code> follows the familiar babel form. To swap models, use the existing <code>:version</code> param as follows.</p>
<pre><code class="language-org">#+begin_src chatgpt-shell :results output :version gpt-4o
  Who built you?
#+end_src

#+RESULTS:
: I was developed by OpenAI, a research organization focused on creating and promoting friendly AI for the benefit of all humanity.

#+begin_src chatgpt-shell :results output :version claude-3-5-sonnet-20240620
  Who built you?
#+end_src

#+RESULTS:
: I was created by Anthropic.

#+begin_src chatgpt-shell :results output :version qwen2.5-coder
  Who built you?
#+end_src

#+RESULTS:
: I was built by Alibaba Cloud. How can I assist you today?

#+begin_src chatgpt-shell :results output :version gemini-1.5-pro-latest
  Who built you?
#+end_src

#+RESULTS:
: I was built by Google.  More specifically, I'm a large language model, trained by Google.
</code></pre>
<p>Keep in mind that <code>:version</code> depends on <code>chatgpt-shell-models</code> to resolve its models. You may need to add other models. If you add new ones, consider contributing a <a href="https://github.com/xenodium/chatgpt-shell/pulls">pull request</a>, so we all benefit from the addition.</p>
<h2>Should <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-multi-model#should-chatgpt-shell-rename%3F">ob-chatgpt-shell</a> rename?</h2>
<p>See <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-multi-model#should-chatgpt-shell-rename%3F">this</a>.</p>
<h2>Please report issues</h2>
<p>In addition to being a fairly new feature, <code>chatgpt-shell</code> multi-model support required quite a few structural changes. We may still need additional polishing follow-ups. If you encounter any issues <a href="https://github.com/xenodium/ob-chatgpt-shell/issues/new">please report them</a>.</p>
<h2>Make this project sustainable</h2>
<p>Maintaining, experimenting, implementing feature requests, and supporting open-source packages takes work. Today, chatgpt-shell has roughly <a href="https://melpa.org/#/chatgpt-shell">21.5K downloads on MELPA</a> and many untracked elsewhere. If you're one of the happy users, <a href="https://github.com/sponsors/xenodium">consider sponsoring the project</a>. If you see potential, help <a href="https://github.com/sponsors/xenodium">fuel development by sponsoring</a> too.</p>
<p>Perhaps you enjoy some of the content I write about? Find my Emacs posts/tips useful?</p>
<ul>
<li><a href="https://xenodium.com/">Blog (xenodium.com)</a> (Web)</li>
<li><a href="https://lmno.lol/alvaro">Blog (lmno.lol/alvaro)</a> (Web)</li>
</ul>
<p>Alternatively, you want a blogging platform that skips the yucky side effects of the modern web?</p>
<ul>
<li>I'm building <a href="https://lmno.lol">lmno.lol</a> (my blog is <a href="https://lmno.lol/alvaro">there</a>).</li>
</ul>
<p>Maybe you enjoy one of my other projects?</p>
<ul>
<li><a href="https://plainorg.com">Plain Org</a> (org mode / iOS)</li>
<li><a href="https://flathabits.com">Flat Habits</a> (org mode / iOS)</li>
<li><a href="https://apps.apple.com/us/app/scratch/id1671420139">Scratch</a> (org mode / iOS)</li>
<li><a href="https://github.com/xenodium/macosrec">macosrec</a> (macOS)</li>
<li><a href="https://apps.apple.com/us/app/fresh-eyes/id6480411697?mt=12">Fresh Eyes</a> (macOS)</li>
<li><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/company-org-block">company-org-block</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/org-block-capf">org-block-capf</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/ready-player">ready-player</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/sqlite-mode-extras">sqlite-mode-extras</a></li>
<li><a href="https://github.com/xenodium/ob-chatgpt-shell">ob-chatgpt-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/dall-e-shell">dall-e-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/ob-dall-e-shell">ob-dall-e-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/shell-maker">shell-maker</a> (Emacs)</li>
</ul>
<p>So, umm… I'll just leave my GitHub sponsor page <a href="https://github.com/sponsors/xenodium">here</a>.</p>
]]></description>
    <pubDate>Wed, 27 Nov 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>LLM iterate and insert</title>
<link>https://xenodium.com/llm-iterate-and-insert</link>
<guid isPermaLink="false">https://xenodium.com/llm-iterate-and-insert</guid>
    <description><![CDATA[<p><a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> includes a couple of mechanisms to operate on an Emacs buffer region. That is, select a region and ask the <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-multi-model">LLM robots</a> to modify it for us. Until now, both of these mechanisms didn't quite close the loop. They could either modify current region or iterate on a separate solution, but never both.</p>
<h2>M-x chatgpt-shell-quick-insert</h2>
<p>While <code>chatgpt-shell</code>'s quick insert mechanism already enabled selecting a region and requesting changes, it was more of a &quot;I'm feeling lucky&quot; situation. If the changes didn't pan out, you'd have to discard the suggestion and start over.</p>
<p>With the latest changes, in addition to accepting or discarding (y/n bindings) suggestions, we can now iterate using the <code>i</code> binding.</p>
<p><img src="http://localhost:8787/alvaro/llm-iterate-and-insert/quick-insert-iterate.gif" alt="" title="1"></p>
<h2>M-x chatgpt-shell-prompt-compose</h2>
<p>While quick insertions rely on minibuffer input, <code>chatgpt-shell-prompt-compose</code> opens a dedicated buffer for a more thorough interactions. Select a region, invoke <code>chatgpt-shell-prompt-compose</code> (my preferred binding being <code>C-c C-e</code>), and a new compose buffer is created with the region text. Add your instructions and submit with <code>C-c C-c</code>. Post submission, the compose buffer becomes read-only and single-character key-bindings take over. For example: <code>r</code> replies (for further iteration) and <code>n/p</code> (or <code>TAB/shift-TAB</code>) navigation. There are <a href="https://github.com/xenodium/chatgpt-shell?tab=readme-ov-file#a-shell-hybrid">more bindings</a>.</p>
<p>Until now, we could easily craft more involved queries and continue iterating from the compose buffer, but integrating suggested changes was a manual process. That is, navigate to a code block, select, copy it and then paste it elsewhere.</p>
<p>With the latest changes, pressing <code>i</code> (insert) while on a code block will attempt to insert it wherever the initial interaction took place.</p>
<p><img src="http://localhost:8787/alvaro/llm-iterate-and-insert/compose-insert-iterate.gif" alt="" title="1"></p>
<p>Both of these changes show now be available on MELPA. While I demoed ChatGPT, the two mechanism should now work with any of the supported models (ChatGPT, Claude, Gemini, and Ollama).</p>
]]></description>
    <pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Toggle macOS menu bar from you know where</title>
<link>https://xenodium.com/toggle-macos-menu-bar-from-you-know-where</link>
<guid isPermaLink="false">https://xenodium.com/toggle-macos-menu-bar-from-you-know-where</guid>
    <description><![CDATA[<p>I'm a fan of macOS's auto-hide menu bar setting. Unless I'm reaching out to a menu item, I don't typically need to have a visible menu bar, so I set auto-hide to &quot;Always&quot;.</p>
<p><img src="https://xenodium.github.io/images/toggle-macos-menu-bar-from-you-know-where/control-center.png" alt=""></p>
<p>On rare occasions, I turn this setting off (say <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-offline">for a screen grab</a>). While reaching out to macOS Control Center is OK, I wanted to quickly toggle it from the comfort of Emacs via <code>M-x</code> fuzzy search.</p>
<p>We can leverage AppleScript to toggle the setting on and off. In the past, I would write shell scripts for this kinda thing and invoke from the command line. These days, I dump them into a <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> and quickly forget about its implementation. From then on, I just M-x and fuzzy search for some magical incantation (I'm looking at you ffmpeg). I got <a href="https://github.com/xenodium/dwim-shell-command?tab=readme-ov-file#my-toolbox">a bunch of these things</a>…</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-macos-toggle-menu-bar-autohide ()
  &quot;Toggle macOS menu bar auto-hide.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Toggle menu bar auto-hide.&quot;
   &quot;current_status=$(osascript -e 'tell application \&quot;System Events\&quot; to get autohide menu bar of dock preferences')

if [ \&quot;$current_status\&quot; = \&quot;true\&quot; ]; then
    osascript -e 'tell application \&quot;System Events\&quot; to set autohide menu bar of dock preferences to false'
    echo \&quot;Auto-hide disabled.\&quot;
else
    osascript -e 'tell application \&quot;System Events\&quot; to set autohide menu bar of dock preferences to true'
    echo \&quot;Auto-hide enabled.\&quot;
fi&quot;
   :utils &quot;osascript&quot;
   :silent-success t))
</code></pre>
<p>…and that's all there is to it.</p>
<p><img src="https://xenodium.github.io/images/toggle-macos-menu-bar-from-you-know-where/autohide.webp" alt=""></p>
]]></description>
    <pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>chatgpt-shell goes offline</title>
<link>https://xenodium.com/chatgpt-shell-goes-offline</link>
<guid isPermaLink="false">https://xenodium.com/chatgpt-shell-goes-offline</guid>
    <description><![CDATA[<p>Since <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-multi-model">chatgpt-shell going multi-model</a>, it was only a matter of time until we added support for local/offline models. As of version 2.0.6, <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> has a basic <a href="https://ollama.com/">Ollama</a> implementation (llama3.2 for now).</p>
<p><code>chatgpt-shell</code> is more than a shell. Check out the <a href="https://lmno.lol/alvaro/chatgpt-shell-goes-multi-model">demos in the previous post</a>.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-goes-offline/who-offline.gif" alt=""></p>
<p>For anyone keen on keeping all their LLM interactions offline, Ollama seems like a great option. I'm an Ollama noobie myself and already looking forward to getting acquainted. Having an offline LLM available at my Emacs fingertips will be super convenient.</p>
<p>For the more familiar with Ollama, please give the <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> integration a try (it's on <a href="https://melpa.org/#/chatgpt-shell">MELPA</a>).</p>
<p>v2.0.6 has a basic/inital Ollama implementation. Please give it a good run and <a href="https://github.com/xenodium/chatgpt-shell/issues/new">report bugs</a>.</p>
<p>You can swap models via:</p>
<pre><code>M-x chatgpt-shell-swap-model
</code></pre>
<p>Help make this project sustainable. <a href="https://github.com/sponsors/xenodium">Sponsor the work</a>.</p>
]]></description>
    <pubDate>Thu, 21 Nov 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>chatgpt-shell goes multi-model</title>
<link>https://xenodium.com/chatgpt-shell-goes-multi-model</link>
<guid isPermaLink="false">https://xenodium.com/chatgpt-shell-goes-multi-model</guid>
    <description><![CDATA[<p>Over the last few months, I've been chipping at implementing <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>'s most requested and biggest feature: multi-model support. Today, I get to unveil the first two implementations: <a href="https://www.anthropic.com/claude">Anthropic's Claude</a> and <a href="https://gemini.google.com/">Google's Gemini</a>.</p>
<img src="https://raw.githubusercontent.com/xenodium/chatgpt-shell/main/demos/multi-model-shell.gif" width="99%" />
<h2>Changing course</h2>
<p>In the past, I envisioned a different path for multi-model support. By isolating shell logic into a new package (<a href="https://github.com/xenodium/shell-maker">shell-maker</a>), folks could use it as a <a href="https://lmno.lol/alvaro/a-shell-maker">building block to create new shells</a> (adding support for their favourite LLM).</p>
<p>While each shell-maker-based shell currently shares a basic common experience, I did not foresee the minor differences affecting the general Emacs user experience. Learning the quirks of each new shell felt like unnecessary friction in developing muscle memory. I also became dependent on <code>chatgpt-shell</code> features, which I often missed when using other shells.</p>
<p>Along with slightly different shell experiences, we currently require multiple package installations (and setups). Depending on which camp you're on (batteries included vs fine-grained control) this may or may not be a downside.</p>
<p>With every new <code>chatgpt-shell</code> feature I showcased, I was often asked if they could be used with other LLM providers. I typically answered with &quot;I've been meaning to work on this…&quot; or &quot;I heard you can do multi-model <code>chatgpt-shell</code> using a bridge like <a href="https://docs.litellm.ai/docs/">liteLLM</a>&quot;. Neither of these where great answers, resulting in me just postponing the chunky work.</p>
<p>Eventually, I bit the bullet, changed course, and got to work on multi-model support. With my initial plan to spin multiple shells via <code>shell-maker</code>, <code>chatgpt-shell</code>'s implementation didn't exactly lend itself to support multiple clients. Long story short, <code>chatgpt-shell</code> multi-model support required quite a bit of work. This where I divert to ask you to <a href="https://github.com/sponsors/xenodium">help make this project sustainable by sponsoring the work</a>.</p>
<h2>Make this project sustainable</h2>
<p>Maintaining, experimenting, implementing feature requests, and supporting open-source packages takes work. Today, chatgpt-shell has over <a href="https://melpa.org/#/chatgpt-shell">20.5K downloads on MELPA</a> and many untracked others elsewhere. If you're one of the happy users, <a href="https://github.com/sponsors/xenodium">consider sponsoring the project</a>. If you see potential, help <a href="https://github.com/sponsors/xenodium">fuel development by sponsoring</a> too.</p>
<p>Perhaps you enjoy some of the content I write about? Find my Emacs posts/tips useful?</p>
<ul>
<li><a href="https://xenodium.com/">Blog (xenodium.com)</a> (Web)</li>
<li><a href="https://lmno.lol/alvaro">Blog (lmno.lol/alvaro)</a> (Web)</li>
</ul>
<p>Alternatively, you want a blogging platform that skips the yucky side effects of the modern web?</p>
<ul>
<li>I'm building <a href="https://lmno.lol">lmno.lol</a> (my blog is <a href="https://lmno.lol/alvaro">there</a>).</li>
</ul>
<p>Maybe you enjoy one of my other projects?</p>
<ul>
<li><a href="https://plainorg.com">Plain Org</a> (org mode / iOS)</li>
<li><a href="https://flathabits.com">Flat Habits</a> (org mode / iOS)</li>
<li><a href="https://apps.apple.com/us/app/scratch/id1671420139">Scratch</a> (org mode / iOS)</li>
<li><a href="https://github.com/xenodium/macosrec">macosrec</a> (macOS)</li>
<li><a href="https://apps.apple.com/us/app/fresh-eyes/id6480411697?mt=12">Fresh Eyes</a> (macOS)</li>
<li><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/company-org-block">company-org-block</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/org-block-capf">org-block-capf</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/ready-player">ready-player</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/sqlite-mode-extras">sqlite-mode-extras</a></li>
<li><a href="https://github.com/xenodium/ob-chatgpt-shell">ob-chatgpt-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/dall-e-shell">dall-e-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/ob-dall-e-shell">ob-dall-e-shell</a> (Emacs)</li>
<li><a href="https://github.com/xenodium/shell-maker">shell-maker</a> (Emacs)</li>
</ul>
<p>So, umm… I'll just leave my GitHub sponsor page <a href="https://github.com/sponsors/xenodium">here</a>.</p>
<h2>chatgpt-shell, more than a shell</h2>
<p>With chatgpt-shell being a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint</a> shell, you can bring your favourite Emacs flows along.</p>
<img src="https://raw.githubusercontent.com/xenodium/chatgpt-shell/main/demos/cyberpunk.gif" width="99%" />
<p>As I used <code>chatgpt-shell</code> myself, I kept experimenting with different integrations and improvements. Read on for some of my favourites…</p>
<h3>A shell hybrid</h3>
<p><code>chatgpt-shell</code> includes a compose buffer experience. This is my favourite and most frequently used mechanism to interact with LLMs.</p>
<p>For example, select a region and invoke <code>M-x chatgpt-shell-prompt-compose</code> (<code>C-c C-e</code> is my preferred binding), and an editable buffer automatically copies the region and enables crafting a more thorough query. When ready, submit with the familiar <code>C-c C-c</code> binding. The buffer automatically becomes read-only and enables single-character bindings.</p>
<img src="https://raw.githubusercontent.com/xenodium/chatgpt-shell/main/demos/compose.gif" width="99%" />
<h3>Navigation: n/p (or TAB/shift-TAB)</h3>
<p>Navigate through source blocks (including previous submissions in history). Source blocks are automatically selected.</p>
<h3>Reply: r</h3>
<p>Reply with with follow-up requests using the <code>r</code> binding.</p>
<h3>Give me more: m</h3>
<p>Want to ask for more of the same data? Press <code>m</code> to request more of it. This is handy to follow up on any kind of list (suggestion, candidates, results, etc).</p>
<h3>Request entire snippets: e</h3>
<p>LLM being lazy and returning partial code? Press <code>e</code> to request entire snippet.</p>
<h3>Quick quick: q</h3>
<p>I'm a big fan of quickly disposing of Emacs buffers with the <code>q</code> binding. chatgpt-shell compose buffers are no exception.</p>
<h2>Confirm inline mods (via diffs)</h2>
<p>Request inline modifications, with explicit confirmation before accepting.</p>
<img src="https://raw.githubusercontent.com/xenodium/chatgpt-shell/main/demos/quick-insert.gif" width="99%" />
<h2>Execute snippets (a la <a href="https://orgmode.org/worg/org-contrib/babel/intro.html">org babel</a>)</h2>
<p>Both the shell and the compose buffers enable users to execute source blocks via <code>C-c C-c</code>, leveraging <a href="https://orgmode.org/worg/org-contrib/babel/intro.html">org babel</a>.</p>
<img src="https://raw.githubusercontent.com/xenodium/chatgpt-shell/main/demos/swiftui.gif" width="99%" />
<h2>Vision experiments</h2>
<p>I've been experimenting with image queries (currently ChatGPT only, please <a href="https://github.com/sponsors/xenodium">sponsor</a> to help bring support for others).</p>
<p>Below is a handy integration to extract Japanese vocabulary. There's also a generic image descriptor available via <code>M-x chatgpt-shell-describe-image</code> that works on any Emacs image (via dired, image buffer, point on image, or selecting a desktop region).</p>
<img src="https://raw.githubusercontent.com/xenodium/chatgpt-shell/main/demos/japanese-weekdays.gif" width="99%" />
<h2>Supporting new models</h2>
<p>Your favourite model not yet supported? File a <a href="https://github.com/xenodium/chatgpt-shell/issues/new">feature request</a>. You also know how to <a href="https://github.com/sponsors/xenodium">fuel the project</a>. Want to contribute new models? <a href="https://github.com/xenodium/chatgpt-shell/issues/new">Reach out</a>.</p>
<h2>Local models</h2>
<p>While the two new implementations rely on cloud APIs, local services are now possible. I've yet to use a local LLM, but please <a href="https://github.com/xenodium/chatgpt-shell/issues/new">reach out</a>, so we can make these happen too. Want to contribute?</p>
<h2>Should chatgpt-shell rename?</h2>
<p>With <code>chatgpt-shell</code> going multi-model, it's not unreasonable to ask if this package should be renamed. Maybe it should. But that's additional work we can likely postpone for the time being (and avoid pushing users to migrate). For now, I'd prefer focusing on polishing the multi-model experience and work on ironing out any issues. For that, I'll need your help.</p>
<h2>Take Gemini and Claude for a spin</h2>
<p>Multi-model support required chunky structural changes. While I've been using it myself, I'll need wider usage to uncover issues. Please take it for a spin and <a href="https://github.com/xenodium/chatgpt-shell/issues/new">file bugs or give feedback</a>. Or if you just want to ping me, I'd love to hear about your experience (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
<ul>
<li>Be sure to update to <code>chatgpt-shell</code> v2.0.1 and <code>shell-maker</code> v0.68.1 as a minimum.</li>
<li>Set <code>chatgpt-shell-anthropic-key</code> or <code>chatgpt-shell-google-key</code>.</li>
<li>Swap models with existing <code>M-x chatgpt-shell-swap-model-version</code> or set a default with <code>(setq chatgpt-shell-model-version &quot;claude-3-5-sonnet-20240620&quot;)</code> or <code>(setq chatgpt-shell-model-version &quot;claude-gemini-1.5-pro-latest&quot;)</code>.</li>
<li>Everything else should just work 🤞😅</li>
</ul>
<p>Happy Emacsing!</p>
]]></description>
    <pubDate>Wed, 20 Nov 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>chatgpt-shell splits up</title>
<link>https://xenodium.com/chatgpt-shell-repo-splits-up</link>
<guid isPermaLink="false">https://xenodium.com/chatgpt-shell-repo-splits-up</guid>
    <description><![CDATA[<p>The <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> package started as an experiment <a href="https://lmno.lol/alvaro/a-chatgpt-emacs-shell">glueing the ChatGPT API to an Emacs comint buffer</a>. Over time, it grew into several packages within the same repository: shell-maker, ob-chatgpt-shell, dall-e-shell, ob-dall-e-shell, and of course chatgpt-shell itself.</p>
<p>I'm splitting the repository as a first step in reworking <code>chatgpt-shell</code> to enable multi-model support (i.e. Gemini, Claude, and others), a popular feature request.</p>
<h2>Want multi-model support?</h2>
<p>Go 👍 the <a href="https://github.com/xenodium/chatgpt-shell/issues/244">feature request</a> and ✨<a href="https://github.com/sponsors/xenodium">sponsor</a>✨ the work.</p>
<p>If keen on having a multi-modal <code>chatgpt-shell</code> at your fingertips, please consider <a href="https://github.com/sponsors/xenodium">sponsoring</a> to make the project sustainable. Improvements like this, integrations, and keeping up with the AI space takes quite a bit of work and effort.</p>
<h2>New package repositories</h2>
<h3>chatgpt-shell</h3>
<p>No repo location changes. Remains at <a href="https://github.com/xenodium/chatgpt-shell">https://github.com/xenodium/chatgpt-shell</a></p>
<p><code>chatgpt-shell</code> carries the ChatGPT shell itself, but also convenience integrations.</p>
<p>My hope is to make this a multi-model package.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-repo-splits-up/swiftui.webp" alt=""></p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-repo-splits-up/japanese.webp" alt=""></p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-repo-splits-up/fix.webp" alt=""></p>
<h3>ob-chatgpt-shell</h3>
<p>Moves to <a href="https://github.com/xenodium/ob-chatgpts-shell">https://github.com/xenodium/ob-chatgpts-shell</a></p>
<p>An extension of <code>chatgpt-shell</code> to execute org babel blocks as ChatGPT prompts.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-repo-splits-up/ob-chatgpt-shell.png" alt=""></p>
<h3>dall-e-shell</h3>
<p>Moves to <a href="https://github.com/xenodium/dall-e-shell">https://github.com/xenodium/dall-e-shell</a></p>
<p>A dedicated shell for DALL-E image generation.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-repo-splits-up/dall-e-shell.png" alt=""></p>
<h3>ob-dall-e-shell</h3>
<p>Moves to <a href="https://github.com/xenodium/ob-dall-e-shell">https://github.com/xenodium/ob-dall-e-shell</a></p>
<p>An extension of <code>dall-e-shell</code> to execute org babel blocks as ChatGPT prompts.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-repo-splits-up/ob-dall-e-shell.png" alt=""></p>
<h3>shell-maker</h3>
<p>Moves to <a href="https://github.com/xenodium/shell-maker">https://github.com/xenodium/shell-maker</a></p>
<p><code>shell-maker</code> a convenience wrapper around <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint mode</a> to build shells. Both <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> and <a href="https://github.com/xenodium/dall-e-shell">dall-e-shell</a> are built on top of shell-maker.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-repo-splits-up/sofia.gif" alt=""></p>
<h2>Enjoying this content? Using one of my Emacs packages?</h2>
<p>Help make the work sustainable. Consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>. I'm also building <a href="https://lmno.lol/">lmno.lol</a>. A platform to <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop</a> your blog to the web.</p>
]]></description>
    <pubDate>Wed, 13 Nov 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hide another detail</title>
<link>https://xenodium.com/hide-another-detail</link>
<guid isPermaLink="false">https://xenodium.com/hide-another-detail</guid>
    <description><![CDATA[<p>It's been 5 years since I talked about <a href="https://xenodium.com/showhide-emacs-dired-details-in-style/">showing/hiding Emacs dired details in style</a>, a short post showcasing <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Misc-Dired-Features.html">hide-details-mode</a> (built-in) and <a href="https://github.com/purcell/diredfl">diredfl</a> (third-party).</p>
<p>While my dired usage increased over the years, my dired config remained largely unchanged. Today, I'll show a new dired tweak.</p>
<p>As you likely suspect by now, I'm a big fan of <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Misc-Dired-Features.html">hide-details-mode</a>. It gives me super clean and minimalistic view of my files.</p>
<p><img src="https://xenodium.github.io/images/hide-another-detail/before.png" alt=""></p>
<p>If I need more details, it's one toggle away using my trusty C-( binding.</p>
<p><img src="https://xenodium.github.io/images/hide-another-detail/toggle-before.gif" alt=""></p>
<p>Now this is a super minor thing, but for a little while, I wished I could also hide the current directory's absolute path as part of <code>hide-details-mode</code>'s toggling. In the same spirit as other hidden dired details, I rarely need to see the absolute path. And if I did, it'd only be a toggle away.</p>
<p>With that in mind, I set out to bend dired my way. I looked at the <code>dired-hide-details-mode</code> built-in code (dired.el) and came across invisibility specs, which I hadn't used before. Dired uses <code>add-to-invisibility-spec</code> and <code>remove-from-invisibility-spec</code> to show and hide details using the <code>invisible</code> property set to <code>dired-hide-details-information</code>.</p>
<p>Now that we know what property to set, we need to find the text to apply it to. Dired offers that via <code>dired-subdir-regexp</code>. All we need to do is match the regular expression and apply our invisible property to the relevant bounds.</p>
<pre><code class="language-{.commonlisp">(defun hide-dired-details-include-all-subdir-paths ()
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward dired-subdir-regexp nil t)
      (let* ((match-bounds (cons (match-beginning 1) (match-end 1)))
             (path (file-name-directory (buffer-substring (car match-bounds)
                                                          (cdr match-bounds))))
             (path-start (car match-bounds))
             (path-end (+ (car match-bounds) (length path)))
             (inhibit-read-only t))
        (put-text-property path-start path-end
                           'invisible 'dired-hide-details-information)))))
</code></pre>
<p>All that's left is for us to add our new function to a hook, and we're good to go.</p>
<pre><code class="language-{.commonlisp">(use-package dired
  :hook ((dired-mode . dired-hide-details-mode)
         (dired-after-readin . hide-dired-details-include-all-subdir-paths)))
</code></pre>
<p>My Dired window is even cleaner now. The current directory's absolute path is now hidden.</p>
<p><img src="https://xenodium.github.io/images/hide-another-detail/after.png" alt=""></p>
<p>There may be times we need to peek at the absolute path. We can now toggle hiding this detail just like the others.</p>
<p><img src="https://xenodium.github.io/images/hide-another-detail/toggle-after.gif" alt=""></p>
<h2>My first Emacs patch</h2>
<p>While this is a rather small change, I figured I could use it to get my toes dipped as a first Emacs contribution. I've since reworked the patch to fit into dired.el's code and submitted for review.</p>
<p>I'm happy to report the tiny feature's now merged to master as of <a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=7cbca90569472af5643905fca5b7ab2dea67f876">a couple of days ago</a>. Yay! 🎉</p>
<p>It'll be sometime until the feature makes it to a release, but if you're living on the Emacs master edge, it should be available there. While the feature is disabled by default, it can enabled with:</p>
<pre><code class="language-{.commonlisp">(setq dired-hide-details-hide-absolute-location t)
</code></pre>
<p>Happy hiding!</p>
<h2>Enjoying this content? Using one of my Emacs packages?</h2>
<p>Help make the work sustainable. Consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>. I'm also building <a href="https://lmno.lol/">lmno.lol</a>. A platform to <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop</a> your blog to the web.</p>
]]></description>
    <pubDate>Mon, 21 Oct 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>How I batch apply and save one-liners</title>
<link>https://xenodium.com/how-i-batch-apply-and-save-one-liners</link>
<guid isPermaLink="false">https://xenodium.com/how-i-batch-apply-and-save-one-liners</guid>
    <description><![CDATA[<p>My significant other needed to share proof of address by providing a number of bank statements for a period of time. That's easy enough to download as pdfs from the bank, but statements typically provide more personal information than the recipient requires. For a proof of address, the first page is more than enough.</p>
<p>macOS's Preview app can easily delete pages from a pdf by selecting undesired pages and hitting the delete key. This is fine for one pdf but for a handful of them, I figured there's a command line incantation I could use out there, and indeed there is:</p>
<pre><code class="language-{.bash">qpdf my.pdf --pages . 1 -- my-one-page.pdf
</code></pre>
<p>With command in mind, I resorted to my now my typical approach of:</p>
<ul>
<li>Convert to a generic <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>.</li>
<li>Batch apply.</li>
</ul>
<p>I could be done at this point, but since I now have the command fresh in mind…</p>
<ul>
<li>Save command for future usage.</li>
</ul>
<p>So let's get on with it.</p>
<h2>Converting to dwim-shell-command</h2>
<pre><code class="language-{.bash">qpdf '&lt;&lt;f&gt;&gt;' --pages . 1 -- '&lt;&lt;fne&gt;&gt;_1.&lt;&lt;e&gt;&gt;'
</code></pre>
<h2>Batch apply</h2>
<p>Other than show it in action, it may be worth mentioning dwim-shell-command recognizes files in region (in addition to dired's mark of course), so you can just select and apply.</p>
<p><img src="https://xenodium.github.io/images/how-i-batch-apply-and-save-one-liners/keep-1-page.gif" alt=""></p>
<h2>Save for future usage</h2>
<p>Saving these commands for future usage typically consists of merely wrapping in an Emacs command so we can invoke via M-x (and your favorite narrowing framework for that fuzzy quick magic).</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-keep-pdf-page ()
  &quot;Keep a page from pdf.&quot;
  (interactive)
  (let ((page-num (read-number &quot;Keep page number: &quot; 1)))
    (dwim-shell-command-on-marked-files
     &quot;Keep pdf page&quot;
     (format &quot;qpdf '&lt;&lt;f&gt;&gt;' --pages . %d -- '&lt;&lt;fne&gt;&gt;_%d.&lt;&lt;e&gt;&gt;'&quot; page-num page-num)
     :utils &quot;qpdf&quot;)))
</code></pre>
<p>For this instance, there's a tiny bit of additional logic to ask the user which page they'd like to keep.</p>
<p>While there's no way I'll remember <code>qpdf my.pdf --pages . 1 -- my-one-page.pdf</code>, I can easily find it in the future by searching with something like <code>M-x keep page</code>.</p>
<p><img src="https://xenodium.github.io/images/how-i-batch-apply-and-save-one-liners/keep-1-page-command.gif" alt=""></p>
<h2>My toolbox</h2>
<p>I've saved a bunch of these commands and use many of them regularly. You can find in the <a href="https://github.com/xenodium/dwim-shell-command?tab=readme-ov-file#my-toolbox">optional component of dwim-shell-command</a>.</p>
<h2>Enjoying this content? Using one of my Emacs packages?</h2>
<p>Help make the work sustainable. Consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>. I'm also building <a href="https://lmno.lol/">lmno.lol</a>. A platform to <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop</a> your blog to the web.</p>
]]></description>
    <pubDate>Sat, 21 Sep 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs bubble mode</title>
<link>https://xenodium.com/emacs-bubble-mode</link>
<guid isPermaLink="false">https://xenodium.com/emacs-bubble-mode</guid>
    <description><![CDATA[<p>From time to time, I want to grab a source code viewport of sorts and feed to an LLM for questioning. From Emacs, I normally use <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>'s <code>chatgpt-shell-prompt-compose</code>, which automatically grabs the active region. This led me to explore a few options to select a region, or maybe even roll my own. I should also mention, these regions don't typically require compilable/complete structures.</p>
<p>In most of these instances, I just reach out to one of my region favourites like <a href="https://github.com/magnars/expand-region.el">expand-region</a>, <code>mark-defun</code>, or <code>mark-whole-buffer</code>. Alternatively, I navigate to different points using sexp commands like <code>backward-sexp</code> and <code>forward-sexp</code> (or maybe something like <code>sp-backward-up-sexp</code> from <a href="https://github.com/Fuco1/smartparens">smartparens</a>), using <code>set-mark-command</code> in-between to activate the region.</p>
<p>While these commands typically yield balanced expressions, it's often unnecessary for my LLM queries. This led me to <a href="https://indieweb.social/@xenodium/113158018599745252">ask folks</a> for different ways of selecting regions, which highlighted great package suggestions like <a href="https://github.com/abo-abo/avy">avy</a>, <a href="https://github.com/meow-edit">meow</a>, and <a href="https://github.com/leoliu/easy-kill">easy-kill</a>.</p>
<p>While I've been intrigued by <code>meow</code>'s modal editing for some time, I'm not ready for that fair trial jump. Will have to postpone it for a little longer.</p>
<p><code>Easy-kill</code> offers <code>easy-mark</code>, in some ways similar to the built-in <code>mark-sexp</code>, but with additional marking heuristics and possibly other goodies I missed. At present, I get similar benefits from the likes of <code>expand-region</code> and the other sexp helpers.</p>
<p><code>Avy</code>'s <code>avy-kill-ring-save-region</code> could work for my purpose, though I wish it left the region active. Maybe that's already possible? I could look into extending <code>avy</code>, though <a href="https://mastodon.social/@ctietze/113154167264208507">Christian's suggestions</a> led me to lean more on visual feedback in my own region-expanding experiments.</p>
<p>The goal was to enable extending regions in both vertical directions by simultaneously adding lines at both ends. Sure, this doesn't guarantee structural completeness, but it may just be enough for my LLM-feeding purpose. Maybe this already exists in the Emacs universe, but hey, it's an excuse to throw some elisp lines together…</p>
<p>Assuming there's an existing active region, expanding in both directions is pretty straightforward.</p>
<pre><code class="language-{.commonlisp">(defun bubble-expand()
  &quot;Expand region.&quot;
  (interactive)
  (when (&gt; (point) (mark))
    (exchange-point-and-mark))
  (forward-line -1)
  (exchange-point-and-mark)
  (forward-line 1)
  (exchange-point-and-mark))

(defun bubble-shrink ()
  &quot;Shrink region.&quot;
  (interactive)
  (when (&lt; (point) (mark))
    (exchange-point-and-mark))
  (forward-line -1)
  (exchange-point-and-mark)
  (forward-line 1))
</code></pre>
<p>While I've yet to use this region-expanding approach long enough to validate its usefulness, it sure is fun to play with it.</p>
<p><img src="https://xenodium.github.io/images/emacs-bubble-mode/bubble-expand-shrink.gif" alt=""></p>
<p>This got me thinking, what other funky things I could do with the region? Could I shift the region selection like a viewport of sorts? As you now expect, the answer in Emacs is almost always of course we can…</p>
<pre><code class="language-{.commonlisp">(defun bubble-shift-up ()
  &quot;Shift the region up by one line.&quot;
  (interactive)
  (when (&gt; (point) (mark))
    (exchange-point-and-mark))
  (forward-line -1)
  (forward-line 0)
  (exchange-point-and-mark)
  (forward-line -1)
  (end-of-line)
  (activate-mark)
  (exchange-point-and-mark))

(defun bubble-shift-down ()
  &quot;Shift the region down by one line.&quot;
  (interactive)
  (when (&gt; (point) (mark))
    (exchange-point-and-mark))
  (forward-line)
  (forward-line 0)
  (exchange-point-and-mark)
  (forward-line)
  (end-of-line)
  (activate-mark)
  (exchange-point-and-mark))
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-bubble-mode/bubble-shift.gif" alt=""></p>
<p>My friend Vaarnan also suggested looking into UX around providing line count, which is possible by providing a prefix into <code>bubble-expand-region</code>.</p>
<pre><code class="language-{.commonlisp">C-5 M-x bubble-expand-region
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-bubble-mode/bubble-number.gif" alt=""></p>
<p>These commands alone aren't as effective unless we have some key-bindings around them. I've tied things up into a minor mode, called… you guessed it: <code>bubble-mode</code>. Oooh, a mode, you may say it's now official ;) Well, no. It's still an experiment of sorts and currently lives in <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/bubble.el">my Emacs config repo</a>.</p>
<p>The key bindings I've chosen are:</p>
<ul>
<li><code>C-c C-w</code>: Enter bubble-mode.</li>
<li><code>C-p</code>: bubble-expand.</li>
<li><code>C-n</code>: bubble-shrink.</li>
<li><code>S-C-p</code>: bubble-move-up.</li>
<li><code>S-C-n</code>: bubble-move-down.</li>
<li><code>Numbers 1-0</code>: Expand 1 to 10 lines.</li>
<li><code>RET</code>: Exit bubble-mode.</li>
</ul>
<p>Note: Inspired by expand-region, any other key binding/command automatically exits <code>bubble-mode</code>.</p>
<p><code>C-c C-w</code> kinda works for me as <code>C-c w</code> is already bound to <code>expand-region</code>. Let's see if that sticks, though I may have to give up the <code>org-refile</code> binding.</p>
<p>So does it work for my original LLM intent? We shall see, but it seems to so far. You can play with it if you'd like (it's on <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/bubble.el">github</a>). Here's what that flow now looks like:</p>
<p><img src="https://xenodium.github.io/images/emacs-bubble-mode/bubble-whats-wrong.gif" alt=""></p>
<h2>Enjoying this content? Using one of my Emacs packages?</h2>
<p>Help make the work sustainable. Consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>. I'm also building <a href="https://lmno.lol/">lmno.lol</a>. A platform to <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop</a> your blog to the web.</p>
]]></description>
    <pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Spiffing up those echo messages</title>
<link>https://xenodium.com/spiffing-up-those-echo-messages</link>
<guid isPermaLink="false">https://xenodium.com/spiffing-up-those-echo-messages</guid>
    <description><![CDATA[<p>Well-ingrained into every Emacs user is the echo area, a one-stop shop to receive any kind of message from the editor, located at the bottom of the frame. Posting messages to this area from elisp couldn't be simpler:</p>
<pre><code class="language-{.commonlisp">(message &quot;Hello world&quot;)
</code></pre>
<p><img src="https://xenodium.github.io/images/spiffing-up-those-echo-messages/svg-hello-world.gif" alt=""></p>
<p>If we want to get a little fancier, we can propertize the text to add some styling.</p>
<pre><code class="language-{.commonlisp">(message (propertize &quot;hello &quot; 'face '(:foreground &quot;#C3E88D&quot;))
         (propertize &quot;world&quot; 'face '(:foreground &quot;#FF5370&quot;)))
</code></pre>
<p><img src="https://xenodium.github.io/images/spiffing-up-those-echo-messages/svg-hello-world-colors.gif" alt=""></p>
<p>With this in mind, I set out to add a tiny command to <a href="https://github.com/xenodium/ready-player">ready-player</a>.</p>
<p>I wanted the ability to ask what's on without switching to another buffer. The echo area is perfect for that. It should display track title, artist, and album.</p>
<pre><code class="language-{.commonlisp">(message (concat &quot;Ahead &quot; ;; title
                 (propertize &quot;Wire &quot; 'face '(:foreground &quot;#C3E88D&quot;)) ;; artist
                 (propertize &quot;The Ideal Copy&quot; 'face '(:foreground &quot;#FF5370&quot;)))) ;; album
</code></pre>
<p><img src="https://xenodium.github.io/images/spiffing-up-those-echo-messages/svg-ready-player-colors.gif" alt=""></p>
<p>This kinda works, but I wasn't convinced with the styling. Maybe I need multi-line?</p>
<pre><code class="language-{.commonlisp">(message (concat &quot;Ahead\n&quot; ;; title
                 (propertize &quot;Wire\n&quot; 'face '(:foreground &quot;#C3E88D&quot;)) ;; artist
                 (propertize &quot;The Ideal Copy&quot; 'face '(:foreground &quot;#FF5370&quot;)))) ;; album
</code></pre>
<p><img src="https://xenodium.github.io/images/spiffing-up-those-echo-messages/svg-ready-player-colors-multiline.gif" alt=""></p>
<p>I felt something was missing. If I could just add the album artwork as a thumbnail… The ideal layout would maybe look something like:</p>
<pre><code>+-------+
|       | Ahead
| image | Wire
|       | The Ideal Copy
+-------+
</code></pre>
<p>While the text-everywhere nature of Emacs buffers has many advantages, building more involved layouts can have its challenges. But hey, for that simple read-only message we're aiming at, we can certainly get creative without too much trouble. You see, Emacs has native svg support, so we can craft our fancy layout in elisp and tell Emacs to render it for us.</p>
<p>While I'm a noob at doing anything in svg from Emacs, adding an image and three labels, really isn't that difficult.</p>
<pre><code class="language-{.commonlisp">(message
 (let* ((image-width 90)
        (image-height 90)
        (text-height 25)
        (svg (svg-create (frame-pixel-width) image-height)))
   (svg-embed svg &quot;path/to/thumbnail.png&quot;
              &quot;image/png&quot; nil
              :x 0 :y 0 :width image-width :height image-height)
   (svg-text svg &quot;Ahead&quot;
             :x (+ image-width 10) :y text-height
             :fill (face-attribute 'default :foreground))
   (svg-text svg &quot;Wire&quot;
             :x (+ image-width 10) :y (* 2 text-height)
             :fill &quot;#C3E88D&quot;)
   (svg-text svg &quot;The Ideal Copy&quot; :x (+ image-width 10) :y (* 3 text-height)
             :fill &quot;#FF5370&quot;)
   (with-temp-buffer
     (svg-insert-image svg)
     (buffer-string))))
</code></pre>
<p>The code is fairly self-explanatory. While there may be an even simpler way (please lemme know), I used a temporary buffer to embed the svg in the propertized text prior to feeding to the handy <code>message</code> function.</p>
<p>…and with that, we get a richer display of the current track.</p>
<p><img src="https://xenodium.github.io/images/spiffing-up-those-echo-messages/svg-ready-player-colors-image.gif" alt=""></p>
<p>While I haven't experimented with other ways of creating multi-column layouts in Emacs (including images), <a href="https://indieweb.social/@xenodium">I'd love to know</a> if there's anything else available besides svg.</p>
<h2>Enjoying these tips? Using one of my Emacs packages?</h2>
<p>Help make them sustainable. Consider <a href="https://github.com/sponsors/xenodium">supporting</a> this work.</p>
]]></description>
    <pubDate>Wed, 11 Sep 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Seek and you shall find</title>
<link>https://xenodium.com/seek-and-you-shall-find</link>
<guid isPermaLink="false">https://xenodium.com/seek-and-you-shall-find</guid>
    <description><![CDATA[<p>A couple of months ago, I <a href="https://xenodium.com/ready-player-mode/">introduced Ready Player Mode</a>, an Emacs major mode used to peek at media files from my beloved text editor. The goal was simple. Treat opening media files like any other file, that is, open and go.</p>
<p>The initial implementation served me well while reviewing lots of tiny audio files I used to practice learning a new language. At this point, I started thinking, could I use ready-player for regular music consumption? The thing is, long ago I had stopped buying music and relied on streamed music from online services. Could I go back to offline?</p>
<p>Dusting off my old media collection brought lots of memories as I rediscovered tunes. Having said that, the ready-player experience wasn't quite cutting it for an extended listening experience. I no longer wanted to occasionally peek at media to learn a language. I wanted to load a full music collection. I wanted random access to everything. I wanted Emacs to remember what I was listening to across sessions… While I did <a href="https://xenodium.com/the-dired-abstraction/">add some pluggable flows</a>, I still needed additional changes to make the experience more pleasant.</p>
<p>While plugging away at my own ready-player's pet peeves, I also collected a handful of feature requests. Let's go over the latest features.</p>
<h2>Seek (f/b binding) - <a href="https://github.com/xenodium/ready-player/issues/11">feature request</a></h2>
<p>While not a feature I initially thought ranked highly in priority, I now find myself seeking audio files from time to time. Ready Player delegates all playback to the likes of <a href="https://mpv.io/">mpv</a>, <a href="https://www.videolan.org/vlc/">vlc</a>, <a href="https://mplayerhq.hu/design7/news.html">mplayer</a>, and so on… Up until now, interacting with these utilities merely consisted of feeding a media file path on to the respective process.</p>
<p>Command line utilities like <code>mpv</code> offer socket communication via <code>--input-ipc-server</code> to enable further requests like seeking forward and back. Ready player now supports seeking via mpv. Maybe support for other utilities can be added in the future.</p>
<p>If you're on a recent version of ready-player, seeking is automatically enabled if you've got mpv installed and aren't explicitly customizing <code>ready-player-open-playback-commands</code>. The default value takes care of things:</p>
<pre><code class="language-{.commonlisp">(defcustom ready-player-open-playback-commands
  '((&quot;mpv&quot; &quot;--audio-display=no&quot; &quot;--input-ipc-server=&lt;&lt;socket&gt;&gt;&quot;)
    (&quot;vlc&quot;)
    (&quot;ffplay&quot;)
    (&quot;mplayer&quot;))
  &quot;...&quot;
  :type '(repeat (list string))
  :group 'ready-player)
</code></pre>
<p><img src="https://xenodium.github.io/images/seek-and-you-shall-find/seek.webp" alt=""></p>
<h2>Pause/resume (SPC binding) - <a href="https://github.com/xenodium/ready-player/issues/10">feature request</a></h2>
<p>Until now, ready-player could only play and stop, so you always had to start playing tracks from the beginning. With <code>mpv</code> ipc support now in place, adding pause/resume was a breeze. Like seek, it should just work for ya if <code>mpv</code> is on your system and no explicit customization of <code>ready-player-open-playback-commands</code>.</p>
<h2>Repeat current file (r binding) - <a href="https://github.com/xenodium/ready-player/issues/16">feature request</a></h2>
<p>While repeating current playlist (or directory) was already supported, there was a feature request to enable repeating files. Toggling repeat now cycles through available modes.</p>
<p><img src="https://xenodium.github.io/images/seek-and-you-shall-find/repeat.webp" alt=""></p>
<h2>Selective players - <a href="https://github.com/xenodium/ready-player/issues/13">feature request</a></h2>
<p>With ready-player delegating to a single utility for either audio or video playback, folks may have a need to specify different utilities for either of these two. While I'm happy for <code>mpv</code> to handle both audio and video, we now have a couple of prepending options.</p>
<h3>Use a predicate function</h3>
<p>Prepend each utility with either the built-in <code>ready-player-is-audio-p</code> or <code>ready-player-is-video-p</code> functions, or maybe create your own predicate helper.</p>
<pre><code class="language-{.commonlisp">(setq ready-player-open-playback-commands
      '((ready-player-is-audio-p &quot;ffplay&quot;)
        (ready-player-is-video-p &quot;mpv&quot;)))
</code></pre>
<h3>Use an extension list</h3>
<p>In this example, we delegate mp3 and ogg playback to ffplay and everything else to mpv.</p>
<pre><code class="language-{.commonlisp">(setq ready-player-open-playback-commands
      '(((&quot;mp3&quot; &quot;ogg&quot;) &quot;ffplay&quot;)
        (&quot;mpv&quot;)))
</code></pre>
<h2>Autoplay (a binding) - <a href="https://github.com/xenodium/ready-player/issues/9">feature request</a></h2>
<p>Automatically start playing once file opens. No need for user to explicitly request playback.</p>
<h2>Mark in dired (m binding) - <a href="https://github.com/xenodium/ready-player/issues/8">feature request</a></h2>
<p>Open a dired buffer and mark the currently played file.</p>
<p><img src="https://xenodium.github.io/images/seek-and-you-shall-find/mark.gif" alt=""></p>
<h2>M3u playlists - <a href="https://github.com/xenodium/ready-player/issues/14">feature request</a></h2>
<p>While I talked about how <a href="https://lmno.lol/alvaro/the-dired-abstraction">the dired abstraction</a> made basic m3u playlist support possible, it wasn't until recently that I included this experiment in the package itself. In addition, .m3u are now recognized by Emacs and automatically open like any other file: find-file, dired, projectile…</p>
<h2>Load recursive directory</h2>
<p>With <a href="https://lmno.lol/alvaro/the-dired-abstraction">the dired abstraction</a> at its core, ready player can load any dired buffer. You could do something like:</p>
<ol>
<li><code>M-x find-dired RET</code>.</li>
<li>Pick a directory. RET.</li>
<li>Type <code>&quot;-iname \*.mp3 -o -iname \*.ogg -o -iname \*.m4a&quot;</code> RET.</li>
<li><code>M-x ready-player-load-dired-buffer</code> RET.</li>
</ol>
<p>While uber flexible, there's no need to regularly do that, so you can now invoke <code>M-x ready-player-load-directory</code> and it will recursively find all media files in it.</p>
<h2>Toggle player view (C-c m m binding)</h2>
<p>While we can always get back to the player buffer via our favourite buffer-switching mechanism (I like <a href="https://github.com/abo-abo/swiper">ivy</a>'s ivy-switch-buffer), we now have <code>M-x ready-player-view-player</code> available for quicker toggle.</p>
<h2>Remember session</h2>
<p>Playback is now remembered across Emacs sessions. Toggling player view (C-c m m binding) or playback (C-c m SPC binding) starts the last song you were playing on your previous Emacs session.</p>
<h2>Index + searching (/ or C-c m /)</h2>
<p>We now have automatic indexing, which enables richer searching across your collection, not to mention that random access I was craving.</p>
<p><img src="https://xenodium.github.io/images/seek-and-you-shall-find/search.webp" alt=""></p>
<h2>Global bindings</h2>
<p>Last but not least, you may have noticed a handful of key bindings throughout the post. Single-character bindings all work within a ready-player buffer. Bindings prefixed <code>C-c m</code> are now globally available when <code>ready-player-mode</code> is turned on. This can be customized via <code>ready-player-set-global-bindings</code>.</p>
<h2>Please help make it all self-sustainable</h2>
<p>If you find this package useful or got the features you wanted, please <a href="https://github.com/sponsors/xenodium">consider sponsoring the work</a>. I've left my tech job (maybe a post for another time) and looking to make projects like ready-player self-sustainable.</p>
<p>If you're an iOS/macOS user, you can also <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">buy my apps</a>. Here's another freebie (<a href="https://github.com/xenodium/macosrec">macosrec</a>) I've put out there, which I <a href="https://lmno.lol/alvaro/recordscreenshot-windows-the-lazy-way">regularly use to capture Emacs demos</a> for this blog.</p>
<p>You may also enjoy this blog and all the tips I share. Blog posts take time. Consider <a href="https://github.com/sponsors/xenodium">sponsoring my blog</a>.</p>
<p>I've built other Emacs packages you may already use or would like to. Maybe I already built a feature request? Consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>:</p>
<ul>
<li><a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a></li>
<li><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a></li>
<li><a href="https://github.com/xenodium/sqlite-mode-extras">sqlite-mode-extras</a></li>
<li><a href="https://github.com/xenodium/org-block-capf">org-block-capf</a></li>
<li><a href="https://github.com/xenodium/company-org-block">company-org-block</a></li>
<li><a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a></li>
</ul>
<p>I'm also building <a href="https://lmno.lol">lmno.lol</a>, a new blogging platform, with <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. Maybe you want to try that too? <a href="mailto:help/at/lmno.lol">Get in touch</a>.</p>
<p>Thank you!</p>
<p>Álvaro</p>
]]></description>
    <pubDate>Sat, 07 Sep 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Anki bookmarks</title>
<link>https://xenodium.com/anki-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/anki-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://doubleloop.net/2020/08/02/adding-flashcards-to-your-digital-garden-with-org-roam-and-anki/">Adding flashcards to your digital garden (with org-roam and Anki) - doubleloop</a>.</li>
<li><a href="https://rgoswami.me/posts/anki-decks-orgmode/">Anki Decks with Orgmode</a>.</li>
<li><a href="https://github.com/louietan/anki-editor">anki-editor: Emacs minor mode for making Anki cards with Org</a>.</li>
<li><a href="https://github.com/telotortium/emacs-od2ae">emacs-od2ae: Convert org-drill entries to anki-editor</a>.</li>
<li><a href="https://github.com/l3kn/org-fc">GitHub - l3kn/org-fc: Spaced Repetition System for Emacs org-mode</a>.</li>
<li><a href="https://github.com/eyeinsky/org-anki/">org-anki: Sync org notes to Anki via AnkiConnect</a>.</li>
<li><a href="https://orgmode.org/worg/org-contrib/org-drill.html">org-drill.el - flashcards and spaced repetition for org-mode</a>.</li>
<li><a href="https://github.com/l3kn/org-fc">org-fc: Spaced Repetition System for Emacs org-mode</a>.</li>
<li><a href="https://yiufung.net/post/anki-org/">Power up Anki with Emacs, Org mode, anki-editor and more</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 04 Sep 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>`*scratch*` v1.3 released</title>
<link>https://xenodium.com/scratch-v1-3-released</link>
<guid isPermaLink="false">https://xenodium.com/scratch-v1-3-released</guid>
    <description><![CDATA[<p>It's been some time since the last release of <code>*scratch*</code> for iOS. If you haven't heard about <code>*scratch*</code>, it's a tiny app I built (part of <a href="https://lmno.lol/alvaro/the-org-bundle">the org bundle</a>).</p>
<p><code>*scratch*</code> enables writing things on the go <em>as quickly as possible</em>.</p>
<ul>
<li>No need to create a new note.</li>
<li>No need to bring keyboard up.</li>
<li><strong>Just open and write</strong>.</li>
<li>Bonus: Basic Emacs org markup ;-)</li>
</ul>
<p>v1.3 (and yesterday's v1.2) are now available on the App Store. They are minor releases bringing:</p>
<ul>
<li>A monospaced font.</li>
<li>A layout fix for &quot;Settings &gt; Display &amp; Brightness &gt; Display Zoom &gt; Larger Text (often affecting iPhones with smaller screens).</li>
<li>A menu fix.</li>
</ul>
<p><img src="https://xenodium.github.io/images/scratch-v1-3-released/scratch.webp" alt=""></p>
<p>Are you a fan of this app? Want to <a href="https://apps.apple.com/app/id1671420139?action=write-review">rate on the App Store</a>? Please help me spread the word. Tell your friends.</p>
<br/>
<br/>
<center>
  <a href="https://apps.apple.com/app/id1671420139">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Fri, 23 Aug 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>The dired abstraction</title>
<link>https://xenodium.com/the-dired-abstraction</link>
<guid isPermaLink="false">https://xenodium.com/the-dired-abstraction</guid>
    <description><![CDATA[<p>I recently <a href="https://lmno.lol/alvaro/ready-player-mode">wrote about image-mode's next/previous item navigation</a>, a feature I wanted to bring to <a href="https://github.com/xenodium/ready-player">ready player mode</a>.</p>
<p>I was curious to see how <code>image-mode</code> resolved next and previous files, so I checked the associated keybinding (n) via <a href="https://github.com/Wilfred/helpful">helpful-key</a> (my preferred alternative to <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Help.html">describe-key</a>), and landed on <code>image-next-file</code>. While this function only takes care of high-level routing, it led me to <code>image-mode--next-file</code>, which is where the actual next/previous file resolution happens:</p>
<pre><code class="language-{.commonlisp">(defun image-mode--next-file (file n)
  &quot;Go to the next image file in the parent buffer of FILE.
This is typically a Dired buffer, but may also be a tar/archive buffer.
Return the next image file from that buffer.
If N is negative, go to the previous file.&quot;
  ...)
</code></pre>
<p>While <code>image-mode--next-file</code>'s implementation details are worth <a href="https://github.com/emacs-mirror/emacs/blob/e4d22abcab60ead179e7d114faa4c2def559cfbb/lisp/image-mode.el#L1264">checking out</a>, its docstring already highlights the bit I found most interesting: <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a>'s involvement in the mix. I'm not sure why I initially found <code>dired</code> usage surprising. Buffers are Emacs's backbone. They are the fundamental structures holding the content we work with, whether it’s editing text, reading logs, displaying information, and many others including file management… Dired specializes buffers for this last purpose. While <code>dired</code> itself is a powerhouse, at its core it's just an ordered list of files.</p>
<p>Given a location within a <code>dired</code> buffer, we can use its helpers to find next and previous files. Like <code>image-mode</code>, <code>ready-player</code> now mirrors this approach (minus tar/archive handling). This got me thinking more about the <code>dired</code> abstraction… If it quacks like a duck, and walks like a duck, then it's probably <em>errrm</em> a <code>dired</code> buffer. What I actually mean is that associating a <code>dired</code> buffer to a <code>ready-player</code> buffer effectively attaches a playlist of sorts. It doesn't quite matter how this <code>dired</code> buffer was constructed. What's important is that it's recognized as a <code>dired</code> buffer, so all relevant helpers remain useful.</p>
<p>With <code>dired</code> buffers acting as media playlists, we can easily create a directory playlist by merely pointing <code>dired</code> to the current directory. This is the default behaviour in <code>ready-player</code>. When you open a media file, we attach a <code>dired</code> buffer pointing to the current directory. Play next or previous item, and you're effectively moving up and down the associated <code>dired</code> buffer.</p>
<p>Things get more interesting when we craft <code>dired</code> buffers in more creative ways than just supplying a path to a directory. One of my favourite commands is <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired-and-Find.html">find-dired</a>. It runs the <a href="https://www.man7.org/linux/man-pages/man1/find.1.html">find</a> utility, crafting a <code>dired</code> buffer with its results.</p>
<p><img src="https://xenodium.github.io/images/the-dired-abstraction/find.png" alt=""></p>
<p>For kicks, I added a <code>ready-player-load-dired-playback-buffer</code> command to <code>ready-player</code>, so we can just load any <code>dired</code> buffer, including our newly generated one, courtesy of <code>find-dired</code>.</p>
<p>With this generated buffer loaded and <code>ready-player</code> random playback enabled, we get to see our lucky jumps across find results.</p>
<p><img src="https://xenodium.github.io/images/the-dired-abstraction/find-random.gif" alt=""></p>
<p>At this point I thought &quot;this is prolly as far as I'll take things&quot;… <code>ready-player</code> was born to address quick access to media, typically from <code>dired</code> itself. For deep playlist handling, there are many other Emacs media players.</p>
<p>The thing is, with my newly found reusable <code>dired</code> abstraction, a rough <a href="https://en.wikipedia.org/wiki/M3U">m3u</a> playlist experiment didn't seem that far-fetched at all. I'd need to read an <code>m3u</code> file and generate a <code>dired</code> buffer. I knew nothing about m3u's, other than being text files including media paths, along with optional metadata. I figured <em>minimal</em> m3u reading support shouldn't be too difficult.</p>
<p>If we are to create a playlist including the first three album tracks from the artist above, it'd look something like this:</p>
<pre><code>#EXTM3U

#EXTINF:-1,George Benson - Dance
/absolute/path/to/Music/George Benson/Body Talk/01 Dance.mp3
#EXTINF:-1,George Benson - When Love Has Grown
/absolute/path/to/Music/George Benson/Body Talk/02 When Love Has Grown.mp3
#EXTINF:-1,George Benson - Plum
/absolute/path/to/Music/George Benson/Body Talk/03 Plum.mp3

#EXTINF:-1,George Benson - So What
/absolute/path/to/Music/George Benson/Original Album Classics/1-01 So What.mp3
#EXTINF:-1,George Benson - The Gentle Rain
/absolute/path/to/Music/George Benson/Original Album Classics/1-02 The Gentle Rain (From the Film, _The Gentle Rain_).mp3
#EXTINF:-1,George Benson - All Clear
/absolute/path/to/Music/George Benson/Original Album Classics/1-03 All Clear.mp3

#EXTINF:-1,George Benson - Footin' It
/absolute/path/to/Music/George Benson/The Shape Of Things To Come/01 Footin' It.mp3
#EXTINF:-1,George Benson - Face It Boy It's Over
/absolute/path/to/Music/George Benson/The Shape Of Things To Come/02 Face It Boy It's Over.mp3
#EXTINF:-1,George Benson - Shape Of Things To Come
/absolute/path/to/Music/George Benson/The Shape Of Things To Come/03 Shape Of Things To Come.mp3
</code></pre>
<p>A crude function to extract file paths into a list would look something like the following:</p>
<pre><code class="language-{.commonlisp">(defun ready-player--media-at-m3u-file (m3u-path)
  &quot;Read m3u playlist at M3U-PATH and return files.&quot;
  (with-temp-buffer
    (insert-file-contents m3u-path)
    (let ((files))
      (while (re-search-forward
              (rx bol (not (any &quot;#&quot; space))
                  (zero-or-more (not (any &quot;\n&quot;)))
                  eol) nil t)
        (when (file-exists-p (match-string 0))
          (push (match-string 0) files)))
      (nreverse files))))
</code></pre>
<p>Feeding our m3u file to our new function conveniently returns a list of found files:</p>
<pre><code class="language-{.commonlisp">(&quot;/absolute/path/to/Music/George Benson/Body Talk/01 Dance.mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/Body Talk/02 When Love Has Grown.mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/Body Talk/03 Plum.mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/Original Album Classics/1-01 So What.mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/Original Album Classics/1-02 The Gentle Rain (From the Film, _The Gentle Rain_).mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/Original Album Classics/1-03 All Clear.mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/The Shape Of Things To Come/01 Footin' It.mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/The Shape Of Things To Come/02 Face It Boy It's Over.mp3&quot;
 &quot;/absolute/path/to/Music/George Benson/The Shape Of Things To Come/03 Shape Of Things To Come.mp3&quot;)
</code></pre>
<p>Next we need to create a dired buffer from a list of files. This is where I thought things would get trickier, but I was pleasantly surprised.</p>
<p>The <code>dired</code> docstring had the answer:</p>
<pre><code class="language-{.commonlisp">(defun dired (dirname &amp;optional switches)
  &quot;...

If DIRNAME is a cons, its first element is taken as the directory name
and the rest as an explicit list of files to make directory entries for.
In this case, SWITCHES are applied to each of the files separately, and
therefore switches that control the order of the files in the produced
listing have no effect.

...&quot;
  ...)
</code></pre>
<p>With that in mind, this is all it takes:</p>
<pre><code class="language-{.commonlisp">(let ((default-directory &quot;/absolute/path/to/Music/George Benson&quot;))
  (dired '(&quot;*My fancy m3u list*&quot;
           &quot;Body Talk/01 Dance.mp3&quot;
           &quot;Body Talk/02 When Love Has Grown.mp3&quot;
           &quot;Body Talk/03 Plum.mp3&quot;
           &quot;Original Album Classics/1-01 So What.mp3&quot;
           &quot;Original Album Classics/1-02 The Gentle Rain (From the Film, _The Gentle Rain_).mp3&quot;
           &quot;Original Album Classics/1-03 All Clear.mp3&quot;
           &quot;The Shape Of Things To Come/01 Footin' It.mp3&quot;
           &quot;The Shape Of Things To Come/02 Face It Boy It's Over.mp3&quot;
           &quot;The Shape Of Things To Come/03 Shape Of Things To Come.mp3&quot;)))
</code></pre>
<p>Here's the <code>dired</code> buffer to prove it:</p>
<p><img src="https://xenodium.github.io/images/the-dired-abstraction/playlist.png" alt=""></p>
<p>We now have all the pieces. We can wire them up in a <code>ready-player-load-m3u-playlist</code> function.</p>
<p>From the previous snippet, you'd notice all file paths are relative to default-directory. While in the following snippet I use <code>try-completion</code> to find the longest common substring amongst the paths, I wonder if there's a more appropriate built-in function for this? <a href="https://indieweb.social/@xenodium">I'd love to hear</a>.</p>
<pre><code class="language-{.commonlisp">(defun ready-player-load-m3u-playlist ()
  &quot;Load an .m3u playlist.&quot;
  (interactive)
  (let* ((m3u-path (read-file-name &quot;find m3u: &quot; nil nil t nil
                                   (lambda (name)
                                     (or (string-match &quot;\\.m3u\\'&quot; name)
                                         (file-directory-p name)))))
         (media-files (if (string-match &quot;\\.m3u\\'&quot; m3u-path)
                          (ready-player--media-at-m3u-file m3u-path)
                        (error &quot;Not a .m3u file&quot;)))
         (default-directory (file-name-directory
                             (try-completion &quot;&quot; media-files)))
         (m3u-fname (file-name-nondirectory m3u-path))
         (dired-buffer-name (format &quot;*%s*&quot; m3u-fname))
         (dired-buffer (dired (append (list dired-buffer-name)
                                      (mapcar (lambda (path)
                                                (file-relative-name path default-directory))
                                              media-files)))))
    (ready-player-load-dired-playback-buffer dired-buffer)))
</code></pre>
<p>We're good to go now! Invoking <code>M-x ready-player-load-m3u-playlist</code> enables us to load our <code>m3u</code> playlist, automatically opening the first media file, and also navigate each song in the list one by one.</p>
<p><img src="https://xenodium.github.io/images/the-dired-abstraction/benson.gif" alt=""></p>
<p>This was a really fun experiment. While <code>dired</code> is often used to manage files within a directory, its magic also extends to <code>dired</code> buffers crafted in more creative ways. <code>find-dired</code> and <code>find-grep-dired</code> are my two favourite built-ins. Are there other ones you like? <a href="https://indieweb.social/@xenodium">Do tell</a>.</p>
<p>Not long ago, I added <code>ready-player-load-dired-playback-buffer</code> to ready-player, but <code>ready-player-load-m3u-playlist</code> remains a local experiment (for now anyway). Let's see ;-)</p>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of your favourite text editor and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Fri, 16 Aug 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ctrl-n/p everywhere. Balance restored.</title>
<link>https://xenodium.com/ctrl-np-everywhere-balance-restored</link>
<guid isPermaLink="false">https://xenodium.com/ctrl-np-everywhere-balance-restored</guid>
    <description><![CDATA[<p>For some years now, I've enjoyed <a href="https://lmno.lol/alvaro/improved-ctrl-p-ctrl-n-macos-movement">macOS Ctrl-n/p movement everywhere</a>. I sometimes forget I need <a href="https://karabiner-elements.pqrs.org/">Karabiner Elements</a> to reach certain macOS corners.</p>
<p>macOS supports many Emacs bindings (out of the box). Ctrl-n and Ctrl-p are some of my favourites. Not only can I use these to move the cursor up and down while editing text, but in many cases, for list selections too. Out of the box, list selection, in particular, is more miss than hit. <a href="https://support.apple.com/en-gb/guide/mac-help/mchlp1008/mac">Spotlight</a> and web drop boxes are the biggest pet peeves. Without remapping, vertical movement can only be achieved via arrow keys.</p>
<p>I had a sudden reminder recently when Spotlight's Ctrl-p/n didn't just work. I wanted to launch Firefox Developer Edition, the second result. Ctrl-n did nothing! The horror!</p>
<p>Turns out, I had a tiny misconfiguration, possibly as I recently switched to using my keyboard via Bluetooth? I needed &quot;Modify events&quot; set for my keyboard.</p>
<p><img src="https://xenodium.github.io/images/ctrl-np-everywhere-balance-restored/modify_events.png" alt=""></p>
<p>After setting &quot;Modify events&quot; for my external keyboard, my beloved key bindings started working again. Balance restored.</p>
<p><img src="https://xenodium.github.io/images/ctrl-np-everywhere-balance-restored/spotlight-ctrl-n.webp" alt=""></p>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of your favourite text editor and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Thu, 01 Aug 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs macOS native emoji picker (revisited)</title>
<link>https://xenodium.com/emacs-macos-native-emoji-picker-revisited</link>
<guid isPermaLink="false">https://xenodium.com/emacs-macos-native-emoji-picker-revisited</guid>
    <description><![CDATA[<h2>Update: Doh! I was wrong. There's a better way.</h2>
<p>So, I totally missed the macOS native emoji picker is actually supported out of the box 😭. Thanks to redditor <a href="https://www.reddit.com/user/hrabannixlisp/">u/hrabannixlisp</a> who <a href="https://www.reddit.com/r/emacs/comments/1ec5t4j/comment/ley1j59">pointed me in the right direction</a>.</p>
<p><code>ns-do-show-character-palette</code> is bound to <code>C-s-SPC</code> by default, which didn't work for me as I use <code>(setq mac-command-modifier 'meta)</code>, that is, ⌘ as meta modifier.</p>
<p>While I won't be giving up <code>(setq mac-command-modifier 'meta)</code>, I can certainly use <code>ns-do-show-character-palette</code> via <code>M-x</code> or a different binding. Thank you <code>u/hrabannixlisp</code>!</p>
<h2>Read on for how I went about it the long convoluted way 🤷‍♂️</h2>
<p>A couple of years ago, I was delighted to discover <a href="https://lmno.lol/alvaro/emacs-freebie-macos-emoji-picker">a macOS freebie for us Emacs users</a>. Newer Macbook models started shipping with a globe/🌐 key, which summons the macOS native emoji picker. Pressing this key in Emacs works as you'd expect (no config required 🎉).</p>
<p>While I seldom use emojis, the globe key worked great for me until I started using an external keyboard, which didn't have this magical key. The potential solutions I came across suggest either reprogramming the keyboard or using the likes of <a href="https://karabiner-elements.pqrs.org/">Karabiner-Elements</a> to map other keys to an alternate shortcut: <code>Ctrl-⌘-SPC</code>. As far as I can tell, this is the only other available shortcut (please reach out if otherwise). Not a great option (it conflicts with Emacs's <code>mark-sexp</code>). Not that I'd be super keen to lose this mark command, but even unbinding doesn't seem of much help.</p>
<p>While we have Emacs packages available for different emoji-picking experiences, I was keen on maintaining that native experience I enjoyed before. I nearly gave up on the matter until I remembered we have at least one more tool in the Emacs toolbox: <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Dynamic-Modules.html">dynamic modules</a>. Thanks to Valeriy Savchenko's <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">emacs-swift-module</a>, we can leverage Swift to integrate native macOS experiences.</p>
<p>With that in mind, I set out to find the relevant macOS API, which turned out to be a lovely one-liner:</p>
<pre><code class="language-swift">NSApp.orderFrontCharacterPalette(nil)
</code></pre>
<p>Let's bring it into Emacs via <code>emacs-swift-module</code>'s infrastructure:</p>
<pre><code class="language-swift">try env.defun(
  &quot;macos-module--show-emoji-picker&quot;,
  with: &quot;Show emoji picker (macOS module implementation).&quot;
) { (env: Environment) in
  NSApp.orderFrontCharacterPalette(nil)
}
</code></pre>
<p>In theory, this is all we need. We can <code>M-x eval-expression</code> <code>(macos-module--show-emoji-picker)</code> and the picker simply pops up. I haven't worked out how define an interactive command from <code>emacs-swift-module</code> just yet, so for now I'll just wrap with a little elisp:</p>
<pre><code class="language-{.commonlisp">(defun macos-show-emoji-picker ()
  &quot;Show macOS emoji picker.&quot;
  (interactive)
  (macos-module--show-emoji-picker))
</code></pre>
<p>And with that, we got our native macoOS emoji picker back at our fingertips:</p>
<p><img src="https://xenodium.github.io/images/emacs-macos-native-emoji-picker-revisited/hearts3.webp" alt=""></p>
<p>While the dedicated globe key <em>just worked</em> without configuration, it required newer hardware. This new approach works on older Macbooks too. Since it's an interactive command, you can optionally bind to your preferred keys.</p>
<p>Having said all that, you may have noticed a brief lag during insertion. I haven't worked out the source, but since I rarely use emojis, this will have to do for now. If you have a better macOS alternative working on external keyboards, <a href="https://indieweb.social/@xenodium">I'd love to hear about it</a>!</p>
<p>I've added <code>macos-show-emoji-picker</code> to <code>EmacsMacOSModule</code>, a tiny repo I've used to experiment with <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">emacs-swift-module</a>. You can find <code>EmacsMacOSModule</code> on <a href="https://github.com/xenodium/EmacsMacOSModule">GitHub</a>.</p>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of your favourite text editor and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fresh Eyes 1.7 released</title>
<link>https://xenodium.com/fresh-eyes-17-released</link>
<guid isPermaLink="false">https://xenodium.com/fresh-eyes-17-released</guid>
    <description><![CDATA[<p>Back in April, <a href="https://xenodium.com/fresh-eyes-20-20-20-for-macos">I introduced Fresh Eyes</a>: a tiny macOS utility helping me take care of my eyes.</p>
<p>I spend a bunch of time in front of a computer screen and <a href="https://apps.apple.com/us/app/fresh-eyes/id6480411697">Fresh Eyes</a> has been helping me stick with the often recommended <a href="https://en.wikipedia.org/wiki/Computer_vision_syndrome">20-20-20 rule</a>.</p>
<p><img src="https://xenodium.github.io/images/fresh-eyes-17-released/1.7.webp" alt=""></p>
<p><code>Fresh Eyes</code> 1.7 ships a handful of improvements suggested by users:</p>
<ul>
<li>Postpone Fresh Eyes for 1 hour, 2 hours, 3 hours, or until the next day.</li>
<li>Revamped notification.</li>
<li>Revamped countdown screen.</li>
<li>Reorganized menu.</li>
<li>New keyboard shortcuts.</li>
<li>Fresh Eyes is now translated to German 🇩🇪🇩🇪🇩🇪.</li>
</ul>
<p>One-time purchase; [no]{.underline} subscriptions, [no]{.underline} additional payments, [no]{.underline} ads.</p>
<h2>Want to support <a href="https://lmno.lol/alvaro">my blogging</a> and other <a href="https://github.com/xenodium/">open source work</a>?</h2>
<p>Buy this app (or the <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">others</a>) ;) Tell your friends!</p>
<p>There's always <a href="https://github.com/sponsors/xenodium">GitHub sponsoring</a> if your prefer.</p>
<center>
  <a href="https://apps.apple.com/app/id6480411697">
    <img src="https://xenodium.github.io/images/fresh-eyes-now-on-the-app-store/fresh_eyes_icon.png" alt="Fresh eyes icon" width="100px">
  </a>
  <br/>
  <br/>
  <a href="https://apps.apple.com/app/id6480411697">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of your favourite text editor and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ready Player Mode now on MELPA</title>
<link>https://xenodium.com/ready-player-mode-now-on-melpa</link>
<guid isPermaLink="false">https://xenodium.com/ready-player-mode-now-on-melpa</guid>
    <description><![CDATA[<p>A few weeks ago, I <a href="https://lmno.lol/alvaro/ready-player-mode">announced Ready Player Mode</a>'s availability on <a href="https://github.com/xenodium/ready-player">GitHub</a>. As of today, you can <a href="https://melpa.org/#/ready-player">find it on MELPA</a>.</p>
<p>Ready Player Mode is a lightweight major mode to open media (audio/video) files in an Emacs buffer.</p>
<p>Install, enable via <code>M-x ready-player-mode</code> and you should be good to go.</p>
<p>Open and preview media files (audio + video) like other files. If in repeat mode, ready-player attempts to play other files in the current directory. Track playback from the corresponding <code>dired</code> buffer.</p>
<p><img src="https://xenodium.github.io/images/ready-player-mode-now-on-melpa/ready-player.gif" alt=""></p>
<p>Playback is handled by your favourite command line utility. <code>ready-player-mode</code> will try to use either <a href="https://mpv.io/">mpv</a>, <a href="https://www.videolan.org/vlc/">vlc</a>, <a href="https://ffmpeg.org/ffplay.html">ffplay</a>, or <a href="https://mplayerhq.hu/design7/news.html">mplayer</a> (in that order), but you can customize that. I'd love to hear of other defaults worth considering.</p>
<p>Bonus rendering includes media thumbnails and metadata, if either <a href="https://github.com/dirkvdb/ffmpegthumbnailer">ffmpegthumbnailer</a> or <a href="https://ffmpeg.org/">ffmpeg</a> are found.</p>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of your favourite text editor and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Sun, 21 Jul 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>OCR those buffers</title>
<link>https://xenodium.com/ocr-those-buffers</link>
<guid isPermaLink="false">https://xenodium.com/ocr-those-buffers</guid>
    <description><![CDATA[<p>I've written about <a href="https://github.com/xenodium/macosrec">macosrec</a> before. A tiny macOS command line utility I built to <a href="https://lmno.lol/alvaro/recordscreenshot-windows-the-lazy-way">take screenshots or videos of my macOS windows</a>. Sure, there are a gazillion utilities out there, but I wanted my own, so I could bend and integrate with Emacs buffers as needed.</p>
<p>If you've seen me post a screenshot or gif after April 2023, it was likely taken with <code>macosrec</code>.</p>
<p>As of <code>macosrec</code> v0.7.3, <a href="https://en.wikipedia.org/wiki/Optical_character_recognition">OCR</a> was added to the mix. I've also added a couple of <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-commands</a> (<code>dwim-shell-commands-macos-ocr-text-from-desktop-region</code> and <code>dwim-shell-commands-macos-ocr-text-from-image</code>), so I can do things like:</p>
<h2>OCR region</h2>
<p>Use the mouse to select a region to OCR.</p>
<p><img src="https://xenodium.github.io/images/ocr-those-buffers/ocr-region.gif" alt=""></p>
<p>*This gif area recording was captured via macOS's built-in <code>screencapture</code>.</p>
<h2>OCR dired files</h2>
<p>Selecting any file (or files) in dired OCRs the whole lot.</p>
<p><img src="https://xenodium.github.io/images/ocr-those-buffers/ocr-files.gif" alt=""></p>
<p>*This gif window recording was captured via <a href="https://github.com/xenodium/macosrec">macosrec</a>.</p>
<p>Invoking <code>dwim-shell-commands-macos-ocr-text-from-image</code> from the current image buffer does the job also.</p>
<h2>What about non-macOS users?</h2>
<p>The same approach can be used with any other OCR command line tool. <code>dwim-shell-command</code> includes <code>dwim-shell-commands-tesseract-ocr-text-from-image</code>, which uses <a href="https://github.com/tesseract-ocr/tessdoc">tesseract</a>.</p>
<p>While I've had more reliable results via <code>macosrec</code> (using macOS's Vision API), I'm sure there are other great alternatives on linux. If you know of one, <a href="https://indieweb.social/@xenodium">I'd love to hear</a>.</p>
<h2>Available on github</h2>
<p>Both <a href="https://github.com/xenodium/macosrec">macosrec</a> and <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> are on GitHub and installable via <code>brew install xenodium/macosrec/macosrec</code> and <a href="https://melpa.org/#/dwim-shell-command">MELPA</a> respectively.</p>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of Emacs and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>It's all up for grabs, compound with glue</title>
<link>https://xenodium.com/its-all-up-for-grabs-and-it-compounds</link>
<guid isPermaLink="false">https://xenodium.com/its-all-up-for-grabs-and-it-compounds</guid>
    <description><![CDATA[<p>I've written before, once you learn a little <a href="https://en.wikipedia.org/wiki/Emacs_Lisp">elisp</a>, <a href="https://www.gnu.org/software/emacs/">Emacs</a> becomes this hyper malleable editor/platform. A live playground of sorts, where almost everything is up for grabs. You can inspect and tweak behaviour of just about anything to your liking.</p>
<p>While the compounding benefits of using your favourite Emacs utilities are evident over time, learning elisp takes the compounding effect to another level. It empowers you to have those aha moments like &quot;if I could just wire this awesome utility with that other one, it'd be perfect for me&quot; and enable you to act on it.</p>
<p>Take, for example, <a href="https://github.com/wolray/symbol-overlay">symbol-overlay</a> and <a href="https://github.com/magnars/multiple-cursors.el">multiple-cursors</a>. Two Emacs packages I've been using for years. The first one is a feature you've likely experienced on your favourite IDE or editor without thinking too much about it. Placing your editor cursor on a variable automatically highlights its usages. It's one of those lovely features with zero learning demands.</p>
<p><img src="https://xenodium.github.io/images/its-all-up-for-grabs-and-it-compounds/overlay-symbol.gif" alt=""></p>
<p>The second utility, <a href="https://github.com/magnars/multiple-cursors.el">multiple-cursors</a>, does demand some learning but can be so fun to use once you get the hang of it. Below is a little multiple cursor demo I used recently <a href="https://www.reddit.com/r/emacs/comments/1dyn3zy/comment/lcbi10o/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">in a reddit comment</a>, but you really should check out <a href="https://emacsrocks.com/e13.html">Emacs Rocks! Episode 13: multiple-cursors</a> (stick around for the ending).</p>
<p><img src="https://xenodium.github.io/images/its-all-up-for-grabs-and-it-compounds/mc_x2.gif" alt=""></p>
<p>So where am I going with this? While <a href="https://github.com/wolray/symbol-overlay">symbol-overlay</a> offers a mechanism to rename symbols via <code>symbol-overlay-rename</code>, I prefer <a href="https://github.com/magnars/multiple-cursors.el">multiple-cursors</a> for this kind of thing… &quot;if I could just get <code>symbol-overlay</code> to tell <code>multiple-cursors</code> where to place my cursors, it'd be just perfect for me&quot;.</p>
<p>I've been wanting this tweak for some time. Today's the day I finally act on it. I had no idea how to go about it, but opening <code>symbol-overlay.el</code> (via <code>M-x find-library symbol-overlay</code>) and browsing through all functions (via imenu) yields the first piece I needed: <code>symbol-overlay-get-list</code>.</p>
<p><img src="https://xenodium.github.io/images/its-all-up-for-grabs-and-it-compounds/imenu.png" alt=""></p>
<pre><code class="language-{.commonlisp">(defun symbol-overlay-get-list (dir &amp;optional symbol exclude)
  &quot;Get all highlighted overlays in the buffer.
If SYMBOL is non-nil, get the overlays that belong to it.
DIR is an integer.
If EXCLUDE is non-nil, get all overlays excluding those belong to SYMBOL.&quot;
  ...)
</code></pre>
<p>Let's take <code>symbol-overlay-get-list</code> for a spin, courtesy of <code>M-x eval-expression</code>, and see what we get out of it:</p>
<p><img src="https://xenodium.github.io/images/its-all-up-for-grabs-and-it-compounds/eval.gif" alt=""></p>
<p>With a list of overlays, we now know where to tell <code>multiple-cursors</code> to do its thing. For the second piece, we needed to peek at any of the <code>multiple-cursors</code> commands I already use. I happen to pick <code>mc/mark-all-like-this</code> to examine what's under the hood.</p>
<pre><code class="language-{.commonlisp">(defun mc/mark-all-like-this ()
  &quot;Find and mark all the parts of the buffer matching the currently active region&quot;
  (interactive)
  (unless (region-active-p)
    (error &quot;Mark a region to match first.&quot;))
  (mc/remove-fake-cursors)
  (let ((master (point))
        (case-fold-search nil)
        (point-first (&lt; (point) (mark)))
        (re (regexp-opt (mc/region-strings) mc/enclose-search-term)))
    (mc/save-excursion
     (goto-char 0)
     (while (search-forward-regexp re nil t)
       (push-mark (match-beginning 0))
       (when point-first (exchange-point-and-mark))
       (unless (= master (point))
         (mc/create-fake-cursor-at-point))
       (when point-first (exchange-point-and-mark)))))
  (if (&gt; (mc/num-cursors) 1)
      (multiple-cursors-mode 1)
    (mc/disable-multiple-cursors-mode)))
</code></pre>
<p>The star of the <code>mc/mark-all-like-this</code> attraction is <code>mc/create-fake-cursor-at-point</code>, used to create each cursor. If we can just iterate over the overlays, we'd be able to create a fake cursor per overlay. There's some additional logic needed to ensure all fake cursors are placed in the same relative position within symbol (using an offset). Finally, we need to enable <code>multiple-cursors-mode</code>.</p>
<p>We put it all together in <code>ar/mc-mark-all-symbol-overlays</code>:</p>
<pre><code class="language-{.commonlisp">(defun ar/mc-mark-all-symbol-overlays ()
  &quot;Mark all symbol overlays using multiple cursors.&quot;
  (interactive)
  (mc/remove-fake-cursors)
  (when-let* ((overlays (symbol-overlay-get-list 0))
              (point (point))
              (point-overlay (seq-find
                              (lambda (overlay)
                                (and (&lt;= (overlay-start overlay) point)
                                     (&lt;= point (overlay-end overlay))))
                              overlays))
              (offset (- point (overlay-start point-overlay))))
    (setq deactivate-mark t)
    (mapc (lambda (overlay)
            (unless (eq overlay point-overlay)
              (mc/save-excursion
               (goto-char (+ (overlay-start overlay) offset))
               (mc/create-fake-cursor-at-point))))
          overlays)
    (mc/maybe-multiple-cursors-mode)))
</code></pre>
<p>and with that, you finally get to see it all in action…</p>
<p><img src="https://xenodium.github.io/images/its-all-up-for-grabs-and-it-compounds/symbol-overlay-meets-multiple-cursors.gif" alt=""></p>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of Emacs (or your favourite text editor) and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ready Player Mode</title>
<link>https://xenodium.com/ready-player-mode</link>
<guid isPermaLink="false">https://xenodium.com/ready-player-mode</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/ready-player-mode/meme.gif" alt=""></p>
<p>As an Emacs user, I eventually made the leap over to <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> as my file manager of choice. Dired has <a href="https://xenodium.com/emacs-git-rename-courtesy-of-dired/">magical things like wdired</a>. But this post isn't so much about dired and more about the occasional need to peek at media files (images, audio, and video) from Emacs (including dired).</p>
<p>To view images in Emacs, there's <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Image-Mode.html">image mode</a>, a fantastic major mode for taking a quick look without leaving your editor. Image mode strikes a great balance. You can get in quickly and out. The <code>q</code> keyboard binding is fabulous for bailing out. While viewing an image, you may quickly open the previous/next one by using <code>n</code> and <code>p</code> keyboard binding. For me, this is just about all I need within my text editor. For anything else, I resort to my favorite image viewing app (macOS's Preview).</p>
<p>For audio and video, we aren't as lucky with Emacs built-in features (even for a quick peek). While Emacs faithfully opens the files, it's not realistically practical for my typical needs.</p>
<p><img src="https://xenodium.github.io/images/ready-player-mode/no-handling.png" alt=""></p>
<p>There's a convenient package aptly named <a href="https://github.com/jpkotta/openwith">openwith</a>, which automatically opens specific files in an external app. This isn't just for media files, but anything really. It works well with office docs, for example. While I've used it for quite some time, I found always bouncing to an external app for peeking at audio/video somewhat suboptimal.</p>
<p>While a <a href="https://www.reddit.com/r/emacs/comments/1dtnjy7/is_there_imageview_but_for_audio">reddit post</a> yielded some handy options, none were in the same spirit as image mode. Having said that, I did come across <a href="https://github.com/xFA25E/mediainfo-mode">mediainfo-mode</a> on my search, which is pretty neat for viewing media metadata quickly. Bonus points for <code>q</code> keyboard binding to exit and <code>mediainfo-mode-open</code> command to open with an external app. There may be other packages out there (I'd love to hear about them), though most seemed to focus on listening to music (and playlist management), which is a different flow from what I'm after.</p>
<h2>Ready player mode enters the chat</h2>
<p>With all that, I had no choice (I kid of course) but to go and throw some lines of elisp together and see if I could get to my ideal media experience, and so <a href="https://github.com/xenodium/ready-player">ready player mode</a> was born…</p>
<p><img src="https://xenodium.github.io/images/ready-player-mode/ready-player.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/ready-player-mode/video-player.png" alt=""></p>
<p>As core features, <code>ready-player-mode</code> has two buttons: one to play from within Emacs and one to open media in the preferred external app. You can <code>TAB</code> your way to the buttons. <code>RET</code> or <code>click</code> actions the buttons, in addition to the <code>SPC</code> keyboard binding to toggle playback.</p>
<p>Like image mode, <code>ready-player-mode</code> offers <code>n/p</code> navigation to open the next/previous media file in the current directory.</p>
<p><code>ready-player-mode</code> attempts to display basic metadata if possible, courtesy of <code>ffprobe</code> and <code>ffmpeg</code>. You'll need these installed on your system if you want the optional metadata.</p>
<p>Playback is handled by your favourite command line utility. <code>ready-player-mode</code> will try to use either <a href="https://mpv.io/">mpv</a>, <a href="https://www.videolan.org/vlc/">vlc</a>, <a href="https://ffmpeg.org/ffplay.html">ffplay</a>, or <a href="https://mplayerhq.hu/design7/news.html">mplayer</a> (in that order), but you can customize that.</p>
<p><code>ready-player-mode</code> is available on <a href="https://github.com/xenodium/ready-player">GitHub</a> if you're keen to check it out. Keep in mind this is a brand new package (a day old!), so it may need some improvements. If you do give it a try, <a href="https://indieweb.social/@xenodium">I'd love to hear</a> how you got on. I've only tested on macOS so far.</p>
<h2>Unrelated - Want your own blog?</h2>
<p>Like this blog? Want to start a blog? Run your blog off a single file. Write from the comfort of Emacs and <a href="https://indieweb.social/@xenodium/112265481282475542">drag and drop to the web</a>. I'm launching a blogging service at <a href="https://lmno.lol">lmno.lol</a>. Looking for early adopters. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
]]></description>
    <pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hey mouse, don't mess with my Emacs font size</title>
<link>https://xenodium.com/hey-mouse-dont-mess-with-my-emacs-font-size</link>
<guid isPermaLink="false">https://xenodium.com/hey-mouse-dont-mess-with-my-emacs-font-size</guid>
    <description><![CDATA[<p>While most of my Emacs workflows are typically keyboard-driven, I'm fairly pragmatic about mouse usage. My MacBook's trackpad is great for just kicking back to read and scroll through text.</p>
<p>There are brief times, however, when that keyboard-driven muscle memory overlaps my mouse usage, resulting in a buffer catastrophe. I joke of course. What I'm actually referring to is nothing more than a slight annoyance. There are times when I inadvertently trigger <code>&lt;C-wheel-up&gt;</code> or <code>&lt;C-wheel-down&gt;</code> events (because I happen to hold <code>Ctrl</code> down while triggering scrolling events). This results in buffer font size quickly changing to either really large or super small, depending on whether I was scrolling up or down at the time. The snafu is further exacerbated by inertial scrolling on trackpads. Go ahead and press the Ctrl key while your buffer is carrying some of that inertia. The font size is affected just the same, even though there was no explicit physical/touching activity on the trackpad at the time.</p>
<p><img src="https://xenodium.github.io/images/hey-mouse-dont-mess-with-my-emacs-font-size/scroll-reduces-font-size.gif" alt=""></p>
<p>While this behaviour was a little annoying, I would typically just reopen the file via <code>C-x C-v RET</code> (aka <code>find-alternate-file</code>), which would reset the font size as a convenient side-effect. Now, you may wonder if reopening the file would also forget the point/cursor position, but that's not an issue if you've got the handy built-in <a href="https://www.emacswiki.org/emacs/SavePlace">save-place-mode</a> turned on (highly recommended).</p>
<p>Ok and all, but this is a second-class workaround at best. What I really wanted is for the mouse/trackpad to stop messing with my font size.</p>
<p>Lucky for me, I bumped into a <a href="https://indieweb.social/@goldayan@clj.social/112195984778424216">simple solution</a> shared by <a href="https://indieweb.social/@shanecelis@mastodon.gamedev.place">Shane Celis</a> and <a href="https://indieweb.social/@goldayan@clj.social">Thanga Ayyanar</a>. It worked a treat, and it's only a few lines of elisp.</p>
<pre><code class="language-{.commonlisp">(global-set-key (kbd &quot;&lt;pinch&gt;&quot;) 'ignore)
(global-set-key (kbd &quot;&lt;C-wheel-up&gt;&quot;) 'ignore)
(global-set-key (kbd &quot;&lt;C-wheel-down&gt;&quot;) 'ignore)
</code></pre>
<p>Thank you folks. Balance restored.</p>
<h2>Update</h2>
<p>While I was using <code>C-x C-v RET</code> (aka <code>find-alternate-file</code>) to reset font size, <a href="https://fosstodon.org/@lukeshu/112577135094007001">Luke T. Shumaker</a> and <a href="https://social.lol/@starbreaker/112577354623711993">Matthew G.</a> shared a better reset alternative:</p>
<pre><code class="language-{.commonlisp">C-u 0 M-x text-scale-adjust
</code></pre>
]]></description>
    <pubDate>Fri, 07 Jun 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: git rename, courtesy of dired</title>
<link>https://xenodium.com/emacs-git-rename-courtesy-of-dired</link>
<guid isPermaLink="false">https://xenodium.com/emacs-git-rename-courtesy-of-dired</guid>
    <description><![CDATA[<p>Emacs <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Wdired.html">wdired</a> is a beautiful thing. You turn a directory representation into an editable buffer and you can do some magic. By magic, I mean you can apply your favourite text-editing commands to a directory and do some file management.</p>
<p>Take, for example, batch-renaming. Turn <code>wdired</code> on via <code>dired-toggle-read-only</code>, use something like Magnar's <a href="https://github.com/magnars/multiple-cursors.el">multiple-cursors</a> (or built-in <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html">keyboard macros</a>) and commit via <code>wdired-finish-edit</code> (using the often-familar <code>C-c C-c</code> binding). You've now renamed multiple files as it if were any other text buffer. Pretty magical.</p>
<p><img src="https://xenodium.github.io/images/emacs-git-rename-courtesy-of-dired/wdired.gif" alt=""></p>
<p>One downside (or so I thought) is that wdired didn't automagically also take care of git renames for me, you know <a href="https://xenodium.com/emacs-dwim-do-what-i-mean/">DWIM-style</a>.</p>
<p>Every time I renamed anything via <code>wdired</code> and subsequently pulled up my trusty <a href="https://magit.vc/">magit</a>, I was a little sad it wasn't all just handled… The renamed files were seen as deleted, along with all the untracked counterparts.</p>
<p><img src="https://xenodium.github.io/images/emacs-git-rename-courtesy-of-dired/rename-no-git.png" alt=""></p>
<p>So, I set out to change this unacceptable state of affairs 😀. I started off by setting a breakpoint on <code>wdired-finish-edit</code> via edebug (see <a href="https://xenodium.com/inline-previous-result-and-why-you-should-edebug/">why this util is awesome</a>).</p>
<p>I wanted to see what <code>wdired-finish-edit</code> did under the hood, which led me to <code>dired-rename-file</code>. As I stepped through the code, I spotted the <code>dired-vc-rename-file</code> variable, which does exactly what you think it does 🤦.</p>
<p>One <code>setq</code> later…</p>
<pre><code class="language-{.commonlisp">(setq dired-vc-rename-file t)
</code></pre>
<p>…and boom! From now on, renaming from dired does exactly what you would expect. Here's <code>magit</code> to prove it:</p>
<p><img src="https://xenodium.github.io/images/emacs-git-rename-courtesy-of-dired/rename-with-git.png" alt=""></p>
<p>lol. I was so fixated on &quot;adding git rename support&quot;, that I forgot to first search the documentation.</p>
<p>While you can search for variables via the built-in <code>describe-variable</code>, I'm a fan of Wilfred's <a href="https://github.com/Wilfred/helpful">helpful</a> equivalent: <code>helpful-variable</code>. Coupled with with your favourite completion framework (Abo Abo's <a href="https://github.com/abo-abo/swiper">ivy</a> for me), it's as easy a fuzzy searching for anything you're after:</p>
<p><img src="https://xenodium.github.io/images/emacs-git-rename-courtesy-of-dired/dired-vc-rename-file.png" alt=""></p>
<p><em>This post is also at <a href="https://lmno.lol/alvaro/emacs-git-rename-courtesy-of-dired">lmno.lol</a>.</em></p>
]]></description>
    <pubDate>Thu, 16 May 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fresh Eyes now on the App Store</title>
<link>https://xenodium.com/fresh-eyes-now-on-the-app-store</link>
<guid isPermaLink="false">https://xenodium.com/fresh-eyes-now-on-the-app-store</guid>
    <description><![CDATA[<p>A couple of days ago, <a href="https://xenodium.com/fresh-eyes-20-20-20-for-macos">I introduced Fresh Eyes</a>, a little macOS utility to help me practice the <a href="https://en.wikipedia.org/wiki/Computer_vision_syndrome">20-20-20 rule</a> and take better care of my vision while on the computer.</p>
<p><img src="https://xenodium.github.io/images/fresh-eyes-now-on-the-app-store/big-sur-eyes.gif" alt=""></p>
<p>Today, <a href="https://apps.apple.com/app/id6480411697">Fresh Eyes</a> was approved and is now available on the macOS App Store.</p>
<center>
  <a href="https://apps.apple.com/app/id6480411697">
    <img src="https://xenodium.github.io/images/fresh-eyes-now-on-the-app-store/fresh_eyes_icon.png" alt="Fresh eyes icon" width="100px">
  </a>
  <br/>
  <br/>
  <a href="https://apps.apple.com/app/id6480411697">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Fri, 05 Apr 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fresh Eyes: 20-20-20 for macOS</title>
<link>https://xenodium.com/fresh-eyes-20-20-20-for-macos</link>
<guid isPermaLink="false">https://xenodium.com/fresh-eyes-20-20-20-for-macos</guid>
    <description><![CDATA[<p>I've been lucky to have enjoyed healthy vision throughout my life. That is, until recently. Nothing major, I'll need glasses for some activities. I also learned from the optometrist I should follow the <a href="https://www.sbs.nhs.uk/information/home-working-looking-after-eyes">20-20-20 rule</a> to reduce eye strain.</p>
<p>The <strong>20-20-20 rule</strong> is simple:</p>
<p>Take a break from looking at your computer screen every <strong>20 minutes</strong> and look away at something roughly <strong>20 feet away</strong> (6 metres) for <strong>20 seconds</strong>.</p>
<p>While there are no shortages of macOS timer apps available, I figured it'd be fun to build a 20-20-20 one anyway.</p>
<p>Meet <strong>Fresh Eyes</strong>. I've been using it in the last few days. If you'd like to give it a try, send me an email at me@xenodium.com and I'll reply with a TestFlight invite.</p>
<p><img src="https://xenodium.github.io/images/fresh-eyes-20-20-20-for-macos/fresh-eyes.gif" alt=""></p>
<p>If looking for alternatives, <a href="https://samuelwflint.com/">Samuel W. Flint</a> <a href="https://emacs.ch/@swflint/112197147526251145">offers a couple of great options</a>:</p>
<ul>
<li>On Emacs: <a href="https://github.com/alphapapa/hammy.el/tree/master">hammy.el</a> by <a href="https://github.com/alphapapa">Adam Porter (alphapapa)</a>.</li>
<li>On Linux/Windows (GTK-based): <a href="https://workrave.org/">Workrave</a> by Raymond Penners &amp; Rob Caeler.</li>
</ul>
<h2>Update</h2>
<p><a href="https://apps.apple.com/app/id1558358855">Fresh Eyes</a> has now <a href="https://xenodium.com/fresh-eyes-now-on-the-app-store">been approved and is available on the macOS App Store</a>.</p>
<center>
  <a href="https://apps.apple.com/app/id6480411697">
    <img src="https://xenodium.github.io/images/fresh-eyes-now-on-the-app-store/fresh_eyes_icon.png" alt="Fresh eyes icon" width="100px">
  </a>
  <br/>
  <br/>
  <a href="https://apps.apple.com/app/id6480411697">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Wed, 03 Apr 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs 29.3 emergency release</title>
<link>https://xenodium.com/emacs-293-emergency-release</link>
<guid isPermaLink="false">https://xenodium.com/emacs-293-emergency-release</guid>
    <description><![CDATA[<p>It was only last week when I upgraded to Emacs 29.2. Yup, I was late to the party. This week, we have a new release.</p>
<p>Emacs 29.3 is an <a href="https://lists.gnu.org/archive/html/emacs-devel/2024-03/msg00611.html">emergency bugfix release</a>, so this time I've upgraded promptly. I'm on macOS using the great <a href="https://github.com/d12frosted/homebrew-emacs-plus">Emacs Plus</a> so upgraded via <a href="https://brew.sh/">Homebrew</a> using:</p>
<pre><code class="language-{.bash">brew reinstall emacs-plus@29 --with-imagemagick --with-no-frame-refocus --with-native-comp --with-savchenkovaleriy-big-sur-3d-icon --with-poll
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-293-emergency-release/29.3.png" alt=""></p>
<p>ps. Like this splash screen? Check out the <a href="https://xenodium.com/my-emacs-eye-candy/">Emacs eye candy post</a>.</p>
]]></description>
    <pubDate>Mon, 25 Mar 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Toggling the continuation indicator</title>
<link>https://xenodium.com/toggling-emacs-continuation-fringe-indicator</link>
<guid isPermaLink="false">https://xenodium.com/toggling-emacs-continuation-fringe-indicator</guid>
    <description><![CDATA[<p>By default, Emacs typically displays curly arrows when wrapping lines. While likely a handy feature to some, I didn't really find much use for it. At the same time, I never looked into their removal until now.</p>
<p>Turns out, there's a <code>continuation</code> entry in <code>fringe-indicator-alist</code> variable that handles this. Removing this entry also removes the curly arrows.</p>
<pre><code class="language-{.commonlisp">(setq-default fringe-indicator-alist
              (delq (assq 'continuation fringe-indicator-alist) fringe-indicator-alist))
</code></pre>
<p>Alternatively, one could write a simple function to toggle displaying the continuation indicator.</p>
<p><img src="https://xenodium.github.io/images/toggling-emacs-continuation-fringe-indicator/curly.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(defun toggle-continuation-fringe-indicator ()
  (interactive)
  (setq-default
   fringe-indicator-alist
   (if (assq 'continuation fringe-indicator-alist)
       (delq (assq 'continuation fringe-indicator-alist) fringe-indicator-alist)
     (cons '(continuation right-curly-arrow left-curly-arrow) fringe-indicator-alist))))
</code></pre>
<p>That's it for this post. A tiny tip. Perhaps there's a better way to handle it. If you know, I'd love to know too (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
]]></description>
    <pubDate>Sun, 24 Mar 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>The Org bundle</title>
<link>https://xenodium.com/the-org-bundle</link>
<guid isPermaLink="false">https://xenodium.com/the-org-bundle</guid>
    <description><![CDATA[<p>I have <a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">three apps on the App Store</a>: <a href="https://plainorg.com">Plain Org</a>, <a href="https://flathabits.com/">Flat Habits</a>, and <a href="https://apps.apple.com/us/app/scratch/id1671420139">scratch</a>.</p>
<h2>Plain Org / <a href="https://plainorg.com">plainorg.com</a></h2>
<p>My more generic solution to access org files on the go and away from Emacs.</p>
<p><img src="https://xenodium.github.io/images/the-org-bundle/plainorg-600x0w.png" alt=""></p>
<h2>Flat Habits / <a href="https://flathabits.com/">flathabits.com</a></h2>
<p>My take on frictionless habit tracking truly respecting user privacy and their time (absolutely no distractions).</p>
<p><img src="https://xenodium.github.io/images/the-org-bundle/flathabits-600x0w.png" alt=""></p>
<h2><code>*scratch*</code> / <a href="https://apps.apple.com/us/app/scratch/id1671420139">App Store</a></h2>
<p>Sure, we have tons of note-taking apps but most require more steps than desirable to write something down ASAP. Launch the app and you're good to write. No new note creation, bring keyboard up, etc.</p>
<p><img src="https://xenodium.github.io/images/the-org-bundle/scratch-600x0w.webp" alt=""></p>
<h2>Common denominator</h2>
<p>In addition to being offline-first, no cloud, no login, no ads, no tracking, no social… each app targets a specific purpose, sharing an important common denominator: they all use <a href="https://orgmode.org/">org markup</a> as the underlying storage.</p>
<h2>The Org bundle / <a href="https://apps.apple.com/us/app-bundle/the-org-bundle/id1717663541">App Store</a></h2>
<p>While you can still get each of my apps individually, you now have the option to get them all as a single bundle: <a href="https://apps.apple.com/us/app-bundle/the-org-bundle/id1717663541">The Org bundle</a>.</p>
<p><img src="https://xenodium.github.io/images/the-org-bundle/bundle.png" alt=""></p>
<h2>Journelly joining the bundle soon…</h2>
<p>Continuing on the org storage theme, I got another app in the works. Also joining <a href="https://apps.apple.com/us/app-bundle/the-org-bundle/id1717663541">The Org bundle</a>, maintaining its privacy-first approach: offline, no cloud, no login, no ads, no tracking, no social… this time in the journaling space.</p>
<p>Journelly is currently <a href="https://xenodium.com/an-ios-journaling-app-powered-by-org-plain-text">in beta, want to join</a>?</p>
<p><img src="https://xenodium.github.io/images/the-org-bundle/journelly-demo.gif" alt=""></p>
]]></description>
    <pubDate>Fri, 22 Mar 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>sqlite-mode-extras on MELPA</title>
<link>https://xenodium.com/sqlite-mode-extras-on-melpa</link>
<guid isPermaLink="false">https://xenodium.com/sqlite-mode-extras-on-melpa</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/sqlite-mode-goodies/sqlite-previous.gif" alt=""></p>
<p>Emacs 29 <a href="https://xenodium.com/emacs-29s-sqlite-mode">introduced the handy sqlite-mode</a>. Soon after, I tried a couple of experiments <a href="https://xenodium.com/further-sqlite-mode-extensions/">here</a> and <a href="https://xenodium.com/sqlite-mode-goodies">there</a> to bring additional functionality.</p>
<p>Folks reached out. The additions seemed useful to them and were keen on upstreaming or pushing to MELPA. While I can't commit to upstreaming at this moment, I can happily meet halfway on MELPA.</p>
<p>As of a couple of days, you can find <a href="https://github.com/xenodium/sqlite-mode-extras">sqlite-mode-extras</a> on <a href="https://melpa.org/#/sqlite-mode-extras">MELPA</a> and <a href="https://github.com/xenodium/sqlite-mode-extras">GitHub</a>. Contributions <a href="https://github.com/xenodium/sqlite-mode-extras/pulls?q=is%3Apr">totally welcome</a>.</p>
<p>While I haven't heard of issues, please continue treating the package as experimental and exercise safety with your data. Please back up.</p>
]]></description>
    <pubDate>Tue, 19 Mar 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Som tam salad dressing recipe (improvised)</title>
<link>https://xenodium.com/som-tam-salad-dressing-recipe-improvised</link>
<guid isPermaLink="false">https://xenodium.com/som-tam-salad-dressing-recipe-improvised</guid>
    <description><![CDATA[<p>Lately, I've been slightly obsessed with <a href="https://cooking.nytimes.com/recipes/1012589-som-tum-green-papaya-salad">Som Tam</a>, a magnificent salad packing both crunch and flavour.</p>
<p>I didn't have all the right ingredients for the full-blown salad at home, so I set out to experiment with the dressing's punchy flavours. While I've gone a little rogue here, I mean no disrespect to the faithful recipe and all its glory. Luckily, I did have fish sauce at home, which I considered the core ingredient, and made do with everything else I could find.</p>
<p>This is where I landed:</p>
<ul>
<li>2 cloves of garlic</li>
<li>Thai chillies to taste (improvised with chilli flakes)</li>
<li>2 tablespoons of fish sauce</li>
<li>1 tablespoons of palm sugar (improvised with honey)</li>
<li>2 limes squeezed (improvised with lemon)</li>
<li>1 tablespoon of dried shrimp (didn't have any)</li>
<li>1 small plum tomato (I used 2 of those bite-size ones)</li>
</ul>
<p>Using my trusty mortar and pestle, I ground and crushed the garlic, chilli flakes, and tomato, forming a paste of sorts. Then added the remaining liquids (fish sauce, honey and lemon) diluting the paste.</p>
<ul>
<li>2 tablespoons of roasted peanuts (roasted some cashews)</li>
</ul>
<p>Most recipes seem to suggest using peanuts, though my local Thai restaurant uses cashews. Luckily I had cashews at home, so I'm copied my local. Roasted them on pan for a few minutes.</p>
<p>As you can imagine, I didn't just have a green papaya laying around at home, so I experimented with other crunchy veggies. While I won't reveal what the other veggies were (oh man, I've gone way off script), both my other half and I were happy with the results.</p>
<p>Som Tam dressing packs an awesome punch. If your salads were feeling a little boring, give this a try!</p>
]]></description>
    <pubDate>Tue, 19 Mar 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>My first bread (pane dei Castelli recipe)</title>
<link>https://xenodium.com/my-first-bread-pane-dei-castelli-recipe</link>
<guid isPermaLink="false">https://xenodium.com/my-first-bread-pane-dei-castelli-recipe</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/my-first-bread-pane-dei-castelli-recipe/my-bread.jpg" alt=""></p>
<p>I followed <a href="https://www.emmafontanella.com/the-easiest-no-knead-bread">The easiest no knead bread recipe</a> (<a href="https://www.youtube.com/watch?v=3xtj9X1jDc0">video</a>).</p>
<h2>No-knead method</h2>
<h3>Dough</h3>
<ul>
<li>1 1/4 cups (300g) lukewarm water</li>
<li>2 teaspoons (8g) salt</li>
<li>1 teaspoon (3.5g) yeast</li>
<li>3 cups (420g) all purpose flour</li>
</ul>
<p>Mix thoroughly (I like to use Ciro's spoon mixing method from <a href="https://www.bbc.com/travel/article/20200415-how-to-make-pizza-like-a-neapolitan-master">this video</a>), cover and rest for 6 hours. Stretch and fold if the dough collapsed on itself to rescue.</p>
<h3>Bake</h3>
<ul>
<li>Preheat oven (and dutch oven) at 230°C.</li>
<li>Flour.</li>
</ul>
<p>I didn't have a dutch oven, but my oven-proof saucepans (with lid) did just fine. Carefully take the pan out of the oven, sprinkle the bottom with some flour, and place the dough inside. Cover with lid (careful, also hot) and bake for 30-35 minutes.</p>
<h3>Crust</h3>
<ul>
<li>Reduce heat to 200°C.</li>
</ul>
<p>Remove the lid and bake for another 10 minutes or until you get the crust darkness of your choice.</p>
<h3>Rest</h3>
<p>Let the bread cool on a cooling rack for 45 mins before cutting. If no rack available, set upsidedown.</p>
<h2>Stretch and fold method</h2>
<h3>Dough</h3>
<ul>
<li>1 1/4 cups (300g) lukewarm water</li>
<li>2 1/2 teaspoons (10g) salt</li>
<li>2 teaspoon (7g) yeast</li>
<li>3 cups (420g) all purpose flour</li>
</ul>
<p>Mix thoroughly (I like to use Ciro's spoon mixing method from <a href="https://www.bbc.com/travel/article/20200415-how-to-make-pizza-like-a-neapolitan-master">this video</a>), cover and rest for 6 hours. Stretch and fold if the dough collapsed on itself to rescue.</p>
<h3>Stretch and fold</h3>
<p>See <a href="https://www.emmafontanella.com/the-easiest-no-knead-bread">Emma Fontanella</a>'s stretch and fold technique and apply 4-5 times every 30 mins.</p>
<h3>Follow no-knead method</h3>
<p>Remaining steps are the same as the no-knead method.</p>
]]></description>
    <pubDate>Thu, 14 Mar 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Seafood stew recipe</title>
<link>https://xenodium.com/seafood-stew-recipe</link>
<guid isPermaLink="false">https://xenodium.com/seafood-stew-recipe</guid>
    <description><![CDATA[<p>I've made this seafood stew a handful of times and it's always delivered.</p>
<p><img src="https://xenodium.github.io/images/seafood-stew-recipe/IMG_7030.jpg" alt=""></p>
<h2>Garlic almond paste</h2>
<ul>
<li>1/8 cup of olive oil.</li>
<li>8 cloves of garlic chopped.</li>
<li>1/4 cup almond meal (flour).</li>
</ul>
<p>Cook garlic in low-medium heat until softened. Add almond meal and cook 3-4 mins or until golden. Set aside to cool.</p>
<ul>
<li>1 large handful of parsley.</li>
</ul>
<p>Blend the almond mixture to make a paste. Set aside.</p>
<h2>Spices</h2>
<ul>
<li>1 large onion halved and sliced.</li>
</ul>
<p>In a large pan, cook onion until softened.</p>
<ul>
<li>1/8 cup of olive oil.</li>
<li>1 large red chilli finely chopped (on occasions, I use chilli flakes).</li>
<li>1 teaspoon of smoked paprika.</li>
<li>2 bay leaves.</li>
</ul>
<p>Add chilli, paprika, and bay leaves and cook for 30 seconds (or fragrant).</p>
<h2>Liquids</h2>
<ul>
<li>1/3 cup dry white wine (I've used cooking sake on occasion).</li>
<li>1000g of passata (typically comes in 500g packs).</li>
<li>400g plum tomatoes tin (undrained).</li>
<li>1 teaspoon of saffron threads (soaked in 2 tablespoons of water).</li>
<li>1 tablespoon of tomato paste.</li>
<li>2 cups of fish stock (I've used 2 stock cubes + same amount of water).</li>
</ul>
<p>Add the wine, passata, plum tomatoes, saffron, tomato pate, and fish stock. Simmer for 10 minutes.</p>
<h2>Fish</h2>
<ul>
<li>700g of firm white fish (cut into 5 cm chunks).</li>
<li>12 mussels.</li>
</ul>
<p>Add the almond paste, fish, and mussels. Cook for 3-4 minutes.</p>
<ul>
<li>12 prawns (shelled).</li>
</ul>
<p>Add the prawns. Cook for 3 minutes (or pink).</p>
<h2>Finishing touches</h2>
<p>Season with salt and pepper to taste. I've added roughly a teaspoon of salt.</p>
<p>Garnish generously with parsley and you're good to go.</p>
]]></description>
    <pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A Cloudflare Workers primer: hello world</title>
<link>https://xenodium.com/a-cloudflare-workers-primer-hello-world</link>
<guid isPermaLink="false">https://xenodium.com/a-cloudflare-workers-primer-hello-world</guid>
    <description><![CDATA[<pre><code class="language-example">o______________o
| Hello world! |
o--------------o
        \   ^__^
         \  (oo)_______
            (__)\       )\/\
                ||----w |
                ||     ||

</code></pre>
<p>Keen to get started with your <em>Hello World</em> Cloudflare Worker? Skip to the <a href="id:cloudflare-worker-hello-world-setup">setup</a> section.</p>
<h2>A little background</h2>
<p>The vast majority of my software development experience has been centered around client-side software. The few times I've needed a server-side component for a hobby project, I've historically provisioned a linux <a href="https://en.wikipedia.org/wiki/Virtual_machine">virtual machine</a> somewhere and ran whatever services I needed. I have to admit though, I don't enjoy the provisioning process, configuration, maintenance, upgrades, database admin, etc. which take time away from the part I enjoy more: building and experimenting with features.</p>
<p>While <a href="https://en.wikipedia.org/wiki/Containerization_(computing)">containers</a> have made things somewhat simpler, much of the maintenance tradeoffs remain.</p>
<p>These days, the server-managing overhead has been greatly reduced by &quot;<a href="https://en.wikipedia.org/wiki/Serverless_computing">serverless</a>&quot; solutions. Odd terminology for a server offering, but I digress. It more or less refers to removing most of that additional responsibility that comes with managing your own servers and enabling you to focus on building your business logic. Having said that, I've typically shied away from these services, with the possibly irrational fear of vendor lock-in.</p>
<p>The thing is, if most of my potential server-side needs merely require an entry point (where I could route/handle incoming requests) and possibly some persistence (maybe a database), I should be able to abstract these things away and build server-side logic against portable abstractions. With that in place, maybe there's little vendor lock-in to worry about? Who knows, the devil's in the detail. If I keep shying away from these services, I'll never know, so maybe I should try some and see.</p>
<h2>Let's try Cloudflare Workers</h2>
<p>There are no shortages of serverless options offering <a href="https://en.wikipedia.org/wiki/Function_as_a_service">functions as a service</a>. Google Cloud, AWS Lambda, Azure Functions, Vercel Functions, Netlify Functions, Fastly, Cloudflare workers, I could go on…</p>
<p>While I haven't researched the different offerings, I had made a mental note to check out Cloudflare Workers as they had <a href="https://blog.cloudflare.com/introducing-d1">announced D1</a>, their database backed by SQLite …and who doesn't love SQLite? ;) OK, I'm no expert here, but I have had a pleasant experience whenever I've used it. These days, even <a href="https://xenodium.com/emacs-29s-sqlite-mode/">Emacs 29 got some SQLite love</a>, which prompted me to add <a href="https://xenodium.com/sqlite-mode-goodies/">cell navigation/navigation</a> and <a href="https://xenodium.com/further-sqlite-mode-extensions/">try other experiments</a>.</p>
<h2>D1 / SQLite in beta</h2>
<p>Keep in mind that D1 is in public beta and not yet recommended for large production workloads. From the <a href="https://developers.cloudflare.com/d1/">Cloudflare site</a>:</p>
<blockquote>
<p>&quot;While the D1 team expects breaking changes and issues to be minimal, they may still occur. The D1 team generally does not recommend running large production workloads on beta products.&quot;</p>
</blockquote>
<h2>Workers cost</h2>
<p>In terms of pricing (as of 2024-01-13), the <a href="https://developers.cloudflare.com/workers/platform/pricing">free tier</a> enables workers to handle up 100,000 requests per day. Plenty for trying things out.</p>
<p>In any case, we're only checking out Cloudflare's offering, so let's move on…</p>
<h2>Settings up a new Cloudflare Worker (via web dash) {#settings-up-a-new-cloudflare-worker-via-web-dash id=&quot;cloudflare-worker-hello-world-setup&quot;}</h2>
<p>Cloudflare has a tiny snippet on their <a href="https://workers.cloudflare.com/">Workers landing page</a> that sets things up rather quickly, but [I won't be using it]{.underline}.</p>
<pre><code class="language-{.bash">~/ $ npm create cloudflare -- my-app
~/ $ cd my-app
~/ $ npx wrangler deploy
Published https://my-app.world.workers.dev
</code></pre>
<p>⚠️ <em>Note: before you get copying and pasting, read on.</em></p>
<p>Cloudflare's snippet is helpful, but it does quite a bit under the hood. I'm somewhat of a node and serverless noob, so I wanted to understand things a little more and figure out the bare minimum needed to start a minimal Cloudflare Worker project.</p>
<p>Instead, we'll first click here and there over at <a href="https://dash.cloudflare.com">https://dash.cloudflare.com</a> to spin off our new worker from the web and later continue from the command line.</p>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/cf-new-0.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/cf-new-1.png" alt=""></p>
<p>Give the worker a name. We'll call it &quot;todos&quot; to give ya a little sneak peek at what the next post is possibly about… But you can call it whatever you'd like. Keep in mind you'll need to use this name to refer to your new worker.</p>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/cf-new-2.png" alt=""></p>
<p>Congrats, you've now deployed a new worker. You can access it via the URL that looks something like <a href="https://todos.somewhere.workers.dev">https://todos.somewhere.workers.dev</a></p>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/hello-dark.png" alt=""></p>
<p>This is great and all, but we want to build something with this new worker, so let's set up our local development environment…</p>
<h2>Prerequisites</h2>
<p>You'll need <a href="https://nodejs.org/">node.js</a> installed on your machine.</p>
<p>I happen to be on macOS, so I installed node via <a href="https://brew.sh/">Homebrew</a>.</p>
<pre><code class="language-{.bash">brew install node
</code></pre>
<h2>Create a new node project</h2>
<p>We want to start with a bare bones node project, so let's do just that.</p>
<pre><code class="language-{.bash">mkdir HelloCloudflareWorker
cd HelloCloudflareWorker
npm init -y
</code></pre>
<h2>Install TypeScript (compiler)</h2>
<p>I like some guardrails when targetting Javascript, so I'll use the <a href="https://www.typescriptlang.org">TypeScript</a> compiler in this project. Let's install it.</p>
<pre><code class="language-{.bash">npm install --save-dev typescript
npx tsc --init
</code></pre>
<h2>Install Cloudflare Typescript types</h2>
<p>To have Cloudflare types information accessible to the TypeScript compiler, we'll need to install that too.</p>
<pre><code class="language-{.bash">npm install --save-dev @cloudflare/workers-types
</code></pre>
<h2>Install Wrangler (Cloudflare tooling)</h2>
<p>To manage your worker from the command-line, you'll need Cloudflare's <a href="https://developers.cloudflare.com/workers/wrangler/">wrangler</a> tool. Let's install it.</p>
<pre><code class="language-{.bash">npm install --save-dev wrangler
</code></pre>
<h2>Point Wrangler to our worker</h2>
<p>We're done installing things now. Let's point wrangler to our new worker by creating its config file.</p>
<p><code>wrangler.toml</code></p>
<pre><code class="language-{.bash">name = &quot;todos&quot;
main = &quot;worker/worker.ts&quot;
</code></pre>
<h2>Worker entry point</h2>
<p>By default, the worker we created using Cloudflare's dash has the following entry point:</p>
<pre><code class="language-{.javascript">export default {
  async fetch(request, env, ctx) {
    return new Response( 'Hello World!'):
  }
}
</code></pre>
<p>However, this isn't yet included in our development environment. We need to write our first bit of code. You may have noticed our <code>wrangler.toml</code> is pointing to the main entry point (<code>worker/worker.ts</code>) and this file doesn't exist yet. Let's create it, though be sure to also create its owning directory:</p>
<pre><code class="language-{.bash">mkdir worker
</code></pre>
<p>Now we can create our very own <code>worker/worker.ts</code>. Let's make the first change that shapes worker to our liking. Rather than just printing &quot;Hello World&quot;, let's style things up using our <a href="https://en.wikipedia.org/wiki/Cowsay">cow friend</a>. We'll create <code>worker/worker.ts</code> and include the spiffed up message.</p>
<p><code>worker/worker.ts</code></p>
<pre><code class="language-{.javascript">import { Env, ExecutionContext } from '@cloudflare/workers-types';

export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise&lt;Response&gt; {
    let defaultResponse = `
   o______________o
   | Hello World! |
   o--------------o
           \\   ^__^
            \\  (oo)\_______
               (__)\\       )\\/\\
                   ||----w |
                   ||     ||`
    return new Response(defaultResponse);
  }
};
</code></pre>
<p>It's worth mentioning the import statement, since it brings Cloudflare's type information for both <code>Env</code> and <code>ExecutionContext</code>.</p>
<h2>Running worker locally</h2>
<p>Okay, we now have our <code>worker/worker.ts</code> code ready to go. Let's run it locally. For that we use the wrangler utility.</p>
<pre><code class="language-{.bash">npx wrangler dev
</code></pre>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/dev.png" alt=""></p>
<p>With that, you'll notice the worker is now running locally and waiting to be visited at <a href="http://localhost:8787">http://localhost:8787</a>.</p>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/moo.png" alt=""></p>
<h2>Deploying worker</h2>
<p>When we first created the worker via <a href="https://dash.cloudflare.com">https://dash.cloudflare.com</a>, it automatically deployed to <a href="https://todos.somewhere.workers.dev">https://todos.somewhere.workers.dev</a>. But our mods only ran locally. Let's deploy, again with the wrangler utility.</p>
<pre><code class="language-{.bash">npx wrangler deploy
</code></pre>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/deploying.png" alt=""></p>
<p>We're good to go. Let's point our browser to the worker's public location.</p>
<p><img src="https://xenodium.github.io/images/a-cloudflare-workers-primer-hello-world/deployed.png" alt=""></p>
<p>…and with that, we have a functional Cloudflare Worker and a local development environment to shape things up however we'd like. What would you use the Worker for?</p>
<p>Gave this primer a try? I'd love to hear from ya (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
<p><em>Enjoying this content? Find it useful?</em></p>
<p><em>Consider ✨<a href="https://github.com/sponsors/xenodium">sponsoring me</a>✨ or buy ✨<a href="https://apps.apple.com/us/developer/xenodium-ltd/id304568690">my iOS apps</a>✨.</em></p>
]]></description>
    <pubDate>Sat, 13 Jan 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A chatgpt-shell compose ux experiment</title>
<link>https://xenodium.com/a-chatgpt-shell-compose-ux-experiment</link>
<guid isPermaLink="false">https://xenodium.com/a-chatgpt-shell-compose-ux-experiment</guid>
    <description><![CDATA[<p>It's been roughly 9 months since I <a href="https://xenodium.com/a-chatgpt-emacs-shell/">experimented</a> with wiring the <a href="https://openai.com/blog/chatgpt">ChatGPT</a> API to an Emacs <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint</a> buffer in <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>. ChatGPT's request-response nature maps fairly well to a shell's mode of interaction.</p>
<p>In the past, I've also talked about <a href="https://xenodium.com/yasnippet-in-emacs-eshell/">blurring the lines between shell and editor</a>. That is, using Emacs as your shell (<a href="https://www.masteringemacs.org/article/complete-guide-mastering-eshell">eshell</a> being my favourite) enables compounding goodies from both shell and editor when both are used from the same app.</p>
<p>Keeping interactions within the same app also cuts down on some of that friction that comes with context switching between your text editor and the browser for <a href="https://en.wikipedia.org/wiki/Large_language_model">llm</a> things.</p>
<p>Today, my interactions with llms typically consists of copying and pasting details from other Emacs buffers, crafting a query, and finally submitting by pressing enter (RET) from a shell like <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>.</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/shell-find-bug.gif" alt=""></p>
<p>With the entire interaction happening from Emacs, we're already cutting a fair amount of friction… But we can do better, specially when copying, pasting, and crafting those multi-line queries (you don't want to prematurely submit those shell queries by inadvertently pressing RET when you want a newline).</p>
<h2>chatgpt-shell-prompt-compose</h2>
<p>This is where <code>chatgpt-shell-prompt-compose</code> comes in, an opinionated experiment bringing some of my favourite &quot;compose&quot; features over from the likes of <a href="https://github.com/magit">magit</a> commit buffers, <a href="https://www.gnu.org/software/emacs/manual/html_node/org/Using-capture.html">org capture</a>, <a href="https://www.djcbsoftware.nl/code/mu/mu4e/">mu4e</a> compose, and so on…</p>
<p>You can bring a compose buffer up by invoking <code>M-x chatgpt-shell-prompt-compose</code>. From there, you can both craft and send your queries. If you're a magit fan, the process should feel fairly familiar with crafting a git commit message by editing away and quickly committing (via <code>C-c C-c</code> binding). Similarly, you can also abort with the familiar <code>C-c C-k</code> binding.</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/10k.gif" alt=""></p>
<p>I use this compose utility often enough that I bound it to <code>C-c C-e</code>, though this may not be your cup of tea (needs overriding other mode maps).</p>
<pre><code class="language-{.commonlisp">(use-package chatgpt-shell
  :commands
  (chatgpt-shell
   chatgpt-shell-prompt-compose)
  :bind ((&quot;C-c C-e&quot; . chatgpt-shell-prompt-compose)
         :map org-mode-map
         (&quot;C-c C-e&quot; . chatgpt-shell-prompt-compose)
         :map eshell-mode-map
         (&quot;C-c C-e&quot; . chatgpt-shell-prompt-compose)
         :map mu4e-compose-mode-map
         (&quot;C-c C-e&quot; . chatgpt-shell-prompt-compose)
         :map emacs-lisp-mode-map
         (&quot;C-c C-e&quot; . chatgpt-shell-prompt-compose)))
</code></pre>
<p>While the compose buffer displays a single query/response at a time, it also follows on from previous requests. You can press <code>r</code> to reply and continue the conversation.</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/marathon.gif" alt=""></p>
<p>The compose buffer is fairly stateless and mostly serves as viewport over the last query in the shell itself. If you invoke <code>chatgpt-shell-prompt-compose</code> with a prefix (ie. C-u), it wipes the shell history. You can do it from the compose buffer itself, if you forgot to prior to launching.</p>
<p>You can also use the <code>o</code> binding to jump to the &quot;other buffer&quot; (the shell carrying the conversation history).</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/other.gif" alt=""></p>
<p>If using the <code>r</code> and <code>o</code> bindings in a compose buffer sounds a little strange, fear not. The compose buffer is writeable while crafting queries, thus you can safely insert any character. Once a query is submitted (via <code>C-c C-c</code>), the buffer automatically becomes read-only, and thus unlocking single-character bindings.</p>
<p>Another magit commit favorite of mine is using the <code>M-p</code> or <code>M-n</code> bindings to insert previous messages via <code>git-commit-prev-message</code> or <code>git-commit-next-message</code>.</p>
<p>With that in mind, I also brought <code>M-p</code> and <code>M-n</code> over to the editable compose buffer.</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/previous-next-history.gif" alt=""></p>
<p>If cycling isn't efficient enough, you can also use the typical <code>M-r</code> binding to search and insert from history.</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/search-history.png" alt=""></p>
<p>Now, getting back to removing some of that copy-pasting friction… Selecting text in any buffer and invoking <code>M-x chatgpt-shell-prompt-compose</code> (or <code>C-c C-e</code> in my case) automatically pastes the region into the compose buffer. You get to tweak your query before submitting (via that familiar <code>C-c C-c</code>), in a more flexible buffer (compared to a shell).</p>
<p><em>Note: You can also invoke the compose command with a region as many times as you'd like. Each region is sent to the compose buffer, so you can craft more involved queries before submission.</em></p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/find-and-fix-bug.gif" alt=""></p>
<p>While I typically prefer short query responses (using diffs like the example above), I sometimes want full snippets as follow-ups. I found myself typing <em>&quot;show entire snippet&quot;</em> often enough, that I now use one of those single-character bindings (<code>e</code>) for this purpose.</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-shell-compose-ux-experiment/show-entire-snippet.gif" alt=""></p>
<h2>Compose bindings</h2>
<p>I've showcased most of the compose key bindings, here's the whole lot (so far anyway), which you can also view from <code>chatgpt-shell-prompt-compose</code>'s documentation.</p>
<h3>Editing</h3>
<ul>
<li><code>C-c C-c</code> to send the buffer query.</li>
<li><code>C-c C-k</code> to cancel compose buffer.</li>
<li><code>M-r</code> search through history.</li>
<li><code>M-p</code> cycle through previous item in history.</li>
<li><code>M-n</code> cycle through next item in history.</li>
</ul>
<h3>Read-only</h3>
<ul>
<li><code>C-c C-c</code> After sending offers to abort query in-progress.</li>
<li><code>q</code> Exits the read-only buffer.</li>
<li><code>g</code> Refresh (re-send the query). Useful to retry on disconnects.</li>
<li><code>n</code> Jump to next source block.</li>
<li><code>p</code> Jump to next previous block.</li>
<li><code>r</code> Reply to follow-up with additional questions.</li>
<li><code>e</code> Send &quot;Show entire snippet&quot; query.</li>
<li><code>o</code> Jump to other buffer (ie. the shell itself).</li>
<li><code>C-M-h</code> Mark block at point.</li>
</ul>
<h2>Buyer beware: it's all pretty experimental</h2>
<p>When I started playing with the compose buffer idea, I wasn't too sure whether or not its usage would stick, so I basically hacked <code>chatgpt-shell-prompt-compose</code> to pieces. A cheap prototype of sorts to validate the idea before fully committing to a more involved solution.</p>
<p>I'll eventually rewrite <code>chatgpt-shell-prompt-compose</code> as either a major or minor mode if there's enough interest.</p>
<p>For now, I'll continue using as is to validate its usefulness.</p>
<p>If you give <code>chatgpt-shell-prompt-compose</code> a try, I'd love to hear your feedback (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
<p><em>Enjoying this content? Find it useful? Consider <a href="https://github.com/sponsors/xenodium">sponsoring</a>.</em></p>
]]></description>
    <pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A Murder at the End of the World: Are you Vi or Emacs?</title>
<link>https://xenodium.com/are-you-vi-or-emacs</link>
<guid isPermaLink="false">https://xenodium.com/are-you-vi-or-emacs</guid>
    <description><![CDATA[<p>I've enjoyed watching <a href="https://www.imdb.com/title/tt15227418/">A Murder at the End of the World</a>. The show may resonate with folks following the tech world. Won't say much more than that…</p>
<p>What I can maybe say is, the shows features <a href="https://www.reddit.com/r/emacs/">Reddit</a>, <a href="https://brave.com/">Brave browser</a>, terminal usage (ifconfig, nmap, hydra, responder), and a reference to the good 'ol <a href="https://en.wikipedia.org/wiki/Editor_war">Vi vs Emacs rivalry</a>, which I hope folks these days don't take further than friendly teasing between dear cousins.</p>
<p>In any case, being an Emacs nut, the scene gave me a good tickle. It's a great show, with a lovely Emacs cherry on top! While the show title and description didn't immediately draw me in, I'm glad I gave it a chance.</p>
<p><img src="https://xenodium.github.io/images/are-you-vi-or-emacs/vi-or-emacs.webp" alt=""></p>
<p><img src="https://xenodium.github.io/images/are-you-vi-or-emacs/what-is-emacs.webp" alt=""></p>
]]></description>
    <pubDate>Fri, 22 Dec 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>An basic Mullvad WireGuard setup for macOS</title>
<link>https://xenodium.com/a-quick-mullvad-macos-setup</link>
<guid isPermaLink="false">https://xenodium.com/a-quick-mullvad-macos-setup</guid>
    <description><![CDATA[<p>Needed a VPN to test an API from a different location. Gave <a href="https://mullvad.net/en">Mullvad</a> a try.</p>
<p>Pretty neat, you can generate an account number without providing an email address. You can also pre-pay with a ton of options, including cash, crypto, credit cards, PayPal, wire transfers…</p>
<p>After seeing your account credited, one can download a <a href="https://mullvad.net/en/account/wireguard-config">generated WireGuard configuration</a>. Also a WireGuard noob, so took this opportunity to give it a try.</p>
<p>The <a href="https://apps.apple.com/us/app/wireguard/id1451685025?mt=12">WireGuard macOS app</a> has an &quot;Import Tunnel(s) from File…&quot; option where you can import the .conf file downloaded from <a href="https://mullvad.net/en/account/wireguard-config">Mullvad's generated config</a>. After that, all I had to do was click the &quot;Activate&quot; button and <a href="https://en.wikipedia.org/wiki/Bob%27s_your_uncle">Bob's your uncle</a>.</p>
<p><img src="https://xenodium.github.io/images/a-quick-mullvad-macos-setup/wg-redact.png" alt=""></p>
<p>You can test your connection via:</p>
<pre><code class="language-bash">curl https://am.i.mullvad.net/connected
</code></pre>
<p>I had a brief stint at using the command-line alternative via homebrew <code>brew install wireguard-go wireguard-tools</code>, but that seems to fail silently:</p>
<pre><code class="language-{.bash">wg-quick up xxxxx
[#] wireguard-go utun
[+] Interface for xxxxx is utun7
[#] wg setconf utun7 /dev/fd/63
[#] ifconfig utun7 inet xxx.xxx.xxx.xxx/xx xxx.xxx.xxx.xxx alias
[#] ifconfig utun7 inet6 xxxx:xxxx:xxxx:xxxx::x:xxxx/xxx alias
[#] ifconfig utun7 up
[#] route -q -n add -inet6 ::/1 -interface utun7
[#] route -q -n add -inet6 8000::/1 -interface utun7
[#] route -q -n add -inet xxx.xxx.xxx.xxx/x -interface utun7
[#] route -q -n add -inet xxx.xxx.xxx.xxx/x -interface utun7
[#] route -q -n add -inet xxx.xxx.xxx.xxx -gateway xxx.xxx.xxx.xxx
[#] networksetup -getdnsservers Wi-Fi
[#] networksetup -getsearchdomains Wi-Fi
[#] networksetup -getdnsservers iPhone USB
[#] networksetup -getsearchdomains iPhone USB
[#] networksetup -getdnsservers Thunderbolt Bridge
[#] networksetup -getsearchdomains Thunderbolt Bridge
[#] networksetup -getdnsservers xxxxx
[#] networksetup -getsearchdomains xxxxx
[#] networksetup -setdnsservers iPhone USB xxx.xxx.xxx.xxx
[#] networksetup -setsearchdomains iPhone USB Empty
[#] networksetup -setdnsservers xxxxx xxx.xxx.xxx.xxx
[#] networksetup -setsearchdomains xxxxx Empty
[#] networksetup -setdnsservers Wi-Fi xxx.xxx.xxx.xxx
[#] networksetup -setsearchdomains Wi-Fi Empty
[#] networksetup -setdnsservers Thunderbolt Bridge xxx.xxx.xxx.xxx
[#] networksetup -setsearchdomains Thunderbolt Bridge Empty
[+] Backgrounding route monitor
</code></pre>
<pre><code class="language-bash">curl https://am.i.mullvad.net/connected
</code></pre>
<p>I'm on a Macbook M1 Pro, running macOS Sonoma. If you got <code>wg-quick</code> working on Sonoma, I'd love to hear from ya (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
]]></description>
    <pubDate>Sun, 17 Dec 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>An iOS journaling app powered by org plain text</title>
<link>https://xenodium.com/an-ios-journaling-app-powered-by-org-plain-text</link>
<guid isPermaLink="false">https://xenodium.com/an-ios-journaling-app-powered-by-org-plain-text</guid>
    <description><![CDATA[<p>I've been experimenting with building a rich text editing component for iOS, powered by <a href="https://orgmode.org/">org</a> markup. The idea is to offer a mobile-friendly editing experience, backed by our beloved plain text format.</p>
<p><img src="https://xenodium.github.io/images/an-ios-journaling-app-powered-by-org-plain-text/rich-text-experiment.gif" alt=""></p>
<p>To make things a little more interesting, I'm introducing a new org-based app to help anyone with regular journaling.</p>
<center>👉 Meet ✨Journelly✨</center>
<p><img src="https://xenodium.github.io/images/an-ios-journaling-app-powered-by-org-plain-text/journelly.jpg" alt=""></p>
<p>Plain text <em>is</em> the serialization format. No conversion/import/export needed.</p>
<p><img src="https://xenodium.github.io/images/an-ios-journaling-app-powered-by-org-plain-text/journelly.gif" alt=""></p>
<p>Though it's early days, it's fairly functional. Been using it daily for some time. You can opt in to use an external org file and sync with your beloved Emacs.</p>
<p>Want to give it a try? Want a TestFlight invite? Send me an email address (any would do) at either of these: <a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>.</p>
<p>The topic of org being fairly Emacs-oriented, though a strength for someone far down the rabbit hole, it is <a href="https://indieweb.social/@ringtailringo@mastodon.social/111533733278287863">understandable to call it out for someone in a different position</a>. Lucky for us, org markup is plain text and can be implemented by apps other than Emacs, like Journelly itself for iOS and even more experimentally on macOS:</p>
<p><img src="https://xenodium.github.io/images/an-ios-journaling-app-powered-by-org-plain-text/macos.png" alt=""></p>
<p>And like Journelly for iOS, I got other org things available on iOS:</p>
<table>
  <tr>
    <td><a href='https://plainorg.com'><img width='40' src='https://plainorg.github.io/favicon.ico'/></a></td>
    <td>As an <a href="https://orgmode.org/">Org mode</a> fan, so I wrote <a href="https://plainorg.com/">Plain Org</a> for iOS. It's on the <a href="https://apps.apple.com/app/id1578965002">App Store</a>.</td>
  </tr>
  <tr>
    <td><a href='https://apps.apple.com/app/id1671420139'><img width='40' src='https://raw.githubusercontent.com/xenodium/xenodium.github.io/master/images/scratch-a-minimal-scratch-area/scratch_icon.png'/></a></td>
    <td>Inspired by <a href="https://jamesclear.com/atomic-habits">Atomic Habits</a>, I wrote <a href="https://flathabits.com/">Flat Habits</a> for iOS. Also on the <a href="https://apps.apple.com/app/id1558358855">App Store</a>.</td>
  </tr>
  <tr>
    <td><a href='https://flathabits.com'><img width='40' src='https://flathabits.github.io/favicon.ico'/></a></td>
    <td>I needed an Emacs-inspired <a href="scratch-a-minimal-scratch-area"><strong>scratch</strong></a> buffer on iOS (who doesn't?), so I <a href="scratch-a-minimal-scratch-area/">built one</a>.</td>
  </tr>
</table>
<ul>
<li>As an <a href="https://orgmode.org/">Org mode</a> fan, so I wrote <a href="https://plainorg.com/">Plain Org</a> for iOS. It's on the <a href="https://apps.apple.com/app/id1578965002">App Store</a>.</li>
<li>Inspired by <a href="https://jamesclear.com/atomic-habits">Atomic Habits</a>, I wrote <a href="https://flathabits.com/">Flat Habits</a> for iOS. Also on the <a href="https://apps.apple.com/app/id1558358855">App Store</a>.</li>
<li>I needed an Emacs-inspired <a href="https://xenodium.com/scratch-a-minimal-scratch-area"><strong>scratch</strong></a> buffer on iOS (who doesn't?), so I <a href="https://xenodium.com/scratch-a-minimal-scratch-area/">built one</a>.</li>
</ul>
<p>Just like the stuff I do or <a href="https://xenodium.com">write about</a>? <a href="https://github.com/sponsors/xenodium">Sponsor me</a>.</p>
]]></description>
    <pubDate>Wed, 06 Dec 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Building your own bookmark launcher</title>
<link>https://xenodium.com/building-your-own-bookmark-launcher</link>
<guid isPermaLink="false">https://xenodium.com/building-your-own-bookmark-launcher</guid>
    <description><![CDATA[<p><em>✨<a href="https://github.com/sponsors/xenodium">sponsor</a>✨ this content</em></p>
<p>I've been toying with the idea of managing browser bookmarks from <a href="https://www.gnu.org/software/emacs/">you know where</a>. Maybe dump a bunch of links into an org file and use that as a quick and dirty bookmark manager. We'll start with a flat list plus fuzzy searching and see how far that gets us.</p>
<p>The org file would look a little something like this:</p>
<p>::: captioned-content
::: caption
bookmarks.org
:::</p>
<pre><code class="language-org">My bookmarks
- [[https://lobste.rs/t/emacs][Emacs editor (Lobsters)]]
- [[https://emacs.stackexchange.com][Emacs Stack Exchange]]
- [[https://www.reddit.com/r/emacs][Emacs subreddit]]
- [[https://emacs.ch][Emacs.ch (Mastodon)]]
- [[https://www.emacswiki.org][EmacsWiki]]
- [[https://planet.emacslife.com/][Planet Emacslife]]
</code></pre>
<p>:::</p>
<p>Next we need fuzzy searching, but first let's write a little elisp to extract all links from the org file:</p>
<pre><code class="language-{.commonlisp">(require 'org-element)
(require 'seq)

(defun browser-bookmarks (org-file)
  &quot;Return all links from ORG-FILE.&quot;
  (with-temp-buffer
    (let (links)
      (insert-file-contents org-file)
      (org-mode)
      (org-element-map (org-element-parse-buffer) 'link
        (lambda (link)
          (let* ((raw-link (org-element-property :raw-link link))
                 (content (org-element-contents link))
                 (title (substring-no-properties (or (seq-first content) raw-link))))
            (push (concat title
                          &quot;\n&quot;
                          (propertize raw-link 'face 'whitespace-space)
                          &quot;\n&quot;)
                  links)))
        nil nil 'link)
      (seq-sort 'string-greaterp links))))
</code></pre>
<p>The snippet uses <code>org-element</code> to iterate over links to collect/return them in a list. We join both the title and url, so searching can match either of these values. We also add a little formatting (new lines/face) to spiff things up.</p>
<pre><code class="language-{.commonlisp">(browser-bookmarks &quot;/private/tmp/bookmarks.org&quot;)
</code></pre>
<p>We can now feed our list to our preferred narrowing framework (ivy, helm, ido, vertico) and use it to quickly select a bookmark. In the past, I've <a href="https://xenodium.com/emacs-utilities-for-your-os/">used the likes of ivy-read</a> directly, though have since adopted the humble but mighty <code>completing-read</code> which hooks up to any of the above frameworks.</p>
<p>With that in mind, let's use <code>completing-read</code> to make a selection and split the text to extract the corresponding URL. Feed it to <code>browse-url</code>, and you got your preferred browser opening your bookmark.</p>
<pre><code class="language-{.commonlisp">(defun open-bookmark ()
  (interactive)
  (browse-url (seq-elt (split-string (completing-read &quot;Open: &quot; (browser-bookmarks &quot;/private/tmp/bookmarks.org&quot;)) &quot;\n&quot;) 1)))
</code></pre>
<p>I remain a happy ivy user, so we can see its fuzzy searching in action.</p>
<p><img src="https://xenodium.github.io/images/building-your-own-bookmark-launcher/emacs-bookmark.gif" alt=""></p>
<p>At this point, we now have our bookmark-launching Emacs utility. It's only an <code>M-x open-bookmark</code> command away, but we want to make it accessible from anywhere in our operating system, in my case macOS.</p>
<p>Let's enable launching from the command line, though before we do that, let's craft a dedicated frame for this purpose.</p>
<pre><code class="language-{.commonlisp">(defmacro present (&amp;rest body)
  &quot;Create a buffer with BUFFER-NAME and eval BODY in a basic frame.&quot;
  (declare (indent 1) (debug t))
  `(let* ((buffer (get-buffer-create (generate-new-buffer-name &quot;*present*&quot;)))
          (frame (make-frame '((auto-raise . t)
                               (font . &quot;Menlo 15&quot;)
                               (top . 200)
                               (height . 20)
                               (width . 110)
                               (internal-border-width . 20)
                               (left . 0.33)
                               (left-fringe . 0)
                               (line-spacing . 3)
                               (menu-bar-lines . 0)
                               (minibuffer . only)
                               (right-fringe . 0)
                               (tool-bar-lines . 0)
                               (undecorated . t)
                               (unsplittable . t)
                               (vertical-scroll-bars . nil)))))
     (set-face-attribute 'ivy-current-match frame
                         :background &quot;#2a2a2a&quot;
                         :foreground 'unspecified)
     (select-frame frame)
     (select-frame-set-input-focus frame)
     (with-current-buffer buffer
       (condition-case nil
           (unwind-protect
               ,@body
             (delete-frame frame)
             (kill-buffer buffer))
         (quit (delete-frame frame)
               (kill-buffer buffer))))))
</code></pre>
<p>Most of the snippet styles our new frame and invokes the body parameter. While I don't typically resort to macros, we get a little syntatic sugar here, so we can invoke like so:</p>
<pre><code class="language-{.commonlisp">(defun present-open-bookmark-frame ()
  (present (browse-url (seq-elt (split-string (completing-read &quot;Open: &quot; (browser-bookmarks &quot;/private/tmp/bookmarks.org&quot;)) &quot;\n&quot;) 1))))
</code></pre>
<p>Wrapping our one-liner with the <code>present-open-bookmark-frame</code> function enables us to easily invoke from the command line, with something like</p>
<pre><code class="language-{.bash">emacsclient -ne &quot;(present-open-bookmark-frame)&quot;
</code></pre>
<p><img src="https://xenodium.github.io/images/building-your-own-bookmark-launcher/command.gif" alt=""></p>
<p>Now that we can easily invoke from the command line, we have the flexibility to summon from anywhere. We can even bind to a key shortcut, available anywhere (not just Emacs). I typically do this via <a href="http://www.hammerspoon.org/">Hammerspoon</a>, with some helpers, though there are likely simpler options out there.</p>
<pre><code class="language-lua">function emacsExecute(activate, elisp)
   if activate then
      activateFirstOf({
            {
               bundleID=&quot;org.gnu.Emacs&quot;,
               name=&quot;Emacs&quot;
            }
      })
   end

   local socket, found = emacsSocketPath()
   if not found then
      hs.alert.show(&quot;Could not get emacs socket path&quot;)
      return &quot;&quot;, false
   end

   local output,success = hs.execute(&quot;/opt/homebrew/bin/emacsclient -ne \&quot;&quot;..elisp..&quot;\&quot; -s &quot;..socket)
   if not success then
      hs.alert.show(&quot;Emacs did not execute: &quot;..elisp)
      return &quot;&quot;, false
   end

   return output, success
end

function openBookmark()
   appRequestingEmacs = hs.application.frontmostApplication()
   emacsExecute(false, &quot;(present-open-bookmark-frame)&quot;)
   activateFirstOf({
         {
            bundleID=&quot;org.gnu.Emacs&quot;,
            name=&quot;Emacs&quot;
         }
   })
end

hs.hotkey.bind({&quot;alt&quot;}, &quot;W&quot;, openBookmark)
</code></pre>
<p>With that, we have our Emacs-powered bookmark launcher, available from anywhere.</p>
<p><img src="https://xenodium.github.io/images/building-your-own-bookmark-launcher/launcher.gif" alt=""></p>
<p>While we used our Emacs frame presenter to summon our universal bookmark launcher, we can likely the same mechanism for other purposes. Maybe a clipboard (kill ring) manager?</p>
<p><img src="https://xenodium.github.io/images/building-your-own-bookmark-launcher/kill-ring.png" alt=""></p>
<p>What would you use it for? Get in touch (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
<p><em>Enjoying this content? Find it useful? Consider ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨.</em></p>
]]></description>
    <pubDate>Wed, 29 Nov 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Native Emacs/macOS UX integrations via Swift modules</title>
<link>https://xenodium.com/native-emacsmacos-ux-integrations-via-swift-modules</link>
<guid isPermaLink="false">https://xenodium.com/native-emacsmacos-ux-integrations-via-swift-modules</guid>
    <description><![CDATA[<p>Once you learn a little <a href="https://en.wikipedia.org/wiki/Emacs_Lisp">elisp</a>, <a href="https://www.gnu.org/software/emacs/">Emacs</a> becomes this hyper malleable editor/platform. A live playground of sorts, where almost everything is up for grabs at runtime. Throw some elisp at it, and you can customize or extend almost anything to your heart's content. I say almost, as there's a comparatively small native core, that would typically require recompiling if you wanted to make further (native) mods. But that isn't entirely true. <a href="https://www.masteringemacs.org/article/whats-new-in-emacs-25-1">Emacs 25</a> enabled us to further extend things by loading native <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Dynamic-Modules.html">dynamic modules</a>, back in 2016.</p>
<p>Most of my Emacs-bending adventures have been powered by elisp, primarily on macOS. I also happen to have an iOS dev background, so when <a href="https://github.com/SavchenkoValeriy">Valeriy Savchenko</a> <a href="https://www.reddit.com/r/emacs/comments/wemj1z/writing_emacs_dynamic_modules_in_swift/">announced</a> his project bringing <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">Emacs dynamic modules powered by Swift</a>, I added it to my never-ending list of things to try out.</p>
<p>Fast-forward to a year later, and <a href="https://github.com/roife">Roife</a>'s <a href="https://www.reddit.com/r/emacs/comments/17vrmrk/emt_emacs_macos_tokenizer_for_enhanced_cjk_word/">introduction</a> to <a href="https://github.com/roife/emt">emt</a> finally gave me that much-needed nudge to give <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">emacs-swift-module</a> a try. While I wish I had done it earlier, I also wish <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">emacs-swift-module</a> had gotten more visibility. Native extensions written in Swift can open up some some neat integrations using native macOS UX/APIs.</p>
<p>While I'm new to Savchenko's <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">emacs-swift-module</a>, the project has <a href="https://savchenkovaleriy.github.io/emacs-swift-module/documentation/emacsswiftmodule/">wonderful documentation</a>. It quickly got me on my way to build an experimental dynamic module introducing a native context menu for sharing files from my beloved editor.</p>
<p><img src="https://xenodium.github.io/images/native-emacsmacos-ux-integrations-via-swift-modules/emacs-share.webp" alt=""></p>
<p>Most of the elisp/native bridging magic happens with fairly little Swift code:</p>
<pre><code class="language-swift">try env.defun(
  &quot;macos-module--share&quot;,
  with: &quot;&quot;&quot;
    Share files in ARG1.

    ARG1 must be a vector (not a list) of file paths.
    &quot;&quot;&quot;
) { (env: Environment, files: [String]) in
  let urls = files.map { URL(fileURLWithPath: $0) }

  let picker = NSSharingServicePicker(items: urls)
  guard let view = NSApp.mainWindow?.contentView else {
    return
  }

  let x = try env.funcall(&quot;macos--emacs-point-x&quot;) as Int
  let y = try env.funcall(&quot;macos--emacs-point-y&quot;) as Int

  let rect = NSRect(
    x: x + 15, y: Int(view.bounds.height) - y + 15, width: 1, height: 1
  )
  picker.show(relativeTo: rect, of: view, preferredEdge: .maxY)
}
</code></pre>
<p>This produced an elisp <code>macos-module--share</code> function I could easily access from elisp like so:</p>
<pre><code class="language-{.commonlisp">(defun macos-share ()
  &quot;Share file(s) with other macOS apps.

If visiting a buffer with associated file, share it.

While in `dired', any selected files, share those.  If region is
active, share files in region.  Otherwise share file at point.&quot;
  (interactive)
  (macos-module--share (vconcat (macos--files-dwim))))
</code></pre>
<p>On a side note, <code>(macos--files-dwim)</code> chooses files depending on context. That is, <a href="https://xenodium.com/emacs-dwim-do-what-i-mean/">do what I mean (DWIM) style</a>. If there's a file associated with current buffer, share it. When in <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> (the directory editor, aka file manager), look at region, selected files, or default to file at point.</p>
<pre><code class="language-{.commonlisp">(defun macos--files-dwim ()
  &quot;Return buffer file (if available) or marked/region files for a `dired' buffer.&quot;
  (if (buffer-file-name)
      (list (buffer-file-name))
    (or
     (macos--dired-paths-in-region)
     (dired-get-marked-files))))

(defun macos--dired-paths-in-region ()
  &quot;If `dired' buffer, return region files.  nil otherwise.&quot;
  (when (and (equal major-mode 'dired-mode)
             (use-region-p))
    (let ((start (region-beginning))
          (end (region-end))
          (paths))
      (save-excursion
        (save-restriction
          (goto-char start)
          (while (&lt; (point) end)
            ;; Skip non-file lines.
            (while (and (&lt; (point) end) (dired-between-files))
              (forward-line 1))
            (when (dired-get-filename nil t)
              (setq paths (append paths (list (dired-get-filename nil t)))))
            (forward-line 1))))
      paths)))
</code></pre>
<p>I got one more example of a native macOS integration I added. Being an even simpler one, and in hindsight, I prolly should have introduced it first. In any case, this one reveals <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> files in macOS's Finder app (including the selection itself).</p>
<p><img src="https://xenodium.github.io/images/native-emacsmacos-ux-integrations-via-swift-modules/reveal.webp" alt=""></p>
<pre><code class="language-swift">try env.defun(
  &quot;macos-module--reveal-in-finder&quot;,
  with: &quot;&quot;&quot;
    Reveal (and select) files in ARG1 in macOS Finder.

    ARG1 mus be a vector (not a list) of file paths.
    &quot;&quot;&quot;
) { (env: Environment, files: [String]) in
  NSWorkspace.shared.activateFileViewerSelecting(files.map { URL(fileURLWithPath: $0) })
}
</code></pre>
<p>The corresponding elisp is nearly identical to its <code>macos-share</code> sibling:</p>
<pre><code class="language-{.commonlisp">(defun macos-reveal-in-finder ()
  &quot;Reveal file(s) in macOS Finder.

If visiting a buffer with associated file, reveal it.

While in `dired', any selected files, reveal those.  If region is
active, reveal files in region.  Otherwise reveal file at point.&quot;
  (interactive)
  (macos-module--reveal-in-finder (vconcat (macos--files-dwim))))
</code></pre>
<p>My Swift module experiment introduces two native macOS UX integrations, now available via <code>M-x macos-share</code> and <code>M-x macos-reveal-in-finder</code>. I've pushed all code to it's own <a href="https://github.com/xenodium/EmacsMacOSModule">repo</a>.</p>
<p>I hope this post brings visibility to the wonderful <a href="https://github.com/SavchenkoValeriy/emacs-swift-module">emacs-swift-module</a> project and sparks new, native, and innovative integrations for those on macOS. Can't wait to see what others can do with it.</p>
<p><em>Enjoying this content? Find it useful? Consider ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨.</em></p>
]]></description>
    <pubDate>Sat, 25 Nov 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Migrating/re-encrypting pass's password store</title>
<link>https://xenodium.com/migratingre-encrypting-passs-password-store</link>
<guid isPermaLink="false">https://xenodium.com/migratingre-encrypting-passs-password-store</guid>
    <description><![CDATA[<p>Note to self, I needed to migrate/re-encrypt someone's password store (aka pass). Straightforward:</p>
<p>Get the new key, probably already in gpg key chain. Try listing it:</p>
<pre><code class="language-{.bash">gpg --list-keys
</code></pre>
<p>To re-encrypt, <code>pass init</code> with new key is enough. It'll prompt for old pass key.</p>
<pre><code class="language-{.bash">cd path/to/.password-store
pass init NEW-GPG-KEY
</code></pre>
]]></description>
    <pubDate>Thu, 16 Nov 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>How I smash burgers</title>
<link>https://xenodium.com/how-i-smash-burgers</link>
<guid isPermaLink="false">https://xenodium.com/how-i-smash-burgers</guid>
    <description><![CDATA[<p>I'm neither a burger expert nor a connoisseur of any kind, yet I sure have a lot of fun smashing burgers at home. Needless to say, I shamelessly enjoy gobbling them too!</p>
<figure width="60%">
<img src="https://xenodium.github.io/images/how-i-smash-burgers/burger-cut.png" />
<figcaption>my smash burger</figcaption>
</figure>
<p>I'll share details on how I smash my burgers, but here's a quick ingredient list, if that's all you need.</p>
<ul>
<li>Mince beef (20%-30% fat).</li>
<li>Streaky bacon.</li>
<li>Brioche burger buns.</li>
<li>American cheese slices (cheddar individual slices work too).</li>
<li>Lettuce.</li>
<li>Tomatoes.</li>
<li>Onions.</li>
<li>Pickles.</li>
<li>Jalapeños.</li>
<li>Garlic.</li>
<li>Chipotle powder.</li>
<li>Mayonnaise.</li>
<li>Salt.</li>
<li>Pepper.</li>
<li>Oil.</li>
<li>Greaseproof paper.</li>
<li>Butter.</li>
</ul>
<h2>The calling</h2>
<p>My quest to smash burgers at home didn't start until earlier this year, while watching the <a href="https://www.imdb.com/title/tt9764362/">The Menu</a>. I just could't stop <a href="https://indieweb.social/@xenodium/109734285674122246">craving the burger</a> from that scene, so I set out to start smashing my own.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/the-menu.webp" alt=""></p>
<h2>The gear</h2>
<p>Don't rush to buy anything fancy. Your existing gear will likely do the job just fine. I'd say try a few things out and only upgrade when needed. I'll share the gear I use and where I felt I needed tweaking.</p>
<h2>Skillet</h2>
<p>While I didn't have a griddle at home, I did have a couple of trusty <a href="https://www.lodgecastiron.com/">Lodge</a> <strong>skillets</strong> (<a href="https://www.lodgecastiron.com/product/round-cast-iron-classic-skillet?sku=L8SK3">cast iron</a> and <a href="https://www.lodgecastiron.com/product/carbon-steel-skillet?sku=CRS12">carbon steel</a>). Both work great for burgers, though I have a slight preference for the carbon steel one, as it's the bigger of the two and gives a little more room for manoeuvring, specially when smashing two burgers at a time.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/cast-iron.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/carbon.png" alt=""></p>
<p>Heat the skillet up and add a little oil. If the oil starts smoking, be quick to drop the patties and start smashing.</p>
<h2>Grill Spatula (too big/stiff for skillet)</h2>
<p>Somewhat inspired by the film, I got myself a wide spatula so I could firmly press those patties against the skillet, and to flip of course.</p>
<p>While this kind of spatula may work well on a spacious griddle, I felt constrained on a relatively small cast iron. Specially when flipping. I went looking for an alternative.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/spatula.png" alt=""></p>
<h2>Spatula + smasher (my winning combo)</h2>
<p>Over at the <a href="https://reddit.com/r/castiron/">r/castiron</a> subreddit, I discovered fish spatulas. They are fairly agile on cast irons but also work great for loosening burger patties before flipping.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/ready.webp" alt=""></p>
<p>While effective for flipping, fish spatulas are obviously no good for smashing. So I got myself a burger smasher. This combo worked well for me.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/smash.webp" alt=""></p>
<p>When smashing, use greaseproof paper to prevent the patties from sticking to the smasher.</p>
<h2>Ingredients</h2>
<p>While I've drawn inspiration from others, I've landed on my own preferred ingredients. I'm sure that will continue changing over time. Pick and choose as your heart desires.</p>
<h2>Minced/ground beef</h2>
<p>Minced beef with higher fat content (around 20-30%) is often recommended for a couple of reasons:</p>
<ul>
<li>
<p>Flavour: Fat equals flavour in cooking. The higher fat content will melt during cooking and become 'self-basting', resulting in a juicier and more flavourful burger.</p>
</li>
<li>
<p>Texture: The fat in the beef melts under heat, helping the burger achieve a crispy, caramelized exterior known as the <a href="https://en.wikipedia.org/wiki/Maillard_reaction">Maillard reaction</a>, which contrasts nicely against the soft, juicy interior.</p>
</li>
</ul>
<p>In the UK, I can typically find minced beef with 15%-20% fat content at the main supermarkets.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/pattie.png" alt=""></p>
<p>Be sure to salt and pepper to taste (as in picture) on one side. Once flipped on pan, salt and pepper the other side.</p>
<h2>Bacon</h2>
<p>I tend to prefer smoked streaky bacon, but hey these will be your burgers. Your burgers, your rules.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/streaky.png" alt=""></p>
<h2>Buns (brioche)</h2>
<p>I hear potato buns are great for burgers. I've yet to try them. So far, I've settled for brioche. I happen to find these near me, so I've gone with them.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/brioche.png" alt=""></p>
<p>Butter the buns and brown on the skillet for a minute. Check the buns often. Brioche buns can burn quickly.</p>
<h2>American cheese</h2>
<p>American cheese is often the burger cheese of choice.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/american-cheese.webp" alt=""></p>
<p>While American cheese isn't widely available in the UK, the individually wrapped orange-looking cheddar cheese slices work just fine.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/cheese.png" alt=""></p>
<h2>Toppings</h2>
<p>I like my burgers with lettuce, tomatoes, onions, pickles, and occasionally jalapeños. For pickles, I typically just take cornichons and slice them up.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/toppings_x0.30.png" alt=""></p>
<h2>Burger sauce (chipotle/garlic/mayo)</h2>
<p>While classic burger sauce is often made with mayo, ketchup, pickles, and mustard, I've gone fairly rogue here.</p>
<p>You see, I love chipotle mayo. I'm also a fan of garlic mayo, so I figured why not both? Turns out these three ingredients work great together.</p>
<p>I like to draw out the flavours by first mixing the garlic and chipotle with a little hot water.</p>
<ul>
<li>1 garlic clove.</li>
<li>2 teaspoons of chipotle powder.</li>
<li>1 tablespoon of hot water.</li>
<li>Pinch of salt.</li>
</ul>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/sauce1.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/sauce2.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/sauce3.png" alt=""></p>
<p>…and then thicken with mayo.</p>
<ul>
<li>1/4 cup of mayo.</li>
</ul>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/sauce4.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/sauce5.png" alt=""></p>
<p>These are very rough measurements, tweak to your preference. Make more garlicky, spicier, or soften things by adding garlic, chipotle, or mayo.</p>
<h2>Assembling</h2>
<p>I like to assemble in the following order from the bottom bun up.</p>
<ol>
<li>Sauce on bottom bun.</li>
<li>Lettuce.</li>
<li>Tomatoes.</li>
<li>Onions.</li>
<li>2 patties (melted cheese on both).</li>
<li>Bacon.</li>
<li>Pickles.</li>
<li>Jalapeños.</li>
<li>Sauce on top bun (oops, I forgot in the picture).</li>
</ol>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/open.png" alt=""></p>
<p>…and here's the final product.</p>
<p><img src="https://xenodium.github.io/images/how-i-smash-burgers/burger-cut.png" alt=""></p>
<p>If you gave smashing burgers a go, I'd love to hear about it. Also any tips are very much welcome. Get in touch (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
]]></description>
    <pubDate>Mon, 30 Oct 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Open in Xcode at line number</title>
<link>https://xenodium.com/open-in-xcode-at-line-number</link>
<guid isPermaLink="false">https://xenodium.com/open-in-xcode-at-line-number</guid>
    <description><![CDATA[<p>I live mostly in Emacs. I say mostly 'cause well, I'm fairly pragmatic about it. If there's a workflow elsewhere that's more appropriate for my needs, I'll happily use that instead. While I'd love to do my web browsing from my beloved editor, Firefox ticks the right boxes for me.</p>
<p>I do most of my iOS coding in Emacs. It's a hybrid of sorts between Emacs and Xcode. If I need to use the debugger, Xcode is a clear winner for me. If I happen to be visiting a Swift file in an Emacs buffer, I typically used the handy <code>crux-open-with</code> from <a href="https://github.com/bbatsov/crux">crux</a> to open in Xcode, and continue from there. This worked OK, but I always wished opening in Xcode would also jump to the same line number as the Emacs point (cursor) location. This is particularly useful if I had just spotted where I'd like to set a breakpoint in an Emacs buffer and need to transition over to Xcode.</p>
<p>It turns out, there's a nifty command line utility for that. <a href="https://www.unix.com/man-page/osx/1/xed/">xed</a>, the Xcode text editor invocation tool. It enables telling Xcode what file to open and at what line number:</p>
<pre><code class="language-{.bash">xed -line 141 path/to/some/file.swift
</code></pre>
<p>With that in mind, I've added my own version of <code>crux-open-with</code>, using <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>.</p>
<p>When running on macOS, the function checks whether or not I'm visiting a buffer for a programming language, and opens the file in Xcode at the same line number.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-open-externally ()
  &quot;Open file(s) externally.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Open externally&quot;
   (if (eq system-type 'darwin)
       (if (derived-mode-p 'prog-mode)
           (format &quot;xed --line %d '&lt;&lt;f&gt;&gt;'&quot;
                   (line-number-at-pos (point)))
         &quot;open '&lt;&lt;f&gt;&gt;'&quot;)
     &quot;xdg-open '&lt;&lt;f&gt;&gt;'&quot;)
   :shell-args '(&quot;-x&quot; &quot;-c&quot;)
   :silent-success t
   :utils (if (eq system-type 'darwin)
              &quot;open&quot;
            &quot;xdg-open&quot;)))
</code></pre>
<p><img src="https://xenodium.github.io/images/open-in-xcode-at-line-number/xed_x0.8_x2.webp" alt=""></p>
<p><code>dwim-shell-commands-open-externally</code> is now <a href="https://github.com/xenodium/dwim-shell-command/commit/19be1c2f3792c95f04fd369cb931a52f7df9cfd5">added to dwim-shell-commands.el</a>.</p>
<p>ps. If you find opening the same file in a different context handy, you may also like the package <a href="https://github.com/rmuslimov/browse-at-remote">browse-at-remote</a> that opens the visited file at its corresponding remote location (for example, GitHub). I can never remember the name of the function (<a href="https://github.com/rmuslimov/browse-at-remote">browse-at-remote</a>), so I aliased it to something I'd remember and moved on…</p>
<pre><code class="language-{.commonlisp">(defalias 'ar/open-at-github #'browse-at-remote))
</code></pre>
]]></description>
    <pubDate>Tue, 24 Oct 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trimming video screenshots</title>
<link>https://xenodium.com/trimming-video-screenshots</link>
<guid isPermaLink="false">https://xenodium.com/trimming-video-screenshots</guid>
    <description><![CDATA[<p>A quick one… I recently wanted to trim the black borders around a video screenshot. While I could use an image editor to manually select and trim, I wondered if there was an <a href="https://imagemagick.org/">imagemagick</a> trick somewhere out there for such a thing… and of course there was:</p>
<pre><code class="language-{.bash">magick convert -fuzz 3% -define trim:percent-background=0% -trim +repage path/to/input.png path/to/output.png
</code></pre>
<p>Pretty neat. It does the job, but I won't remember it next time. May as well make another <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> function out of it and conveniently invoke from Emacs via a memorable name plus fuzzy search.</p>
<p><img src="https://xenodium.github.io/images/trimming-video-screenshots/trim.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-image-trim-borders ()
  &quot;Trim image(s) border (useful for video screenshots).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Trim image border&quot;
   &quot;magick convert -fuzz 3% -define trim:percent-background=0% -trim +repage '&lt;&lt;f&gt;&gt;' '&lt;&lt;fne&gt;&gt;_trimmed.&lt;&lt;e&gt;&gt;'&quot;
   :utils &quot;magick&quot;))
</code></pre>
<p>While the screenshot I've just used was a little blurry, it's from the movie <a href="https://www.imdb.com/title/tt1104001/">Tron Legacy</a>, and it features Emacs eshell. This is old news, though <a href="https://irreal.org/blog/?p=9573">well covered</a>.</p>
<p><img src="https://xenodium.github.io/images/trimming-video-screenshots/eshell_trimmed.png" alt=""></p>
<p><code>dwim-shell-commands-image-trim-borders</code> is now <a href="https://github.com/xenodium/dwim-shell-command/commit/5bed2f6b40761db4913c8d8f58bb147c71a9ceb7">added to dwim-shell-commands.el</a></p>
]]></description>
    <pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Displaying image details in mode line</title>
<link>https://xenodium.com/displaying-image-details-in-mode-line</link>
<guid isPermaLink="false">https://xenodium.com/displaying-image-details-in-mode-line</guid>
    <description><![CDATA[<p>A benefit of running Emacs as a GUI app, is that you can view images from your beloved editor. This is super handy to take a quick peek at any image.</p>
<p>Sometimes, I'd like a little more than just viewing the image. I'd like to see basic image details like type, dimensions, and file size. The <a href="https://imagemagick.org/">imagemagick</a> <code>identify</code> utility is pretty handy for that.</p>
<pre><code class="language-bash">identify -format &quot;%m %wx%h %b&quot; path/to/image.png
</code></pre>
<p>I could easily invoke <code>shell-command</code> for this or even create a <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> function (maybe I will), but if this info was proactively displayed in the mode line, I wouldn't have to fetch it myself.</p>
<p>Since I know I can use the <code>identify</code> command for this, I may as well see if I can plug it into the mode line.</p>
<p>Turns out this wasn't too bad by setting <code>setting mode-line-format</code>. I added a little logic to only include image details while in <code>image-mode</code> and rely on <code>process-lines</code> to fetch the details. This function returns a list, which is a happy coincidence since <code>mode-line-format</code> also expects a list.</p>
<pre><code class="language-{.commonlisp">(setq-default mode-line-format
              '(&quot; &quot;
                mode-line-front-space
                mode-line-client
                mode-line-frame-identification
                mode-line-buffer-identification
                (:eval
                 (when (eq major-mode 'image-mode)
                   ;; Needs imagemagick installed.
                   (process-lines &quot;identify&quot; &quot;-format&quot; &quot;[%m %wx%h %b]&quot; (buffer-file-name))))
                &quot; &quot;
                mode-line-position
                (vc-mode vc-mode)
                (multiple-cursors-mode mc/mode-line)
                &quot; &quot; mode-line-modes
                mode-line-end-spaces))
</code></pre>
<p><img src="https://xenodium.github.io/images/displaying-image-details-in-mode-line/buddies.png" alt=""></p>
<p>I'd love to hear if there's a pure elisp alternative (<a href="https://indieweb.social/@xenodium">mastodon</a>/<a href="https://twitter.com/xenodium">twitter</a>). I gave <code>(image-size (image-get-display-property) :pixels)</code> a try, but that seemed to return the display size in buffer rather than actual file size.</p>
]]></description>
    <pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Creating an iCloud account (via tart VM)</title>
<link>https://xenodium.com/creating-icloud-test-accounts</link>
<guid isPermaLink="false">https://xenodium.com/creating-icloud-test-accounts</guid>
    <description><![CDATA[<p><em>UPDATE: This method no longer works for creating iCloud accounts. I'd love to know if you find an alternative. Please let me know.</em></p>
<p>I wanted an additional @icloud.com account for myself. My first thought was to head over to <a href="https://developer.apple.com">https://developer.apple.com</a> and create a new account, but that requires an existing email address. I wanted an actual @icloud.com email address.</p>
<p><img src="https://xenodium.github.io/images/creating-icloud-test-accounts/web.png" alt=""></p>
<p>My next thought was to create a new account using the iOS simulator, but that complained about creating too many accounts already. Strange, as I hadn't created any.</p>
<p><img src="https://xenodium.github.io/images/creating-icloud-test-accounts/iphone.png" alt=""></p>
<p>I could create an account from macOS settings itself, though that would require logging out my current account (and the syncing implications). To get around that, I could maybe create a temporary macOS user. Instead, I somewhat revisited the simulator route and looked for a VM option to run macOS. This gave me an excuse to play with VM options on macOS.</p>
<p>I had been meaning to check out <a href="https://github.com/lima-vm/lima">lima</a> as per Hacker News's <a href="https://news.ycombinator.com/item?id=36668964">Lima: A nice way to run Linux VMs on Mac</a>. The Hacker News's <a href="https://news.ycombinator.com/item?id=36668964">thread</a> has a handful of great recommendations. Amongst them, <a href="https://github.com/cirruslabs/tart/">tart</a> (macOS and Linux VMs on Apple Silicon) stood out, as it also gave me the Mac on Mac option.</p>
<p>Installing <code>tart</code> via <a href="https://brew.sh/">Homebrew</a> followed the typical <code>brew</code> command… a breeze via my trusty Emacs <a href="https://www.masteringemacs.org/article/complete-guide-mastering-eshell">eshell</a>:</p>
<pre><code class="language-{.bash">brew install cirruslabs/cli/tart
</code></pre>
<p>Cloning a VM image, while straightforward, it did take a little while for the chunky download:</p>
<pre><code class="language-{.bash">tart clone ghcr.io/cirruslabs/macos-sonoma-base:latest sonoma-base
</code></pre>
<p>Running the macOS Sonoma VM was a breeze:</p>
<pre><code class="language-{.bash">tart run sonoma-base
</code></pre>
<p>…and with that, I got a full (and disposable) macOS VM I can use to create another @icloud.com account:</p>
<p><img src="https://xenodium.github.io/images/creating-icloud-test-accounts/sonoma1.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/creating-icloud-test-accounts/sonoma2.png" alt=""></p>
<p>While there may be simpler options out there to create an @icloud.com account (please do let me know <a href="https://indieweb.social/@xenodium">mastodon</a>/<a href="https://twitter.com/xenodium">twitter</a>), the VM did the job. I'd been meaning to find a low friction mechanism to run VMs for a different reason, but that's a post for another time.</p>
]]></description>
    <pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Virtual machine (VM) bookmarks</title>
<link>https://xenodium.com/virtual-machine-vm-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/virtual-machine-vm-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/abiosoft/colima">colima: Container runtimes on macOS (and Linux) with minima…</a>.</li>
<li><a href="https://github.com/runfinch/finch">finch: The Finch CLI an open source client for container development</a>.</li>
<li><a href="https://earthly.dev/blog/lima/">lima VM - Linux Virtual Machines On macOS - Earthly Blog</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=36668964">lima: A nice way to run Linux VMs on Mac | Hacker News</a>.</li>
<li><a href="https://github.com/lima-vm/lima">lima: Linux virtual machines</a>.</li>
<li><a href="https://github.com/beringresearch/macpine">macpine: Lightweight Linux VMs on MacOS</a>.</li>
<li><a href="https://orbstack.dev/">OrbStack · Fast, light, simple Docker &amp; Linux on macOS</a>.</li>
<li><a href="https://github.com/cirruslabs/tart/">tart: macOS and Linux VMs on Apple Silicon to use in CI a…</a>.</li>
<li><a href="https://eclecticlight.co/virtualisation-on-apple-silicon/">Virtualisation on Apple silicon – The Eclectic Light Company</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 04 Oct 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs hangs saving .authinfo.gpg (workaround)</title>
<link>https://xenodium.com/emacs-hangs-saving-authinfogpg-workaround</link>
<guid isPermaLink="false">https://xenodium.com/emacs-hangs-saving-authinfogpg-workaround</guid>
    <description><![CDATA[<p>My Emacs (v29.1) was hanging when saving changes to .authinfo.gpg. Turns out, I ran into a <a href="http://git.savannah.gnu.org/cgit/emacs.git/commit/etc/PROBLEMS?id=1b9812af80b6ceec8418636dbf84c0fbcd3ab694">known issue</a> with a workaround. Downgrading gnupgp to a version older than 2.4.1 sorts things out.</p>
<p>I'm on macOS. Downgraded by downloading the 2.4.0 Homebrew formula at <a href="https://raw.githubusercontent.com/Homebrew/homebrew-core/59edfe598541186430d49cc34f42671e849e2fc9/Formula/gnupg.rb">https://raw.githubusercontent.com/Homebrew/homebrew-core/59edfe598541186430d49cc34f42671e849e2fc9/Formula/gnupg.rb</a> and installing with:</p>
<pre><code class="language-{.bash">brew unlink gnupg
brew install ~/Downloads/gnupg.rb
</code></pre>
]]></description>
    <pubDate>Sat, 16 Sep 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Redact that buffer</title>
<link>https://xenodium.com/redact-that-buffer</link>
<guid isPermaLink="false">https://xenodium.com/redact-that-buffer</guid>
    <description><![CDATA[<p>As I was getting ready to take an Emacs screenshot in the <a href="https://xenodium.com/emacs-send-to-kindle/">previous post</a>, I figured I may want to redact email addresses before moving forward. I had a quick look for existing options and found <a href="https://github.com/bkaestner/redacted.el">redacted.el</a>, built-in <code>toggle-rot13-mode</code>, and <a href="https://github.com/alphapapa/unpackaged.el#obfuscate-buffer-text-with-lorem-ipsum-words">unpackaged/lorem-ipsum-overlay</a>. All great options. I wanted a solution I could feed a single regular expression to obscure matches. I also wanted toggling capabilities, so I had a quick go at it…</p>
<p><img src="https://xenodium.github.io/images/redact-that-buffer/redact-regexp.gif" alt=""></p>
<p>I also wanted the ability to redact the entire buffer content, so feeding a space to the regexp query also translates to <code>[[:graph:]]</code>, effectively redacting all visible characters.</p>
<p><img src="https://xenodium.github.io/images/redact-that-buffer/redact-all.gif" alt=""></p>
<p>The solution is overlay-based, ensuring the buffer content remains unchanged. The function may have its own rough edges, yet it certainly scratched the itch for the current need. I'll leave ya with the snippet.</p>
<pre><code class="language-{.commonlisp">(defun ar/toggle-redact-buffer ()
  &quot;Redact buffer content matching regexp. A space redacts all.&quot;
  (interactive)
  (let* ((redacted)
         (regexp (string-trim (read-regexp &quot;Redact regexp&quot; 'regexp-history-last)))
         (matches (let ((results '()))
                    (when (string-empty-p regexp)
                      (setq regexp &quot;[[:graph:]]&quot;)
                      (setq regexp-history-last regexp)
                      (add-to-history 'regexp-history regexp))
                    (save-excursion
                      (goto-char (point-min))
                      (while (re-search-forward regexp nil t)
                        (push (cons (match-beginning 0) (match-end 0)) results)))
                    (nreverse results))))
    (mapc (lambda (match)
            (dolist (overlay (overlays-in (car match) (cdr match)))
              (setq redacted t)
              (delete-overlay overlay))
            (unless redacted
              (overlay-put (make-overlay (car match) (cdr match))
                           'display (make-string (- (cdr match) (car match)) ?x))))
          matches)))
</code></pre>
]]></description>
    <pubDate>Fri, 15 Sep 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Send note to Kindle</title>
<link>https://xenodium.com/emacs-send-to-kindle</link>
<guid isPermaLink="false">https://xenodium.com/emacs-send-to-kindle</guid>
    <description><![CDATA[<p>While on Mastodon, I spotted <a href="https://indieweb.social/@summeremacs@fashionsocial.host">@summeremacs</a> looking into <a href="https://indieweb.social/@summeremacs@fashionsocial.host/111058226788825431">sending Emacs text selections to a Kindle via email</a>. This sparked my interest as I previously looked into <a href="https://xenodium.com/emailing-pdfs-to-kindle-from-mu4e/">sending pdfs to my Kindle</a> via <a href="https://github.com/djcb/mu">mu4e</a>.</p>
<p>Kindle offers a neat service where you can email a file to your <code>@kindle.com</code> address and it automatically shows up in your Kindle library.</p>
<p>I already do email from my beloved editor, and like most Emacs things, it's powered by <a href="https://en.wikipedia.org/wiki/Emacs_Lisp">elisp</a>. In other words, it's basically up for grabs if you'd like to glue it to anything else, so I did…</p>
<p>I can now select a region and invoke <code>M-x send-to-kindle-as-txt</code> to send it over to my Kindle.</p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-kindle/send-to-my-kindle.gif" alt=""></p>
<p>Soon enough, the note shows up on my Kindle.</p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-kindle/listed.png" alt=""></p>
<p>Opening the note reveals the same content we had previously selected and sent from our malleable editor.</p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-kindle/repeated.png" alt=""></p>
<p>While it looks kinda magical, it's fairly simple under the hood. It takes the region content, writes it to a txt file, creates an email message buffer attaching the file, and finally sends via <code>message-send-and-exit</code>.</p>
<p>If <code>M-x send-to-kindle-as-txt</code> is invoked with a <code>C-u</code> prefix, you get to inspect the message buffer right before sending via <code>C-c C-c</code>.</p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-kindle/email.png" alt=""></p>
<p>Here's the full snippet.</p>
<pre><code class="language-{.commonlisp">(defcustom send-to-kindle-from-email
  nil
  &quot;Your own email address to send from via mu4e.&quot;
  :type 'string
  :group 'send-to-kindle)

(defcustom send-to-kindle-to-email
  nil
  &quot;Your Kindle email address to send pdf to.&quot;
  :type 'string
  :group 'send-to-kindle)

(defun send-to-kindle-as-txt (review)
  (interactive &quot;P&quot;)
  (unless send-to-kindle-from-email
    (setq send-to-kindle-from-email
          (read-string &quot;From email address: &quot;)))
  (unless send-to-kindle-to-email
    (setq send-to-kindle-to-email
          (read-string &quot;To email address: &quot;)))
  (let* ((content (string-trim (if (region-active-p)
                                   (buffer-substring (region-beginning) (region-end))
                                 (buffer-string))))
         (note-name (let ((name (string-trim (read-string &quot;Note name: &quot;))))
                      (if (string-empty-p name)
                          (nth
                           0 (string-split
                              (substring content 0 (min 40 (length content))) &quot;\n&quot;))
                        name)))
         (path (concat (temporary-file-directory) note-name))
         (txt (concat path &quot;.txt&quot;))
         (buffer (get-buffer-create (generate-new-buffer-name &quot;*Email txt*&quot;))))
    (with-temp-buffer
      (insert content)
      (write-file txt))
    (with-current-buffer buffer
      (erase-buffer)
      ;; Disable hooks
      (let ((message-mode-hook nil))
        (message-mode))
      (insert
       (format
        &quot;From: %s
To: %s
Subject: %s
--text follows this line--
&lt;#multipart type=mixed&gt;
&lt;#part type=\&quot;text/plain\&quot; filename=\&quot;%s\&quot; disposition=attachment&gt;
&lt;#/part&gt;
&lt;#/multipart&gt;&quot;
        send-to-kindle-from-email
        send-to-kindle-to-email
        note-name txt))
      (unless review
        (message-send-and-exit)))
    (when review
      (switch-to-buffer buffer))))
</code></pre>
<p>By the way, and I only just learned this today… To take a screenshot on a Kindle Paperwhite, tap on these opposite corners.</p>
<p><img src="https://xenodium.github.io/images/emacs-send-to-kindle/tap-screenshot.png" alt=""></p>
]]></description>
    <pubDate>Fri, 15 Sep 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>SHA-256 hash from URL, the easy way</title>
<link>https://xenodium.com/sha-256-hash-from-url-the-easy-way</link>
<guid isPermaLink="false">https://xenodium.com/sha-256-hash-from-url-the-easy-way</guid>
    <description><![CDATA[<p>From time to time, I need to generate a SHA-256 hash from a file hosted on some server. For me, this flow typically goes something along the lines of:</p>
<ul>
<li>Copy the file URL from browser.</li>
<li>Drop to Emacs eshell.</li>
<li>Change current directory.</li>
<li>Type &quot;curl -o file&quot;</li>
<li>Paste the file URL.</li>
<li>Run curl command.</li>
<li>Type &quot;shasum -a 256 file&quot;.</li>
<li>Run <a href="https://linux.die.net/man/1/shasum">shasum</a> command.</li>
<li>Copy the generated hash.</li>
<li>Maybe delete the downloaded file?</li>
</ul>
<p>We can maybe shave some steps off by downloading directly from the browser, though that may also bring additional clicks and navigating to a download location.</p>
<p>Amongst the steps, <a href="https://linux.die.net/man/1/shasum">shasum</a> is the star player, and its output can be seen below.</p>
<pre><code class="language-bash">shasum -a 256 path/to/downloaded/file
</code></pre>
<p>Not a huge deal. One can copy the hash from the output, but why go through multiple small manual steps when I know I can get Emacs to simplify the lot? I've expedited a similar flow in the past when <a href="https://xenodium.com/emacs-clone-git-repo-from-clipboard/">cloning git repos</a>. Let's simplify again so hashing a hosted file boils down to:</p>
<ul>
<li>Copy the file URL from browser.</li>
<li>Run an Emacs interactive command.</li>
</ul>
<p>This is where I pull out <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> (a little package I wrote) and glue the lot to get an expedited experience.</p>
<p><img src="https://xenodium.github.io/images/sha-256-hash-from-url-the-easy-way/hash.gif" alt=""></p>
<p>There isn't much to the function other than glueing a little elisp and a shell script via <code>dwim-shell-command</code> for some buffer/error handling.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-sha-256-hash-file-at-clipboard-url ()
  &quot;Download file at clipboard URL and generate SHA-256 hash.&quot;
  (interactive)
  (let ((url (current-kill 0)))
    (unless (string-match-p &quot;^http[s]?://&quot; url)
      (user-error &quot;No URL in clipboard&quot;))
    (dwim-shell-command-on-marked-files
     &quot;Generate SHA-256 hash from clipboard URL.&quot;
     (format
      &quot;temp_file=$(mktemp)
       function cleanup {
         rm -f $temp_file
       }
       trap cleanup EXIT
       curl --no-progress-meter --location --fail --output $temp_file %s || exit 1
       shasum -a 256 $temp_file | awk '{print $1}'&quot;
      (shell-quote-argument url))
     :utils '(&quot;curl&quot; &quot;shasum&quot;)
     :on-completion
     (lambda (buffer process)
       (if-let ((success (= (process-exit-status process) 0))
                (hash (with-current-buffer buffer
                        (string-trim (buffer-string)))))
           (progn
             (kill-buffer buffer)
             (kill-new hash)
             (message &quot;Copied %s to clipboard&quot;
                      (propertize hash 'face 'font-lock-string-face)))
         (switch-to-buffer buffer))))))
</code></pre>
<p><code>dwim-shell-commands-sha-256-hash-file-at-clipboard-url</code> is now in <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>, the optional counterpart in <a href="https://github.com/xenodium/dwim-shell-command/">dwim-shell-command</a>.</p>
<h2>UPDATE</h2>
<p>There's better way. Thanks to <a href="https://emacs.ch/@pkal">Philip Kaludercic</a> for <a href="https://emacs.ch/@pkal/111041928308815477">suggesting</a> <code>curl -s example.com | sha256sum - | cut -d &quot; &quot; -f1</code> and <a href="https://emacs.ch/@sachac">Sacha Chua</a> who pinged me about it.</p>
<p>Also note I'm now relying on the <code>&lt;&lt;cb&gt;&gt;</code> template, since dwim-shell-command replaces it with the clipboard/kill ring.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-sha-256-hash-file-at-clipboard-url ()
  &quot;Download file at clipboard URL and generate SHA-256 hash.&quot;
  (interactive)
  (unless (string-match-p &quot;^http[s]?://&quot; (current-kill 0))
    (user-error &quot;No URL in clipboard&quot;))
  (dwim-shell-command-on-marked-files
   &quot;Generate SHA-256 hash from clipboard URL.&quot;
   &quot;curl -s '&lt;&lt;cb&gt;&gt;' | sha256sum - | cut -d ' ' -f1&quot;
   :utils '(&quot;curl&quot; &quot;sha256sum&quot;)
   :on-completion
   (lambda (buffer process)
     (if-let ((success (= (process-exit-status process) 0))
              (hash (with-current-buffer buffer
                      (string-trim (buffer-string)))))
         (progn
           (kill-buffer buffer)
           (kill-new hash)
           (message &quot;Copied %s to clipboard&quot;
                    (propertize hash 'face 'font-lock-string-face)))
       (switch-to-buffer buffer)))))
</code></pre>
]]></description>
    <pubDate>Sun, 10 Sep 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Inline previous result and why you should edebug</title>
<link>https://xenodium.com/inline-previous-result-and-why-you-should-edebug</link>
<guid isPermaLink="false">https://xenodium.com/inline-previous-result-and-why-you-should-edebug</guid>
    <description><![CDATA[<p>Artur Malabarba's <a href="https://endlessparentheses.com/debugging-emacs-lisp-part-1-earn-your-independence.html">Debugging Elisp Part 1: Earn your independence</a> is nearly a decade old, yet it rings just as true today.</p>
<p>Learning to Edebug really <em>&quot;is the right decision for anyone who doesn't know how to Edebug.&quot;</em> Why, you may ask? He best puts it as <em>&quot;running into errors is not only a consequence of tinkering with your editor, it is the only road to graduating in Emacs.&quot;</em></p>
<p>For me personally, it <em>earned me that independence</em> to bend Emacs my way. Don't like how something works? Pull up the debugger to help me understand how a package or function works. I've done this countless of times to bend things my way.</p>
<p>Speaking of edebug, I had been meaning to tweak edebug's result display behaviour for quite some time. As you step through code, edbug prints the result of previous expressions to the minibuffer. This works well, but I couldn't help but feel like my eyes were constantly jumping between the code and the minibuffer at the bottom of the window.</p>
<p><img src="https://xenodium.github.io/images/inline-previous-result-and-why-you-should-edebug/edebug-minibuffer.gif" alt=""></p>
<p>I wanted to minimize the eye jumping experience, so I figured I could likely bend things my way and print the result at point. How did I go about it? The same way I often do. Figure out what function is called for a given key binding via <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Help.html">describe-key</a> or my favourite replacement helpful-key from <a href="https://github.com/Wilfred/helpful">helpful.el</a>. This led me to <code>edebug-next-mode</code> in <code>edebug.el</code>. At that point, I could have set a breakpoint in <code>edebug-next-mode</code> and eventually step into the relevant code, but hey we had a better clue. We knew that all output started with &quot;Result:&quot;, so we could just search for that string in <code>edebug.el</code> instead. Jackpot! <code>edebug-compute-previous-result</code> and its adjacent <code>edebug-previous-result</code> are just the right functions:</p>
<pre><code class="language-{.commonlisp">(defun edebug-compute-previous-result (previous-value)
  (if edebug-unwrap-results
      (setq previous-value
            (edebug-unwrap* previous-value)))
  (setq edebug-previous-result
        (concat &quot;Result: &quot;
                (edebug-safe-prin1-to-string previous-value)
                (eval-expression-print-format previous-value))))

(defun edebug-previous-result ()
  &quot;Print the previous result.&quot;
  (interactive)
  (message &quot;%s&quot; edebug-previous-result))
</code></pre>
<p>We can see that <code>edebug-previous-result</code> invokes <code>message</code> which is responsible for displaying the debugged expression's result in the minibuffer. Modifying this functions behaviour would be enough to achieve inline display, but I also want to remove &quot;Result:&quot; from the displayed message. Neither of these functions offer configurability, so we'll resort to advising both functions. That is, <a href="https://en.wikipedia.org/wiki/Monkey_patch">monkey patch</a> them (errm I know… lovely).</p>
<pre><code class="language-{.commonlisp">(defun adviced:edebug-compute-previous-result (_ &amp;rest r)
  &quot;Adviced `edebug-compute-previous-result'.&quot;
  (let ((previous-value (nth 0 r)))
    (if edebug-unwrap-results
        (setq previous-value
              (edebug-unwrap* previous-value)))
    (setq edebug-previous-result
          (edebug-safe-prin1-to-string previous-value))))

(advice-add #'edebug-compute-previous-result
            :around
            #'adviced:edebug-compute-previous-result)
</code></pre>
<p><code>adviced:edebug-compute-previous-result</code> removes &quot;Result:&quot; in addition to dropping <code>(eval-expression-print-format previous-value)</code>, which I don't typically rely on.</p>
<pre><code class="language-{.commonlisp">(require 'eros)

(defun adviced:edebug-previous-result (_ &amp;rest r)
  &quot;Adviced `edebug-previous-result'.&quot;
  (eros--make-result-overlay edebug-previous-result
    :where (point)
    :duration eros-eval-result-duration))

(advice-add #'edebug-previous-result
            :around
            #'adviced:edebug-previous-result)
</code></pre>
<p><code>adviced:edebug-previous-result</code> is in charge of display via <code>message</code>, so all we need is some replacement. I initially played with <a href="https://github.com/auto-complete/popup-el">popup-tip</a> and that <a href="https://indieweb.social/@xenodium/111008598580447299">did the job just fine</a>, but <a href="https://emacs.ch/@fosskers">Colin</a> led me to a better path while <a href="https://emacs.ch/@fosskers/111009811997698187">pointing to Clojure and Common Lisp</a>. This reminded me of <a href="https://github.com/xiongtx/eros">eros: Evaluation Result OverlayS for Emacs Lisp</a>, which I already used. Swapping <code>message</code> for <code>eros--make-result-overlay</code> did the trick. Yes, this is a private function, but I can live with that. This code is only an <code>advice-remove</code> away from disabling, but hey look at those <em>inline results</em>!</p>
<p><img src="https://xenodium.github.io/images/inline-previous-result-and-why-you-should-edebug/edebug-inline.gif" alt=""></p>
]]></description>
    <pubDate>Tue, 05 Sep 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Further sqlite-mode extensions</title>
<link>https://xenodium.com/further-sqlite-mode-extensions</link>
<guid isPermaLink="false">https://xenodium.com/further-sqlite-mode-extensions</guid>
    <description><![CDATA[<p>I've continued poking at Emacs 29's sqlite-mode. Since <a href="https://xenodium.com/sqlite-mode-goodies/">my last post on extensions</a>, I've experimented a little with adding a handful of interactive functions:</p>
<ul>
<li><code>sqlite-mode-extras-compose-and-execute</code>: Compose and execute a query.</li>
</ul>
<p><img src="https://xenodium.github.io/images/further-sqlite-mode-extensions/compose-execute.gif" alt=""></p>
<ul>
<li><code>sqlite-mode-extras-execute</code>: Execute a query.</li>
</ul>
<p><img src="https://xenodium.github.io/images/further-sqlite-mode-extensions/execute.gif" alt=""></p>
<ul>
<li><code>sqlite-mode-extras-add-row</code>: Add row to table at point.</li>
</ul>
<p><img src="https://xenodium.github.io/images/further-sqlite-mode-extensions/add-row.gif" alt=""></p>
<ul>
<li><code>sqlite-mode-extras-delete-row-dwim</code>: Similar to <code>sqlite-mode-delete</code> but also enables deleting range in region.</li>
</ul>
<p><img src="https://xenodium.github.io/images/further-sqlite-mode-extensions/delete-rows.gif" alt=""></p>
<ul>
<li><code>sqlite-mode-extras-refresh</code>: Refreshes the buffer re-querying the database.</li>
<li><code>sqlite-mode-extras-ret-dwim</code>: If on table, toggle expansion. If on row, edit it.</li>
<li><code>sqlite-mode-extras-execute-and-display-select-query</code>: Executes a query and displays results.</li>
</ul>
<p><img src="https://xenodium.github.io/images/further-sqlite-mode-extensions/select-earth.gif" alt=""></p>
<p>I've been playing with the following key bindings:</p>
<pre><code class="language-{.commonlisp">(use-package sqlite-mode-extras
  :bind (:map
         sqlite-mode-map
         (&quot;n&quot; . next-line)
         (&quot;p&quot; . previous-line)
         (&quot;b&quot; . sqlite-mode-extras-backtab-dwim)
         (&quot;f&quot; . sqlite-mode-extras-tab-dwim)
         (&quot;+&quot; . sqlite-mode-extras-add-row)
         (&quot;D&quot; . sqlite-mode-extras-delete-row-dwim)
         (&quot;C&quot; . sqlite-mode-extras-compose-and-execute)
         (&quot;E&quot; . sqlite-mode-extras-execute)
         (&quot;S&quot; . sqlite-mode-extras-execute-and-display-select-query)
         (&quot;DEL&quot; . sqlite-mode-extras-delete-row-dwim)
         (&quot;g&quot; . sqlite-mode-extras-refresh)
         (&quot;&lt;backtab&gt;&quot; . sqlite-mode-extras-backtab-dwim)
         (&quot;&lt;tab&gt;&quot; . sqlite-mode-extras-tab-dwim)
         (&quot;RET&quot; . sqlite-mode-extras-ret-dwim)))
</code></pre>
<p>The code lives in <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/sqlite-mode-extras.el">sqlite-mode-extras.el</a> under my <a href="https://github.com/xenodium/dotsies/tree/main">Emacs config repo</a>. Beware, it's fairly experimental and hasn't been tested thoroughly.</p>
]]></description>
    <pubDate>Sun, 27 Aug 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>My custom Tesco Clubcard pkpass</title>
<link>https://xenodium.com/my-custom-tesco-clubcard-pkpass</link>
<guid isPermaLink="false">https://xenodium.com/my-custom-tesco-clubcard-pkpass</guid>
    <description><![CDATA[<p>My significant other and I had two plastic Tesco Clubcards. I lost mine, so I took a picture of hers. I was fairly certain a barcode photo would scan just as well at self-checkout, and it did.</p>
<p>This got me thinking about Apple's Wallet <a href="https://en.wikipedia.org/wiki/PKPASS">pkpasses</a>. I don't really know much about them. Could I potentially create my own <code>.pkpass</code>? If I could just include the same barcode as in the photo, it should do the job just fine.</p>
<p>Now I should mention, <a href="https://apps.apple.com/gb/app/tesco-grocery-clubcard/id389581236">Tesco does have an app on the App Store</a>. If you just want the official Wallet pass on your iPhone, use that. But I was curious about whether or not I could create my own pass.</p>
<p>Turns out I <em>can</em>. I followed Apple's <a href="https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/YourFirst.html">building your first pass</a> which runs you through <a href="https://developer.apple.com/help/account/configure-app-capabilities/create-wallet-identifiers-and-certificates">creating Wallet identifiers/certificates</a>, editing <code>pass.json</code>, and downloading/building <a href="https://developer.apple.com/services-account/download?path=/iOS/Wallet_Support_Materials/WalletCompanionFiles.zip">signpass</a> (the utility used to sign <code>.pass</code> bundles).</p>
<p>The <code>signpass</code> utility is included in WalletCompanionFiles.zip, which comes with a handful of sample passes.</p>
<pre><code class="language-{.commonlisp">WalletCompanionFiles
│
├── SamplePasses
│   │
│   ├── BoardingPass.pass
│   ├── Coupon.pass
│   ├── Event.pass
│   ├── Event.pkpass
│   ├── Generic.pass
│   └── StoreCard.pass
│       │
│       ├── pass.json
│       └── ...
└── signpass
</code></pre>
<p>Being a rewards card, I opted to look into <code>StoreCard.pass</code>, but like all other passes, the <code>barcode</code> itself is what makes each pass scannable. The barcode details are specified in the bundles's <code>pass.json</code> file. I needed to figure out the relevant values describing the Tesco barcode.</p>
<pre><code class="language-json">&quot;barcode&quot;: {
  &quot;format&quot;: &quot;???&quot;,
  &quot;message&quot;: &quot;???&quot;,
  &quot;messageEncoding&quot;: &quot;???&quot;
}
</code></pre>
<p>I had no clue what values I should use for a Tesco Clubcard. I did, however, have a photo of the barcode I needed. This is in fact what prompted looking into <a href="https://xenodium.com/emacs-scan-this-qrcode">scanning barcodes from Emacs</a>, which worked just great. It gave me all the crucial bits for the Clubcard.</p>
<pre><code class="language-json">&quot;barcode&quot;: {
  &quot;format&quot;: &quot;PKBarcodeFormatCode128&quot;,
  &quot;message&quot;: &quot;1234567890123456&quot;,  // not my actual Clubcard number of course.
  &quot;messageEncoding&quot;: &quot;iso-8859-1&quot;
}
</code></pre>
<p>That's all that's needed for the barcode section, the most useful part of the pass. We're not done though. We also need our registered Wallet identifiers, so the <code>signpass</code> utility can sign.</p>
<pre><code class="language-json">&quot;passTypeIdentifier&quot;: &quot;my.com.identifier.passmaker&quot;, // also not my actual one.
&quot;teamIdentifier&quot;: &quot;AAABBBCCCD&quot;, // nor this one.
</code></pre>
<p>We should be able to sign the pass with the following:</p>
<pre><code class="language-{.bash">signpass -p StoreCard.pass
</code></pre>
<p>We're technically done. We now have a working card, but it looks just like the sample store card included in WalletCompanionFiles.</p>
<p><img src="https://xenodium.github.io/images/my-custom-tesco-clubcard-pkpass/lemons.png" alt=""></p>
<p>What's the fun in that? Now that I can make my own Clubcard, let's customize it!</p>
<p>For imagery, I replaced a couple of images in the .pass bundle:</p>
<pre><code class="language-c">StoreCard.pass
│
├── pass.json
├── icon.png
├── logo.png // replaced
└── strip.png // replaced
</code></pre>
<p>I replaced <code>logo.png</code> using a <a href="https://en.wikipedia.org/wiki/File:Tesco_Logo.svg">Tesco logo I found on Wikipedia</a>. I had initially removed <code>strip.png</code>, but that made the card feel a little empty. I was thinking of using a Tesco carrier bag to bulk the space up. While I didn't find a suitable bag image, I did land on &quot;<a href="https://banksyexplained.com/very-little-helps-2008/">Very Little Helps, 2008</a>&quot;. Using my limited <a href="https://www.gimp.org/">GIMP</a> skills, I cropped one of the images and also replaced <code>strip.png</code>.</p>
<p>The remaining customizations took place in <code>pass.json</code> and should be fairly self-explanatory. There's the text shown in all labels as well as three customizable colours (background, label, and foreground).</p>
<pre><code class="language-json">{
  &quot;formatVersion&quot;: 1,
  &quot;passTypeIdentifier&quot;: &quot;my.com.identifier.passmaker&quot;, // also not my actual one.
  &quot;teamIdentifier&quot;: &quot;AAABBBCCCD&quot;, // nor this one.
  &quot;serialNumber&quot;: &quot;AnySerialNumberYouWant&quot;,
  &quot;barcode&quot;: {
    &quot;format&quot;: &quot;PKBarcodeFormatCode128&quot;,
    &quot;message&quot;: &quot;1234567890123456&quot;,
    &quot;messageEncoding&quot;: &quot;iso-8859-1&quot;
  },
  &quot;organizationName&quot;: &quot;Not Tesco of course&quot;,
  &quot;description&quot;: &quot;Not a Tesco reqards card&quot;,
  &quot;logoText&quot;: &quot;Clubcard&quot;,
  &quot;foregroundColor&quot;: &quot;rgb(255, 255, 255)&quot;,
  &quot;labelColor&quot;: &quot;rgb(255, 255, 255)&quot;,
  &quot;backgroundColor&quot;: &quot;rgb(2, 81, 158)&quot;, // Blue for that Tesco look
  &quot;storeCard&quot;: {
    &quot;auxiliaryFields&quot;: [
      {
        &quot;key&quot;: &quot;membership&quot;,
        &quot;label&quot;: &quot;Member since 2023&quot;,
        &quot;value&quot;: &quot;&quot;
      },
      {
        &quot;key&quot;: &quot;membership2&quot;,
        &quot;label&quot;: &quot;Expires sometime&quot;,
        &quot;value&quot;: &quot;&quot;
      }
    ]
  }
}
</code></pre>
<p>…and with all that, here's what my very own custom Tesco Clubcard pkpass looks like. As you can appreciate, my image-editing skills aren't all that great, but hey this will do for now.</p>
<p><img src="https://xenodium.github.io/images/my-custom-tesco-clubcard-pkpass/bsy.png" alt=""></p>
<h2>Update</h2>
<p>Redditor u/stupergenius <a href="https://www.reddit.com/r/programming/comments/15y4c65/comment/jxa1obg/?utm_source=share&amp;utm_medium=web2x&amp;context=3">suggested using the image's original background color</a>. Nice suggestion. Tweaked via pass.json:</p>
<pre><code class="language-json">&quot;foregroundColor&quot;: &quot;rgb(2, 81, 158)&quot;,
&quot;labelColor&quot;: &quot;rgb(15, 58, 105)&quot;,
&quot;backgroundColor&quot;: &quot;rgb(166, 202, 214)&quot;,
</code></pre>
<p><img src="https://xenodium.github.io/images/my-custom-tesco-clubcard-pkpass/bsy-light.png" alt=""></p>
]]></description>
    <pubDate>Tue, 22 Aug 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Extending sqlite-mode (cell navigation + edits)</title>
<link>https://xenodium.com/sqlite-mode-goodies</link>
<guid isPermaLink="false">https://xenodium.com/sqlite-mode-goodies</guid>
    <description><![CDATA[<p>I recently <a href="https://xenodium.com/emacs-29s-sqlite-mode/">wrote about Emacs 29's new sqlite-mode</a>, which enables you to browse sqlite databases from your beloved editor.</p>
<p>Out of the box, it supports the following browsing features:</p>
<ul>
<li><code>sqlite-mode-list-data</code>: List the data from the table under point.</li>
<li><code>sqlite-mode-list-column</code>: List the columns of the table under point.</li>
<li><code>sqlite-mode-list-tables</code>: Re-list the tables from the currently selected database.</li>
</ul>
<p>On the editing side of things it supports row deletion:</p>
<ul>
<li><code>sqlite-mode-delete</code>: Delete the row under point.</li>
</ul>
<p>While fairly spartan, it lays foundations for additional tools and features.</p>
<p>Two features I would like to have:</p>
<ol>
<li>TAB navigation across table rows and columns.</li>
<li>Updating the row's field at point.</li>
</ol>
<p>This would give me the familiar behaviour I'm used to in my org tables as well as other common spreadsheet tools.</p>
<p>Luckily, this is Emacs, so we can bend it our way… and I sure did!</p>
<p>Here's tab navigating forward:</p>
<p><img src="https://xenodium.github.io/images/sqlite-mode-goodies/sqlite-forward.gif" alt=""></p>
<p>Here's tab navigating backward:</p>
<p><img src="https://xenodium.github.io/images/sqlite-mode-goodies/sqlite-previous.gif" alt=""></p>
<p>And updating row fields:</p>
<p><img src="https://xenodium.github.io/images/sqlite-mode-goodies/sqlite-edits.gif" alt=""></p>
<p>Most of the navigation is achieved by querying the current buffer to figure out column positions. Editing was in some ways easier, as I looked at <code>sqlite-mode-delete</code> to figure out how it handled the query.</p>
<p>To get the more familiar navigation behaviour, I've adjusted my key bindings as follows:</p>
<pre><code class="language-{.commonlisp">(use-package sqlite-mode-extras
  :bind (:map
         sqlite-mode-map
         (&quot;n&quot; . next-line)
         (&quot;p&quot; . previous-line)
         (&quot;&lt;backtab&gt;&quot; . sqlite-mode-extras-backtab-dwim)
         (&quot;&lt;tab&gt;&quot; . sqlite-mode-extras-tab-dwim)
         (&quot;RET&quot; . sqlite-mode-extras-ret-dwim)))
</code></pre>
<p>The code for <code>sqlite-mode-extras-tab-dwim</code>, <code>sqlite-mode-extras-backtab-dwim</code>, and <code>sqlite-mode-extras-ret-dwim</code> is little rough still (hacky even), but hey still fun.</p>
<p>For now, the code lives in <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/sqlite-mode-extras.el">sqlite-mode-extras.el</a> under my <a href="https://github.com/xenodium/dotsies/tree/main">Emacs config repo</a>. Improvements/fixes totally welcome!</p>
]]></description>
    <pubDate>Mon, 07 Aug 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs 29's sqlite-mode</title>
<link>https://xenodium.com/emacs-29s-sqlite-mode</link>
<guid isPermaLink="false">https://xenodium.com/emacs-29s-sqlite-mode</guid>
    <description><![CDATA[<p>I've jumped on the Emacs 29 bandwagon! Mickey Petersen has a great rundown of <a href="https://www.masteringemacs.org/article/whats-new-in-emacs-29-1">What's New in Emacs 29.1</a>.</p>
<p>Now every so often, I need to take a quick peek at an <a href="https://www.sqlite.org/index.html">sqlite3</a> table. Emacs 29.1 ships <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Database.html">sqlite-mode</a>, which can help with that. Use <code>sqlite-mode-open-file</code> to open a database.</p>
<p>Pressing <code>RET</code> on a table shows its content via <code>sqlite-mode-list-data</code>. <code>DEL</code> does as you'd expect and delete a row via <code>sqlite-mode-delete</code>.</p>
<p><img src="https://xenodium.github.io/images/emacs-29s-sqlite-mode/sqlite-mode.gif" alt=""></p>
]]></description>
    <pubDate>Sun, 06 Aug 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: scan this QR/bar code</title>
<link>https://xenodium.com/emacs-scan-this-qrcode</link>
<guid isPermaLink="false">https://xenodium.com/emacs-scan-this-qrcode</guid>
    <description><![CDATA[<p>Another day, another tool brought to my Emacs fingertips. A while ago, I wrote about easily <a href="https://xenodium.com/copy-from-desktop-to-mobile-via-qr-code/">copying text from desktop to mobile via QR codes</a>. Later on, I brought it under <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> as <a href="https://github.com/xenodium/dwim-shell-command/blob/67da65f97d7f5477e19407d25887c23fab31517d/dwim-shell-commands.el#L593">dwim-shell-commands-clipboard-to-qr</a>.</p>
<p>This time around, I needed the opposite: to scan a code from an image file. This is where <a href="https://github.com/mchehab/zbar">zbar</a>'s <code>zbarimg</code> comes in. These days, I'm mostly on macOS, so I installed via <a href="https://brew.sh/">Homebrew</a>:</p>
<pre><code class="language-{.bash">$ brew install zbar
</code></pre>
<p>There's really nothing to the command. You feed it an image, and it outputs the scanned details. Perfect.</p>
<pre><code class="language-{.bash">$ zbarimg path/to/code-128.png
CODE-128:hello world
scanned 1 barcode symbols from 1 images in 0.02 seconds
</code></pre>
<p>The only challenge is my brain. I probably won't remember the name of this wonderful tool next time I need it, so I'll just add it to my <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el arsenal</a> with a memorable name:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-image-scan-code ()
  &quot;Scan any code from image(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Scan code&quot;
   &quot;zbarimg '&lt;&lt;f&gt;&gt;'&quot;
   :utils &quot;zbarimg&quot;))
</code></pre>
<p>In the future, rather than reaching out to <code>zbarimg</code> directly, I'll use my trusty fuzzy search and… voilà!</p>
<p><img src="https://xenodium.github.io/images/emacs-scan-this-qrcode/scan-dired.gif" alt=""></p>
<p>Because <code>dwim-shell-command</code> operates on either <code>dired</code> files or current file, we can also apply our new function when viewing the QR code itself.</p>
<p><img src="https://xenodium.github.io/images/emacs-scan-this-qrcode/scan-image.gif" alt=""></p>
<p><code>dwim-shell-commands-image-scan-code</code> is now <a href="https://github.com/xenodium/dwim-shell-command/commit/85ebcb0a466ddfe48e543d585e16aff7aee8da5e">pushed to dwim-shell-commands.el</a>, the optional package in <a href="https://github.com/xenodium/dwim-shell-command/">dwim-shell-command</a>.</p>
]]></description>
    <pubDate>Sun, 30 Jul 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A cure for JavaScript fatigue?</title>
<link>https://xenodium.com/a-cure-for-javascript-fatigue</link>
<guid isPermaLink="false">https://xenodium.com/a-cure-for-javascript-fatigue</guid>
    <description><![CDATA[<p>It's been roughly a decade since I wrote any significant amount of JavaScript. Back then, I primarily relied on the <a href="https://developers.google.com/closure/compiler/">Google Closure Compiler</a>, now maybe an archaeological artefact? These days, it's hard not to bump into any JavaScript project that doesn't rely on <a href="https://www.npmjs.com/">npm</a>, along with many other tools like the <a href="https://www.typescriptlang.org/">Typescript</a> compiler, <a href="https://eslint.org/">ESLint</a>, <a href="https://prettier.io/">Prettier</a>… There are a ton of available frameworks too. I was somewhat put off (or maybe just lazy?) by the initial ramp-up to reenter the JavaScript world. I guess that's what some refer to as <a href="https://medium.com/@ericclemmons/javascript-fatigue-48d4011b6fc4#.prcj59904">Javascript Fatigue</a>.</p>
<p>I'm giving JavaScript another try, but this time with an Emacs <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> standing by. Reentering the JavaScript world as a noob, I often know what I want to enable, but I'm unfamiliar with which project knobs to turn to set things up.</p>
<p>While I may want to dig deeper into things in the future, at present I just want to dabble with JavaScript. I want a local project set up as quickly as possible. ChatGPT has been pretty handy at that. The Emacs ChatGPT shell and its minibuffer prompts work fairly well for my needs, yet I often found myself wishing it could behave more like a <a href="https://magit.vc/">magit</a> commit buffer. That is, launch a dedicated buffer (not the shell itself), ask the question, maybe paste some snippets, and send it on its way with that oh so familiar and satisfying <code>C-c C-c</code> binding (<a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Sending-Mail.html">sending mail</a> also says hello).</p>
<p>This is where <code>M-x chatgpt-shell-prompt-compose</code> comes in. It's a mash between the ChatGPT shell and a magit commit buffer:</p>
<p><img src="https://xenodium.github.io/images/a-cure-for-javascript-fatigue/node-chatgpt.gif" alt=""></p>
<p>In the background, the buffer is still powered by the shell itself, so you can reuse it to ask clarifying questions.</p>
<p><img src="https://xenodium.github.io/images/a-cure-for-javascript-fatigue/compose.gif" alt=""></p>
<p>A couple of additional features worth mentioning… Invoking <code>chatgpt-shell-prompt-compose</code> with an active region automatically copies the region content over to the compose buffer. This is handy if you'd like to create more elaborate prompts with further editing. So far, this feels more natural than editing text from the shell or the minibuffer, where <code>RET</code> doesn't insert new lines.</p>
<p>The compose buffer is powered by a background shell (storing history for us). Typing <code>clear</code> followed by <code>C-c C-c</code> clears the background shell history.</p>
<p><code>chatgpt-shell-prompt-compose</code> is available in <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> v0.72.1. I've so far bound it to <code>C-c C-e</code>, though I've already found some unfortunate clashes.</p>
]]></description>
    <pubDate>Tue, 25 Jul 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>ChatGPT visits the Emacs doctor</title>
<link>https://xenodium.com/chatgpt-visits-the-emacs-doctor</link>
<guid isPermaLink="false">https://xenodium.com/chatgpt-visits-the-emacs-doctor</guid>
    <description><![CDATA[<p>Emacs is a <a href="https://youtu.be/urcL86UpqZc?t=177">part-time job</a>. A <a href="https://emacs-lsp.github.io/lsp-mode/">multi-language</a> development environment. A <a href="https://www.emacswiki.org/emacs/LispMachine">lisp machine</a>. An <a href="https://www.djcbsoftware.nl/code/mu/mu4e.html">email client</a>. A <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/EWW.html">web browser</a>. A <a href="https://youtu.be/AyhPmypHDEw">zettelkasten</a>. A <a href="https://www.emacswiki.org/emacs/SpreadSheet">spreadsheet</a>. A <a href="https://codeberg.org/martianh/mastodon.el">mastodon client</a>. A <a href="https://www.masteringemacs.org/article/complete-guide-mastering-eshell">shell</a>. A <a href="https://github.com/ledger/ledger-mode">ledger</a>. A <a href="https://github.com/alphapapa/org-super-agenda">super agenda</a>. An <a href="https://twitter.com/nixcraft/status/1435140596520218628">operating system</a>. Some say it sends <a href="https://xkcd.com/378/">ripples into the atmosphere</a> or <a href="https://github.com/skeeto/autotetris-mode">plays tetris for you</a>. It may even <a href="https://github.com/johanvts/emacs-fireplace">warm your place up</a> during the winter. Can <a href="https://github.com/TeMPOraL/nyan-mode">meme with you</a>. It's an ultra-malleable editor with endless possibilities, powered by your life-long customizations. Oh man, no wonder we need to chat to someone from time to time. You know what I mean? <em><a href="https://knowyourmeme.com/editorials/guides/what-does-sir-this-is-a-wendys-mean">Sir, this is a Wendy's</a></em>.</p>
<p>Luckily, we also have the built-in Emacs psychotherapist we can chat to, courtesy of <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Amusements.html">M-x doctor</a>. It's powered by <a href="https://en.wikipedia.org/wiki/Emacs_Lisp">elisp</a>, and like all Emacs things, it's basically up for grabs. What I mean is, elisp implements many of these features, but also glues the lot for you. Once you learn a little elisp, you can build new Emacs features but also glue others for that magical compound effect.</p>
<figure width="85%">
<img src="https://xenodium.github.io/images/chatgpt-visits-the-emacs-doctor/got-a-problem.gif" />
<figcaption>The Emacs doctor</figcaption>
</figure>
<p>A little while ago, I wanted to give <a href="https://openai.com/blog/chatgpt">ChatGPT</a> a try, preferably from Emacs (of course). I figured a shell interface would be a great fit for the interaction. Emacs already shipped with a general command interpreter (<a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint</a>), so I cobbled together a <a href="https://xenodium.com/a-chatgpt-emacs-shell/">ChatGPT Emacs shell</a>.</p>
<figure width="75%">
<img src="https://xenodium.github.io/images/chatgpt-visits-the-emacs-doctor/cyberpunk.gif" />
<figcaption><a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a></figcaption>
</figure>
<p>So where am I going with all this? The fine netizens <a href="https://www.reddit.com/user/emaphis/">r/emaphis</a> and <a href="https://news.ycombinator.com/user?id=salgernon">salgernon</a> both planted a great seed:</p>
<ul>
<li><em>&quot;<a href="https://www.reddit.com/r/emacs/comments/11wdub9/comment/jczrlt7">Now for extra-credit, add the ability for Alt-X doctor to psychoanalyze Chat-GPT</a>&quot;</em>.</li>
<li><em>&quot;<a href="https://news.ycombinator.com/item?id=35259022">So how about a quick M-x psychoanalyze-chatgpt?</a>&quot;</em></li>
</ul>
<p>I haven't forgotten about you. Let's take <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>, <em>M-x doctor</em>, our versatile elisp glue, and let's make them talk:</p>
<p><img src="https://xenodium.github.io/images/chatgpt-visits-the-emacs-doctor/000026814.jpg" alt="courtesy of thriveth and dr.dk."></p>
<p>There isn't too much to the code, but beware:</p>
<ol>
<li>If you want to run it, you'll need chatgpt-shell <a href="https://github.com/xenodium/chatgpt-shell#install">installed and set up</a>.</li>
<li>This was a quick fun hack. No code judging ;)</li>
</ol>
<p>The snippet is further down… Start with <code>chatgpt-shell-visit-doctor</code> as the entry point, setting things up for us. It creates both the <code>*chatgpt*</code> and <code>*doctor*</code> buffers and arranges the windows next to each other.</p>
<p>We also set a ChatGPT system prompt to guide things a little:</p>
<blockquote>
<p>&quot;Pretend to be an overwhelmed Emacs user who is obsessed with configuring their init.el file. You are in a session talking to a psychotherapist. Limit your output to no more than 20 words. In the course of 5 exchanges between you and the therapist, show improvements. On the 8th exchange after therapist speaks, declare you are cured and only output 'Thank you doc, I think I'm cured!'&quot;</p>
</blockquote>
<p>ChatGPT and Emacs doctor can go on and on, so we limit ChatGPT responses to 20 words per response and 8 exchanges. We don't want the session to abruptly end without a resolution, so we'll use <em>Thank you doc, I think I'm cured!</em> as our key phrase to end the session.</p>
<p>We register <code>chatgpt-shell--on-chatgpt-patient-response</code> as a hook to receive ChatGPT output, which we feed to the <code>*doctor*</code> buffer. We subsequently get a doctor response that's fed back to ChatGPT via <code>chatgpt-shell--insert-doc-response</code>.</p>
<p>We add some additional freebies like binding <code>Ctrl-c Ctrl-c</code> to <code>chatgpt-shell-leave-doctor</code>, so we can bail out of the exchange from the <code>*chatgpt*</code> buffer.</p>
<p>We also introduced <code>chatgpt-shell--insert-delayed-text</code> as a replacement for <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Insertion.html">insert</a> to slow things down a little. For visual effects, really.</p>
<pre><code class="language-{.commonlisp">(require 'chatgpt-shell)

(defun chatgpt-shell-visit-doctor ()
  (interactive)
  (setq chatgpt-shell--doctor-in-session t)
  (when (get-buffer &quot;*doctor*&quot;)
    (kill-buffer &quot;*doctor*&quot;))
  (delete-other-windows)
  (split-window-horizontally)
  (other-window 1)
  (doctor)
  (visual-line-mode 1)
  (when (fboundp 'accent-menu-mode)
    (accent-menu-mode -1))
  (mapc
   (lambda (shell-buffer)
     (kill-buffer shell-buffer))
   (chatgpt-shell--shell-buffers))
  (other-window 1)
  (setq chatgpt-shell-system-prompts
        '((&quot;Doc&quot; . &quot;Pretend to be an overwhelmed Emacs user who is obsessed with configuring their init.el file. You are in a session talking to a psychotherapist. Limit your output to no more than 20 words. In the course of 5 exchanges between you and the therapist, show improvements. On the 8th exchange after therapist speaks, declare you are cured and only output \&quot;Thank you doc, I think I'm cured!\&quot;.&quot;)))
  (setq chatgpt-shell-system-prompts nil)
  (setq chatgpt-shell-system-prompt nil)
  (with-current-buffer (chatgpt-shell)
    (define-key chatgpt-shell-mode-map (kbd &quot;C-c C-c&quot;)
      'chatgpt-shell-leave-doctor)
    (shell-maker-set-buffer-name (current-buffer)
                                 &quot;*chatgpt*&quot;))
  (chatgpt-shell--insert-doc-response))

(defun chatgpt-shell--doc-conversation ()
  (let ((convo (with-current-buffer &quot;*doctor*&quot;
                 (split-string (buffer-string) &quot;\n\n&quot;))))
    (seq-remove
     (lambda (item)
       (string-empty-p (string-trim item)))
     (append
      ;; Replace first doc line, so it drops &quot;Each time you are finished talking, type RET twice.&quot;
      (list &quot;I am the psychotherapist.  Please, describe your problems.&quot;)
      (mapcar
       (lambda (item)
         (replace-regexp-in-string &quot;\n&quot; &quot; &quot; item))
       (cdr convo))))))

(defun chatgpt-shell--doc-response ()
  (let* ((conversation (chatgpt-shell--doc-conversation))
         (length (seq-length conversation))
         (doc-response (nth (1- length) conversation)))
    doc-response))

(defun chatgpt-shell--insert-doc-response ()
  (with-current-buffer &quot;*chatgpt*&quot;
    (goto-char (point-max))
    (chatgpt-shell--insert-delayed-text (chatgpt-shell--doc-response))
    (call-interactively 'shell-maker-submit)))

(defun chatgpt-shell--insert-delayed-text (text)
  &quot;Insert TEXT into the current buffer, with a delay between each character.&quot;
  (dolist (char (string-to-list text))
    (insert char)
    (sit-for 0.009)))

(defun chatgpt-shell--on-chatgpt-patient-response (command output)
  (if (and chatgpt-shell--doctor-in-session
           (not (string-match-p (regexp-quote &quot;I'm cured&quot;) output)))
      (progn
        (with-current-buffer &quot;*chatgpt*&quot;
          (goto-char (point-max)))
        (with-selected-window (get-buffer-window &quot;*doctor*&quot;)
          (goto-char (point-max))
          (chatgpt-shell--insert-delayed-text output)
          (call-interactively 'doctor-ret-or-read)
          (chatgpt-shell--insert-doc-response)))
    (message &quot;Bye Bye&quot;)))

(defun chatgpt-shell-leave-doctor ()
  (interactive)
  (setq chatgpt-shell--doctor-in-session nil)
  (call-interactively 'chatgpt-shell-ctrl-c-ctrl-c))

(add-hook 'chatgpt-shell-after-command-functions
          #'chatgpt-shell--on-chatgpt-patient-response)

(global-set-key (kbd &quot;M-q&quot;) #'chatgpt-shell-visit-doctor)
</code></pre>
<p>Ok, enough already. Let's see it in action.</p>
<p><a href="https://xenodium.github.io/images/chatgpt-visits-the-emacs-doctor/chatgpt-doc_optimized.gif"><img src="https://xenodium.github.io/images/chatgpt-visits-the-emacs-doctor/chatgpt-doc_optimized.gif" alt=""></a></p>
<p>If you'd like to take a closer look for analysis, here's the official transcript of this fruitful session:</p>
<blockquote>
<p>I am the psychotherapist. Please, describe your problems. Each time you are finished talking, type RET twice.</p>
<p>I spend hours tweaking my Emacs config, but it's never perfect. I'm overwhelmed and obsessed with customization.</p>
<p>Is it because it's not ever perfect you are overwhelmed and obsessed with customization that you came to me?</p>
<p>Yes, I can't stop myself from constantly trying to tweak and improve my Emacs configuration. It's consuming me.</p>
<p>Emacs? Hah! I would appreciate it if you would continue.</p>
<p>Sorry about that. Yes, I came to you because I'm overwhelmed by my obsession with customizing my Emacs configuration.</p>
<p>Does it bother you that you are overwhelmed by your obsession with customizing your emacs configuration?</p>
<p>Absolutely! I feel trapped in an endless cycle of tweaking and configuring, unable to achieve satisfaction.</p>
<p>Why do you say that?</p>
<p>I constantly seek perfection in my Emacs config, but it's an unattainable goal that leaves me exhausted and frustrated.</p>
<p>When did you first know that it's an unattainable goal that leaves you exhausted and frustrated?</p>
<p>I've realized it recently after spending countless hours trying to perfect my Emacs configuration without any lasting satisfaction.</p>
<p>Are you sure?</p>
<p>Thanks you doc, I think I'm cured.</p>
</blockquote>
<p>While we can work exclusively with the <code>*doctor*</code> buffer making requests directly to the ChatGPT API, where's the fun in that? Getting the buffers to talk to each other enables us to marvel at both the beauty and absurdity of being able to glue anything together in our lovely Emacs world.</p>
<p>Happy Emacsing!</p>
]]></description>
    <pubDate>Wed, 12 Jul 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>chatgpt-shell v0.60.1 updates</title>
<link>https://xenodium.com/chatgpt-shell-v0601-updates</link>
<guid isPermaLink="false">https://xenodium.com/chatgpt-shell-v0601-updates</guid>
    <description><![CDATA[<p>Back in April, I shared <a href="https://xenodium.com/chatgpt-shell-available-on-melpa/">chatgpt-shell updates</a>, showcasing <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> features. It's been a little while, so here's an update with the latest additions.</p>
<p>Like this project? Consider ✨<a href="https://github.com/sponsors/xenodium">sponsoring</a>✨.</p>
<h2>Multi-session support</h2>
<p>You can run multiple shell instances independently configured to use different versions or system prompts.</p>
<p>This was biggest recent change. Please report issues.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-v0601-updates/cat-turtle.gif" alt=""></p>
<h2>Display system prompt and version</h2>
<p>The current shell's version and system prompt are now displayed more prominently in both the shell prompt and buffer name.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-v0601-updates/display.png" alt=""></p>
<p>With multi-session support, displaying shell details in the buffer name becomes more important as it makes it easier to find shells across your buffer list.</p>
<h2>Rename shell buffers</h2>
<p>While buffer names are now automatically derived, one can also use <code>chatgpt-shell-rename-buffer</code> to use custom buffer names.</p>
<h2>ob-chatgpt-shell improvements</h2>
<p>Use <code>:temperature</code> to specify the <a href="https://platform.openai.com/docs/api-reference/completions/create#completions/create-temperature">temperature</a>.</p>
<p>Use <code>:context CONTEXT-NAME</code> to pick and choose which source blocks to aggregate as context. Thank you <a href="https://github.com/jtmoulia">Thomas Moulia</a>.</p>
<p>Use <code>:preflight t</code> to debug <code>ob-chatgpt-shell</code> execution.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-v0601-updates/preflight.png" alt=""></p>
<h2>chatgpt-shell-write-git-commit</h2>
<p>Adds <code>chatgpt-shell-write-git-commit</code>, so you can generate commit messages using the current region. Thank you <a href="https://github.com/bigsky77">Simon Judd</a>.</p>
<h2>Approximate context length</h2>
<p><code>chatgpt-shell</code> now uses <code>chatgpt-shell--approximate-context-length</code> to approximate the context size and discard history if necessary. This is pretty experimental but seems to work well enough. It's enabled by default to get some feedback. Please file bugs if needed or send PRs to improve.</p>
<h2><code>S-&lt;return&gt;</code> for multiline input</h2>
<p>In addition to <code>C-J</code> to insert multi-line input, <code>S-&lt;return&gt;</code> is also supported. Thank you <a href="https://github.com/shouya">shouya</a> for the submission.</p>
<h2>Welcome message</h2>
<p>A welcome message now makes the help much more discoverable for new or sporadic users. Thank you <a href="https://github.com/shouya">shouya</a> for the suggestion.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-v0601-updates/welcome.png" alt=""></p>
<h2>Help me</h2>
<p>While the <a href="https://github.com/xenodium/chatgpt-shell">README</a> documents the shells and Emacs is <a href="https://www.emacswiki.org/emacs/SelfDocumentation">self-documenting</a>, we now have a <code>help</code> command to make things a little more discoverable.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-v0601-updates/help.png" alt=""></p>
<h2>Hello chatgpt-shell-mode and dall-e-shell-mode</h2>
<p>Both <code>chatgpt-shell</code> and <code>dall-e-shell</code> are both based on <code>shell-maker</code> and until recently both shared <code>shell-maker-mode</code> as their major mode. This didn't play well with yasnippet. Both shells now enable independent major modes: <code>chatgpt-shell-mode</code> and <code>dall-e-shell-mode</code>. Thank you <a href="https://github.com/djliden">Daniel Liden</a> for the proposal.</p>
<h2>Saving transcript customizations</h2>
<p>Make transcript saving more customizable via <code>shell-maker-transcript-default-path</code> and <code>shell-maker-transcript-default-filename</code>. Thank you <a href="https://github.com/gnusupport">gnusupport</a>.</p>
<h2>New ChatGPT model versions</h2>
<p>New OpenAI model versions were recently released and added to chatgpt-shell: <code>gpt-3.5-turbo-0613</code> and <code>gpt-4-0613</code>. Thanks you <a href="https://github.com/suzuki">Norio Suzuki</a>.</p>
<h2>Load awesome prompts</h2>
<p><code>M-x chatgpt-shell-load-awesome-prompts</code> to download and import curated prompts from <a href="https://github.com/f/awesome-chatgpt-prompts">awesome-chatgpt-prompts</a>. Thank you <a href="https://github.com/dangom">Daniel Gomez</a>.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-v0601-updates/awesome.png" alt=""></p>
<h2>ob-async</h2>
<p>We had reports that ob-chatgpt-shell didn't play nice with <a href="https://github.com/astahlman/ob-async">ob-async</a>. Thank you <a href="https://github.com/wmedrano">William Medrano</a> for the solution.</p>
<h2>Configurable prompts</h2>
<p>Functions like <code>chatgpt-shell-describe-code</code> ask ChatGPT to describe the code in region. These functions used hardcoded English prompts. These are now configurable, so users can tweak or translate if preferred. Thank you <a href="https://github.com/suzuki">Norio Suzuki</a>.</p>
<ul>
<li><code>chatgpt-shell-prompt-header-describe-code</code></li>
<li><code>chatgpt-shell-prompt-header-refactor-code</code></li>
<li><code>chatgpt-shell-prompt-header-generate-unit-test</code></li>
<li><code>chatgpt-shell-prompt-header-proofread-region</code></li>
<li><code>chatgpt-shell-prompt-header-whats-wrong-with-last-command</code></li>
<li><code>chatgpt-shell-prompt-header-eshell-summarize-last-command-output</code></li>
</ul>
]]></description>
    <pubDate>Sun, 09 Jul 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Duplicate this!</title>
<link>https://xenodium.com/duplicate-this</link>
<guid isPermaLink="false">https://xenodium.com/duplicate-this</guid>
    <description><![CDATA[<p><a href="http://www.dyerdwelling.family/">James Dyer</a> has a nice <a href="https://www.emacs.dyerdwelling.family/emacs/20230606213531-emacs--dired-duplicate-here-revisited/">post</a> sharing his frequent <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> need to duplicate files. He offers a solution using a custom interactive command. His use-case resonated with me.</p>
<p>Similarly, James' recommendation to bind his file-duplicating command to <code>C-c d</code> [^1] sent a signal to my brain triggering <a href="https://twitter.com/bbatsov">Bozhidar Batsov</a>'s <code>crux-duplicate-current-line-or-region</code>.</p>
<p><code>crux-duplicate-current-line-or-region</code> is part of a &quot;collection of Ridiculously useful extensions for Emacs&quot; (yeah that's <a href="https://github.com/bbatsov/crux">crux</a>). The command itself does what it says on the tin.</p>
<p>Let's duplicate the current line.</p>
<p><img src="https://xenodium.github.io/images/duplicate-this/duplicate-line.gif" alt=""></p>
<p>Now let's duplicate the current region.</p>
<p><img src="https://xenodium.github.io/images/duplicate-this/duplicate-region.gif" alt=""></p>
<p>Since I already have a well-internalized key-binding duplicating lines/regions in text buffers, I could extend a similar behaviour to dired files with almost zero adoption effort.</p>
<p>In case you haven't noticed, I've made it a <a href="https://youtu.be/urcL86UpqZc?t=177">part-time job</a> to make command line utilities easily accessible from Emacs (<a href="https://xenodium.com/joining-images-from-the-comfort-of-dired/">1</a> <a href="https://xenodium.com/emacs-dwim-shell-command/">2</a> <a href="https://xenodium.com/emacs-password-protect-current-pdf-revisited/">3</a> <a href="https://xenodium.com/dwim-shell-command-now-on-windows/">4</a> <a href="https://xenodium.com/recordscreenshot-windows-the-lazy-way/">5</a> <a href="https://xenodium.com/emacs-ffmpeg-and-macos-alias-commands/">6</a> <a href="https://xenodium.com/emacs-quick-kill-process/">7</a> <a href="https://xenodium.com/hey-emacs-change-the-default-macos-app-for/">8</a> <a href="https://xenodium.com/hey-emacs-where-did-i-take-that-photo/">9</a> <a href="https://xenodium.com/emacs-open-with-macos-app/">10</a> <a href="https://xenodium.com/emacs-macos-sharing-dwim-style-improved/">11</a> <a href="https://xenodium.com/emacs-macos-share-from-dired-dwim-style/">12</a> <a href="https://xenodium.com/emacs-reveal-in-finder-dwim-style/">13</a> <a href="https://xenodium.com/dwim-shell-command-usages-pdftotext-and-scp/">14</a> <a href="https://xenodium.com/dwim-shell-command-with-template-prompts/">15</a> <a href="https://xenodium.com/seamless-command-line-utils/">16</a> <a href="https://xenodium.com/dwim-shell-command-video-streams/">17</a> <a href="https://xenodium.com/dwim-shell-command-improvements/">18</a> <a href="https://xenodium.com/dwim-shell-command-on-melpa/">19</a> <a href="https://xenodium.com/emacs-dwim-shell-command-multi-language/">20</a> <a href="https://xenodium.com/png-to-icns-emacs-dwim-style/">21</a>) via <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>. Partly because it's fairly quick and partly 'cause it's fun.</p>
<p>Jame's post gave me yet another opportunity to exercise my errrm part-time job. This time, duplicating files. All I need is the <a href="https://www.man7.org/linux/man-pages/man1/cp.1.html">cp</a> utility and a template:</p>
<pre><code class="language-{.bash">cp -R '&lt;&lt;f&gt;&gt;' '&lt;&lt;f(u)&gt;&gt;'
</code></pre>
<p>I seldom type these template's myself when I want to execute a command (via <code>M-x dwim-shell-command</code>). I typically wrap these templates in interactive commands, making them easily accessible via <code>M-x</code> and your favorite completion framework. I happen to use <a href="https://github.com/abo-abo/swiper">ivy</a>.</p>
<pre><code class="language-{.commonlisp">(require 'dwim-shell-command)

(defun dwim-shell-commands-duplicate ()
  &quot;Duplicate file(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Duplicate file(s).&quot;
   &quot;cp -R '&lt;&lt;f&gt;&gt;' '&lt;&lt;f(u)&gt;&gt;'&quot;
   :utils &quot;cp&quot;))
</code></pre>
<p>There's nothing much to the command. Most logic is handled by the template, replacing <code>&lt;&lt;f&gt;&gt;</code> with the current file and <code>&lt;&lt;f(u)&gt;&gt;</code> with a uniquified version of it. Having said this, there's a bunch of free <a href="https://xenodium.com/emacs-dwim-do-what-i-mean/">DWIM</a> love that kicks in, courtesy of the <code>dwim-shell-command</code> package by yours truly. Let's give our new <code>dwim-shell-commands-duplicate</code> command a spin.</p>
<p>Like <code>crux-duplicate-current-line-or-region</code> duplicates the current line, our new command duplicates the current dired file.</p>
<p><img src="https://xenodium.github.io/images/duplicate-this/duplicate-file.gif" alt=""></p>
<p>Got multiple files to duplicate? Like <code>crux-duplicate-current-line-or-region</code>, we can use the region for a similar purpose.</p>
<p><img src="https://xenodium.github.io/images/duplicate-this/duplicate-files.gif" alt=""></p>
<p>While we have been using the region to duplicate adjacent files, we can also mark specific files.</p>
<p><img src="https://xenodium.github.io/images/duplicate-this/duplicate-marked.gif" alt=""></p>
<p>Our <code>cp -R '&lt;&lt;f&gt;&gt;' '&lt;&lt;f(u)&gt;&gt;'</code> template uses the <code>-R</code> (recursive) flag, so we get another freebie. In addition to files, we can also duplicate directories.</p>
<p><img src="https://xenodium.github.io/images/duplicate-this/duplicate-dirs.gif" alt=""></p>
<p>Lastly, because we're on a DWIM train, if your current buffer happens to be visiting a file, you can <code>M-x dwim-shell-commands-duplicate</code> the current file to duplicate it. You're automatically dropped to a dired buffer, with point on the new file (à la <a href="https://emacsredux.com/blog/2013/09/24/dired-jump/">dired-jump</a>).</p>
<p><img src="https://xenodium.github.io/images/duplicate-this/duplicate-buffer.gif" alt=""></p>
<p>While duplicating files using a template was a mere <code>cp -R '&lt;&lt;f&gt;&gt;' '&lt;&lt;f(u)&gt;&gt;'</code> away, we get a bunch of free DWIM magic applied to a handful of use-cases and contexts. What made the file-duplicating use-case extra special is that it maps almost exactly to an equivalent text command. Keep the same key bindings and we almost get a &quot;<a href="https://endlessparentheses.com/hungry-delete-mode.html">free feature</a>&quot;.</p>
<pre><code class="language-{.commonlisp">(use-package crux
  :ensure t
  :commands crux-open-with
  :bind
  ((&quot;C-c d&quot; . crux-duplicate-current-line-or-region)))

(use-package dwim-shell-command
  :ensure t
  :bind (:map dired-mode-map
              (&quot;C-c d&quot; . dwim-shell-commands-duplicate))
  :config
  ;; Loads all my own dwim shell commands
  ;; (including `dwim-shell-commands-duplicate')
  (require 'dwim-shell-commands))
</code></pre>
<p>You can find my ever-growing list of similar commands over at <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a> (the optional part of the package). Got some nifty usages? Would love to check 'em out. <a href="https://indieweb.social/@xenodium">Get in touch</a>.</p>
<p>Like this or <a href="https://xenodium.com/">other content</a>? <a href="https://github.com/sponsors/xenodium">✨Sponsor✨ via GitHub Sponsors</a>.</p>
<h2>Update</h2>
<p>If you're keen on a regex-based approach, <a href="https://www.reddit.com/user/arthurno1/">u/arthurno1</a> <a href="https://www.reddit.com/r/emacs/comments/14rmvkx/comment/jqtkel8/?utm_source=share&amp;utm_medium=web2x&amp;context=3">offers a great built-in alternative</a>: dired-do-copy-regexp (bound to <code>% C</code>).</p>
]]></description>
    <pubDate>Wed, 05 Jul 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Stitching images from the comfort of dired</title>
<link>https://xenodium.com/joining-images-from-the-comfort-of-dired</link>
<guid isPermaLink="false">https://xenodium.com/joining-images-from-the-comfort-of-dired</guid>
    <description><![CDATA[<p>I recently wanted a few images stitched together. A perfect job for <a href="https://imagemagick.org/">ImageMagick</a>. A quick search yielded the magical incantation:</p>
<pre><code class="language-{.bash">convert image1.jpg image2.jpg image3.jpg +append joined.jpg
</code></pre>
<p>Great, now I know, but I'll rarely use it and will soon forget it. I may as well add it to my <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">repository</a> of <a href="https://en.wikipedia.org/wiki/DWIM">DWIM</a> command line utilities, wrapped in a convenient Emacs function, applicable from different contexts… <a href="https://xenodium.com/emacs-dwim-do-what-i-mean/">know what I mean</a>? 🙃</p>
<p>I built <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> for this purpose. You can take the above command and easily turn it into an interactive Emacs command with something like the following:</p>
<pre><code class="language-{.commonlisp">(require 'dwim-shell-command)

(defun dwim-shell-commands-join-images-horizontally ()
  &quot;Join all marked images horizontally as a single image.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Join images horizontally&quot;
   &quot;convert -verbose '&lt;&lt;*&gt;&gt;' +append 'joined.jpg'&quot;
   :utils &quot;convert&quot;))
</code></pre>
<p>You can select as many images as you'd like from the comfort of your dired and <em>make the ImageMagick happen</em>.</p>
<p><img src="https://xenodium.github.io/images/joining-images-from-the-comfort-of-dired/burgers.gif" alt=""></p>
<p>The snippet does the job just fine, but we can make it smarter. For starters, let's not hardcode the output filename. We'll ask the user instead. While we're asking, let's offer a default filename, but let's not assume the output extension is <code>.jpg</code>. Let's guess based on the image selection. While we're at it, let's not override the output file if already exists. Uniquify it.</p>
<p>Most of the above can be achieved by either using <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> helpers or its templating language. For example, <code>&lt;&lt;joined.png(u)&gt;&gt;</code> ensures that if <code>joined.png</code> already exists, it automatically generates <code>joined(1).png</code> instead.</p>
<pre><code class="language-{.commonlisp">(require 'dwim-shell-command)

(defun dwim-shell-commands-join-images-horizontally ()
  &quot;Join all marked images horizontally as a single image.&quot;
  (interactive)
  (let ((filename (format &quot;joined.%s&quot;
                          (or (seq-first (dwim-shell-command--file-extensions)) &quot;png&quot;))))
    (dwim-shell-command-on-marked-files
     &quot;Join images horizontally&quot;
     (format &quot;convert -verbose '&lt;&lt;*&gt;&gt;' +append '&lt;&lt;%s(u)&gt;&gt;'&quot;
             (dwim-shell-command-read-file-name
              (format &quot;Join as image named (default \&quot;%s\&quot;): &quot; filename)
              :default filename))
     :utils &quot;convert&quot;)))
</code></pre>
<p>Here's the new horizontal command in action…</p>
<p><img src="https://xenodium.github.io/images/joining-images-from-the-comfort-of-dired/burger_row_x1.5_optimized.gif" alt=""></p>
<p>Notice how this time we didn't mark the images using <code>dired-mark</code>, typically bound to <code>m</code>. Instead, we made our selection using the region. Also, if you haven't gotten your junk food fix yet, here's the fries equivalent ;)</p>
<p><img src="https://xenodium.github.io/images/joining-images-from-the-comfort-of-dired/fries_row_x1.5_optimized.gif" alt=""></p>
<p>We'll rinse all and repeat to get the vertical command equivalent. I know, I know, there's fair amount of duplication but c'est la vie.</p>
<pre><code class="language-{.commonlisp">(require 'dwim-shell-command)

(defun dwim-shell-commands-join-images-vertically ()
  &quot;Join all marked images vertically as a single image.&quot;
  (interactive)
  (let ((filename (format &quot;joined.%s&quot;
                          (or (seq-first (dwim-shell-command--file-extensions)) &quot;png&quot;))))
    (dwim-shell-command-on-marked-files
     &quot;Join images vertically&quot;
     (format &quot;convert -verbose '&lt;&lt;*&gt;&gt;' -append '&lt;&lt;%s(u)&gt;&gt;'&quot;
             (dwim-shell-command-read-file-name
              (format &quot;Join as image named (default \&quot;%s\&quot;): &quot; filename)
              :default filename))
     :utils &quot;convert&quot;)))
</code></pre>
<p>…and for our grand finale, we'll vertically join our burgers and fries. Behold!</p>
<p><img src="https://xenodium.github.io/images/joining-images-from-the-comfort-of-dired/finale_x1.5_optimized.gif" alt=""></p>
<p>These commands are now part of <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>. To get them, load the optional commands via <code>(require 'dwim-shell-commands)</code>.</p>
]]></description>
    <pubDate>Thu, 29 Jun 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>noweb: the lesser known org babel glue</title>
<link>https://xenodium.com/noweb-more-glue-for-your-org-toolbox</link>
<guid isPermaLink="false">https://xenodium.com/noweb-more-glue-for-your-org-toolbox</guid>
    <description><![CDATA[<p>While <a href="https://orgmode.org/">Org</a> babel's <a href="https://orgmode.org/manual/Noweb-Reference-Syntax.html">noweb</a> isn't something I've frequently used for literate programming, its simplicity makes it rather versatile to glue all sorts of babel things I hadn't previously considered.</p>
<p>The idea is simple. Add a placeholder like <code>&lt;&lt;other-block&gt;&gt;</code> to an <a href="https://orgmode.org/manual/Working-with-Source-Code.html">org babel</a> source block, and it will be automatically replaced (verbatim) with the content (or result) of referred block before execution. You'll also need the <code>:noweb yes</code> header argument.</p>
<pre><code class="language-org">#+NAME: other-block
#+begin_src swift
  print(&quot;Hello 0&quot;)
#+end_src

#+RESULTS: other-block
: Hello 0

#+BEGIN_SRC swift :noweb yes
  &lt;&lt;other-block&gt;&gt;
  print(&quot;Hello 1&quot;)
#+END_SRC

#+RESULTS:
: Hello 0
: Hello 1
</code></pre>
<p>Since <code>&lt;&lt;other-block&gt;&gt;</code> is replaced with the content of said block, at execution time, the block is effectively equivalent to executing:</p>
<pre><code class="language-swift">print(&quot;Hello 0&quot;)
print(&quot;Hello 1&quot;)
</code></pre>
<p>Why is this so versatile? Org babel can include/execute all sorts of languages, so you can mix and match the result from one language and massage it to appear as the body of another block using the same (or different) language.</p>
<p>I was recently asked <a href="https://github.com/xenodium/chatgpt-shell/issues/102">how to include the result from one babel block in another</a> using <a href="https://github.com/xenodium/chatgpt-shell/#chatgpt-org-babel">ob-chatgpt-shell</a>. While the initial question was looking for a solution involving variables, we can use noweb to achieve a similar goal.</p>
<p>Note that in this case, I'll be using <code>&lt;&lt;hello()&gt;&gt;</code>, with <code>()</code>, to refer to <code>#+RESULTS:</code> rather than the source block itself.</p>
<pre><code class="language-org">#+NAME: hello
#+BEGIN_SRC chatgpt-shell
Say hello in spanish
#+END_SRC

#+RESULTS: hello
Hola

#+BEGIN_SRC chatgpt-shell :noweb yes
&lt;&lt;hello()&gt;&gt;
What does the previous line say verbatim?
#+END_SRC
</code></pre>
<p>Executing the block</p>
<pre><code class="language-{.chatgpt-shell">&lt;&lt;hello()&gt;&gt;
What does the previous line say verbatim?
</code></pre>
<p>Gives us</p>
<pre><code class="language-{=org}">#+RESULTS:
</code></pre>
<pre><code class="language-example">The previous line says &quot;Hola&quot;.
</code></pre>
<p>On a similar note, I was asked if the results from a previous source block could be <a href="https://indieweb.social/@kickingvegas@sfba.social/110562099134297469">fed to a Swift Chart block</a> using <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a>.</p>
<p>While I'm new to <a href="https://developer.apple.com/documentation/Charts">Swift Charts</a>, I do love glueing things via Emacs lisp. I figured I could write a little elisp to generate random data and feed it to a SwiftUI block via <code>&lt;&lt;data()&gt;&gt;</code>. The result is pretty neat, based on Apple's <a href="https://developer.apple.com/documentation/charts/linemark">LineMark example</a>.</p>
<p><img src="https://xenodium.github.io/images/noweb-more-glue-for-your-org-toolbox/data-chart.gif" alt=""></p>
<pre><code class="language-org">#+NAME: data
#+begin_src emacs-lisp :lexical no
  (concat (mapconcat (lambda (n)
                       (format &quot;MonthlyHoursOfSunshine(city: \&quot;Seattle\&quot;, month: %d, hoursOfSunshine: %d),&quot;
                               n (random 100)))
                     (number-sequence 1 20) &quot;\n&quot;)
          &quot;\n&quot;
          (mapconcat (lambda (n)
                       (format &quot;MonthlyHoursOfSunshine(city: \&quot;Cupertino\&quot;, month: %d, hoursOfSunshine: %d),&quot;
                               n (random 100)))
                     (number-sequence 1 20) &quot;\n&quot;))
#+end_src

#+begin_src swiftui :results file :noweb yes
  import Charts

  struct MonthlyHoursOfSunshine: Identifiable {
    var city: String
    var date: Date
    var hoursOfSunshine: Double
    var id = UUID()

    init(city: String, month: Int, hoursOfSunshine: Double) {
      let calendar = Calendar.autoupdatingCurrent
      self.city = city
      self.date = calendar.date(from: DateComponents(year: 2020, month: month))!
      self.hoursOfSunshine = hoursOfSunshine
    }
  }

  struct ContentView: View {
    var data: [MonthlyHoursOfSunshine] = [
&lt;&lt;data()&gt;&gt;
    ]
    var body: some View {
      Chart(data) {
        LineMark(
          x: .value(&quot;Month&quot;, $0.date),
          y: .value(&quot;Hours of Sunshine&quot;, $0.hoursOfSunshine)
        )
        .foregroundStyle(by: .value(&quot;City&quot;, $0.city))
      }
      .frame(minWidth: 800, minHeight: 300)
      .padding()
      .colorScheme(.dark)
    }
  }
#+end_src
</code></pre>
<p>While I've shown fairly basic usages of noweb, we can accomplish some nifty integrations. Check out the <a href="https://orgmode.org/manual/Noweb-Reference-Syntax.html">noweb reference syntax</a> for more examples and additional header arguments like <code>tangle</code>, <code>strip-tangle</code>, and others.</p>
]]></description>
    <pubDate>Sun, 18 Jun 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Deleting from Emacs sequence vars</title>
<link>https://xenodium.com/deleting-from-emacs-sequence-vars</link>
<guid isPermaLink="false">https://xenodium.com/deleting-from-emacs-sequence-vars</guid>
    <description><![CDATA[<p>Adding hooks and setting variables is core to customizing Emacs. Take a major mode like <code>emacs-lisp-mode</code> as an example. To customize its behaviour, one may add a hook function to <code>emacs-lisp-mode-hook</code>, or if you're a little lazy while experimenting, you may even use a lambda.</p>
<pre><code class="language-{.commonlisp">(add-hook 'emacs-lisp-mode-hook
          #'my/emacs-lisp-mode-config)

(add-hook 'emacs-lisp-mode-hook
          (lambda ()
            (message &quot;I woz ere&quot;)))
</code></pre>
<p><code>emacs-lisp-mode-hook</code>'s content would subsequently look as follows:</p>
<pre><code class="language-{.commonlisp">'(my/emacs-lisp-mode-config
  (lambda nil
    (message &quot;I woz ere&quot;))
  ert--activate-font-lock-keywords
  easy-escape-minor-mode
  lisp-extra-font-lock-global-mode)
</code></pre>
<p>Maybe <code>my/emacs-lisp-mode-config</code> didn't work out for us and we'd like to remove it. We can use <code>remove-hook</code> for that and evaluate something like:</p>
<pre><code class="language-{.commonlisp">(remove-hook 'emacs-lisp-mode-hook #'my/emacs-lisp-mode-config)
</code></pre>
<p>The lambda can be removed too, but you ought to be careful in using the same lambda body.</p>
<pre><code class="language-{.commonlisp">(remove-hook 'emacs-lisp-mode-hook
             (lambda ()
               (message &quot;I woz tere&quot;)))
</code></pre>
<p>There are other ways to remove the lambdas, but we're digressing here… We typically have to write these throwaway snippets to undo our experiments. What if we just had a handy helper always available to remove items from sequences <em>(edit: we do, <code>remove-hook</code> is already interactive, see Update 2 below)</em>? After all, hooks are just lists (sequences).</p>
<p><img src="https://xenodium.github.io/images/deleting-from-emacs-sequence-vars/removed-lambda.gif" alt=""></p>
<p>While the interactive command can likely be simplified further, I tried to optimize for ergonomic usage. For example, <code>completing-read</code> gives us a way narrow down whichever variable we'd like to modify as well as the item we'd like to remove. <code>seqp</code> is also handy, as we filter out noise by automatically removing any variable that's not a sequence.</p>
<pre><code class="language-{.commonlisp">(defun ar/remove-from-list-variable ()
  (interactive)
  (let* ((var (intern
               (completing-read &quot;From variable: &quot;
                                (let (symbols)
                                  (mapatoms
                                   (lambda (sym)
                                     (when (and (boundp sym)
                                                (seqp (symbol-value sym)))
                                       (push sym symbols))))
                                  symbols) nil t)))
         (values (mapcar (lambda (item)
                           (setq item (prin1-to-string item))
                           (concat (truncate-string-to-width
                                    (nth 0 (split-string item &quot;\n&quot;))
                                    (window-body-width))
                                   (propertize item 'invisible t)))
                         (symbol-value var)))
         (index (progn
                  (when (seq-empty-p values) (error &quot;Already empty&quot;))
                  (seq-position values (completing-read &quot;Delete: &quot; values nil t)))))
    (unless index (error &quot;Eeek. Something's up.&quot;))
    (set var (append (seq-take (symbol-value var) index)
                     (seq-drop (symbol-value var) (1+ index))))
    (message &quot;Deleted: %s&quot; (truncate-string-to-width
                            (seq-elt values index)
                            (- (window-body-width) 9)))))
</code></pre>
<p>Hooks are just an example of lists we can delete from. I recently used the same command on <code>display-buffer-alist</code>.</p>
<p><img src="https://xenodium.github.io/images/deleting-from-emacs-sequence-vars/alist.gif" alt=""></p>
<p>While this has been a fun exercise, I can't help but think that I'm likely re-inventing the wheel here. Is there something already built-in that I'm missing?</p>
<h2>Update 1</h2>
<p><a href="https://www.reddit.com/user/github-alphapapa/">alphapapa</a> suggested some generalizations that would provide <a href="https://www.reddit.com/r/emacs/comments/13rvehx/comment/jlni3fc/?utm_source=share&amp;utm_medium=web2x&amp;context=3">an editing buffer of sorts</a>. This is a neat idea, using familiar key bindigs <code>C-c C-c</code> to save and <code>C-c C-k</code> to bail.</p>
<p><img src="https://xenodium.github.io/images/deleting-from-emacs-sequence-vars/edit.gif" alt=""></p>
<p>Beware, I haven't tested the code with a diverse set of list items, so there's a chance of corrupting the variable content. Improvements to the code are totally welcome.</p>
<pre><code class="language-{.commonlisp">;;; -*- lexical-binding: t; -*-

(defun ar/edit-list-variable ()
  (interactive)
  (let* ((var (intern
               (completing-read &quot;From variable: &quot;
                                (let (symbols)
                                  (mapatoms
                                   (lambda (sym)
                                     (when (and (boundp sym)
                                                (seqp (symbol-value sym)))
                                       (push sym symbols))))
                                  symbols) nil t)))
         (values (string-join
                  (mapcar #'prin1-to-string (symbol-value var))
                  &quot;\n&quot;)))
    (with-current-buffer (get-buffer-create &quot;*eval elisp*&quot;)
      (emacs-lisp-mode)
      (local-set-key (kbd &quot;C-c C-c&quot;)
                     (lambda ()
                       (interactive)
                       (eval-buffer)
                       (kill-this-buffer)
                       (message &quot;Saved: %s&quot; var)))
      (local-set-key (kbd &quot;C-c C-k&quot;) 'kill-this-buffer)
      (erase-buffer)
      (insert (format &quot;(setq %s\n `(%s))&quot; var values))
      (mark-whole-buffer)
      (indent-region (point-min) (point-max))
      (deactivate-mark)
      (switch-to-buffer (current-buffer)))))
</code></pre>
<h2>Update 2</h2>
<p>So hunch was right…</p>
<blockquote>
<p>&quot;While this has been a fun exercise, I can't help but think that I'm likely re-inventing the wheel here. Is there something already built-in that I'm missing?&quot;</p>
</blockquote>
<p><a href="https://www.reddit.com/user/juicecelery/">juicecelery</a>'s Reddit commit <a href="https://www.reddit.com/r/emacs/comments/13rvehx/comment/jlo8mhf/?utm_source=share&amp;utm_medium=web2x&amp;context=3">confirmed it</a>. Thank you! <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html">remove-hook</a> is already interactive 🤦‍♂️. <a href="https://knowyourmeme.com/memes/today-i-learned-til">TIL</a> 😁</p>
<p>juicecelery was kind enough to point out an improvement in the custom function:</p>
<blockquote>
<p>&quot;but I see your improvements, for instance that non list items are removed from the selection.&quot;</p>
</blockquote>
]]></description>
    <pubDate>Thu, 25 May 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sprinkle me logs</title>
<link>https://xenodium.com/sprinkle-me-logs</link>
<guid isPermaLink="false">https://xenodium.com/sprinkle-me-logs</guid>
    <description><![CDATA[<p>At times, basic prints/logs are just about the right debugging strategy. Sure, we have debuggers and <a href="https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop">REPLs</a> which are super useful, but sometimes you just know that sprinkling your code with a handful of temporary prints/logs will get you enough info to fix an issue.</p>
<p>I must confess, my temporary print statements are fairly uninspiring. Sometimes I log the name of the method/function, but I also resort to less creative options like <code>print(&quot;Yay&quot;)</code> or <code>print(&quot;Got here&quot;)</code>.</p>
<p>My laziness and lack of creativity knows no boundaries, so if I need multiple unique entries, I often copy, paste, and append numbers to my entries: <code>print(&quot;Yay 2&quot;)</code>, <code>print(&quot;Yay 3&quot;)</code>, <code>print(&quot;Yay 4&quot;)</code>… I know, are you judging yet?</p>
<p>So rather than develop the creative muscle, I've decided to lean on laziness and old habits, so let's make old habit more efficient :) I no longer want to copy, paste, and increment my uncreative log statements. Instead, I'll let Emacs do it for me!</p>
<p><img src="https://xenodium.github.io/images/sprinkle-me-logs/log-elisp.gif" alt=""></p>
<p>There isn't a whole lot to the implementation. It searches the current buffer for other instances of the same logging string and captures the largest counter found. It subsequently prints the same string with the counter incremented. This can be done in a few lines of elisp, but I figure I wanted some additional features like auto indenting and changing the logging string when using a prefix.</p>
<pre><code class="language-{.commonlisp">(defvar ar/unique-log-word &quot;Yay&quot;)

(defun ar/insert-unique-log-word (prefix)
  &quot;Inserts `ar/unique-log-word' incrementing counter.

With PREFIX, change `ar/unique-log-word'.&quot;
  (interactive &quot;P&quot;)
  (let* ((word (cond (prefix
                      (setq ar/unique-log-word
                            (read-string &quot;Log word: &quot;)))
                     ((region-active-p)
                      (setq ar/unique-log-word
                            (buffer-substring (region-beginning)
                                              (region-end))))
                     (ar/unique-log-word
                      ar/unique-log-word)
                     (t
                      &quot;Reached&quot;)))
         (config
          (cond
           ((equal major-mode 'emacs-lisp-mode)
            (cons (format &quot;(message \&quot;%s: \\([0-9]+\\)\&quot;)&quot; word)
                  (format &quot;(message \&quot;%s: %%s\&quot;)&quot; word)))
           ((equal major-mode 'swift-mode)
            (cons (format &quot;print(\&quot;%s: \\([0-9]+\\)\&quot;)&quot; word)
                  (format &quot;print(\&quot;%s: %%s\&quot;)&quot; word)))
           ((equal major-mode 'ada-mode)
            (cons (format &quot;Ada.Text_Io.Put_Line (\&quot;%s: \\([0-9]+\\)\&quot;);&quot; word)
                  (format &quot;Ada.Text_Io.Put_Line (\&quot;%s: %%s\&quot;);&quot; word)))
           ((equal major-mode 'c++-mode)
            (cons (format &quot;std::cout &lt;&lt; \&quot;%s: \\([0-9]+\\)\&quot; &lt;&lt; std::endl;&quot; word)
                  (format &quot;std::cout &lt;&lt; \&quot;%s: %%s\&quot; &lt;&lt; std::endl;&quot; word)))
           (t
            (error &quot;%s not supported&quot; major-mode))))
         (match-regexp (car config))
         (format-string (cdr config))
         (max-num 0)
         (case-fold-search nil))
    (when ar/unique-log-word
      (save-excursion
        (goto-char (point-min))
        (while (re-search-forward match-regexp nil t)
          (when (&gt; (string-to-number (match-string 1)) max-num)
            (setq max-num (string-to-number (match-string 1))))))
      (setq max-num (1+ max-num)))
    (unless (looking-at-p &quot;^ *$&quot;)
      (end-of-line))
    (insert (concat
             (if (looking-at-p &quot;^ *$&quot;) &quot;&quot; &quot;\n&quot;)
             (format format-string
                     (if ar/unique-log-word
                         (number-to-string (1+ max-num))
                       (string-trim
                        (shell-command-to-string
                         &quot;grep -E '^[a-z]{6}$' /usr/share/dict/words | shuf -n 1&quot;))))))
    (call-interactively 'indent-for-tab-command)))
</code></pre>
<p>Note: This snippet may evolve independently of this post. For the latest, chech my <a href="https://github.com/xenodium/dotsies">Emacs config</a>'s <a href="https://github.com/xenodium/dotsies/blob/main/emacs/features/fe-prog.el">fe-prog.el</a>.</p>
<p>I want to be lazy in other languages, so the function can now be extended to support other languages. Here's the Swift counterpart.</p>
<p><img src="https://xenodium.github.io/images/sprinkle-me-logs/log-swift.gif" alt=""></p>
<p>Since I sometimes log function names, I figured making it region-aware would help with that.</p>
<p><img src="https://xenodium.github.io/images/sprinkle-me-logs/log-selection.gif" alt=""></p>
<p>I'm sure there's a package out there that does something similar, but I figure this would be a fun little elisp hack.</p>
<p>Happy logging!</p>
<h2>Update 1</h2>
<p>Set <code>ar/unique-log-word</code> to nil and let it generate a random word. Maybe I get to learn new words as I debug ;)</p>
<p><img src="https://xenodium.github.io/images/sprinkle-me-logs/word.gif" alt=""></p>
<h2>Update 2</h2>
<p>Added Ada and C++ support, thanks to <a href="https://www.emacs.dyerdwelling.family/emacs/20230523204523-emacs--insert-unique-log-message/">James Dyer's post</a>.</p>
]]></description>
    <pubDate>Thu, 18 May 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>dwim-shell-command on Windows + upload to 0x0.st</title>
<link>https://xenodium.com/dwim-shell-command-now-on-windows</link>
<guid isPermaLink="false">https://xenodium.com/dwim-shell-command-now-on-windows</guid>
    <description><![CDATA[<p>You can now use <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> on Windows. Shoutout to Kartik Saranathan, who sent a <a href="https://github.com/xenodium/dwim-shell-command/pull/9">pull request</a> to get rid of <code>ls</code> usage.</p>
<p>Also thanks to Bram for sharing his <a href="https://indieweb.social/@bram85@emacs.ch/110335134760990713">upload to 0x0.st implementation</a>. I'd been wanting to do something similar for <a href="https://imgur.com/">imgur</a>, but <a href="https://0x0.st/">0x0.st</a> is a much better alternative!</p>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-now-on-windows/0x0.gif" alt=""></p>
<p><code>dwim-shell-commands-upload-to-0x0</code> is now part of <a href="https://github.com/xenodium/dwim-shell-command/commit/1a896221cc34319582b0921b919638ea2528b0e6">dwim-shell-commands.el</a> (the optional part of the package). It has a couple of additional touches:</p>
<ul>
<li>Open the uploaded image in <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/EWW.html">eww</a> browser.</li>
<li>Automatically copy the upload URL to kill-ring. You're likely gonna share this link, right?</li>
</ul>
<p>If you're unfamiliar with <code>dwim-shell-command</code>, it enables Emacs shell commands with DWIM behaviour:</p>
<ul>
<li>Asynchronously.</li>
<li>Using noweb templates.</li>
<li>Automatically injecting files (from <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> or other buffers) or kill ring.</li>
<li>Managing buffer focus with heuristics.</li>
<li>Showing progress bar.</li>
<li>Quick buffer exit.</li>
<li>More reusable history.</li>
</ul>
<p>In addition to replacing <code>shell-command</code> with <code>dwim-shell-command</code>, I also use it to bring all sorts of command line utilities to familiar Emacs workflows (in dired or current buffers), without having to remember complex command invocations.</p>
<p>I've covered many of the use-cases before:</p>
<ul>
<li><a href="https://xenodium.com/emacs-dwim-shell-command/">Emacs DWIM shell-command</a></li>
<li><a href="https://xenodium.com/emacs-password-protect-current-pdf-revisited/">Emacs: Password-protect current pdf (revisited)</a></li>
<li><a href="https://xenodium.com/png-to-icns-emacs-dwim-style/">png to icns (Emacs DWIM style)</a></li>
<li><a href="https://xenodium.com/emacs-dwim-shell-command-multi-language/">Emacs: DWIM shell command (multi-language)</a></li>
<li><a href="https://xenodium.com/dwim-shell-command-on-melpa/">dwim-shell-command on Melpa</a></li>
<li><a href="https://xenodium.com/dwim-shell-command-improvements/">dwim-shell-command improvements</a></li>
<li><a href="https://xenodium.com/dwim-shell-command-video-streams/">dwim-shell-command video streams</a></li>
<li><a href="https://xenodium.com/dwim-shell-command-with-template-prompts/">dwim-shell-command with template prompts</a></li>
<li><a href="https://xenodium.com/dwim-shell-command-usages-pdftotext-and-scp/">dwim-shell-command usages: pdftotext and scp</a></li>
<li><a href="https://xenodium.com/emacs-reveal-in-finder-dwim-style/">Emacs: Reveal in macOS Finder (DWIM style)</a></li>
<li><a href="https://xenodium.com/emacs-macos-share-from-dired-dwim-style/">Emacs: macOS sharing (DWIM style)</a></li>
</ul>
]]></description>
    <pubDate>Thu, 11 May 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>chatgpt-shell siblings now on MELPA also</title>
<link>https://xenodium.com/chatgpt-shell-siblings-now-on-melpa-also</link>
<guid isPermaLink="false">https://xenodium.com/chatgpt-shell-siblings-now-on-melpa-also</guid>
    <description><![CDATA[<p>In <a href="https://xenodium.com/chatgpt-shell-available-on-melpa/">chatgpt-shell updates</a>, I highlighted <code>dall-e-shell</code> (a DALL-E Emacs shell), <code>ob-chatgpt-shell</code> (ChatGPT org babel support), and <code>ob-dall-e-shell</code> (DALL-E org babel support) were initially excluded from the <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> MELPA submission while I worked out their split.</p>
<p>That's now sorted and the packages are available on MELPA.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-siblings-now-on-melpa-also/melpa-siblings.jpg" alt=""></p>
<p>Here's <code>ob-chatgpt-shell</code> and <code>ob-dall-e-shell</code> in action.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/babel.png" alt=""></p>
<p>Here's <code>dall-e-shell</code>.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/dalle.png" alt=""></p>
]]></description>
    <pubDate>Mon, 01 May 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Generating elisp org docs</title>
<link>https://xenodium.com/generating-elisp-org-docs</link>
<guid isPermaLink="false">https://xenodium.com/generating-elisp-org-docs</guid>
    <description><![CDATA[<p><a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>'s README includes few org tables documenting the package's <a href="https://github.com/xenodium/chatgpt-shell#chatgpt-shell-customizations">customizable variables</a> as well as <a href="https://github.com/xenodium/chatgpt-shell#chatgpt-shell-commands">available commands</a>. Don't worry, this isn't really another ChatGPT post.</p>
<p>Here's an extract of the docs table:</p>
<pre><code class="language-{.org">| Custom variable                       | Description                                                 |
|---------------------------------------+-------------------------------------------------------------|
| chatgpt-shell-display-function        | Function to display the shell.                              |
| chatgpt-shell-curl-additional-options | Additional options for `curl' command.                      |
| chatgpt-shell-system-prompt           | The system message helps set the behavior of the assistant. |
</code></pre>
<p>While the table docs didn't take long to build manually, they quickly became out of sync with their elisp counterparts. Not ideal, as it'll require a little more careful maintenance in the future.</p>
<p>Emacs being the self-documenting editor that it is, I figured I should be able to extract customizable variables, commands, along with their respective docs, and generate these very same org tables.</p>
<p>I had no idea how to go about this, but <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Apropos.html">apropos-variable</a> and <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Apropos.html">apropos-command</a> surely knew where to fetch the details from. A peek into <code>apropos.el</code> quickly got me on my way. Turns out <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Symbols.html#Definition-of-mapatoms">mapatoms</a> is just what I needed. It iterates over <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Symbols.html">obarray</a>, Emacs's symbol table. We can use it to extract the symbols we're after.</p>
<p>Since we're filtering symbols from <code>chatgpt-shell</code>, we can start by including only those whose <code>symbol-name</code> match &quot;^chatgpt-shell&quot;. Out of all matching, we should only keep custom variables. We can use <code>custom-variable-p</code> to check for that. This gives us all relevant variables. We can subsequently get each variable's corresponding docs using <code>(get symbol 'variable-documentation)</code> and put it into a list.</p>
<p>Now, if we pull our org babel rabbit out of our Emacs magic hat, we can use <code>:results table</code> to print the list as an org table. The source block powering this magic trick looks as follows:</p>
<pre><code class="language-org">#+begin_src emacs-lisp :results table :colnames '(&quot;Custom variable&quot; &quot;Description&quot;)
  (let ((rows))
    (mapatoms
     (lambda (symbol)
       (when (and (string-match &quot;^chatgpt-shell&quot;
                                (symbol-name symbol))
                  (custom-variable-p symbol))
         (push `(,symbol
                 ,(car
                   (split-string
                    (or (get (indirect-variable symbol)
                             'variable-documentation)
                        (get symbol 'variable-documentation)
                        &quot;&quot;)
                    &quot;\n&quot;)))
               rows))))
    rows)
#+end_src
</code></pre>
<p>And just like that… we effortlessly get our elisp docs in an org table, straight from Emacs's symbol table.</p>
<p><img src="https://xenodium.github.io/images/generating-elisp-org-docs/docs.gif" alt=""></p>
<p>It's worth noting that our snippet used <code>indirect-variable</code> to resolve aliases but also limited descriptions to the first line in each docstring.</p>
<p>To build a similar table for interactive commands, we can use the following block (also including bindings).</p>
<pre><code class="language-org">#+BEGIN_SRC emacs-lisp :results table :colnames '(&quot;Binding&quot; &quot;Command&quot; &quot;Description&quot;)
  (let ((rows))
    (mapatoms
     (lambda (symbol)
       (when (and (string-match &quot;^chatgpt-shell&quot;
                                (symbol-name symbol))
                  (commandp symbol))
         (push `(,(mapconcat
                   #'help--key-description-fontified
                   (where-is-internal
                    symbol shell-maker-mode-map nil nil (command-remapping symbol)) &quot;, &quot;)
                 ,symbol
                 ,(car
                   (split-string
                    (or (documentation symbol t) &quot;&quot;)
                    &quot;\n&quot;)))
               rows))))
    rows)
#+END_SRC
</code></pre>
<p><img src="https://xenodium.github.io/images/generating-elisp-org-docs/commands.gif" alt=""></p>
<p>You see? This post wasn't really about ChatGPT. Aren't you glad you stuck around? 😀</p>
]]></description>
    <pubDate>Fri, 28 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>LLM bookmarks</title>
<link>https://xenodium.com/llm-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/llm-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://vineeth.io/posts/2023/new-age-of-magic/">A New Age of Magic</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=35643219">Bark – Text-prompted generative audio model | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=35942583">Brex’s Prompt Engineering Guide | Hacker News</a>.</li>
<li><a href="https://github.com/suno-ai/bark">GitHub - suno-ai/bark: 🔊 Text-Prompted Generative Audio Model</a>.</li>
<li><a href="https://blog.rfox.eu/en/Programming/How_to_run_your_own_LLM_GPT.html">How to run your own LLM (GPT)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=40408880">Llama3 implemented from scratch | Hacker News</a>.</li>
<li><a href="https://promptperfect.jina.ai/">PromptPerfect - Elevate Your Prompts to Perfection with AI Prompt Engineering</a>.</li>
<li><a href="https://www.reddit.com/r/BackyardAI/s/I5HLdePj6Z">Reddit - Dive into anythingHow Language Models work, Part 1</a></li>
<li><a href="https://ykgoon.com/running-llm-locally.html">Running LLMs Locally | Y.K. Goon</a>.</li>
<li><a href="https://sharegpt.com/">ShareGPT: Share your wildest ChatGPT conversations with one click.</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=35660751">Show HN: Automatic prompt optimizer for LLMs | Hacker News</a>.</li>
<li><a href="https://fka.gumroad.com/l/art-of-chatgpt-prompting">The Art of ChatGPT Prompting: A Guide to Crafting Clear and Effective Prompts</a>.</li>
<li><a href="https://fka.gumroad.com/l/the-art-of-midjourney-ai-guide-to-creating-images-from-text">The Art of Midjourney AI: A Guide to Creating Images from Text</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 25 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>chatgpt-shell updates</title>
<link>https://xenodium.com/chatgpt-shell-available-on-melpa</link>
<guid isPermaLink="false">https://xenodium.com/chatgpt-shell-available-on-melpa</guid>
    <description><![CDATA[<p>About a month ago, I posted about an experiment to build <a href="https://xenodium.com/a-chatgpt-emacs-shell/">a ChatGPT Emacs shell</a> using <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint mode</a>. Since then, it's turned into a package of sorts, evolving with <a href="https://github.com/xenodium/chatgpt-shell/issues?q=is%3Aissue+is%3Aclosed+">user feedback</a> and <a href="https://github.com/xenodium/chatgpt-shell/pulls?q=is%3Apr+is%3Aclosed">pull requests</a>.</p>
<h2>Now on MELPA</h2>
<p>While <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> is a young package still, it seems useful enough to share more widely. As of today, <code>chatgpt-shell</code> is <a href="https://melpa.org/#/chatgpt-shell">available on MELPA</a>. Many thanks to <a href="https://github.com/riscy">Chris Rayner</a> for his MELPA guidance to get the package added.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/cyberpunk.gif" alt=""></p>
<p>I'll cover some of the goodies included in the latest <code>chatgpt-shell</code>.</p>
<h2>Delegating to Org Babel</h2>
<p><code>chatgpt-shell</code> now evaluates Markdown source blocks by delegating to <a href="https://orgmode.org/worg/org-contrib/babel/">org babel</a>. I've had success with a handful of languages. In some instances, some babel headers may need overriding in <code>chatgpt-shell-babel-headers</code>.</p>
<p>Here's a Swift execution via babel, showing standard output.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/swift.gif" alt=""></p>
<p>In addition to standard output, <code>chatgpt-shell</code> can now render blocks generating images. Here's a rendered SwiftUI layout via <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a>.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/swiftui.gif" alt=""></p>
<p>Can also do diagrams. Here's <a href="https://ditaa.sourceforge.net/">ditaa</a> in action.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/ditaa.gif" alt=""></p>
<h2>Renaming blocks</h2>
<p>At times, ChatGPT may forget to label source blocks or maybe you just want to name it differently… You can now rename blocks at point.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/rename.gif" alt=""></p>
<h2>Send prompt/region</h2>
<p>There are a handful of commands to send prompts from other buffers, including the region. For example <code>chatgpt-shell-explain-code</code>.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/explain-region.gif" alt=""></p>
<ul>
<li>chatgpt-shell-send-region</li>
<li>chatgpt-shell-generate-unit-test</li>
<li>chatgpt-shell-refactor-code</li>
<li>chatgpt-shell-proofread-doc</li>
<li>chatgpt-shell-eshell-summarize-last-command-output</li>
<li>chatgpt-shell-eshell-whats-wrong-with-last-command</li>
</ul>
<h2>Saving/restoring transcript</h2>
<p>You can save your current session to a transcript and restore later.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/restore.gif" alt=""></p>
<h2>History improvements</h2>
<p><a href="https://www.n16f.net/">Nicolas Martyanoff</a> has a great post on <a href="https://www.n16f.net/blog/making-ielm-more-comfortable/">making IELM More Comfortable</a>. A couple of improvements that stood out for me were:</p>
<ul>
<li>Making the command history persistent.</li>
<li>Searching history with <code>shell-maker-search-history</code> / <code>M-r</code> via <code>completing-read</code>.</li>
</ul>
<p><code>shell-maker-search-history</code>, coupled with your completion framework of choice, can be pretty handy. I happen to use Oleh Krehel's <a href="https://github.com/abo-abo/swiper">ivy</a>.</p>
<h2>shell-maker (make your own AI shells)</h2>
<p>While ChatGPT is a popular service, there are many others sprouting. Some are cloud-based, others local, proprietary, open source… In any case, it'd be great be able to hook on to them without much overhead. <a href="https://xenodium.com/a-shell-maker/">shell-maker</a> should help with that. The first <code>shell-maker</code> clients are <code>chatgpt-shell</code> and <code>dall-e-shell</code>.</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/dalle.png" alt=""></p>
<p>While I've built <code>dall-e-shell</code>, it'd be great to see what others can do with <code>shell-maker</code>. If you wire it up to anything, please get in touch (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
<h2>dall-e-shell, ob-chatgpt-shell, and ob-dall-e-shell (on MELPA too)</h2>
<p>UPDATE: <a href="https://indieweb.social/@xenodium/110087011082546281">dall-e-shell</a>, <a href="https://indieweb.social/@xenodium/110130580337078002">ob-chatgpt-shell</a>, and <a href="https://indieweb.social/@xenodium/110142796865197004">ob-dall-e-shell</a> are now available on MELPA also.</p>
<p>You've seen <code>dall-e-shell</code> in the previous section. Here's what <code>ob-chatgpt-shell</code> and <code>ob-dall-e-shell</code> look like in an <a href="https://orgmode.org/">org mode</a> document:</p>
<p><img src="https://xenodium.github.io/images/chatgpt-shell-available-on-melpa/babel.png" alt=""></p>
<h2>How are you using <code>chatgpt-shell</code>?</h2>
<p>Whether you are an existing <code>chatgpt-shell</code> user, or would like to give things a try, <a href="https://melpa.org/#/chatgpt-shell">installing from MELPA</a> should generally make things easier for ya. As I mentioned, <code>chatgpt-shell</code> is a young package still. There are unexplored Emacs integrations out there. I'd love to hear about whatever you come up with (<a href="https://indieweb.social/@xenodium">Mastodon</a> / <a href="https://twitter.com/xenodium">Twitter</a> / <a href="https://www.reddit.com/user/xenodium">Reddit</a> / <a href="mailto:me__AT__xenodium.com">Email</a>).</p>
]]></description>
    <pubDate>Tue, 25 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Recording and screenshotting windows: the lazy way</title>
<link>https://xenodium.com/recordscreenshot-windows-the-lazy-way</link>
<guid isPermaLink="false">https://xenodium.com/recordscreenshot-windows-the-lazy-way</guid>
    <description><![CDATA[<p>While there's no substitution for great written documentation, a quick demo can go a long way in conveying what a tool if capable of doing or what a tip/trick can achieve.</p>
<p>If you've read a handful of my posts, you would have come across either a screenshot or a short clip with some demo. Historically, I've used the macOS's built-in utility invoked via <code>⌘ + Shift + 5</code>. It does a fine job for screenshots. For video captures, it's got a couple of small quirks.</p>
<h2>Record window</h2>
<p>Unlike screenshots, macOS video capture cannot record a specific window. While you can select a region, it's easy to inadvertently include a portion of your wallpaper in the recording. Not a big deal, but I felt posted screencasts could look as clean as their screenshot counterparts if we could record the window alone.</p>
<p>Let's compare grabbing a region vs window alone. I know the clean look may be subjective, but see what I mean?</p>
<figure width="50%">
<img src="https://xenodium.github.io/images/recordscreenshot-windows-the-lazy-way/record-bg.gif" />
<figcaption>Capture region (includes wallpaper/background)</figcaption>
</figure>
<figure width="50%">
<img src="https://xenodium.github.io/images/recordscreenshot-windows-the-lazy-way/record.gif" />
<figcaption>Capture window only (ahhh, so clean)</figcaption>
</figure>
<h2>Cancel recording</h2>
<p>macOS has a handy shortcut (<code>⌘ + Ctrl + Esc</code>) to stop recording. If you got your demo right, you're done. If not, you have one more step remaining (right click to delete the blooper).</p>
<p><img src="https://xenodium.github.io/images/recordscreenshot-windows-the-lazy-way/delete.png" alt=""></p>
<p>Also not a huge deal, but I was hoping for a single shortcut to stop recording [and]{.underline} also automatically discard. I haven't found one, but would love to hear if otherwise.</p>
<h2>macosrec enters the chat</h2>
<p>I wanted more flexibility to build my own recording/screenshotting flows. A command line utility could be quite versatile at that, so I built <a href="https://github.com/xenodium/macosrec">macosrec</a>.</p>
<p><code>macosrec</code> enables taking a screenshot or recording a window video entirely from the command line.</p>
<p><img src="https://xenodium.github.io/images/recordscreenshot-windows-the-lazy-way/macosrec.gif" alt=""></p>
<h2>elisp glues the world</h2>
<p>Command line utilities can be invoked in all sorts of ways, but I'm an Emacs nutter so you can see where this is going… I want Emacs key bindings to control the lot.</p>
<hr>
<p>C-c _   Take screenshot of a window
C-c (    Start recording window
C-c )    Stop recording window
C-c 8    Abort recording</p>
<hr>
<p>Integrating command line utilities into Emacs and making them quickly accessible seems to have become a full-time hobby of mine. I kid, but it's become a pretty painless process for me. I built <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> for that. If you've never heard of <a href="https://en.wikipedia.org/wiki/DWIM">DWIM</a>, it stands for &quot;Do what I mean&quot;. To give you an idea of the kinds of things I'm using DWIM commands for, check the following out:</p>
<ul>
<li>dwim-shell-commands-audio-to-mp3</li>
<li>dwim-shell-commands-bin-plist-to-xml</li>
<li>dwim-shell-commands-clipboard-to-qr</li>
<li>dwim-shell-commands-drop-video-audio</li>
<li>dwim-shell-commands-files-combined-size</li>
<li>dwim-shell-commands-git-clone-clipboard-url</li>
<li>dwim-shell-commands-git-clone-clipboard-url-to-downloads</li>
<li>dwim-shell-commands-image-to-grayscale</li>
<li>dwim-shell-commands-image-to-icns</li>
<li>dwim-shell-commands-image-to-jpg</li>
<li>dwim-shell-commands-image-to-png</li>
<li>dwim-shell-commands-pdf-password-protect</li>
<li>dwim-shell-commands-reorient-image</li>
<li>dwim-shell-commands-resize-gif</li>
<li>dwim-shell-commands-resize-image</li>
<li>dwim-shell-commands-resize-video</li>
<li>dwim-shell-commands-speed-up-gif</li>
<li>dwim-shell-commands-speed-up-video</li>
<li>dwim-shell-commands-unzip</li>
<li>dwim-shell-commands-video-to-gif</li>
<li>dwim-shell-commands-video-to-optimized-gif</li>
<li>dwim-shell-commands-video-to-webp</li>
</ul>
<p>If it ever took you a little while to find the right command incantation to get things right, only to forget all about it next time you need it (<a href="https://xenodium.com/emacs-ffmpeg-and-macos-alias-commands">I'm looking at you ffmpeg</a>), <code>dwim-shell-command</code> can help you easily save things for posterity and make them easily accessible in the future.</p>
<p>Since we're talking ffmpeg, here's all it takes to have gif conversion handy:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-video-to-gif ()
  &quot;Convert all marked videos to gif(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert to gif&quot;
   &quot;ffmpeg -loglevel quiet -stats -y -i '&lt;&lt;f&gt;&gt;' -pix_fmt rgb24 -r 15 '&lt;&lt;fne&gt;&gt;.gif'&quot;
   :utils &quot;ffmpeg&quot;))
</code></pre>
<p>There's no way I'll remember the ffmpeg command, but I can always fuzzy search my trusty commands with something like <code>&quot;to gif&quot;</code> and apply to either the current buffer file or any selected <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> files.</p>
<p><img src="https://xenodium.github.io/images/recordscreenshot-windows-the-lazy-way/to-gif.png" alt=""></p>
<p>So where am I going with this? I wrote DWIM shell commands for the bindings I previously described:</p>
<hr>
<p>C-c _   <code>dwim-shell-commands-macos-screenshot-window</code>
C-c (    <code>dwim-shell-commands-macos-start-recording-window</code>
C-c )    <code>dwim-shell-commands-macos-end-recording-window</code>
C-c 8    <code>dwim-shell-commands-macos-abort-recording-window</code></p>
<hr>
<p>Out of all of commands, <code>dwim-shell-commands-macos-start-recording-window</code> is likely the most interesting one.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-macos-start-recording-window ()
  &quot;Select and start recording a macOS window.&quot;
  (interactive)
  (let* ((window (dwim-shell-commands--macos-select-window))
         (path (dwim-shell-commands--generate-path &quot;~/Desktop&quot; (car window) &quot;.mov&quot;))
         (buffer-file-name path) ;; override so &lt;&lt;f&gt;&gt; picks it up
         (inhibit-message t))
    (dwim-shell-command-on-marked-files
       &quot;Start recording a macOS window.&quot;
       (format
        &quot;# record .mov
         macosrec --record '%s' --mov --output '&lt;&lt;f&gt;&gt;'
         # speed .mov up x1.5
         ffmpeg -i '&lt;&lt;f&gt;&gt;' -an -filter:v 'setpts=1.5*PTS' '&lt;&lt;fne&gt;&gt;_x1.5.&lt;&lt;e&gt;&gt;'
         # convert to gif x1.5
         ffmpeg -loglevel quiet -stats -y -i '&lt;&lt;fne&gt;&gt;_x1.5.&lt;&lt;e&gt;&gt;' -pix_fmt rgb24 -r 15 '&lt;&lt;fne&gt;&gt;_x1.5.gif'
         # speed .mov up x2
         ffmpeg -i '&lt;&lt;f&gt;&gt;' -an -filter:v 'setpts=2*PTS' '&lt;&lt;fne&gt;&gt;_x2.&lt;&lt;e&gt;&gt;'
         # convert to gif x2
         ffmpeg -loglevel quiet -stats -y -i '&lt;&lt;fne&gt;&gt;_x2.&lt;&lt;e&gt;&gt;' -pix_fmt rgb24 -r 15 '&lt;&lt;fne&gt;&gt;_x2.gif'&quot;
        (cdr window))
       :silent-success t
       :monitor-directory &quot;~/Desktop&quot;
       :no-progress t
       :utils '(&quot;ffmpeg&quot; &quot;macosrec&quot;))))
</code></pre>
<p>As you likely expect, this command invokes <code>macosrec</code> to start recording a window. The nifty part is that when it's done recording (and saving the .mov file), it automatically creates multiple variants. For starters, it creates x1.5 and x2 .mov videos, but it also generates their .gif counterparts.</p>
<p><img src="https://xenodium.github.io/images/recordscreenshot-windows-the-lazy-way/bunch.png" alt=""></p>
<p>Let's recap here for a sec. You start recording a window video with <code>C-c (</code>, end with <code>C-c )</code>, and automagically have all these generated files waiting for you.</p>
<p>You can subsequently inspect any of the video candidates and pick the most appropriate variant. Discard whatever else you don't need.</p>
<p>The output bundle is tailored to my needs. Maybe you want to invoke <a href="https://www.lcdf.org/gifsicle/">gifsycle</a> for more optimized versions? Or maybe you want automatic webp generation via <code>ffmpeg</code>? DWIM does that I mean, so you likely have other plans…</p>
<p><code>dwim-shell-commands-macos-start-recording-window</code> and all other DWIM commands are now included in <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>, which ships optionally as part of <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>.</p>
<p><a href="https://github.com/xenodium/macosrec">macosrec</a> is also on GitHub, but if you want to be on your way, you can install via:</p>
<pre><code class="language-{.bash">brew tap xenodium/macosrec
brew install macosrec
</code></pre>
<p>This is my way to record and screenshot windows the lazy way. How would you tweak to make it yours?</p>
]]></description>
    <pubDate>Sat, 22 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>ob-swiftui updates</title>
<link>https://xenodium.com/ob-swiftui-updates</link>
<guid isPermaLink="false">https://xenodium.com/ob-swiftui-updates</guid>
    <description><![CDATA[<p>While <a href="https://indieweb.social/@xenodium/110227186721704189">experimenting with delegating Markdown</a> blocks to <a href="https://orgmode.org/worg/org-contrib/babel/">Org babel</a> in Emacs <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>, I resurrected <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a>. A package I had written to execute and render SwiftUI blocks in org babel.</p>
<p><a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> has two modes of rendering SwiftUI blocks: <code>:results window</code>, which runs outside of Emacs in a native window and <code>:results file</code>, which renders and saves to a file. The latter can be viewed directly from Emacs.</p>
<p><code>:results file</code> was a little clunky. That is, it hardcoded dimensions I had to manually modify if the canvas wasn't big enough. It was also a little slow.</p>
<p>The clunkyness really came through with my chatgpt-shell experiments, so I took a closer look and made a few changes to remove hardcoding and speeds things up.</p>
<p>The results ain't too shabby.</p>
<p><img src="https://xenodium.github.io/images/ob-swiftui-updates/file-render.gif" alt=""></p>
<p>Another tiny improvement is that if you'd like to compose a more complex layout made of multiple custom views, <code>ob-swiftui</code> now looks for a <code>ContentView</code> as that root view by default. Specifying another root view was already possible but it had to be explicitly requested via <code>:view</code> param.</p>
<p>You can now omit the <code>:view</code> param if you name the root view <code>ContentView</code>:</p>
<pre><code class="language-org">#+begin_src swiftui
  struct ContentView: View {
    var body: some View {
        TopView()
        BottomView()
    }
  }

  struct TopView: View {
    var body: some View {
      Text(&quot;Top text&quot;)
    }
  }

  struct BottomView: View {
    var body: some View {
      Text(&quot;Bottom text&quot;)
    }
  }
#+end_src
</code></pre>
<p>The improvements have been pushed to <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> and will soon be picked up on <a href="https://melpa.org/#/ob-swiftui">melpa</a>.</p>
<p>Edit: Added ContentView details.</p>
]]></description>
    <pubDate>Thu, 20 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>My Emacs eye candy</title>
<link>https://xenodium.com/my-emacs-eye-candy</link>
<guid isPermaLink="false">https://xenodium.com/my-emacs-eye-candy</guid>
    <description><![CDATA[<p>I get the occasional question about my Emacs theme, font, and other eye candy. I'm always tickled and happy to share.</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/Emacs.png" alt=""></p>
<p>It's been a while since I've made visually significant changes to my Emacs config. May as well briefly document for posterity…</p>
<h2>Nyan Mode</h2>
<p>First things first. The adorable and colorful little fella in my mode line is a <a href="https://en.wikipedia.org/wiki/Nyan_Cat">Nyan Cat</a> (if you dare, check the <a href="https://www.youtube.com/watch?v=2yJgwwDcgV8">meme video</a>). Yes, I know it's sooo 2011, but it's 2023 and I still love the little guy hanging out in my Emacs mode line. I still get asked about it.</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/Nyan.png" alt=""></p>
<p>This fabulous feature comes to us via the great <a href="https://github.com/TeMPOraL/nyan-mode/">Nyan Mode</a> package. If looks haven't convinced you, Nyan also packs scrolling functionality. Click anywhere in it.</p>
<p>Oh, and if you can't get enough of Nyan, there's also <a href="https://depp.brause.cc/zone-nyan/">zone-nyan</a> for Emacs.</p>
<h2>Emacs Plus (macOS)</h2>
<p>I should mention I'm running Emacs 28 on macOS via the excellent <a href="https://github.com/d12frosted/homebrew-emacs-plus">Emacs Plus</a> <a href="https://brew.sh/">homebrew</a> recipe. These are all the options I enable.</p>
<pre><code class="language-{.bash">brew install  emacs-plus@28 --with-imagemagick --with-no-frame-refocus --with-native-comp --with-savchenkovaleriy-big-sur-icon
</code></pre>
<h3>Icon</h3>
<p>Since we're talking eye candy, let's chat about <code>--with-savchenkovaleriy-big-sur-icon</code>. This Emacs Plus option enables Valeriy Savchenko's <a href="https://github.com/SavchenkoValeriy/emacs-icons">wonderful icon</a>.</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/swap.png" alt=""></p>
<h3>Titlebar</h3>
<p>I've enabled both transparent title bar as well as dark appearance, giving a minimal window decoration.</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/decoration.jpg" alt=""></p>
<pre><code class="language-{.commonlisp">(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark))
</code></pre>
<p>Note: both of these variables are prefixed <code>ns-</code> (macOS-only settings).</p>
<h2>Font (JetBrains Mono)</h2>
<p>I've been on <a href="https://www.jetbrains.com/lp/mono/">JetBrains Mono</a> font for quite some time now. In the past, I've also been a fan of <a href="https://madmalik.github.io/mononoki/">Mononoki</a> and <a href="https://en.wikipedia.org/wiki/Menlo_(typeface)">Menlo</a> (on macOS) or <a href="https://github.com/andreberg/Meslo-Font">Meslo</a> (similar elsewhere).</p>
<h2>Theme (Materialized)</h2>
<p>I'm using <a href="https://github.com/xenodium/emacs-materialized-theme">Materialized</a> which I derived from the great <a href="https://github.com/cpaulik/emacs-material-theme">Material Theme for Emacs</a>.</p>
<h2>Modeline tabs/ribbons (Moody)</h2>
<p>The <a href="https://github.com/tarsius/moody">moody</a> package adds a nice touch displaying mode line elements as tabs and ribbons.</p>
<h2>Modeline menus (Minions)</h2>
<p>The <a href="https://github.com/tarsius/minions">minions</a> package removes lots of minor mode clutter from the mode line and stashes it away in menus.</p>
<h2>Hiding modeline (hide mode line mode)</h2>
<p>Hiding the mode line isn't something I use in most major modes. However, I found it complements my shell (<a href="https://www.masteringemacs.org/article/complete-guide-mastering-eshell">eshell</a>) quite well. While I was sceptical at first, once I hid the mode line in my shell I never looked back. I just didn't miss it. I also love the uncluttered clean vibe. <a href="https://github.com/hlissner/emacs-hide-mode-line">hide-mode-line-mode</a> can help with that.</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/eshell.gif" alt=""></p>
<h2>Welcome screen</h2>
<p>Back in October 2022, I experimented with <a href="https://xenodium.com/emacs-a-welcoming-experiment/">adding a minimal welcome screen</a>. I was initially hesitant, as I was already a fan of the welcome scratch buffer. In any case, I figured I'd eventually get tired of it and remove it. Well, it's enabled in my config still ;) My initial attachment to a landing scratch quickly faded. I'm only a <code>C-x b</code> binding away from invoking ivy-switch-buffer to get me anywhere.</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/welcome.png" alt=""></p>
<p>The great Emacs logo originally <a href="https://www.reddit.com/r/unixporn/comments/yamj5f/exwm_emacs_is_kinda_comfy_as_a_wm/">shared by u/pearcidar43</a>.</p>
<h2>Zones</h2>
<p>I've been meaning to re-enable <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/play/zone.el">zones</a> in my config. They always gave me a good tickle. I've already mentioned <a href="https://depp.brause.cc/zone-nyan/">zone-nyan</a>, but if you're new to zones, they kick off after a period of inactivity (similar to a screensaver).</p>
<p>Here's <code>zone-pgm-rotate</code> in all its glory. Oh and it's built-in!</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/rotate.webp" alt=""></p>
<p>Coincidentally, I had a go at writing <a href="https://xenodium.com/emacs-zones-to-lift-you-up/">a basic zone a little while ago</a>.</p>
<p><img src="https://xenodium.github.io/images/my-emacs-eye-candy/zone.gif" alt=""></p>
<h2>Config</h2>
<p>Most of the items mentioned I pulled from my <a href="https://github.com/xenodium/dotsies">Emacs config</a>'s <a href="https://github.com/xenodium/dotsies/blob/main/emacs/features/fe-ui.el">fe-ui.el</a>. There's more there if you're interested.</p>
<p>What is some of your favorite Emacs eye candy? <a href="https://www.reddit.com/r/emacs/comments/12nbb9x/my_emacs_eye_candy/">reddit</a> / <a href="https://indieweb.social/@xenodium/110204024063552954">mastodon</a> / <a href="https://twitter.com/xenodium/status/1647293089394900993">twitter</a>.</p>
]]></description>
    <pubDate>Sat, 15 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>shell-maker, a maker of Emacs shells</title>
<link>https://xenodium.com/a-shell-maker</link>
<guid isPermaLink="false">https://xenodium.com/a-shell-maker</guid>
    <description><![CDATA[<p>A few weeks ago, I wrote about an experiment to bring <a href="https://xenodium.com/a-chatgpt-emacs-shell/">ChatGPT to Emacs as a shell</a>. I was fairly new to both <a href="https://openai.com/blog/chatgpt">ChatGPT</a> and building anything on top of <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint</a>. It was a fun exercise, which also generated some interest.</p>
<p>As mentioned in the previous post, I took inspiration in other Emacs packages (primarily <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Lisp-Interaction.html">ielm</a>) to figure out what I needed from comint. Soon, I got ChatGPT working.</p>
<p><img src="https://xenodium.github.io/images/a-shell-maker/streamer.gif" alt=""></p>
<p>As I was looking at <a href="https://openai.com">OpenAI</a> API docs, I learned about DALL-E: &quot;an AI system that can create realistic images and art from a description in natural language.&quot;</p>
<p>Like ChatGPT, they also offered an API to DALL-E, so I figured I may as well try to write a shell for that too… and I did.</p>
<p><img src="https://xenodium.github.io/images/a-shell-maker/dalle.gif" alt=""></p>
<p>There was quite a bit of code duplication between the two Emacs shells I had just written. At the same time, I started hearing from folks about integrating other tools, some cloud-based, some local, proprietary, open source.. There's <a href="https://about.sourcegraph.com/cody">Cody</a>, <a href="https://github.com/invoke-ai/InvokeAI">invoke-ai</a>, <a href="https://github.com/ggerganov/llama.cpp">llama.cpp</a>, <a href="https://github.com/antimatter15/alpaca.cpp">alpaca.cpp</a>, and the list continues to grow.</p>
<p>With that in mind, I set out to reduce the code duplication and consolidate into a reusable package. And so <code>shell-maker</code> was born, a maker of Emacs shells.</p>
<p><code>shell-maker</code>'s internals aren't too different from the code I had before. It's still powered by comint, but instead offers a reusable convenience wrapper.</p>
<p>It takes little code to implement a shell, like the sophisticated new <code>greeter-shell</code> ;)</p>
<p><img src="https://xenodium.github.io/images/a-shell-maker/maria.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(require 'shell-maker)

(defvar greeter-shell--config
  (make-shell-maker-config
   :name &quot;Greeter&quot;
   :execute-command
   (lambda (command _history callback error-callback)
     (funcall callback
              (format &quot;Hello \&quot;%s\&quot;&quot; command)
              nil))))

(defun greeter-shell ()
  &quot;Start a Greeter shell.&quot;
  (interactive)
  (shell-maker-start greeter-shell--config))
</code></pre>
<p><a href="https://github.com/xenodium/chatgpt-shell#shell-maker">shell-maker</a> is available on GitHub and currently bundled with <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a>. If there's enough interest and usage, I may just break it out into its own package. For now, it's convenient to keep with <code>chatgpt-shell</code> and <code>dall-e-shell</code>.</p>
<p>If you plug <code>shell-maker</code> into other tools, I'd love to hear about it.</p>
<p>Happy shell making!</p>
]]></description>
    <pubDate>Sat, 08 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flat Habits 1.1.4 released</title>
<link>https://xenodium.com/flat-habits-114-released</link>
<guid isPermaLink="false">https://xenodium.com/flat-habits-114-released</guid>
    <description><![CDATA[<p><a href="https://flathabits.com/">Flat Habits</a> 1.1.4 is now available on the <a href="https://apps.apple.com/app/id1558358855">App Store</a>.</p>
<p>Flat Habits is a habit tracker that’s mindful of your time, data, and privacy. It's a simple but effective iOS app.</p>
<center>
  <img src="https://flathabits.com/intro_thumbnail.jpg" alt="today_no_filter.png" width="90%">
  <br/>
  <br/>
  <a href="https://apps.apple.com/app/id1558358855">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
<p>If you care about how your data is stored, Flat Habits is powered by <a href="https://orgmode.org">org</a> plain text markup without any cloud component. You can use your <a href="https://xenodium.com/frictionless-org-habits-on-ios/">favorite editor</a> (Emacs, Vim, VSCode, etc.) to poke at habit data, if that's your cup of tea.</p>
<h2>What's new?</h2>
<ul>
<li>Quicker toggling, now exposing Done/Skip.
<ul>
<li>Double tap marks Done.</li>
</ul>
</li>
<li>Also display in 12 hour time format.</li>
<li>Overdue habits are now labelled &quot;past&quot; and coloured orange.</li>
<li>Don't dismiss creation dialog if tapping outside.</li>
<li>Set #+STARTUP: nologdrawer in new files.</li>
</ul>
<h2>Are you a fan?</h2>
<p>Is Flat Habits helping you keep up with your habits? Please <a href="https://apps.apple.com/app/id1558358855?action=write-review">rate/review</a> 😊</p>
]]></description>
    <pubDate>Thu, 06 Apr 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A ChatGPT Emacs shell</title>
<link>https://xenodium.com/a-chatgpt-emacs-shell</link>
<guid isPermaLink="false">https://xenodium.com/a-chatgpt-emacs-shell</guid>
    <description><![CDATA[<p>UPDATE: <code>chatgpt-shell</code> <a href="https://xenodium.com/chatgpt-shell-available-on-melpa/">has evolved a bit</a> and is now <a href="https://melpa.org/#/chatgpt-shell">on MELPA</a>.</p>
<p>I had been meaning to give <a href="https://openai.com/blog/chatgpt">ChatGPT</a> a good try, preferably from Emacs. As an <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a> fan, ChatGPT seemed like the perfect fit for a shell interface of sorts. With that in mind, I set out to wire ChatGPT with Emacs's general command interpreter (<a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html">comint</a>).</p>
<p>I had no previous experience building anything comint-related, so I figured I could just take a peek at an existing comint-derived mode to achieve a similar purpose. <code>inferior-emacs-lisp-mode</code> (<a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Lisp-Interaction.html">ielm</a>) seemed to fit the bill just fine, so I borrowed quite a bit to assemble a basic shell experience.</p>
<p>From then on, it was mostly about sending each request over to the ChatGPT API to get a response. For now, I'm relying on <a href="https://curl.se/docs/manpage.html">curl</a> to make each request. The invocation is fairly straightforward:</p>
<pre><code class="language-{.bash">curl &quot;https://api.openai.com/v1/chat/completions&quot; \
     -H &quot;Authorization: Bearer YOUR_OPENAI_KEY&quot; \
     -H &quot;Content-Type: application/json&quot; \
     -d &quot;{
     \&quot;model\&quot;: \&quot;gpt-3.5-turbo\&quot;,
     \&quot;messages\&quot;: [{\&quot;role\&quot;: \&quot;user\&quot;, \&quot;content\&quot;: \&quot;YOUR PROMPT\&quot;}]
     }&quot;
</code></pre>
<p>There are two bits of information needed in each request. The API key, which you must get from <a href="https://openai.com/">OpenAI</a>, and the prompt text itself (i.e. whatever you want ChatGPT to help you with). The results are not too shabby.</p>
<p><img src="https://xenodium.github.io/images/a-chatgpt-emacs-shell/chatgpt.gif" alt=""></p>
<p>I've uploaded the code to GitHub as a tiny <a href="https://github.com/xenodium/chatgpt-shell">chatgpt-shell</a> package. It's a little experimental and rough still, but hey, it does the job for now. Head over to <a href="https://github.com/xenodium/chatgpt-shell">github</a> to take a look. The latest iteration handles multiline prompts (use C-j for newlines) and basic code highlighting.</p>
<p>Let's see where it all goes. Pull requests for improvements totally welcome ;-)</p>
]]></description>
    <pubDate>Tue, 21 Mar 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>`*scratch*` a new minimal org mode scratch area for iOS</title>
<link>https://xenodium.com/scratch-a-minimal-scratch-area</link>
<guid isPermaLink="false">https://xenodium.com/scratch-a-minimal-scratch-area</guid>
    <description><![CDATA[<p>While we already have lots of note-taking apps on iOS, I wanted a minimal <code>*scratch*</code> area (à la Emacs), so I built one.</p>
<br/>
<center>
  <a href="https://apps.apple.com/app/id1671420139">
    <img src="https://xenodium.github.io/images/scratch-a-minimal-scratch-area/icon.png" alt="*scratch* icon" width="150px">
  </a>
</center>
<p>What's the use-case? You're on the go. Someone's telling you directions, or a phone number, name of a restaurant, anything really… you just need to write it down <em>right now, quickly</em>!</p>
<p>No time to create a new contact, a note, a file, or spend time on additional taps, bring up keyboard… You just want to write it somewhere with the least amount of friction.</p>
<p><img src="https://xenodium.github.io/images/scratch-a-minimal-scratch-area/scratch-download_no_audio_x2.6.webp" alt=""></p>
<p>Being an Emacs and org user, I had to sprinkle the app with basic markup support for headings, lists and checkboxes. Also, having a <code>*scratch*</code> &quot;buffer&quot; on my iPhone gives me that warm emacsy fuzzy feeling :)</p>
<p>You can download <code>*scratch*</code> from the <a href="https://apps.apple.com/gb/app/scratch/id1671420139">App Store</a>.</p>
<p>Find it useful? Please help me spread the word. Tell your friends.</p>
<br/>
<br/>
<center>
  <a href="https://apps.apple.com/app/id1671420139">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Sat, 04 Mar 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Chicken Karaage recipe</title>
<link>https://xenodium.com/chicken-karaage-recipe</link>
<guid isPermaLink="false">https://xenodium.com/chicken-karaage-recipe</guid>
    <description><![CDATA[<p>Huge fan of Chicken Karaage, but never really made it at home until recently.</p>
<p><img src="https://xenodium.github.io/images/chicken-karaage-recipe/frying.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/chicken-karaage-recipe/fried.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/chicken-karaage-recipe/dipping.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/chicken-karaage-recipe/sauces.jpg" alt=""></p>
<h2>Dice the chicken</h2>
<ul>
<li>350 grams boneless chicken thighs</li>
</ul>
<p>Dice the chicken up.</p>
<h2>Marinade for 30 mins</h2>
<ul>
<li>1 tablespoon soy sauce (Kikkoman or similar)</li>
<li>1 tablespoon cooking Sake</li>
<li>2 tablespoons of grated ginger (include liquids)</li>
<li>1/2 teaspoon Mirin</li>
</ul>
<p>Mix all ingredients into a ziploc bag. Add the diced chicken and let it marinade for 30 minutes in the fridge.</p>
<h2>Pat dry</h2>
<ul>
<li>Paper towels</li>
</ul>
<p>After marinating, pat the chicken dry with paper towels and set aside.</p>
<h2>Breading</h2>
<ul>
<li>Potato starch</li>
</ul>
<p>Ok, not quite breading since we're using potato starch but same goal. Sprinkle the chicken pieces and make sure they are fully coated with the starch.</p>
<h2>Frying (1st round)</h2>
<ul>
<li>Vegetable oil</li>
<li>Paper towels</li>
</ul>
<p>Heat up (roughly at 160°C) enough oil in a pan to cover the chicken pieces. Cook for about 3 minutes. The pieces don't have to be super golden at this point. There will be another round of frying for that.</p>
<h2>Rest for 4 minutes</h2>
<ul>
<li>Paper towels</li>
</ul>
<p>Let the chicken rest on paper towels for about 4 minutes before frying again.</p>
<h2>Frying (2nd round)</h2>
<ul>
<li>Vegetable oil</li>
<li>Paper towels</li>
</ul>
<p>This time heat up the oil at roughly 200°C. This is a quick in-and-out action to make the chicken crispy. Cook for 30 seconds. Take out and set aside on some paper towels. Let it cool and it's ready to eat.</p>
<h2>Dipping</h2>
<ul>
<li>Kewpie mayo</li>
<li>Sriracha sauce</li>
</ul>
<p>This is totally optional, but I'm a fan of both Kewpie mayo and Sriracha sauce. You can dip your chicken in either or both!</p>
]]></description>
    <pubDate>Sun, 29 Jan 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: org-present in style</title>
<link>https://xenodium.com/emacs-org-present-in-style</link>
<guid isPermaLink="false">https://xenodium.com/emacs-org-present-in-style</guid>
    <description><![CDATA[<p>I had been meaning to check out David Wilson's <a href="https://systemcrafters.cc">System Crafters</a> post detailing <a href="https://systemcrafters.net/emacs-tips/presentations-with-org-present/">his presentations style</a> achieved with the help of <a href="https://github.com/rlister/org-present">org-present</a> and his own customizations. If you're looking for ways to present from Emacs itself, David's post is well worth a look.</p>
<p>org-present's spartan but effective approach resonated with me. David's touches bring the wonderfully stylish icing to the cake. I personally liked his practice of collapsing slide subheadings by default. This lead me to think about slide navigation in general…</p>
<p>There were two things I wanted to achieve:</p>
<ol>
<li>Easily jump between areas of interest. Subheadings, links, and code blocks would be a good start.</li>
<li>Collapse all but the current top-level heading within the slide, as navigation focus changes.</li>
</ol>
<p>A quick search for existing functions led me to <code>org-next-visible-heading</code>, <code>org-next-link</code>, and <code>org-next-block</code>. While these make it easy to jump through jump between headings, links, org block on their own, I wanted to jump to whichever one of these is next (similar a web browser's tab behaviour). In a way, <a href="https://en.wikipedia.org/wiki/DWIM">DWIM</a> style.</p>
<p>I wrapped the existing functions to enable returning positions. This gave me <code>ar/rg-next-visible-heading-pos</code>, <code>ar/rg-next-link-pos</code>, and <code>ar/rg-next-block-pos</code> respectively. Now that I can find out the next location of either of these items, I can subsequently glue the navigation logic in a function like <code>ar/org-present-next-item</code>. To restore balance to the galaxy, I also added <code>ar/org-present-previous-item</code>.</p>
<pre><code class="language-{.commonlisp">(defun ar/org-present-next-item (&amp;optional backward)
  &quot;Present and reveal next item.&quot;
  (interactive &quot;P&quot;)
  ;; Beginning of slide, go to previous slide.
  (if (and backward (eq (point) (point-min)))
      (org-present-prev)
    (let* ((heading-pos (ar/org-next-visible-heading-pos backward))
           (link-pos (ar/org-next-link-pos backward))
           (block-pos (ar/org-next-block-pos backward))
           (closest-pos (when (or heading-pos link-pos block-pos)
                          (apply (if backward #'max #'min)
                                 (seq-filter #'identity
                                             (list heading-pos
                                                   link-pos
                                                   block-pos))))))
      (if closest-pos
          (progn
            (cond ((eq heading-pos closest-pos)
                   (goto-char heading-pos))
                  ((eq link-pos closest-pos)
                   (goto-char link-pos))
                  ((eq block-pos closest-pos)
                   (goto-char block-pos)))
            ;; Reveal relevant content.
            (cond ((&gt; (org-current-level) 1)
                   (ar/org-present-reveal-level2))
                  ((eq (org-current-level) 1)
                   ;; At level 1. Collapse children.
                   (org-overview)
                   (org-show-entry)
                   (org-show-children)
                   (run-hook-with-args 'org-cycle-hook 'children))))
        ;; End of slide, go to next slide.
        (org-present-next)))))

(defun ar/org-present-previous-item ()
  (interactive)
  (ar/org-present-next-item t))

(defun ar/org-next-visible-heading-pos (&amp;optional backward)
  &quot;Similar to `org-next-visible-heading' but for returning position.

Set BACKWARD to search backwards.&quot;
  (save-excursion
    (let ((pos-before (point))
          (pos-after (progn
                       (org-next-visible-heading (if backward -1 1))
                       (point))))
      (when (and pos-after (not (equal pos-before pos-after)))
        pos-after))))

(defun ar/org-next-link-pos (&amp;optional backward)
  &quot;Similar to `org-next-visible-heading' but for returning position.

Set BACKWARD to search backwards.&quot;
  (save-excursion
    (let* ((inhibit-message t)
           (pos-before (point))
           (pos-after (progn
                        (org-next-link backward)
                        (point))))
      (when (and pos-after (or (and backward (&gt; pos-before pos-after))
                               (and (not backward) (&gt; pos-after pos-before))))
        pos-after))))

(defun ar/org-next-block-pos (&amp;optional backward)
  &quot;Similar to `org-next-block' but for returning position.

Set BACKWARD to search backwards.&quot;
  (save-excursion
    (when (and backward (org-babel-where-is-src-block-head))
      (org-babel-goto-src-block-head))
    (let ((pos-before (point))
          (pos-after (ignore-errors
                       (org-next-block 1 backward)
                       (point))))
      (when (and pos-after (not (equal pos-before pos-after)))
        ;; Place point inside block body.
        (goto-char (line-beginning-position 2))
        (point)))))

(defun ar/org-present-reveal-level2 ()
  (interactive)
  (let ((loc (point))
        (level (org-current-level))
        (heading))
    (ignore-errors (org-back-to-heading t))
    (while (or (not level) (&gt; level 2))
      (setq level (org-up-heading-safe)))
    (setq heading (point))
    (goto-char (point-min))
    (org-overview)
    (org-show-entry)
    (org-show-children)
    (run-hook-with-args 'org-cycle-hook 'children)
    (goto-char heading)
    (org-show-subtree)
    (goto-char loc)))
</code></pre>
<p>Beware, this was a minimal effort (with redundant code, duplication, etc) and should likely be considered a proof of concept of sorts, but the results look promising. You can see a demo in action.</p>
<p><img src="https://xenodium.github.io/images/emacs-org-present-in-style/org-navigate_x1.6.webp" alt=""></p>
<p>While this was a fun exercise, I can't help but think there must be a cleaner way of doing it or there are existing packages that already do this for you. If you do know, I'd love to know.</p>
<p>Future versions of this code will likely be updated in <a href="https://github.com/xenodium/dotsies/blob/main/emacs/features/fe-org.el">my Emacs org config</a>.</p>
<h2>Update</h2>
<p>Removed a bunch of duplication and now rely primarily on existing <code>org-next-visible-heading</code>, <code>org-next-link</code>, and <code>org-next-block</code>.</p>
]]></description>
    <pubDate>Tue, 10 Jan 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: insert and render SF symbols</title>
<link>https://xenodium.com/emacs-insert-and-render-sf-symbols</link>
<guid isPermaLink="false">https://xenodium.com/emacs-insert-and-render-sf-symbols</guid>
    <description><![CDATA[<p>About a week ago, I added an Emacs <a href="https://xenodium.com/emacs-macro-me-some-sf-symbols/">function to insert SF symbol names</a>. This is specially useful for SwiftUI. I didn't bother too much with inserting symbols themselves since I hadn't figured out a way to render them for all buffers. That's now changed.</p>
<p>Christian Tietze and Alan Third both have useful posts in this space:</p>
<ul>
<li><a href="http://idiocy.org/emacs-fonts-and-fontsets.html">Emacs, fonts and fontsets</a></li>
<li><a href="https://christiantietze.de/posts/2023/01/use-sf-pro-for-sf-symbols-everywhere-in-emacs/">Use San Francisco Font for SF Symbols Everywhere in Emacs</a></li>
</ul>
<p>I'm currently using the following to render SF symbols in all buffers (macOS only):</p>
<pre><code class="language-{.commonlisp">;; Enable rendering SF symbols on macOS.
(when (memq system-type '(darwin))
  (set-fontset-font t nil &quot;SF Pro Display&quot; nil 'append))
</code></pre>
<p>Now that I can render SF symbols everywhere, I <em>may</em> be more included to use them to spif things up.</p>
<p>I've added <code>sf-symbol-insert</code> to <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/sf.el">sf.el</a>, let's see if usage sticks.</p>
<p><img src="https://xenodium.github.io/images/emacs-insert-and-render-sf-symbols/sf-insert-trimmed_x1.8.webp" alt=""></p>
]]></description>
    <pubDate>Sun, 08 Jan 2023 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Macro me some SF Symbols</title>
<link>https://xenodium.com/emacs-macro-me-some-sf-symbols</link>
<guid isPermaLink="false">https://xenodium.com/emacs-macro-me-some-sf-symbols</guid>
    <description><![CDATA[<p>For inserting SF Symbols in SwiftUI, I typically rely on Apple's <a href="https://developer.apple.com/sf-symbols/">SF Symbols app</a> to browse the symbols's catalog. Once I find a symbol I'm happy with, I copy its name and paste it into my Swift source. This works fairly well.</p>
<p>With Christian Tietze recently posting <a href="https://christiantietze.de/posts/2022/12/sf-symbols-emacs-tab-numbers/">how he rendered SF Symbols in Emacs</a>, I figured there may be a way to shift the above workflow to rely on Emacs completion instead. While I initially went down a rabbit hole to programmatically extract SF symbols (via something like <a href="https://github.com/SFSafeSymbols/SFSafeSymbols">SFSafeSymbols</a>), I took a step back to rethink the strategy.</p>
<p>From the <a href="https://developer.apple.com/sf-symbols/">SF Symbols app</a>, one can select multiple symbols and copy/paste either the symbols themselves or their respective names. The catch is you can only copy disjointed data. That is, you can copy the symbols or their names, but not both in one go. Let's take a look at what the disjointed data looks like. I've pasted both under separate sections in an Emacs buffer.</p>
<p><img src="https://xenodium.github.io/images/emacs-macro-me-some-sf-symbols/disjointed.png" alt=""></p>
<p>If I could rejoin these two sets, I would have a lookup table I could easily invoke from Emacs.</p>
<p>There are roughly 4500 symbols, so copying, pasting, along with text manipulation isn't manually feasible. Lucky for us, an Emacs <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html">keyboard macro</a> is the perfect hammer for this nail. You can see the macro in action below.</p>
<p><img src="https://xenodium.github.io/images/emacs-macro-me-some-sf-symbols/mini-macro_x1.6.webp" alt=""></p>
<p>This looks fairly magical (and it is), but when you break it down into its building blocks, it's nothing more than recording your keystrokes and replaying them. Starting with the cursor at the beginning of <code>square.and.arrow.up</code>, these are the keystrokes we'd need to record:</p>
<p>C-s
:   <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Isearch.html">iseach-forward</a> to search for a character and jump to it</p>
<p>=
:   insert <code>=</code> so we jump to == Symbols ==</p>
<p>&lt;return&gt;
:   runs <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Isearch.html">isearch-exit</a> since we're done jumping.</p>
<p>C-n
:   <code>next-line</code>.</p>
<p>C-a
:   <code>beginning-of-line</code>.</p>
<p>C-SPC
:   <code>set-mark-command</code> to activate the region.</p>
<p>C-f
:   <code>forward-char</code> to select symbol.</p>
<p>C-w
:   <code>kill-ring-save</code> to cut/kill the symbol.</p>
<p>C-u C-&lt;space&gt;
:   <code>set-mark-command</code> (with prefix) to jump back to where we started before searching.</p>
<p>C-y
:   <code>yank</code> to yank/paste the symbol.</p>
<p>C-&lt;space&gt;
:   <code>set-mark-command</code> to activate the region.</p>
<p>C-e
:   <code>end-of-line</code> to select the entire line.</p>
<p>&quot;
:   As a <a href="https://github.com/Fuco1/smartparens">smartparens</a> user, inserting quote with region places quotes around selection.</p>
<p>C-n
:   <code>next-line</code>.</p>
<p>C-a
:   <code>beginning-of-line</code>. We are now at a strategic location where we can replay the above commands.</p>
<p>To start/end recording and executing keyboard macros, use:</p>
<p>C-x (
:   <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Keyboard-Macro.html">kmacro-start-macro</a></p>
<p>C-x )
:   <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Keyboard-Macro.html">kmacro-end-macro</a></p>
<p>C-x e
:   <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Keyboard-Macro.html">kmacro-end-and-call-macro</a> runs your macro. Press <code>e</code> immediately after to execute again.</p>
<p>C-u 0 C-x e
:   <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Keyboard-Macro.html">kmacro-end-and-call-macro</a> (with zero prefix) repeat until there is an error.</p>
<p>Our previous example ran on a handful of SF symbols. Let's bring out the big guns and run on the entire dataset. This time, we'll run the entire flow, including macro creation and executing until there is an error (i.e. process the whole lot).</p>
<p><img src="https://xenodium.github.io/images/emacs-macro-me-some-sf-symbols/sf-symbol-no-mouse-short_x1.4.webp" alt=""></p>
<p>Now that we have our data joined, we can feed it to the humble <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion.html">completing-read</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-macro-me-some-sf-symbols/sf-symbols-insert-name.png" alt=""></p>
<p>It's worth highlighting that to render SF Symbols in Emacs, we must <a href="https://christiantietze.de/posts/2022/12/sf-symbols-emacs-tab-numbers/">propertize our text with one of the macOS SF fonts</a>, for example &quot;SF Pro&quot;.</p>
<p>With all the pieces in place, let's use our new function to insert SF symbol names in a SwiftUI snippet. Since we're using <code>completing-read</code> we can fuzzy search our lookups with our favorite completion frameworks (in my case via <a href="https://github.com/abo-abo/swiper">ivy</a>).</p>
<p><img src="https://xenodium.github.io/images/emacs-macro-me-some-sf-symbols/sf-search_x1.2.webp" alt=""></p>
<p>While this post is macOS-specific, it gives a taste of how powerful Emacs <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html">keyboard macros</a> can be. Be sure to check out <a href="https://emacsrocks.com/e05.html">Emacs Rocks! Episode 05: Macros in style</a> and <a href="https://www.masteringemacs.org/article/keyboard-macros-are-misunderstood">Keyboard Macros are Misunderstood - Mastering Emacs</a>. For those that dabble in elisp, you can appreciate how handy <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion.html">completing-read</a> is with very little code.</p>
<p>The full source to <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/sf.el">sf-symbol-insert-name</a> is available in my <a href="https://github.com/xenodium/dotsies/">Emacs config repo</a>. The function is fairly bare bones and has had fairly little testing. Patches totally welcome.</p>
<h2>Update</h2>
<p>There is some redundancy in the snippet I had forgotten to remove. Either way, latest version at <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/sf.el">sf.el</a>.</p>
]]></description>
    <pubDate>Sat, 31 Dec 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: ffmpeg and macOS aliasing commands</title>
<link>https://xenodium.com/emacs-ffmpeg-and-macos-alias-commands</link>
<guid isPermaLink="false">https://xenodium.com/emacs-ffmpeg-and-macos-alias-commands</guid>
    <description><![CDATA[<p>On a recent mastodon <a href="https://twit.social/@chris_spackman/109531700714365786">post</a>, Chris Spackman mentioned he uses Emacs to save <a href="https://ffmpeg.org/">ffmpeg</a> commands he's figured out for later usage. Emacs is great for this kind of thing. I've tried different approaches over time and eventually landed on <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>, a small package I wrote. Like Chris, I also wanted a way to invoke magical incantations of known shell commands without having to remember all the details.</p>
<p>Chris's post reminded me of a few use-cases I'd been meaning to add DWIM shell commands for.</p>
<h3>ffmpeg</h3>
<ol>
<li>Trimming seconds from videos
<ul>
<li>
<p><code>dwim-shell-commands-video-trim-beginning</code> using:</p>
<pre><code class="language-{.bash">ffmpeg -i '&lt;&lt;f&gt;&gt;' -y -ss &lt;&lt;Seconds:5&gt;&gt; -c:v copy -c:a copy '&lt;&lt;fne&gt;&gt;_trimmed.&lt;&lt;e&gt;&gt;'
</code></pre>
</li>
<li>
<p><code>dwim-shell-commands-video-trim-end</code> using:</p>
<pre><code class="language-{.bash">ffmpeg -sseof -&lt;&lt;Seconds:5&gt;&gt; -i '&lt;&lt;f&gt;&gt;' -y -c:v copy -c:a copy '&lt;&lt;fne&gt;&gt;_trimmed.&lt;&lt;e&gt;&gt;'
</code></pre>
<p>Side-node: The <code>&lt;&lt;Seconds:5&gt;&gt;</code> placeholder is recognized as a query, so Emacs will prompt you for a numeric value.</p>
</li>
</ul>
</li>
<li>Extracting audio from videos
<ul>
<li>
<p><code>dwim-shell-commands-video-to-mp3</code> using:</p>
<pre><code class="language-{.bash">ffmpeg -i '&lt;&lt;f&gt;&gt;' -vn -ab 128k -ar 44100 -y '&lt;&lt;fne&gt;&gt;.mp3'
</code></pre>
</li>
</ul>
</li>
</ol>
<p>With these new dwim shell commands added, I can easily apply them one after the other. No need to remember command details.</p>
<p><img src="https://xenodium.github.io/images/emacs-ffmpeg-and-macos-alias-commands/trim_convert_mp3_x1.4.webp" alt=""></p>
<h3>macOS aliases</h3>
<p>After rebuilding Emacs via the wonderful <a href="https://github.com/d12frosted/homebrew-emacs-plus">emacs-plus</a>, I recently broke my existing <code>/Applications/Emacs.app</code> alias. No biggie, one can easily add a <a href="https://support.apple.com/en-gb/guide/mac-help/mchlp1046/mac">new one alias from macOS Finder</a>, but I've been wanting to do it from Emacs. Turns out there's a bit of AppleScript we can turn into a more memorale command like <code>dwim-shell-commands-macos-make-finder-alias</code>:</p>
<pre><code class="language-{.bash">osascript -e 'tell application \&quot;Finder\&quot; to make alias file to POSIX file \&quot;&lt;&lt;f&gt;&gt;\&quot; at POSIX file \&quot;%s\&quot;'
</code></pre>
<p>It's highly unlikely I'll remember the AppleScript snippet (are there better ways?), but I'll easily find and invoke my new command with fuzzy searching:</p>
<p><img src="https://xenodium.github.io/images/emacs-ffmpeg-and-macos-alias-commands/make-emacs-alias_x1.4.webp" alt=""></p>
<h3>Included in dwim-shell-command</h3>
<p>All of these are now included in <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>, which you can optionally load after installing <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> from <a href="https://melpa.org/#/dwim-shell-command">MELPA</a>.</p>
]]></description>
    <pubDate>Sun, 18 Dec 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Context-aware yasnippets</title>
<link>https://xenodium.com/emacs-generate-a-swift-initializer</link>
<guid isPermaLink="false">https://xenodium.com/emacs-generate-a-swift-initializer</guid>
    <description><![CDATA[<p>Back in 2020, I wrote a semi-automatic <a href="https://github.com/joaotavora/yasnippet">yasnippet</a> to <a href="https://xenodium.com/smarter-snippets/">generate Swift initializers</a>. I say semi-automatic because it could have been a little smarter. While it helped generate some of the code, what I really wanted was full context-aware generation. The Swift struct already had a few properties defined, so a smarter yasnippet should have been able to use this info for code generation.</p>
<p><img src="https://xenodium.github.io/images/smarter-snippets/snippet.gif" alt=""></p>
<p>With an extra push, we could have written a smarter yasnippet, but it may require a fair bit of parsing logic. Fast forward to today, and bringing context-awareness seems like the right match for <a href="https://tree-sitter.github.io/tree-sitter/">Tree-sitter</a>. While Tree-sitter can enable faster and more reliable syntax-highlighting in our beloved text editor, it can also power smarter tools. It does so by exposing a semantic snapshot of our source code using a syntax tree.</p>
<p>Let's see how we can use Tree-sitter to realise our original yasnippet vision. We'll start with the same struct snippet we used back in 2020. The goal is to generate an initializer using the existing definitions.</p>
<pre><code class="language-swift">struct Coordinate {
  public let x: Int
  public let y: Int
  public let z: Int
}
</code></pre>
<p>While Emacs will <a href="https://lists.gnu.org/archive/html/emacs-devel/2022-11/msg01443.html">will soon ship its own Tree-sitter integration</a>, I've opted to try out the <a href="https://github.com/emacs-tree-sitter/elisp-tree-sitter">emacs-tree-sitter</a> package as Swift support is currently included in <a href="https://github.com/emacs-tree-sitter/tree-sitter-langs">tree-sitter-langs</a>.</p>
<p>I have much to learn much about Tree-sitter syntax trees, but the package ships with a handy tool to dump the tree via <code>tree-sitter-debug-mode</code>.</p>
<p><img src="https://xenodium.github.io/images/emacs-generate-a-swift-initializer/syntax-tree.png" alt=""></p>
<p>With a syntax tree in mind, one can craft a query to semantically extract parts of the code. In our case, we want property names and types. I've yet to get acquainted with Tree-sitter's <a href="https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax">query syntax</a>, but the package also ships with another handy tool that helps view query results via <code>tree-sitter-query-builder</code>.</p>
<p><img src="https://xenodium.github.io/images/emacs-generate-a-swift-initializer/query-builder.png" alt=""></p>
<p>The following query extracts all the <code>let properties</code> in file. You can see the builder in action above, highlighting our query results.</p>
<pre><code>(struct_declaration (constant_declaration (identifier) @name (type) @value))
</code></pre>
<p>If we want to be more thorough, we should likely cater for classes, vars, int/string literals, etc. so the query needs to be extended as follows. I'm sure it can be written differently, but for now, it does the job.</p>
<pre><code>(struct_declaration (variable_declaration (identifier) @name (type) @type))
(struct_declaration (variable_declaration (identifier) @name (string) @value))
(struct_declaration (variable_declaration (identifier) @name (number) @value))
(struct_declaration (constant_declaration (identifier) @name (type) @value))
(struct_declaration (constant_declaration (identifier) @name (string) @value))
(struct_declaration (constant_declaration (identifier) @name (number) @value))
(class_declaration (variable_declaration (identifier) @name (type) @type))
(class_declaration (variable_declaration (identifier) @name (string) @value))
(class_declaration (variable_declaration (identifier) @name (number) @value))
(class_declaration (constant_declaration (identifier) @name (type) @type))
(class_declaration (constant_declaration (identifier) @name (string) @value))
(class_declaration (constant_declaration (identifier) @name (number) @value))
</code></pre>
<p>Now that we got our Tree-sitter query sorted, let's write a little elisp to extract the info we need from the generated tree. We'll write a <code>swift-class-or-struct-vars-at-point</code> function to extract the struct (or class) at point and subsequently filter its property names/types using our query. To simplify the result, we'll return a list of alists.</p>
<pre><code class="language-{.commonlisp">(defun swift-class-or-struct-vars-at-point ()
  &quot;Return a list of class or struct vars in the form '(((name . \&quot;foo\&quot;) (type . \&quot;Foo\&quot;))).&quot;
  (cl-assert (seq-contains local-minor-modes 'tree-sitter-mode) &quot;tree-sitter-mode not enabled&quot;)
  (let* ((node (or (tree-sitter-node-at-point 'struct_declaration)
                   (tree-sitter-node-at-point 'class_declaration)))
         (vars)
         (var))
    (unless node
      (error &quot;Neither in class nor struct&quot;))
    (mapc
     (lambda (item)
       (cond ((eq 'identifier
                  (tsc-node-type (cdr item)))
              (when var
                (setq vars (append vars (list var))))
              (setq var (list (cons 'name (tsc-node-text
                                           (cdr item))))))
             ((eq 'type
                  (tsc-node-type (cdr item)))
              (setq var (map-insert var 'type (tsc-node-text
                                               (cdr item)))))
             ((eq 'string
                  (tsc-node-type (cdr item)))
              (setq var (map-insert var 'type &quot;String&quot;)))
             ((eq 'number
                  (tsc-node-type (cdr item)))
              (setq var (map-insert var 'type &quot;Int&quot;)))
             (t (message &quot;%s&quot; (tsc-node-type (cdr item))))))
     (tsc-query-captures
      (tsc-make-query tree-sitter-language
                      &quot;(struct_declaration (variable_declaration (identifier) @name (type) @type))
                       (struct_declaration (variable_declaration (identifier) @name (string) @value))
                       (struct_declaration (variable_declaration (identifier) @name (number) @value))
                       (struct_declaration (constant_declaration (identifier) @name (type) @value))
                       (struct_declaration (constant_declaration (identifier) @name (string) @value))
                       (struct_declaration (constant_declaration (identifier) @name (number) @value))
                       (class_declaration (variable_declaration (identifier) @name (type) @type))
                       (class_declaration (variable_declaration (identifier) @name (string) @value))
                       (class_declaration (variable_declaration (identifier) @name (number) @value))
                       (class_declaration (constant_declaration (identifier) @name (type) @type))
                       (class_declaration (constant_declaration (identifier) @name (string) @value))
                       (class_declaration (constant_declaration (identifier) @name (number) @value))&quot;)
      node nil))
    (when var
      (setq vars (append vars (list var))))
    vars))
</code></pre>
<p>Finally, we write a function to generate a Swift initializer from our property list.</p>
<pre><code class="language-{.commonlisp">(defun swift-class-or-struct-initializer-text (vars)
  &quot;Generate a Swift initializer from property VARS.&quot;
  (cl-assert (seq-contains local-minor-modes 'tree-sitter-mode) &quot;tree-sitter-mode not enabled&quot;)
  (format
   (string-trim
    &quot;
init(%s) {
  %s
}&quot;)
   (seq-reduce (lambda (reduced var)
                 (format &quot;%s%s%s: %s&quot;
                         reduced
                         (if (string-empty-p reduced)
                             &quot;&quot; &quot;, &quot;)
                         (map-elt var 'name)
                         (map-elt var 'type)))
               vars &quot;&quot;)
   (string-join
    (mapcar (lambda (var)
              (format &quot;self.%s = %s&quot;
                      (map-elt var 'name)
                      (map-elt var 'name)))
            vars)
    &quot;\n  &quot;)))
</code></pre>
<p>We're so close now. All we need is a simple way invoke our code generator. We can use yasnippet for that, making <code>init</code> our expandable keyword.</p>
<pre><code># -*- mode: snippet -*-
# name: init all
# key: init
# --
`(swift-class-or-struct-initializer-text (swift-class-or-struct-vars-at-point))`
</code></pre>
<p>And with all that, we've got our yasnippet vision accomplished!</p>
<p><img src="https://xenodium.github.io/images/emacs-generate-a-swift-initializer/init-sitter_x2.webp" alt=""></p>
<p>Be sure to check out this year's relevant <a href="https://emacsconf.org/">EmacsConf</a> talk: <a href="https://emacsconf.org/2022/talks/treesitter/">Tree-sitter beyond syntax highlighting</a>.</p>
<p>All code is now pushed to my <a href="https://github.com/xenodium/dotsies/commit/9a44606935e8d57d7b3bde2d8d051defbf254a9e">config repo</a>. By the way, I'm not super knowledgable of neither yasnippet nor Tree-sitter. Improvements are totally welcome. Please reach out on the <a href="https://indieweb.social/@xenodium">Fediverse</a> if you have suggestions!</p>
<h2>Update</h2>
<p><a href="https://gitlab.com/woolsweater">Josh Caswell</a> kindly pointed out a couple of interesting items:</p>
<ol>
<li>tree-sitter-langs's <a href="https://www.reddit.com/r/emacs/comments/zkb7aq/comment/izzjx3l/">Swift grammar is fairly outdated/incomplete</a>.</li>
<li>There are more up-to-date Swift grammar implementations currently available:
<ul>
<li><a href="https://gitlab.com/woolsweater/tree-sitter-swifter">tree-sitter-swifter</a> (by Josh Caswell himself)</li>
<li><a href="https://github.com/alex-pinkus/tree-sitter-swift">tree-sitter-swift</a> (by <a href="https://twitter.com/alexpinkus">Alex Pinkus</a>)</li>
</ul>
</li>
</ol>
]]></description>
    <pubDate>Mon, 12 Dec 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: quickly killing processes</title>
<link>https://xenodium.com/emacs-quick-kill-process</link>
<guid isPermaLink="false">https://xenodium.com/emacs-quick-kill-process</guid>
    <description><![CDATA[<p>Every so often, I need to kill the odd unresponsive process. While I really like <code>proced</code> (check out Mickey Petersen's <a href="https://www.masteringemacs.org/article/displaying-interacting-processes-proced">article</a>), I somehow find myself using macOS's <a href="https://support.apple.com/en-bw/guide/activity-monitor/actmaea30277/mac">Activity Monitor</a> to this purpose. Kinda odd, considering I prefer to do these kinds of things from Emacs.</p>
<p>What I'd really like is a way to quickly fuzzy search a list of active processes and choose the unresponsive culprid, using my preferred completion frontend (in my case <a href="https://github.com/abo-abo/swiper">ivy</a>).</p>
<p><img src="https://xenodium.github.io/images/emacs-quick-kill-process/kill_x1.8.webp" alt=""></p>
<p>The function below gives us a fuzzy-searchable process utility. While we could use <code>ivy-read</code> directly in our implementation, we're better of using <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion.html">completing-read</a> to remain compatible with other completion frameworks. I'm a big fan of the humble <code>completing-read</code>. You feed it a list of candidates and it prompts users to pick one.</p>
<p>To build our process list, we can lean on <code>proced</code>'s own source: <code>proced-process-attributes</code>. We transform its output to an <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Association-Lists.html">alist</a>, formatting the visible keys to contain the process id, owner, command name, and the command line which invoked the process. Once a process is chosen, we can send a kill signal using <s>signal-process</s> <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> and our <em>job is done</em>.</p>
<pre><code class="language-{.commonlisp">(require 'dwim-shell-command)
(require 'map)
(require 'proced)
(require 'seq)

(defun dwim-shell-commands-kill-process ()
  &quot;Select and kill process.&quot;
  (interactive)
  (let* ((pid-width 5)
         (comm-width 25)
         (user-width 10)
         (processes (proced-process-attributes))
         (candidates
          (mapcar (lambda (attributes)
                    (let* ((process (cdr attributes))
                           (pid (format (format &quot;%%%ds&quot; pid-width) (map-elt process 'pid)))
                           (user (format (format &quot;%%-%ds&quot; user-width)
                                         (truncate-string-to-width
                                          (map-elt process 'user) user-width nil nil t)))
                           (comm (format (format &quot;%%-%ds&quot; comm-width)
                                         (truncate-string-to-width
                                          (map-elt process 'comm) comm-width nil nil t)))
                           (args-width (- (window-width) (+ pid-width user-width comm-width 3)))
                           (args (map-elt process 'args)))
                      (cons (if args
                                (format &quot;%s %s %s %s&quot; pid user comm (truncate-string-to-width args args-width nil nil t))
                              (format &quot;%s %s %s&quot; pid user comm))
                            process)))
                  processes))
         (selection (map-elt candidates
                             (completing-read &quot;kill process: &quot;
                                              (seq-sort
                                               (lambda (p1 p2)
                                                 (string-lessp (nth 2 (split-string (string-trim (car p1))))
                                                               (nth 2 (split-string (string-trim (car p2))))))
                                               candidates) nil t)))
         (prompt-title (format &quot;%s %s %s&quot;
                               (map-elt selection 'pid)
                               (map-elt selection 'user)
                               (map-elt selection 'comm))))
    (when (y-or-n-p (format &quot;Kill? %s&quot; prompt-title))
      (dwim-shell-command-on-marked-files
       (format &quot;Kill %s&quot; prompt-title)
       (format &quot;kill -9 %d&quot; (map-elt selection 'pid))
       :utils &quot;kill&quot;
       :error-autofocus t
       :silent-success t))))
</code></pre>
<p>I've pushed <code>dwim-shell-commands-kill-process</code> to my <s><a href="https://github.com/xenodium/dotsies/">config</a></s> <a href="https://github.com/xenodium/dwim-shell-command/commit/b98f45c7901446cf1ab60be2ab648c623e774427">dwim-shell-commands.el</a>. Got suggestions? Alternatives? Lemme know.</p>
<h2>Update</h2>
<p>I've moved <code>dwim-shell-commands-kill-process</code> from my Emacs <a href="https://github.com/xenodium/dotsies">config</a> to <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>. A few advantages:</p>
<ul>
<li>Killing processes is now async.</li>
<li>Should anything go wrong, an error message is now accessible.</li>
<li>You can easily install via <a href="https://melpa.org/#/dwim-shell-command">MELPA</a>.</li>
</ul>
<p>If you prefer the previous version (without a dependency on <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>), have a look at the <a href="https://github.com/xenodium/dotsies/commit/eac4f892eab7a80740ee8ce0c727381886442fb6">initial commit</a>.</p>
]]></description>
    <pubDate>Sun, 13 Nov 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hey Emacs, change the default macOS app for…</title>
<link>https://xenodium.com/hey-emacs-change-the-default-macos-app-for</link>
<guid isPermaLink="false">https://xenodium.com/hey-emacs-change-the-default-macos-app-for</guid>
    <description><![CDATA[<p>A few weeks ago, I <a href="https://xenodium.com/emacs-open-with-macos-app/">added an &quot;open with&quot;</a> command to <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>. It's pretty handy for opening files using an external app (ie. not Emacs) other than the default macOS one.</p>
<p><code>dwim-shell-commands-macos-open-with</code> and <code>dwim-shell-commands-open-externally</code> are typically enough for me to handle opening files outside of Emacs. But every now and then I'd like to change the default macOS app associated with specific file types. Now this isn't particularly challenging in macOS, but it does require a little navigating to get to the right place to change this default setting.</p>
<p>Back in March 2020, I <a href="https://twitter.com/xenodium/status/1242879439932923909">tweeted</a> about <a href="https://github.com/moretension/duti">duti</a>: a command-line utility capable of setting default applications for various document types on macOS. While I liked the ability to change default apps from the command-line, the habit never quite stuck.</p>
<p>Fast forward to 2022. I've been revisiting lots of my command-line usages (specially those that never stuck) and making them more accessible from Emacs via <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>. I seldom change default apps on macOS, so my brain forgets about <code>duti</code> itself, let alone its arguments, order, etc. But with a dwim shell command like <code>dwim-shell-commands-macos-set-default-app</code>, I can easily invoke the command via <a href="https://github.com/abo-abo/swiper">swiper</a>'s <code>counsel-M-x</code> fuzzy terms: <em>&quot;dwim set&quot;</em>.</p>
<p><img src="https://xenodium.github.io/images/hey-emacs-change-the-default-macos-app-for/set-default_x1.3.webp" alt=""></p>
<p>As an added bonus, I get to reuse <code>dwim-shell-commands--macos-apps</code> from &quot;open with&quot; to quickly pick the new default app, making the whole experience pretty snappy.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-macos-set-default-app ()
  &quot;Set default app for file(s).&quot;
  (interactive)
  (let* ((apps (dwim-shell-commands-macos-apps))
         (selection (progn
                      (cl-assert apps nil &quot;No apps found&quot;)
                      (completing-read &quot;Set default app: &quot; apps nil t))))
    (dwim-shell-command-on-marked-files
     &quot;Set default app&quot;
     (format &quot;duti -s \&quot;%s\&quot; '&lt;&lt;e&gt;&gt;' all&quot;
             (string-trim
              (shell-command-to-string (format &quot;defaults read '%s/Contents/Info.plist' CFBundleIdentifier&quot;
                                               (map-elt apps selection)))))
     :silent-success t
     :no-progress t
     :utils &quot;duti&quot;)))

(defun dwim-shell-commands--macos-apps ()
  &quot;Return alist of macOS apps (\&quot;Emacs\&quot; . \&quot;/Applications/Emacs.app\&quot;).&quot;
  (mapcar (lambda (path)
            (cons (file-name-base path) path))
          (seq-sort
           #'string-lessp
           (seq-mapcat (lambda (paths)
                         (directory-files-recursively
                          paths &quot;\\.app$&quot; t (lambda (path)
                                             (not (string-suffix-p &quot;.app&quot; path)))))
                       '(&quot;/Applications&quot; &quot;~/Applications&quot; &quot;/System/Applications&quot;)))))
</code></pre>
<p>As usual, I've added <code>dwim-shell-commands-macos-set-default-app</code> to <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>, which you can install via <a href="https://melpa.org/#/dwim-shell-command">MELPA</a>.</p>
<p>Did you find this tiny integration useful? Check out <a href="https://xenodium.com/hey-emacs-where-did-i-take-that-photo/">Hey Emacs, where did I take that photo?</a></p>
]]></description>
    <pubDate>Sun, 06 Nov 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hey Emacs, where did I take that photo?</title>
<link>https://xenodium.com/hey-emacs-where-did-i-take-that-photo</link>
<guid isPermaLink="false">https://xenodium.com/hey-emacs-where-did-i-take-that-photo</guid>
    <description><![CDATA[<p>I was recently browsing through an old archive of holiday photos (from <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> of course). I wanted to know where the photo was taken, which got me interested in extracting <a href="https://en.wikipedia.org/wiki/Exif">Exif</a> metadata.</p>
<p>Luckily the <a href="https://exiftool.org/">exiftool</a> command line utility does the heavy lifting when it comes to extracting metadata. Since I want it quickly accessible from Emacs (in either dired or current buffer), a tiny elisp snippet would give me just that (via <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>).</p>
<p><img src="https://xenodium.github.io/images/hey-emacs-where-did-i-take-that-photo/dwim-exif_x1.3.webp" alt=""></p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-image-exif-metadata ()
  &quot;View EXIF metadata in image(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;View EXIF&quot;
   &quot;exiftool '&lt;&lt;f&gt;&gt;'&quot;
   :utils &quot;exiftool&quot;))
</code></pre>
<p>The above makes all Exif metadata easily accessible, including the photo's GPS coordinates. But I haven’t quite answered the original question. Where did I take the photo? I now know the coordinates, but I can’t realistically deduce neither the country nor city unless I <em>manually</em> feed these values to a reverse geocoding service like <a href="https://www.openstreetmap.org/">OpenStreetMap</a>. <em>Manually</em> you say? This is Emacs, so we can throw more elisp glue at the problem, mixed in with a little shell script, and presto! We've now automated the process of extracting metadata, reverse geocoding, and displaying the photo's address in the minibuffer. Pretty nifty.</p>
<p><img src="https://xenodium.github.io/images/hey-emacs-where-did-i-take-that-photo/minibuffer-address_x1.3.webp" alt=""></p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-image-reverse-geocode-location ()
  &quot;Reverse geocode image(s) location.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Reverse geocode&quot;
   &quot;lat=\&quot;$(exiftool -csv -n -gpslatitude -gpslongitude '&lt;&lt;f&gt;&gt;' | tail -n 1 | cut -s -d',' -f2-2)\&quot;
    if [ -z \&quot;$lat\&quot; ]; then
      echo \&quot;no latitude\&quot;
      exit 1
    fi
    lon=\&quot;$(exiftool -csv -n -gpslatitude -gpslongitude '&lt;&lt;f&gt;&gt;' | tail -n 1 | cut -s -d',' -f3-3)\&quot;
    if [ -z \&quot;$lon\&quot; ]; then
      echo \&quot;no longitude\&quot;
      exit 1
    fi
    json=$(curl \&quot;https://nominatim.openstreetmap.org/reverse?format=json&amp;accept-language=en&amp;lat=${lat}&amp;lon=${lon}&amp;zoom=18&amp;addressdetails=1\&quot;)
    echo \&quot;json_start $json json_end\&quot;&quot;
   :utils '(&quot;exiftool&quot; &quot;curl&quot;)
   :silent-success t
   :error-autofocus t
   :on-completion
   (lambda (buffer)
     (with-current-buffer buffer
       (goto-char (point-min))
       (let ((matches '()))
         (while (re-search-forward &quot;^json_start\\(.*?\\)json_end&quot; nil t)
           (push (match-string 1) matches))
         (message &quot;%s&quot; (string-join (seq-map (lambda (json)
                                               (map-elt (json-parse-string json :object-type 'alist) 'display_name))
                                             matches)
                                    &quot;\n&quot;)))
       (kill-buffer buffer)))))
</code></pre>
<p>Displaying the photo's address in the minibuffer is indeed pretty nifty, but what if I’d like to drop a pin in a map for further exploration? This is actually simpler, as there's no need for reverse geocoding. Following a similar recipe, we merely construct an <a href="https://www.openstreetmap.org/">OpenStreetMap</a> URL and open it in our favourite browser.</p>
<p><img src="https://xenodium.github.io/images/hey-emacs-where-did-i-take-that-photo/photo-map_x1.4.webp" alt=""></p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-image-browse-location ()
  &quot;Open image(s) location in browser.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Browse location&quot;
   &quot;lat=\&quot;$(exiftool -csv -n -gpslatitude -gpslongitude '&lt;&lt;f&gt;&gt;' | tail -n 1 | cut -s -d',' -f2-2)\&quot;
    if [ -z \&quot;$lat\&quot; ]; then
      echo \&quot;no latitude\&quot;
      exit 1
    fi
    lon=\&quot;$(exiftool -csv -n -gpslatitude -gpslongitude '&lt;&lt;f&gt;&gt;' | tail -n 1 | cut -s -d',' -f3-3)\&quot;
    if [ -z \&quot;$lon\&quot; ]; then
      echo \&quot;no longitude\&quot;
      exit 1
    fi
    if [[ $OSTYPE == darwin* ]]; then
      open \&quot;http://www.openstreetmap.org/?mlat=${lat}&amp;mlon=${lon}&amp;layers=C\&quot;
    else
      xdg-open \&quot;http://www.openstreetmap.org/?mlat=${lat}&amp;mlon=${lon}&amp;layers=C\&quot;
    fi&quot;
   :utils &quot;exiftool&quot;
   :error-autofocus t
   :silent-success t))
</code></pre>
<p>Got suggestions? Improvements? All three functions are now included in <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a> as part of <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>. Pull requests totally welcome ;)</p>
]]></description>
    <pubDate>Wed, 02 Nov 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: A welcoming experiment</title>
<link>https://xenodium.com/emacs-a-welcoming-experiment</link>
<guid isPermaLink="false">https://xenodium.com/emacs-a-welcoming-experiment</guid>
    <description><![CDATA[<p>The <code>*scratch*</code> buffer is the first thing I see when I launch an Emacs session. Coupled with <a href="https://github.com/Fanael/persistent-scratch">persistent-scratch</a>, it's served me well over the years. I gotta say though, my scratch buffer accumulates random bits and often becomes a little messy. It's not the most visually appealing landing buffer when launching Emacs. But who cares, I'm only a <code>C-x b</code> binding away from invoking <code>ivy-switch-buffer</code> to get me wherever I need to be. It's powered by <code>ivy-use-virtual-buffers</code>, which remembers recent files across sessions.</p>
<p>Having said all of this, I recently ran into u/pearcidar43's <a href="https://www.reddit.com/r/unixporn/comments/yamj5f/exwm_emacs_is_kinda_comfy_as_a_wm/">post</a> showcasing a wonderful Emacs banner. Lucky for us, they <a href="https://www.reddit.com/r/unixporn/comments/yamj5f/comment/itfusm0/?utm_source=share&amp;utm_medium=web2x&amp;context=3">shared</a> the <a href="https://github.com/TanbinIslam43/mydotfiles/blob/main/.doom.d/emacs.png">image</a>, so I got curious about building a minimal welcome buffer of sorts. Nothing fancy, the only requirements being to load quickly and enable me to get on with my <code>C-x b</code> ritual. Throw in a little bonus to exit quickly by pressing just <code>q</code> if I so desire.</p>
<p><img src="https://xenodium.github.io/images/emacs-a-welcoming-experiment/welcome-minimal_x0.5.webp" alt=""></p>
<p>I didn't know a whole lot on how to go about it, so I took a peek at <a href="https://github.com/emacs-dashboard/emacs-dashboard">emacs-dashboard</a> for inspiration. Turns out, I needed little code to get the desired effect in my <code>early-init.el</code>:</p>
<pre><code class="language-{.commonlisp">(defun ar/show-welcome-buffer ()
  &quot;Show *Welcome* buffer.&quot;
  (with-current-buffer (get-buffer-create &quot;*Welcome*&quot;)
    (setq truncate-lines t)
    (let* ((buffer-read-only)
           (image-path &quot;~/.emacs.d/emacs.png&quot;)
           (image (create-image image-path))
           (size (image-size image))
           (height (cdr size))
           (width (car size))
           (top-margin (floor (/ (- (window-height) height) 2)))
           (left-margin (floor (/ (- (window-width) width) 2)))
           (prompt-title &quot;Welcome to Emacs!&quot;))
      (erase-buffer)
      (setq mode-line-format nil)
      (goto-char (point-min))
      (insert (make-string top-margin ?\n ))
      (insert (make-string left-margin ?\ ))
      (insert-image image)
      (insert &quot;\n\n\n&quot;)
      (insert (make-string (floor (/ (- (window-width) (string-width prompt-title)) 2)) ?\ ))
      (insert prompt-title))
    (setq cursor-type nil)
    (read-only-mode +1)
    (switch-to-buffer (current-buffer))
    (local-set-key (kbd &quot;q&quot;) 'kill-this-buffer)))

(setq initial-scratch-message nil)
(setq inhibit-startup-screen t)

(when (&lt; (length command-line-args) 2)
  (add-hook 'emacs-startup-hook (lambda ()
                                  (when (display-graphic-p)
                                    (ar/show-welcome-buffer)))))
</code></pre>
<p>This being Emacs, I can bend it as far as needed. In my case, I didn't need much, so I can probably stop here. It was a fun experiment. I'll even <a href="https://github.com/xenodium/dotsies/commit/90c689def913a9bccdd408ef609c7f99a5cce1fb">try using it</a> for a little while and see if it sticks. I'm sure there's plenty more that could be handled (edge cases, resizes, etc.), but if you want something more established, consider something like <a href="https://github.com/emacs-dashboard/emacs-dashboard">emacs-dashboard</a> instead. I haven't used it myself, but is <a href="https://melpa.org/#/dashboard">pretty popular</a>.</p>
]]></description>
    <pubDate>Mon, 24 Oct 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Open with macOS app</title>
<link>https://xenodium.com/emacs-open-with-macos-app</link>
<guid isPermaLink="false">https://xenodium.com/emacs-open-with-macos-app</guid>
    <description><![CDATA[<p>On a recent Reddit <a href="https://www.reddit.com/r/emacs/comments/y2dfma/comment/is4ygl8/?utm_source=share&amp;utm_medium=web2x&amp;context=3">comment</a>, tdstoff7 asked if I had considered writing an &quot;Open with&quot; DWIM shell command for those times one would like to open a file externally using an app other than the default. I hadn't, but nice idea.</p>
<p>Take images as an example. Though Emacs can display them quickly, I also open images externally using the default app (<a href="https://en.wikipedia.org/wiki/Preview_(macOS)">Preview</a> in my case). But then there are those times when I'd like to open with a different app for editing (maybe something like GIMP). It'd be nice to quickly choose which app to open with.</p>
<p><img src="https://xenodium.github.io/images/emacs-open-with-macos-app/open-with_x2.webp" alt=""></p>
<p>There isn't much to the code. Get a list of apps, ask user to pick one (via <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Programmed-Completion.html">completing-read</a>), and launch the external app via <code>dwim-shell-command-on-marked-files</code>.</p>
<p>There's likely a better way of getting a list of available apps (happy to take suggestions), but searching in &quot;/Applications&quot; &quot;~/Applications&quot; and &quot;/System/Applications&quot; does the job for now.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-macos-open-with ()
  &quot;Convert all marked images to jpg(s).&quot;
  (interactive)
  (let* ((apps (seq-sort
                #'string-lessp
                (seq-mapcat (lambda (paths)
                              (directory-files-recursively
                               paths &quot;\\.app$&quot; t (lambda (path)
                                                  (not (string-suffix-p &quot;.app&quot; path)))))
                            '(&quot;/Applications&quot; &quot;~/Applications&quot; &quot;/System/Applications&quot;))))
         (selection (progn
                      (cl-assert apps nil &quot;No apps found&quot;)
                      (completing-read &quot;Open with: &quot;
                                       (mapcar (lambda (path)
                                                 (propertize (file-name-base path) 'path path))
                                               apps)))))
    (dwim-shell-command-on-marked-files
     &quot;Open with&quot;
     (format &quot;open -a '%s' '&lt;&lt;*&gt;&gt;'&quot; (get-text-property 0 'path selection))
     :silent-success t
     :no-progress t
     :utils &quot;open&quot;)))
</code></pre>
<p><code>dwim-shell-commands-macos-open-with</code> is now included in <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>, available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>. What other uses can you find for it?</p>
]]></description>
    <pubDate>Fri, 14 Oct 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Improving on Emacs macOS sharing</title>
<link>https://xenodium.com/emacs-macos-sharing-dwim-style-improved</link>
<guid isPermaLink="false">https://xenodium.com/emacs-macos-sharing-dwim-style-improved</guid>
    <description><![CDATA[<p>A quick follow-up to <a href="https://xenodium.com/emacs-macos-share-from-dired-dwim-style/">Emacs: macOS sharing (DWIM style)</a>… Though functional, the implementation had a couple of drawbacks.</p>
<p>Tohiko <a href="https://www.reddit.com/r/emacs/comments/y1tneh/comment/is0pgkf">noticed fullscreen wasn't working at all</a> while Calvin <a href="https://lobste.rs/s/qga1px/emacs_macos_sharing_dwim_style#c_safiuw">proposed enumeration for tighter Emacs integration</a>.</p>
<p>Calvin's suggestion enables using <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion.html">completing-read</a> to pick the sharing service. This makes the integration feel more at home. As a bonus, it also enables sharing from fullscreen Emacs.</p>
<p>As an <a href="https://github.com/abo-abo/swiper">ivy</a> user, you can see a vertical list of sharing services.</p>
<p><img src="https://xenodium.github.io/images/emacs-macos-sharing-dwim-style-improved/share-completing_x1.4.webp" alt=""></p>
<p>Here's the new snippet, now <a href="https://github.com/xenodium/dwim-shell-command/commit/20e782b4bf1ea01fecfce3cc8ac4c5a74518cd80">pushed to dwim-shell-commands.el</a>:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands--macos-sharing-services ()
  &quot;Return a list of sharing services.&quot;
  (let* ((source (format &quot;import AppKit
                         NSSharingService.sharingServices(forItems: [
                           %s
                         ]).forEach {
                           print(\&quot;\\($0.prompt-title)\&quot;)
                         }&quot;
                         (string-join (mapcar (lambda (file)
                                                (format &quot;URL(fileURLWithPath: \&quot;%s\&quot;)&quot; file))
                                              (dwim-shell-command--files))
                                      &quot;, &quot;)))
         (services (split-string (string-trim (shell-command-to-string (format &quot;echo '%s' | swift -&quot; source)))
                                 &quot;\n&quot;)))
    (when (seq-empty-p services)
      (error &quot;No sharing services available&quot;))
    services))

(defun dwim-shell-commands-macos-share ()
  &quot;Share selected files from macOS.&quot;
  (interactive)
  (let* ((services (dwim-shell-commands--macos-sharing-services))
         (service-name (completing-read &quot;Share via: &quot; services))
         (selection (seq-position services service-name #'string-equal)))
    (dwim-shell-command-on-marked-files
     &quot;Share&quot;
     (format
      &quot;import AppKit

       _ = NSApplication.shared

       NSApp.setActivationPolicy(.regular)

       class MyWindow: NSWindow, NSSharingServiceDelegate {
         func sharingService(
           _ sharingService: NSSharingService,
           didShareItems items: [Any]
         ) {
           NSApplication.shared.terminate(nil)
         }

         func sharingService(
           _ sharingService: NSSharingService, didFailToShareItems items: [Any], error: Error
         ) {
           let error = error as NSError
           if error.domain == NSCocoaErrorDomain &amp;&amp; error.code == NSUserCancelledError {
             NSApplication.shared.terminate(nil)
           }
           exit(1)
         }
       }

       let window = MyWindow(
         contentRect: NSRect(x: 0, y: 0, width: 0, height: 0),
         styleMask: [],
         backing: .buffered,
         defer: false)

       let services = NSSharingService.sharingServices(forItems: [\&quot;&lt;&lt;*&gt;&gt;\&quot;].map{URL(fileURLWithPath:$0)})
       let service = services[%s]
       service.delegate = window
       service.perform(withItems: [\&quot;&lt;&lt;*&gt;&gt;\&quot;].map{URL(fileURLWithPath:$0)})

       NSApp.run()&quot; selection)
     :silent-success t
     :shell-pipe &quot;swift -&quot;
     :join-separator &quot;, &quot;
     :no-progress t
     :utils &quot;swift&quot;)))
</code></pre>
<p><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>. What other uses can you find for it?</p>
]]></description>
    <pubDate>Wed, 12 Oct 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: macOS sharing (DWIM style)</title>
<link>https://xenodium.com/emacs-macos-share-from-dired-dwim-style</link>
<guid isPermaLink="false">https://xenodium.com/emacs-macos-share-from-dired-dwim-style</guid>
    <description><![CDATA[<p>UPDATE: See an improved implementation <a href="https://xenodium.com/emacs-macos-sharing-dwim-style-improved">here</a>.</p>
<p>A few days ago, <a href="https://xenodium.com/emacs-reveal-in-finder-dwim-style/">I wrote dwim-shell-commands-macos-reveal-in-finder</a>. While I've written a bunch of other <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands</a>, what set this case apart was the use of <a href="https://www.swift.org/">Swift</a> to glue an Emacs workflow.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-macos-reveal-in-finder ()
  &quot;Reveal selected files in macOS Finder.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Reveal in Finder&quot;
   &quot;import AppKit
    NSWorkspace.shared.activateFileViewerSelecting([\&quot;&lt;&lt;*&gt;&gt;\&quot;].map{URL(fileURLWithPath:$0)})&quot;
   :join-separator &quot;, &quot;
   :silent-success t
   :shell-pipe &quot;swift -&quot;))
</code></pre>
<p>There is hardly any Swift involved, yet it scratched a real itch I couldn't otherwise reach (reveal multiple dired files in macOS's <a href="https://en.wikipedia.org/wiki/Finder_(software)">Finder</a>).</p>
<p>divinedominion's <a href="https://www.reddit.com/r/emacs/comments/xzt3gx/comment/irrwoya/?utm_source=share&amp;utm_medium=web2x&amp;context=3">reddit comment</a> got me thinking of other use-cases, so I figured why not push this Swift-elisp beeswax a little further… Let's add macOS's sharing ability via <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>, so I could invoke it from the comfort of my beloved <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> or any 'ol Emacs buffer visiting a file.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-macos-share ()
  &quot;Share selected files from macOS.&quot;
  (interactive)
  (let* ((position (window-absolute-pixel-position))
         (x (car position))
         (y (- (x-display-pixel-height)
               (cdr position))))
    (dwim-shell-command-on-marked-files
     &quot;Share&quot;
     (format
      &quot;import AppKit

       _ = NSApplication.shared

       NSApp.setActivationPolicy(.regular)

       let window = InvisibleWindow(
         contentRect: NSRect(x: %d, y: %s, width: 0, height: 0),
         styleMask: [],
         backing: .buffered,
         defer: false)

       NSApp.activate(ignoringOtherApps: true)

       DispatchQueue.main.async {
         let picker = NSSharingServicePicker(items: [\&quot;&lt;&lt;*&gt;&gt;\&quot;].map{URL(fileURLWithPath:$0)})
         picker.delegate = window
         picker.show(
           relativeTo: .zero, of: window.contentView!, preferredEdge: .minY)
       }

       NSApp.run()

       class InvisibleWindow: NSWindow, NSSharingServicePickerDelegate, NSSharingServiceDelegate {
         func sharingServicePicker(
           _ sharingServicePicker: NSSharingServicePicker, didChoose service: NSSharingService?
         ) {
           if service == nil {
             print(\&quot;Cancelled\&quot;)

             // Delay so \&quot;More...\&quot; menu can launch System Preferences
             DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
               NSApplication.shared.terminate(nil)
             }
           }
         }

         func sharingServicePicker(
           _ sharingServicePicker: NSSharingServicePicker,
           delegateFor sharingService: NSSharingService
         ) -&gt; NSSharingServiceDelegate? {
           return self
         }

         func sharingService(
           _ sharingService: NSSharingService,
           didShareItems items: [Any]
         ) {
           NSApplication.shared.terminate(nil)
         }

         func sharingService(
           _ sharingService: NSSharingService, didFailToShareItems items: [Any], error: Error
         ) {
           let error = error as NSError
           if error.domain == NSCocoaErrorDomain &amp;&amp; error.code == NSUserCancelledError {
             NSApplication.shared.terminate(nil)
           }
           exit(1)
         }
       }&quot; x y)
     :silent-success t
     :shell-pipe &quot;swift -&quot;
     :join-separator &quot;, &quot;
     :no-progress t
     :utils &quot;swift&quot;)))
</code></pre>
<p>Sure there is some trickery involved here (like creating an invisible macOS window to anchor the menu), but hey the results are surprisingly usable. Take a look…</p>
<p><img src="https://xenodium.github.io/images/emacs-macos-share-from-dired-dwim-style/share-done_x1.4.webp" alt=""></p>
<p>I've pushed <code>dwim-shell-commands-macos-share</code> to <a href="https://github.com/xenodium/dwim-shell-command/blob/919817520fa507dd3c7e6859eb982976e28b2575/dwim-shell-commands.el#L370">dwim-shell-commands.el</a> in case you'd like to give it a try. It's very much an experiment of sorts, so please treat it as such. For now, I'm looking forward to AirDropping more files and seeing if the flow sticks. Oh, and I just realised I can use this to send files to iOS Simulators. Win.</p>
<p><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>. What other uses can you find for it?</p>
]]></description>
    <pubDate>Wed, 12 Oct 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Reveal in macOS Finder (DWIM style)</title>
<link>https://xenodium.com/emacs-reveal-in-finder-dwim-style</link>
<guid isPermaLink="false">https://xenodium.com/emacs-reveal-in-finder-dwim-style</guid>
    <description><![CDATA[<p>Just the other day, <a href="https://github.com/gvoysey">Graham Voysey</a> filed an <a href="https://github.com/xenodium/dwim-shell-command/issues/3">escaping bug</a> against <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>. Once he verified the the fix, he also posted <a href="https://github.com/xenodium/dwim-shell-command/issues/3#issuecomment-1272413459">two uses</a> of <code>dwim-shell-command-on-marked-files</code>. I've made some small tweaks, but here's the gist of it:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-feh-marked-files ()
  &quot;View all marked files with feh.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;View with feh&quot;
   &quot;feh --auto-zoom --scale-down '&lt;&lt;*&gt;&gt;'&quot;
   :silent-success t
   :utils &quot;feh&quot;))

(defun dwim-shell-commands-dragon-marked-files ()
  &quot;Share all marked files with dragon.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;View with dragon&quot;
   &quot;dragon --on-top '&lt;&lt;*&gt;&gt;'&quot;
   :silent-success t
   :utils &quot;dragon&quot;))
</code></pre>
<p>I love seeing what others get up to by using <code>dwim-shell-command</code>. Are there new magical command-line utilities out there I don't know about? In this instance, I got to learn about <a href="https://feh.finalrewind.org/">feh</a> and <a href="https://github.com/mwh/dragon">dragon</a>.</p>
<p><a href="https://feh.finalrewind.org/">feh</a> is a no-frills image viewer for console users while <a href="https://github.com/mwh/dragon">dragon</a> is a simple drag-and-drop source/sink for X or Wayland. Both utilities are great uses of <code>dwim-shell-command</code>, enabling a seamless transition from Emacs to the <em>outside world</em>. These days I'm rarely on a linux box, so I was keen to ensure macOS had these cases covered.</p>
<p><a href="https://en.wikipedia.org/wiki/Preview_(macOS)">Preview</a> is a solid macOS equivalent to <a href="https://feh.finalrewind.org/">feh</a>. <code>Preview</code> is already macOS's default image viewer. A simple <code>open '&lt;&lt;f&gt;&gt;'</code> would do the job, but if we'd like to make this command more portable, we can accomodate as follows:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-open-externally ()
  &quot;Open file(s) externally.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Open externally&quot;
   (if (eq system-type 'darwin)
       &quot;open '&lt;&lt;f&gt;&gt;'&quot;
     &quot;xdg-open '&lt;&lt;f&gt;&gt;'&quot;)
   :silent-success t
   :utils &quot;open&quot;))
</code></pre>
<p>Special mention goes to Bozhidar Batsov's <a href="https://github.com/bbatsov/crux">crux</a> which achieves similar functionality via <code>crux-open-with</code>. <a href="https://github.com/bbatsov/crux">crux</a> provides a bunch of other useful functions. Some of my favourites being <code>crux-duplicate-current-line-or-region</code>, <code>crux-transpose-windows</code>, <code>crux-delete-file-and-buffer</code>, and <code>crux-rename-buffer-and-file</code>, but I digress.</p>
<p>Moving on to a <a href="https://github.com/mwh/dragon">dragon</a> equivalent on macOS, I thought I had it covered via <a href="https://github.com/kaz-yos/reveal-in-osx-finder">reveal-in-osx-finder</a> or <a href="https://github.com/jcs-elpa/reveal-in-folder">reveal-in-folder</a>. Turns out, neither of these reveal multiple <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a>-selected files within <a href="https://en.wikipedia.org/wiki/Finder_(software)">Finder</a>. At first, I thought this could be easily achieved by passing additional flags/params to macOS's <code>open</code> command, but it doesn't seem to be the case. Having said that, this <a href="https://stackoverflow.com/questions/7652928/launch-finder-window-with-specific-files-selected">Stack Overflow post</a>, has a solution in Objective-C, which is where things got a little more interesting. You see, back in July I <a href="https://xenodium.com/emacs-dwim-shell-command-multi-language/">added multi-language support</a> to <a href="https://xenodium.com/emacs-dwim-shell-command-multi-language/">dwim-shell-command</a> and while it highlighted language flexibility, I hadn't yet taken advantage of this feature myself. That is, until today.</p>
<p>The Objective-C snippet from the Stack Overflow post can be written as a Swift one-liner. Ok I lie. It's actually two lines, counting the import, but you can see that this multi-language Emacs transition/integration is pretty easy to add.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-macos-reveal-in-finder ()
  &quot;Reveal selected files in macOS Finder.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Reveal in Finder&quot;
   &quot;import AppKit
    NSWorkspace.shared.activateFileViewerSelecting([\&quot;&lt;&lt;*&gt;&gt;\&quot;].map{URL(fileURLWithPath:$0)})&quot;
   :join-separator &quot;, &quot;
   :silent-success t
   :shell-pipe &quot;swift -&quot;))
</code></pre>
<p><code>&lt;&lt;*&gt;&gt;</code> is the centrepiece of the snippet above. It gets instantiated with a list of files joined using the <code>&quot;, &quot;</code> separator.</p>
<pre><code class="language-swift">NSWorkspace.shared.activateFileViewerSelecting([&quot;/path/to/file1&quot;, &quot;/path/to/file2&quot;].map { URL(fileURLWithPath: $0) })
</code></pre>
<p>The proof of the pudding is of course in the eating, so ummm let's show it in action:</p>
<p><img src="https://xenodium.github.io/images/emacs-reveal-in-finder-dwim-style/dwim-reveal.webp" alt=""></p>
<p>I should mention the webp animation above was also created using my trusty <code>dwim-shell-commands-video-to-webp</code> also backed by <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-video-to-webp ()
  &quot;Convert all marked videos to webp(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert to webp&quot;
   &quot;ffmpeg -i '&lt;&lt;f&gt;&gt;' -vcodec libwebp -filter:v fps=fps=10 -compression_level 3 -lossless 1 -loop 0 -preset default -an -vsync 0 '&lt;&lt;fne&gt;&gt;'.webp&quot;
   :utils &quot;ffmpeg&quot;))
</code></pre>
<p><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>. What other uses can you find for it?</p>
<p>UPDATE: Most DWIM shell commands I use are available as part of <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>. See <code>dwim-shell-command</code>'s <a href="https://github.com/xenodium/dwim-shell-command#install-command-line-utilities">install command line utilities</a>.</p>
]]></description>
    <pubDate>Sun, 09 Oct 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org v1.5 released</title>
<link>https://xenodium.com/plain-org-v15-released</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-v15-released</guid>
    <description><![CDATA[<p>If you haven't heard of <a href="https://plainorg.com">Plain Org</a>, it gives you access to <a href="https://orgmode.org">org</a> files on iOS while away from your beloved <a href="https://www.gnu.org/software/emacs/">Emacs</a>.</p>
<p>Hadn't had time to post, but v1.5 has been available on the <a href="https://apps.apple.com/app/id1578965002">App Store</a> for a couple of weeks now. The update is mostly a bugfix release, primarily addressing inline editing issues that appeared on iOS 16, along with a few other changes:</p>
<ul>
<li>Render form feeds at end of headings at all times.</li>
<li>Fixes new files not recognized by org-roam.</li>
<li>Fixes share sheet saving from cold launch.</li>
<li>Fixes inline editing on iOS 16.</li>
</ul>
<p><img src="https://xenodium.github.io/images/plain-org-v15-released/po.png" alt=""></p>
<p>I love org markup, but we (iPhone + org users) are a fairly niche bunch. If you're finding Plain Org useful, <strong>please help support this effort</strong> by getting the word out. Tell your friends, <a href="https://twitter.com/intent/tweet?text=Plain%20Org%20https%3A%2F%2Fapps.apple.com%2Fapp%2Fid1578965002%20">tweet</a>, or blog about it. Or just support via the <a href="https://apps.apple.com/app/id1578965002">App Store</a> :)</p>
]]></description>
    <pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>dwim-shell-command usages: pdftotext and scp</title>
<link>https://xenodium.com/dwim-shell-command-usages-pdftotext-and-scp</link>
<guid isPermaLink="false">https://xenodium.com/dwim-shell-command-usages-pdftotext-and-scp</guid>
    <description><![CDATA[<p><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is a little Emacs package I wrote to enable crafting more reusable shell commands. I intended to use it as an <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell.html">async-shell-command</a> alternative (and I do these days). The more surprising win was bringing lots of command-line utilities (sometimes with complicated invocations) and making them quickly accessible. I no longer need to remember their respective parameters, order, flags, etc.</p>
<p>I've migrated most <a href="https://xenodium.com/emacs-password-protect-current-pdf-revisited/">one-liners</a> and <a href="https://xenodium.com/png-to-icns-emacs-dwim-style/">scripts</a> I had to <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> equivalents. They are available at <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>. Having said that, it's great to discover new usages from <code>dwim-shell-command</code> users.</p>
<p>Take <a href="https://www.reddit.com/user/TiMueller/">u/TiMueller</a>'s Reddit comment, <a href="https://www.reddit.com/r/emacs/comments/w8s2ov/comment/iq7idav/?utm_source=share&amp;utm_medium=web2x&amp;context=3">showcasing pdftotext</a>. Neat utility I was unaware of. It does as it says on the tin and converts a pdf to text. Can be easily saved to your accessible repertoire with:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-pdf-to-txt ()
  &quot;Convert pdf to txt.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;pdf to txt&quot;
   &quot;pdftotext -layout '&lt;&lt;f&gt;&gt;' '&lt;&lt;fne&gt;&gt;.txt'&quot;
   :utils &quot;pdftotext&quot;))
</code></pre>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-usages-pdftotext-and-scp/pdf-to-txt_x2.webp" alt=""></p>
<p><a href="https://github.com/tareefdev">tareefdev</a> wanted a quick command to <a href="https://linux.die.net/man/1/scp">secure copy</a> remote files to a local directory. Though this use-case is already covered by Tramp, I suspect a DWIM command would make it a little more convenient (async by default). However, Tramp paths aren't usable from the shell unless we massage them a little. We can use <code>dwim-shell-command-on-marked-files</code>'s <code>:post-process-template</code> to drop the &quot;/ssh:&quot; prefix.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-copy-remote-to-downloads ()
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Copy remote to local Downloads&quot;
   &quot;scp '&lt;&lt;f&gt;&gt;' ~/Downloads/&quot;
   :utils &quot;scp&quot;
   :post-process-template
   (lambda (script file)
     ;; Tramp file path start with &quot;/ssh:&quot;. Drop it.
     (string-replace file
                     (string-remove-prefix &quot;/ssh:&quot; file)
                     script))))
</code></pre>
<p><a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is available on <a href="https://melpa.org/#/dwim-shell-command">MELPA</a> (531 downloads as of 2022-10-01).</p>
]]></description>
    <pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>\$ rm Important.txt (uh oh!)</title>
<link>https://xenodium.com/rm-important-txt-oh-sht</link>
<guid isPermaLink="false">https://xenodium.com/rm-important-txt-oh-sht</guid>
    <description><![CDATA[<p>Setting Emacs up to use your system trash can potentially save your bacon if you mistakenly delete a file, say from <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a>.</p>
<p>Unsurprisingly, the trash safety net also extends to other Emacs areas. For example, discarding files from <a href="https://magit.vc/">Magit</a> (via <code>magit-discard</code>) becomes a recoverable operation. As an <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a> user, the trash can also help you recover from <code>rm</code> blunders.</p>
<p><img src="https://xenodium.github.io/images/rm-important-txt-oh-sht/recovered_x1.6.webp" alt=""></p>
<p>You can enable macOS system trash in Emacs by setting <code>trash-directory</code> along with defining <code>system-move-file-to-trash</code>:</p>
<pre><code class="language-{.commonlisp">(setq trash-directory &quot;~/.Trash&quot;)

;; See `trash-directory' as it requires defining `system-move-file-to-trash'.
(defun system-move-file-to-trash (file)
  &quot;Use \&quot;trash\&quot; to move FILE to the system trash.&quot;
  (cl-assert (executable-find &quot;trash&quot;) nil &quot;'trash' must be installed. Needs \&quot;brew install trash\&quot;&quot;)
  (call-process &quot;trash&quot; nil 0 nil &quot;-F&quot;  file))
</code></pre>
]]></description>
    <pubDate>Sat, 17 Sep 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cycling through window layouts (revisited)</title>
<link>https://xenodium.com/cycling-through-window-layout-revisited</link>
<guid isPermaLink="false">https://xenodium.com/cycling-through-window-layout-revisited</guid>
    <description><![CDATA[<p>Last year, I wrote a little script to <a href="https://xenodium.com/cycling-window-layouts-via-hammerspoon">cycle through window layouts via Hammerspoon</a>. The cycling set I chose didn't stick, so here's another go.</p>
<p><img src="https://xenodium.github.io/images/cycling-through-window-layout-revisited/cycle_layout.webp" alt=""></p>
<pre><code class="language-lua">function reframeFocusedWindow()
   local win = hs.window.focusedWindow()
   local maximizedFrame = win:screen():frame()
   maximizedFrame.x = maximizedFrame.x + 15
   maximizedFrame.y = maximizedFrame.y + 15
   maximizedFrame.w = maximizedFrame.w - 30
   maximizedFrame.h = maximizedFrame.h - 30

   local leftFrame = win:screen():frame()
   leftFrame.x = leftFrame.x + 15
   leftFrame.y = leftFrame.y + 15
   leftFrame.w = leftFrame.w / 2 - 15
   leftFrame.h = leftFrame.h - 30

   local rightFrame = win:screen():frame()
   rightFrame.x = rightFrame.w / 2
   rightFrame.y = rightFrame.y + 15
   rightFrame.w = rightFrame.w / 2 - 15
   rightFrame.h = rightFrame.h - 30

   if win:frame() == maximizedFrame then
     win:setFrame(leftFrame)
     return
   end

   if win:frame() == leftFrame then
     win:setFrame(rightFrame)
     return
   end

   win:setFrame(maximizedFrame)
end

hs.hotkey.bind({&quot;alt&quot;}, &quot;F&quot;, reframeFocusedWindow)
</code></pre>
<p>Looping through layouts is done with a global key-binding of <code>option f</code> or, if familiar with a macOS keyboard, <code>⌥ f</code>.</p>
<p>For those unfamiliar with <a href="http://hammerspoon.org/">Hammerspoon</a>… If you're a tinkerer and a macOS user, you'd love <a href="http://hammerspoon.org/">Hammerspoon</a>. Like elisp gluing all things Emacs, Hammerspoon uses Lua to glue all things macOS. For example, here's a stint at <a href="https://xenodium.com/emacs-utilities-for-your-os/">writing a narrowing utility for macOS</a> using <a href="http://www.hammerspoon.org/docs/hs.chooser.html">chooser</a>.</p>
]]></description>
    <pubDate>Sun, 11 Sep 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>dwim-shell-command with template prompts</title>
<link>https://xenodium.com/dwim-shell-command-with-template-prompts</link>
<guid isPermaLink="false">https://xenodium.com/dwim-shell-command-with-template-prompts</guid>
    <description><![CDATA[<p>Somewhat recently, I wanted to quickly create an empty/transparent png file. <a href="https://imagemagick.org/">ImageMagick</a>'s convert has you covered here. Say you want a transparent 200x400 image, you can get it with:</p>
<pre><code class="language-{.bash">convert -verbose -size 200x400 xc:none empty200x400.png
</code></pre>
<p>Great, I now know the one-liner for it. But because I'm in the mood of saving these as <a href="https://xenodium.com/seamless-command-line-utils/">seamless command-line utils</a>, I figured I should save the <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> equivalent.</p>
<p>I wanted configurable image dimensions, so I used <a href="https://www.gnu.org/software/emacs/manual/html_node/calc/Formatting-Lisp-Functions.html">read-number</a> together with <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Formatting-Strings.html">format</a> to create the templated command and fed it to <code>dwim-shell-command-on-marked-files</code>. Job done:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-make-transparent-png ()
  &quot;Create a transparent png.&quot;
  (interactive)
  (let ((width (read-number &quot;Width: &quot; 200))
        (height (read-number &quot;Height: &quot; 200)))
    (dwim-shell-command-on-marked-files
     &quot;Create transparent png&quot;
     (format &quot;convert -verbose -size %dx%d xc:none '&lt;&lt;empty%dx%d.png(u)&gt;&gt;'&quot;
             width height width height)
     :utils &quot;convert&quot;)))
</code></pre>
<p>The resulting <code>dwim-shell-commands-make-transparent-png</code> is fairly simple, but <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> aims to remove friction so you're more inclined to save reusable commands. In this case, we can shift querying and formatting into the template.</p>
<p><code>&lt;&lt;Width:200&gt;&gt;</code> can be interpreted as &quot;ask the user for a value using the suggested prompt and default value.&quot;</p>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-with-template-prompts/query.png" alt=""></p>
<p>With template queries in mind, <code>dwim-shell-commands-make-transparent-png</code> can be further reduced to essentially the interactive command boilerplate and the template itself:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-make-transparent-png ()
  &quot;Create a transparent png.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Create transparent png&quot;
   &quot;convert -verbose -size &lt;&lt;Width:200&gt;&gt;x&lt;&lt;Height:200&gt;&gt; xc:none '&lt;&lt;empty&lt;&lt;Width:200&gt;&gt;x&lt;&lt;Height:200&gt;&gt;.png(u)&gt;&gt;'&quot;
   :utils &quot;convert&quot;))
</code></pre>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-with-template-prompts/empty.webp" alt=""></p>
<p>Note: Any repeated queries (same prompt and default) are treated as equal. That is, ask the user once and replace everywhere. If you'd like to request separate values, change either prompt or the default value.</p>
]]></description>
    <pubDate>Thu, 18 Aug 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Seamless command-line utils</title>
<link>https://xenodium.com/seamless-command-line-utils</link>
<guid isPermaLink="false">https://xenodium.com/seamless-command-line-utils</guid>
    <description><![CDATA[<p>Just the other day, I received a restaurant menu split into a handful of image files. I wanted to forward the menu to others but figured I should probably send it as a single file.</p>
<p>ImageMagick's <a href="https://imagemagick.org/script/convert.php">convert</a> command-line utility works great for this purpose. Feed it some images and it creates a pdf for you:</p>
<pre><code class="language-{.bash">convert image1.png image2.png image3.png combined.pdf
</code></pre>
<p>Using <code>convert</code> for this purpose was pretty straightforward. I'm sure I'll use it again in a similar context, but what if I can make future usage more seamless? In the past, I would just make a note of usage and revisit when needed. Though this works well enough, it often requires some amount of manual work (looking things up, tweaking command, etc) if you happen to forget the command syntax.</p>
<p>I wanted common one-liners (or <a href="https://xenodium.com/png-to-icns-emacs-dwim-style/">longer shell scripts</a>) to be easily reusable and accessible from Emacs. Turns out, the <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> experiment is working fairly well for this purpose. In addition to providing template expansion, it generally <a href="https://xenodium.com/emacs-dwim-shell-command/">tries to do what I mean</a> (focus when needed, reveal new files, rename buffers, etc).</p>
<p>Here's how I saved the <code>convert</code> command instance for future usage:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-join-as-pdf ()
  &quot;Join all marked images as a single pdf.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Join as pdf&quot;
   &quot;convert -verbose '&lt;&lt;*&gt;&gt;' '&lt;&lt;joined.pdf(u)&gt;&gt;'&quot;
   :utils &quot;convert&quot;))
</code></pre>
<p>From now on, any time I'd like to join multiple files into a pdf, I can now select them all and invoke <code>dwim-shell-commands-join-as-pdf</code>.</p>
<p><img src="https://xenodium.github.io/images/seamless-command-line-utils/joined_minimal_x1.2.webp" alt=""></p>
<p>In the saved command, <code>'&lt;&lt;*&gt;&gt;'</code> expands to either <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> selected files or whatever file happens to be open in the current buffer. The buffer file isn't of much help for joining multiple items, but can be handy for other instances (say I want to convert current image to jpeg).</p>
<p>Moving on to <code>'&lt;&lt;joined.pdf(u)&gt;&gt;'</code>, we could have just written as <code>joined.pdf</code>, but wrapping it ensures the resulting file name is unique. That is, if <code>joined.pdf</code> already exists, write <code>joined(1).pdf</code> instead.</p>
<p>These kinds of command-line integrations are working well for me. Take the webp animation above, it was created by invoking <code>dwim-shell-commands-video-to-webp</code> on a <code>.mov</code> file. Easy peasy. While I can easily memorize the <code>convert</code> command for the pdf instance, I'm hopeless in the webp scenario:</p>
<pre><code class="language-{.bash">ffmpeg -i '&lt;&lt;f&gt;&gt;' -vcodec libwebp -filter:v fps=fps=10 -compression_level 3 -lossless 1 -loop 0 -preset default -an -vsync 0 '&lt;&lt;fne&gt;&gt;'.webp
</code></pre>
<p>While searching through command line history helps to quickly re-spin previous commands, it requires remembering the actual utility used for any particular action. On the other hand, wrapping with Emacs functions enables me to remember the action itself, using more memorable names. Also, fuzzy searching works a treat.</p>
<p><img src="https://xenodium.github.io/images/seamless-command-line-utils/fuzzy.png" alt=""></p>
<p>It's been roughly a month since I started playing around with this idea of wrapping command-line utilities more seamlessly. Since then, I've brought in a bunch of use-cases that are now quickly accessible (all in <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a>):</p>
<ul>
<li>dwim-shell-commands-audio-to-mp3</li>
<li>dwim-shell-commands-clipboard-to-qr</li>
<li>dwim-shell-commands-copy-to-desktop</li>
<li>dwim-shell-commands-copy-to-downloads</li>
<li>dwim-shell-commands-docx-to-pdf</li>
<li>dwim-shell-commands-download-clipboard-stream-url</li>
<li>dwim-shell-commands-drop-video-audio</li>
<li>dwim-shell-commands-epub-to-org</li>
<li>dwim-shell-commands-external-ip</li>
<li>dwim-shell-commands-files-combined-size</li>
<li>dwim-shell-commands-git-clone-clipboard-url</li>
<li>dwim-shell-commands-git-clone-clipboard-url-to-downloads</li>
<li>dwim-shell-commands-http-serve-dir</li>
<li>dwim-shell-commands-image-browse-location</li>
<li>dwim-shell-commands-image-exif-metadata</li>
<li>dwim-shell-commands-image-reverse-geocode-location</li>
<li>dwim-shell-commands-image-to-grayscale</li>
<li>dwim-shell-commands-image-to-icns</li>
<li>dwim-shell-commands-image-to-jpg</li>
<li>dwim-shell-commands-image-to-png</li>
<li>dwim-shell-commands-install-iphone-device-ipa</li>
<li>dwim-shell-commands-join-as-pdf</li>
<li>dwim-shell-commands-kill-gpg-agent</li>
<li>dwim-shell-commands-kill-process</li>
<li>dwim-shell-commands-macos-bin-plist-to-xml</li>
<li>dwim-shell-commands-macos-caffeinate</li>
<li>dwim-shell-commands-macos-hardware-overview</li>
<li>dwim-shell-commands-macos-open-with</li>
<li>dwim-shell-commands-macos-reveal-in-finder</li>
<li>dwim-shell-commands-macos-set-default-app</li>
<li>dwim-shell-commands-macos-share</li>
<li>dwim-shell-commands-macos-toggle-dark-mode</li>
<li>dwim-shell-commands-macos-toggle-display-rotation</li>
<li>dwim-shell-commands-make-transparent-png</li>
<li>dwim-shell-commands-move-to-desktop</li>
<li>dwim-shell-commands-move-to-downloads</li>
<li>dwim-shell-commands-open-clipboard-url</li>
<li>dwim-shell-commands-open-externally</li>
<li>dwim-shell-commands-pdf-password-protect</li>
<li>dwim-shell-commands-pdf-to-txt</li>
<li>dwim-shell-commands-ping-google</li>
<li>dwim-shell-commands-rename-all</li>
<li>dwim-shell-commands-reorient-image</li>
<li>dwim-shell-commands-resize-gif</li>
<li>dwim-shell-commands-resize-image</li>
<li>dwim-shell-commands-resize-video</li>
<li>dwim-shell-commands-speed-up-gif</li>
<li>dwim-shell-commands-speed-up-video</li>
<li>dwim-shell-commands-stream-clipboard-url</li>
<li>dwim-shell-commands-svg-to-png</li>
<li>dwim-shell-commands-unzip</li>
<li>dwim-shell-commands-url-browse</li>
<li>dwim-shell-commands-video-to-gif</li>
<li>dwim-shell-commands-video-to-optimized-gif</li>
<li>dwim-shell-commands-video-to-webp</li>
</ul>
<p>What other use-cases would you consider? <code>dwim-shell-command</code> is <a href="https://melpa.org/#/dwim-shell-command">available on melpa</a>.</p>
<h2>Update</h2>
<p>2022-11-14 dwim-shell-commands.el list updated.</p>
]]></description>
    <pubDate>Sun, 14 Aug 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs freebie: macOS emoji picker</title>
<link>https://xenodium.com/emacs-freebie-macos-emoji-picker</link>
<guid isPermaLink="false">https://xenodium.com/emacs-freebie-macos-emoji-picker</guid>
    <description><![CDATA[<p>I recently ran a little experiment to bring macOS's <a href="https://xenodium.com/an-accentuated-emacs-experiment/">long-press-accents-like behavior</a> to Emacs. What I forgot to mention is that macOS's character viewer <em>just works</em> from our beloved editor.</p>
<p>If you have a newer MacBook model, you can press the 🌐 key to summon the emoji picker (character viewer). You may need to set this key binding <a href="https://support.apple.com/en-gb/guide/mac-help/mchlp1560/mac">from macOS keyboard preferences</a>.</p>
<p>I'm happy to take this Emacs freebie, kthxbye.</p>
<p><img src="https://xenodium.github.io/images/emacs-freebie-macos-emoji-picker/hearts_x1.5.webp" alt=""></p>
<p>Edits:</p>
<ul>
<li>Like other macOS apps, this dialog can be invoked via control-command-space (thanks <a href="https://www.reddit.com/r/emacs/comments/wfja3n/comment/iiv7ptb/?utm_source=share&amp;utm_medium=web2x&amp;context=3">mtndewforbreakfast</a>). Note: you'd lose this ability if you <code>(setq mac-command-modifier 'meta)</code> in your config.</li>
<li>The 🌐 key is a feature on newer MacBook hardware and likely needs configuration (thanks <a href="https://www.reddit.com/r/emacs/comments/wfja3n/comment/iivnwxt/?utm_source=share&amp;utm_medium=web2x&amp;context=3">Fabbi-</a>).</li>
</ul>
]]></description>
    <pubDate>Wed, 03 Aug 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>dwim-shell-command video streams</title>
<link>https://xenodium.com/dwim-shell-command-video-streams</link>
<guid isPermaLink="false">https://xenodium.com/dwim-shell-command-video-streams</guid>
    <description><![CDATA[<h2>I continue hunting for use-cases I can migrate to <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>… After adding <a href="https://xenodium.com/dwim-shell-command-improvements/">clipboard support</a> (via []</h2>
<p>id: cb
---) I found one more.</p>
<ol>
<li>Copy URL from browser.</li>
<li>Invoke <code>dwim-shell-commands-mpv-stream-clipboard-url</code>.</li>
<li>Enjoy picture in picture from Emacs ;)</li>
</ol>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-video-streams/mpv.webp" alt=""></p>
<p>What's the secret sauce? Very little. Invoke the awesome <a href="https://mpv.io/">mpv</a> with a wrapping function using <code>dwim-shell-command-on-marked-files</code>.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-mpv-stream-clipboard-url ()
  &quot;Stream clipboard URL using mpv.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Streaming&quot;
   &quot;mpv --geometry=30%x30%+100%+0% \&quot;&lt;&lt;cb&gt;&gt;\&quot;&quot;
   :utils &quot;mpv&quot;
   :no-progress t
   :error-autofocus t
   :silent-success t))
</code></pre>
<p>The typical progress bar kinda got in the way, so I added a new option <code>:no-progress</code> to <code>dwim-shell-command-on-marked-files</code>, so it can be used for cases like this one.</p>
]]></description>
    <pubDate>Mon, 01 Aug 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>An accentuated Emacs experiment (à la macOS)</title>
<link>https://xenodium.com/an-accentuated-emacs-experiment</link>
<guid isPermaLink="false">https://xenodium.com/an-accentuated-emacs-experiment</guid>
    <description><![CDATA[<p>macOS has a wonderful input mechanism where you press and hold a key on your keyboard to display the accent menu. It's easy to internalize: <em>long press &quot;a&quot; if you want to input &quot;á&quot;</em>.</p>
<p><img src="https://xenodium.github.io/images/an-accentuated-emacs-experiment/macosaccent.webp" alt=""></p>
<p>On Emacs, <em>C-x 8 ' a</em> would be the equivalent, but it just didn't stick for me. Fortunately, there's an alternative, using dead keys. Mickey Petersen gives a <a href="https://www.masteringemacs.org/article/diacritics-in-emacs">wonderful introduction</a>. Having said all this, I still longed for macOS's input mechanism.</p>
<p>Thanks to Christian Tietze's <a href="https://twitter.com/ctietze/status/1552446492559958017">post</a>, I discovered the <a href="https://github.com/elias94/accent">accent</a> package. While it doesn't handle <em>press-and-hold</em>, it does the heavy lifting of offering a menu with character options. If I could just bring that <em>press-and-hold</em>…</p>
<p>My initial attempt was to use <a href="https://github.com/emacsorphanage/key-chord">key chords</a> (via <a href="https://github.com/jwiegley/use-package">use-package</a>):</p>
<pre><code class="language-{.commonlisp">(use-package accent
  :ensure t
  :chords ((&quot;aa&quot; . ar/spanish-accent-menu)
           (&quot;ee&quot; . ar/spanish-accent-menu)
           (&quot;ii&quot; . ar/spanish-accent-menu)
           (&quot;oo&quot; . ar/spanish-accent-menu)
           (&quot;uu&quot; . ar/spanish-accent-menu)
           (&quot;AA&quot; . ar/spanish-accent-menu)
           (&quot;EE&quot; . ar/spanish-accent-menu)
           (&quot;II&quot; . ar/spanish-accent-menu)
           (&quot;OO&quot; . ar/spanish-accent-menu)
           (&quot;UU&quot; . ar/spanish-accent-menu)
           (&quot;nn&quot; . ar/spanish-accent-menu)
           (&quot;NN&quot; . ar/spanish-accent-menu)
           (&quot;??&quot; . ar/spanish-accent-menu)
           (&quot;!!&quot; . ar/spanish-accent-menu))
  :config
  (defun ar/spanish-accent-menu ()
    (interactive)
    (let ((accent-diacritics
           '((a (á))
             (e (é))
             (i (í))
             (o (ó))
             (u (ú ü))
             (A (Á))
             (E (É))
             (I (Í))
             (O (Ó))
             (U (Ú Ü))
             (n (ñ))
             (N (Ñ))
             (\? (¿))
             (! (¡)))))
      (ignore-error quit
        (accent-menu)))))
</code></pre>
<p>While it kinda works, &quot;nn&quot; quickly got in the way of my n/p <a href="https://magit.vc/">magit</a> navigation. Perhaps key chords are still an option for someone who doesn't need the &quot;nn&quot; chord, but being a Spanish speaker, I need that &quot;ñ&quot; from long &quot;n&quot; presses!</p>
<p>I'm now trying a little experiment using an <code>after-change-functions</code> hook to monitor text input and present the accent menu. I'm sure there's a better way (anyone with ideas?). For now, it gives me something akin to <em>press-and-hold.</em></p>
<p><img src="https://xenodium.github.io/images/an-accentuated-emacs-experiment/accentuated.webp" alt=""></p>
<p>I'm wrapping the hook with a minor mode to easily enable/disable whenever needed. I'm also overriding <code>accent-diacritics</code> to only include the characters I typically need.</p>
<pre><code class="language-{.commonlisp">(use-package accent
  :ensure t
  :hook ((text-mode . accent-menu-mode)
         (org-mode . accent-menu-mode)
         (message-mode . accent-menu-mode))
  :config
  (setq accent-diacritics '((a (á))
                            (e (é))
                            (i (í))
                            (o (ó))
                            (u (ú ü))
                            (A (Á))
                            (E (É))
                            (I (Í))
                            (O (Ó))
                            (U (Ú Ü))
                            (n (ñ))
                            (N (Ñ))
                            (\? (¿))
                            (! (¡))))
  (defvar accent-menu-monitor--last-edit-time nil)

  (define-minor-mode accent-menu-mode
    &quot;Toggle `accent-menu' if repeated keys are detected.&quot;
    :lighter &quot; accent-menu mode&quot;
    (if accent-menu-mode
        (progn
          (remove-hook 'after-change-functions #'accent-menu-monitor--text-change t)
          (add-hook 'after-change-functions #'accent-menu-monitor--text-change 0 t))
      (remove-hook 'after-change-functions #'accent-menu-monitor--text-change t)))

  (defun accent-menu-monitor--text-change (beginning end length)
    &quot;Monitors text change BEGINNING, END, and LENGTH.&quot;
    (let ((last-edit-time accent-menu-monitor--last-edit-time)
          (edit-time (float-time)))
      (when (and (&gt; end beginning)
                 (eq length 0)
                 last-edit-time
                 (not undo-in-progress)
                 ;; 0.27 seems to work for my macOS keyboard settings.
                 ;; Key Repeat: Fast | Delay Until Repeat: Short.
                 (&lt; (- edit-time last-edit-time) 0.27)
                 (float-time (time-subtract (current-time) edit-time))
                 (accent-menu-monitor--buffer-char-string (1- beginning))
                 (seq-contains-p (mapcar (lambda (item)
                                           (symbol-name (car item)))
                                         accent-diacritics)
                                 (accent-menu-monitor--buffer-char-string beginning))
                 (string-equal (accent-menu-monitor--buffer-char-string (1- beginning))
                               (accent-menu-monitor--buffer-char-string beginning)))
        (delete-backward-char 1)
        (ignore-error quit
          (accent-menu)))
      (setq accent-menu-monitor--last-edit-time edit-time)))

  (defun accent-menu-monitor--buffer-char-string (at)
    (when (and (&gt;= at (point-min))
               (&lt; at (point-max)))
      (buffer-substring-no-properties at (+ at 1)))))
</code></pre>
<p>As a bonus, it ocurred to me that I could use the same <em>press-and-hold</em> to handle question marks in Spanish (from my UK keyboard).</p>
<p><img src="https://xenodium.github.io/images/an-accentuated-emacs-experiment/porque.webp" alt=""></p>
]]></description>
    <pubDate>Sat, 30 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>dwim-shell-command improvements</title>
<link>https://xenodium.com/dwim-shell-command-improvements</link>
<guid isPermaLink="false">https://xenodium.com/dwim-shell-command-improvements</guid>
    <description><![CDATA[<p>Added a few improvements to <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>.</p>
<h2>Dired region</h2>
<p>In DWIM style, if you happen to have a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> region selected, use region files instead. There's no need to explicitly mark them.</p>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-improvements/backup_x2.webp" alt=""></p>
<h2>Clipboard (kill-ring) replacement</h2>
<p>Use <code>&lt;&lt;cb&gt;&gt;</code> to substitute with clipboard content. This is handy for cloning git repos, using a URL copied from your browser.</p>
<pre><code class="language-{.bash">git clone &lt;&lt;cb&gt;&gt;
</code></pre>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-improvements/clone.webp" alt=""></p>
<p>This illustrates <code>&lt;&lt;cb&gt;&gt;</code> usage, but you may want to use <code>dwim-shell-commands-git-clone-clipboard-url</code> from <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-commands.el">dwim-shell-commands.el</a> instead. It does the same thing internally, but makes the command more accessible.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-git-clone-clipboard-url ()
  &quot;Clone git URL in clipboard to `default-directory'.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   (format &quot;Clone %s&quot; (file-name-base (current-kill 0)))
   &quot;git clone &lt;&lt;cb&gt;&gt;&quot;
   :utils &quot;git&quot;))
</code></pre>
<h2>Counter replacement</h2>
<p>Use <code>&lt;&lt;n&gt;&gt;</code> to substitute with a counter. You can also use <code>&lt;&lt;3n&gt;&gt;</code> to start the counter at 3.</p>
<p>Handy if you'd like to consistently rename or copy files.</p>
<pre><code class="language-{.bash">mv '&lt;&lt;f&gt;&gt;' 'image(&lt;&lt;n&gt;&gt;).png'
</code></pre>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-improvements/numberedsorted_x2.2.webp" alt=""></p>
<p>Can also use an alphabetic counter with <code>&lt;&lt;an&gt;&gt;</code>. Like the numeric version, can use any letter to start the counter with.</p>
<pre><code class="language-{.bash">mv '&lt;&lt;f&gt;&gt;' 'image(&lt;&lt;an&gt;&gt;).png'
</code></pre>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-improvements/alphacount_x2.2.webp" alt=""></p>
<h2>Prefix counter</h2>
<p>Use a <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Prefix-Command-Arguments.html">prefix command argument</a> on <code>dwim-shell-commands</code> to repeat the command a number of times. Combined with a counter, you can make multiple copies of a single file.</p>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-improvements/repeat.webp" alt=""></p>
<h2>Optional error prompt</h2>
<p>Set <code>dwim-shell-command-prompt-on-error</code> to nil to skip error prompts. Focus process buffers automatically instead.</p>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-improvements/couldnt.png" alt=""></p>
<h2>Configurable prompt</h2>
<p>By default, <code>dwim-shell-command</code> shows all supported placeholders. You can change that prompt to something shorter using <code>dwim-shell-command-prompt</code>.</p>
<p><img src="https://xenodium.github.io/images/dwim-shell-command-improvements/prompt.jpg" alt=""></p>
<h2>⚠️ Use with care ⚠️</h2>
<p>The changes are pretty fresh. Please use with caution (specially the counter support).</p>
]]></description>
    <pubDate>Thu, 28 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>dwim-shell-command on Melpa</title>
<link>https://xenodium.com/dwim-shell-command-on-melpa</link>
<guid isPermaLink="false">https://xenodium.com/dwim-shell-command-on-melpa</guid>
    <description><![CDATA[<figure width="70%" height="70%">
<img src="https://xenodium.github.io/images/dwim-shell-command-on-melpa/clone.webp" />
<figcaption><code>&lt;&lt;cb&gt;&gt;</code> gets replaced by a clipboard (kill ring) URL</figcaption>
</figure>
<p>My pull request to add <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> to <a href="https://melpa.org/">melpa</a> has been <a href="https://github.com/melpa/melpa/pull/8129">merged</a>. Soon, you'll be able to install <a href="https://melpa.org/#/dwim-shell-command">directly</a> from Milkypostman’s Emacs Lisp Package Archive.</p>
<p><code>dwim-shell-command</code> is another way to invoke shell commands from our beloved editor. Why a different way? It does lots of little things for you, removing friction you didn't realise you had. You can check out the <a href="https://github.com/xenodium/dwim-shell-command">README</a>, but you'll appreciate it much more once you try it out.</p>
<p>In addition, it's enabled me to bring lots of command-line tools into my Emacs config and make them highly accessible. You can see my usages over at <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/dwim-shell-command-commands.el">dwim-shell-command-commands.el</a>.</p>
<p>What kind of command-line tools? ffmpeg, convert, gifsycle, atool, qdpf, plutil, qrencode, du, sips, iconutil, and git (so far anyway). Below is a simple example, but would love to <a href="https://twitter.com/xenodium">hear</a> how you get to use it.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-command-audio-to-mp3 ()
  &quot;Convert all marked audio to mp3(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert to mp3&quot;
   &quot;ffmpeg -stats -n -i '&lt;&lt;f&gt;&gt;' -acodec libmp3lame '&lt;&lt;fne&gt;&gt;.mp3'&quot;
   :utils &quot;ffmpeg&quot;))
</code></pre>
<p>I've written about <code>dwim-shell-command</code> before:</p>
<ul>
<li><a href="https://xenodium.com/emacs-dwim-shell-command-multi-language/">Emacs: DWIM shell command (multi-language)</a></li>
<li><a href="https://xenodium.com/png-to-icns-emacs-dwim-style/">png to icns (Emacs DWIM style)</a></li>
<li><a href="https://xenodium.com/emacs-password-protect-current-pdf-revisited/">Emacs: Password-protect current pdf (revisited)</a></li>
<li><a href="https://xenodium.com/emacs-dwim-shell-command/">Emacs DWIM shell-command</a></li>
</ul>
<p><a href="https://irreal.org/blog/">Irreal</a>'s also covered it:</p>
<ul>
<li><a href="https://irreal.org/blog/?p=10674">DWIM Shell Now Supports Multiple Languages</a></li>
<li><a href="https://irreal.org/blog/?p=10653">DWIM Shell Commands</a></li>
<li><a href="https://irreal.org/blog/?p=10660">More Examples of DWIM Shell Commands</a></li>
</ul>
]]></description>
    <pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A lifehack for your shell</title>
<link>https://xenodium.com/a-lifehack-for-your-shell</link>
<guid isPermaLink="false">https://xenodium.com/a-lifehack-for-your-shell</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/a-lifehack-for-your-shell/unzip_x2.gif" alt=""></p>
<p>I'm a fan of the <a href="http://infozip.sourceforge.net/mans/unzip.html">unzip</a> command line utility that ships with macOS. I give it a .zip file and it unzips it for me. No flags or arguments to remember (for my typical usages anyway). Most importantly, I've fully internalized the <code>unzip</code> command into muscle memory, probably because of its <em>perfect mnemonic</em>.</p>
<p>But then there's .tar, .tar.gz, .tar.xz, .rar, and a whole world of compression archives, often requiring different tools, flags, etc. and I need to remember those too.</p>
<p>Can't remember where I got this &quot;life hack&quot; from, but it suggests something along the lines of…</p>
<p>::: center
<em>Once you find a lost item at home, place it in the first spot you looked.</em>
:::</p>
<p>Great, I'll find things quickly. Win.</p>
<p>Now, I still remember a couple of unarchiving commands from memory (looking at you <code>tar xvzf</code>), but I've noticed the first word that pops into mind when extracting is always <code>unzip</code>.</p>
<p>There's the great <a href="https://www.nongnu.org/atool/">atool</a> wrapper out there to extract all kinds of archives (would love to hear of others), but unlucky for me, its name never comes to mind as quickly as <code>unzip</code> does.</p>
<p>With &quot;life hack&quot; in mind, let's just create an <code>unzip</code> <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a> alias to <code>atool</code>. Next time I need to unarchive anything, the first word that comes to mind (unzip!) will quickly get me on my way…</p>
<pre><code class="language-{.bash">alias unzip 'atool --extract --explain $1'
</code></pre>
<p>Or if you prefer to add to your Emacs config:</p>
<pre><code class="language-{.commonlisp">(eshell/alias &quot;unzip&quot; &quot;atool --extract --explain $1&quot;)
</code></pre>
<p>While <a href="https://xenodium.com/yasnippet-in-emacs-eshell/">I'm fan of Emacs eshell</a>, it's not everyone's cup of tea. Lucky for us all, aliases are a popular feature across shells. Happy unzipping!</p>
<h2>Bonus</h2>
<p>Since I'm a keen on using &quot;unzip&quot; mnemonic everywhere in Emacs (not just my shell), I now have a <a href="https://xenodium.com/emacs-dwim-shell-command/">DWIM shell-command</a> for it:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-command-unzip ()
  &quot;Unzip all marked archives (of any kind) using `atool'.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Unzip&quot; &quot;atool --extract --explain '&lt;&lt;f&gt;&gt;'&quot;
   :utils &quot;atool&quot;))
</code></pre>
<p><img src="https://xenodium.github.io/images/a-lifehack-for-your-shell/unzip-dired_x1.5.gif" alt=""></p>
<h2>UPDATE:</h2>
<p><a href="https://lobste.rs/">Lobste.rs</a> has great <a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell">comments</a>. Thanks all:</p>
<h3>Aliases missing on remote machines</h3>
<p>Concerns about aliases <a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_mqxo73">not available on remote machines</a>. Valid. Certainly brings challenges if you can't modify the environment on the remote machine. The severity would depend on how frequently you have to do this. Fortunately for me, it's infrequent.</p>
<p>Additionally, if accessing remote machine via <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a>, this is a non-issue. You get to transparently bring most of your environment with you anyway.</p>
<h3>Unzip keyword is overloaded</h3>
<p>The alias is <a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_78nnwt">overloading the unzip command</a>. I know. It's a little naughty. Going with it for now. I used to use &quot;extract&quot; (also in comments), which I still like but somehow &quot;unzip&quot; still wins my memory race. <a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_73bzze">There's also &quot;x&quot;</a> (nice option), which seems to originate from <a href="https://github.com/sorin-ionescu/prezto">prezto</a>. I could consider unzipp, unzip1, or some other variation.</p>
<p>Not sure how I missed this, but there's also an <a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_ra6sbf">existing alias for atool</a>: aunpack. Could be a great alternative.</p>
<h3>Pause before extracting archives</h3>
<p>Valid <a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_73bzze">point</a>. In my case, the pause typically happens <em>before</em> I invoke the alias.</p>
<h3>Littering</h3>
<p>If the archive didn't have a root dir, it can <a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_7fsart">litter your current directory</a>. Indeed a pain to clean up. For this, we can atool's <code>--subdir</code> param to <em>always create subdirectory when extracting</em>.</p>
<h3>Alias to retrain</h3>
<p><a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_yr1jby">Neat trick</a>: <code>alias unzip = “echo ‘use atool’”</code> to help retrain yourself. Reminds me of Emacs <a href="https://github.com/bbatsov/guru-mode">guru-mode</a>.</p>
<h3>atool alternatives</h3>
<p>Nice to see other options suggested <a href="https://github.com/moonpyk/dtrx">dtrx</a> (<a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_mutdjl">comment</a>), <a href="https://github.com/mholt/archiver">archiver</a> (<a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_nlsk7w">comment</a>), <a href="https://github.com/ashang/unar">unar</a> (<a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_90dk1l">comment</a>), bsdtar from <a href="https://github.com/libarchive/libarchive">libarchive</a> (<a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_ojy6ah">comment</a>), <a href="https://packages.debian.org/stable/unp">unp</a>, <a href="https://wummel.github.io/patool/">patool</a>, and the tangentially related <a href="https://www.nongnu.org/zutils/zutils.html">zgrep</a> (<a href="https://lobste.rs/s/qaimmg/lifehack_for_your_shell#c_vp8fdw">comment</a>).</p>
]]></description>
    <pubDate>Sat, 16 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs zones to lift you up</title>
<link>https://xenodium.com/emacs-zones-to-lift-you-up</link>
<guid isPermaLink="false">https://xenodium.com/emacs-zones-to-lift-you-up</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/emacs-zoneb-tob-lift-you-up/zone.gif" alt=""></p>
<p>As I prune my <a href="https://github.com/xenodium/dotsies/">Emacs config</a> off, I came across a forgotten bit of elisp I wrote about 6 years ago. While it's not going to power up your Emacs fu, it may lift your spirits, or maybe just aid discovery of new words.</p>
<p>You see, I had forgotten about <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/play/zone.el">zone.el</a> altogether: a fabulous package to tickle your heart. You can think of it as screensaver built into Emacs.</p>
<p>If the built-in zones don't do it for ya, check out the few on melpa (<a href="https://depp.brause.cc/zone-nyan/">nyan</a>, <a href="https://github.com/kawabata/zone-sl">sl</a>, and <a href="https://xenodium.com/added-emacs-zone-rainbow/">rainbow</a>).</p>
<p>So, my nostalgic bit of elisp dates <code>Jun 17 2016</code>: a basic but functional zone (<a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/zone-words.el">zone-words</a>), displaying words from <a href="http://wordnet.princeton.edu/">WordNet</a>. Surely the package can use plenty of improvements (<a href="https://github.com/xenodium/dotsies/commit/00215e215be1413ea9d0085dd2de5123c635b8c0">here's one</a>), but hey this is Emacs and pretty much all existing code will run, no matter how old. In Emacs time, 2016 is practically yesterday!</p>
]]></description>
    <pubDate>Wed, 13 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: DWIM shell command (multi-language)</title>
<link>https://xenodium.com/emacs-dwim-shell-command-multi-language</link>
<guid isPermaLink="false">https://xenodium.com/emacs-dwim-shell-command-multi-language</guid>
    <description><![CDATA[<p>UPDATE: <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is now available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command-multi-language/csv.gif" alt=""></p>
<p>I keep on <a href="https://xenodium.com/png-to-icns-emacs-dwim-style/">goofying around</a> with <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> and it's sibling <code>dwim-shell-command-on-marked-files</code> from <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-command.el">dwim-shell-command.el</a>.</p>
<p>In addition to defaulting to <a href="https://en.wikipedia.org/wiki/Z_shell">zsh</a>, <code>dwim-shell-command-on-marked-files</code> now support other shells and languages. This comes in handy if you have snippets in different languages and would like to easily invoke them from Emacs. Multi-language support enables &quot;using the best tool for the job&quot; kinda thing. Or maybe you just happen to know how to solve a particular problem in a specific language.</p>
<p>Let's assume you have an existing Python snippet to convert files from csv to json. With <code>dwim-shell-command-on-marked-files</code>, you can invoke the Python snippet to operate on either <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> or buffer files.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-command-csv-to-json-via-python ()
  &quot;Convert csv file to json (via Python).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert csv file to json (via Python).&quot;
   &quot;
import csv
import json
text = json.dumps({ \&quot;values\&quot;: list(csv.reader(open('&lt;&lt;f&gt;&gt;')))})
fpath = '&lt;&lt;fne&gt;&gt;.json'
with open(fpath , 'w') as f:
  f.write(text)&quot;
   :shell-util &quot;python&quot;
   :shell-args &quot;-c&quot;))
</code></pre>
<p>Or, maybe you prefer Swift and already had a snippet for the same thing?</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-command-csv-to-json-via-swift ()
  &quot;Convert csv file to json (via Swift).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert csv file to json (via Swift).&quot;
   &quot;
    import Foundation
    import TabularData
    let filePath = \&quot;&lt;&lt;f&gt;&gt;\&quot;
    print(\&quot;reading \\(filePath)\&quot;)
    let content = try String(contentsOfFile: filePath).trimmingCharacters(in: .whitespacesAndNewlines)
    let parsedCSV = content.components(separatedBy: CSVWritingOptions().newline).map{
      $0.components(separatedBy: \&quot;,\&quot;)
    }
    let jsonEncoder = JSONEncoder()
    let jsonData = try jsonEncoder.encode([\&quot;value\&quot;: parsedCSV])
    let json = String(data: jsonData, encoding: String.Encoding.utf8)
    let outURL = URL(fileURLWithPath:\&quot;&lt;&lt;fne&gt;&gt;.json\&quot;)
    try json!.write(to: outURL, atomically: true, encoding: String.Encoding.utf8)
    print(\&quot;wrote \\(outURL)\&quot;)&quot;
   :shell-pipe &quot;swift -&quot;))
</code></pre>
<p>You can surely solve the same problem in elisp, but hey it's nice to have options and flexibility.</p>
]]></description>
    <pubDate>Sun, 10 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>png to icns (Emacs DWIM style)</title>
<link>https://xenodium.com/png-to-icns-emacs-dwim-style</link>
<guid isPermaLink="false">https://xenodium.com/png-to-icns-emacs-dwim-style</guid>
    <description><![CDATA[<p>UPDATE: <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is now available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>.</p>
<p><img src="https://xenodium.github.io/images/png-to-icns-emacs-dwim-style/icns.gif" alt=""></p>
<p>Since <a href="https://xenodium.com/emacs-dwim-shell-command/">writing a DWIM version of the shell-command</a>, I've been having a little fun <a href="https://xenodium.com/emacs-password-protect-current-pdf-revisited/">revisiting command line utilities</a> I sometimes invoke from my beloved editor. In this instance, converting a png file to an icns icon. What's more interesting about this case is that it's not just a one-liner, but a short script in itself. Either way, it's just as easy to invoke from Emacs using <code>dwim-shell-command--on-marked-files</code>.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-command-convert-image-to-icns ()
  &quot;Convert png to icns icon.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert png to icns icon&quot;
   &quot;
    # Based on http://stackoverflow.com/questions/12306223/how-to-manually-create-icns-files-using-iconutil
    # Note: png must be 1024x1024
    mkdir &lt;&lt;fne&gt;&gt;.iconset
    sips -z 16 16 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_16x16.png'
    sips -z 32 32 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_16x16@2x.png'
    sips -z 32 32 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_32x32.png'
    sips -z 64 64 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_32x32@2x.png'
    sips -z 128 128 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_128x128.png'
    sips -z 256 256 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_128x128@2x.png'
    sips -z 256 256 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_256x256@2x.png'
    sips -z 512 512 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_512x512.png'
    sips -z 512 512 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_256x256@2x.png'
    sips -z 1024 1024 '&lt;&lt;f&gt;&gt;' --out '&lt;&lt;fne&gt;&gt;.iconset/icon_512x512@2x.png'
    iconutil -c icns '&lt;&lt;fne&gt;&gt;.iconset'&quot;
   :utils '(&quot;sips&quot; &quot;iconutil&quot;)
   :extensions &quot;png&quot;))
</code></pre>
]]></description>
    <pubDate>Sat, 09 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Password-protect current pdf (revisited)</title>
<link>https://xenodium.com/emacs-password-protect-current-pdf-revisited</link>
<guid isPermaLink="false">https://xenodium.com/emacs-password-protect-current-pdf-revisited</guid>
    <description><![CDATA[<p>UPDATE: <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is now available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-password-protect-current-pdf-revisited/passprotect.gif" alt=""></p>
<p>With a recent look at writing <a href="https://xenodium.com/emacs-dwim-shell-command/">DWIM shell commands</a>, I've been revisiting my custom Emacs functions invoking command line utilities.</p>
<p>Take this <a href="https://xenodium.com/emacs-password-protect-current-pdf/">post</a>, for example, where I invoke <a href="https://github.com/qpdf/qpdf">qpdf</a> via a elisp. Using the new <code>dwim-shell-command--on-marked-files</code> in <a href="https://github.com/xenodium/dwim-shell-command/blob/main/dwim-shell-command.el">dwim-shell-command.el</a>, the code is stripped down to a bare minimum:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-pdf-password-protect ()
  &quot;Password protect pdf.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Password protect pdf&quot;
   (format &quot;qpdf --verbose --encrypt '%s' '%s' 256 -- '&lt;&lt;f&gt;&gt;' '&lt;&lt;fne&gt;&gt;_enc.&lt;&lt;e&gt;&gt;'&quot;
           (read-passwd &quot;user-password: &quot;)
           (read-passwd &quot;owner-password: &quot;))
   :utils &quot;qpdf&quot;
   :extensions &quot;pdf&quot;))
</code></pre>
<p>Compare the above <code>dwim-shell-command--on-marked-files</code> usage to my <a href="https://xenodium.com/emacs-password-protect-current-pdf/">previous implementation</a>:</p>
<pre><code class="language-{.commonlisp">(defun pdf-password-protect ()
  &quot;Password protect current pdf in buffer or `dired' file.&quot;
  (interactive)
  (unless (executable-find &quot;qpdf&quot;)
    (user-error &quot;qpdf not installed&quot;))
  (unless (equal &quot;pdf&quot;
                 (or (when (buffer-file-name)
                       (downcase (file-name-extension (buffer-file-name))))
                     (when (dired-get-filename nil t)
                       (downcase (file-name-extension (dired-get-filename nil t))))))
    (user-error &quot;no pdf to act on&quot;))
  (let* ((user-password (read-passwd &quot;user-password: &quot;))
         (owner-password (read-passwd &quot;owner-password: &quot;))
         (input (or (buffer-file-name)
                    (dired-get-filename nil t)))
         (output (concat (file-name-sans-extension input)
                         &quot;_enc.pdf&quot;)))
    (message
     (string-trim
      (shell-command-to-string
       (format &quot;qpdf --verbose --encrypt '%s' '%s' 256 -- '%s' '%s'&quot;
               user-password owner-password input output))))))
</code></pre>
<p>This really changes things for me. I'll be more inclined to add more of these tiny integrations to lots of great command line utilities. Take this recent <a href="https://news.ycombinator.com/item?id=32028752">Hacker News post</a> on <a href="https://github.com/ocrmypdf/OCRmyPDF">ocrmypdf</a> as an example. Their <a href="https://ocrmypdf.readthedocs.io/en/latest/cookbook.html">cookbook</a> has lots of examples that can be easily used via <code>dwim-shell-command--on-marked-files</code>.</p>
<p>What command line utils would you use?</p>
]]></description>
    <pubDate>Sat, 09 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs DWIM shell-command</title>
<link>https://xenodium.com/emacs-dwim-shell-command</link>
<guid isPermaLink="false">https://xenodium.com/emacs-dwim-shell-command</guid>
    <description><![CDATA[<p>UPDATE: <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is now available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>.</p>
<p>I've <a href="https://xenodium.com/emacs-dwim-do-what-i-mean/">talked about DWIM before</a>, where I bend Emacs to help me do what I mean. Emacs is also great for <a href="https://xenodium.com/emacs-password-protect-current-pdf/">wrapping command-line one-liners with elisp</a>, so I can quickly invoke commands without thinking too much about flags, arguments, etc.</p>
<p>I keep thinking the <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell.html">shell-command</a> is ripe for plenty of enhancements using our DWIM fairydust.</p>
<h2>Do what I mean how?</h2>
<h3>Smart template instantiation</h3>
<p>I've drawn inspiration from <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Commands-in-Dired.html">dired-do-shell-command</a>, which substitutes special characters like * and ? with marked files. I'm also drawing inspiration from <a href="https://orgmode.org/worg/org-contrib/babel/">org babel</a>'s <a href="https://orgmode.org/manual/Noweb-Reference-Syntax.html">noweb</a> syntax to substitute <code>&lt;&lt;f&gt;&gt;</code> (file path), <code>&lt;&lt;fne&gt;&gt;</code> (file path without extension), and <code>&lt;&lt;e&gt;&gt;</code> (extension). My initial preference was to use something like <code>$f</code>, <code>$fne</code>, and <code>$e</code>, but felt they clashed with shell variables.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/template.png" alt=""></p>
<h3>Operate on dired marked files</h3>
<p>This is DWIM, so if we're visiting a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> buffer, the shell command should operate on all the marked files.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/diredmark.gif" alt=""></p>
<h3>Operate on current buffer file</h3>
<p>Similarly, if visiting a buffer with an associated file, operate on that file instead.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/blur.png" alt=""></p>
<h3>Automatically take me to created files</h3>
<p>Did the command create a new file in the current directory? Take me to it, right away.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/showme.png" alt=""></p>
<h3>Show me output on error</h3>
<p>I'm not usually interested in the command output when generating new files, unless there was an error of course. Offer to show it.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/couldnt.png" alt=""></p>
<h3>Show me output if no new files</h3>
<p>Not all commands generate new files, so automatically show me the output for these instances.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/apple.gif" alt=""></p>
<h3>Make it easy to create utilities</h3>
<p><a href="https://ffmpeg.org/">ffmpeg</a> is awesome, but man I can never remember all the flags and arguments. I may as well wrap commands like these in a convenient elisp function and invoke via <a href="https://www.gnu.org/software/emacs/manual/html_node/efaq/Extended-commands.html">execute-extended-command</a>, or my favorite <a href="http://oremacs.com/swiper/#minibuffer-key-bindings">counsel-M-x</a> (with completion), bound to the vital <code>M-x</code>.</p>
<p>All those gifs you see in this post were created with <code>dwim-shell-command-convert-to-gif</code>, powered by the same elisp magic.</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-command-convert-to-gif ()
  &quot;Convert all marked videos to optimized gif(s).&quot;
  (interactive)
  (dwim-shell-command--on-marked-files
   &quot;Convert to gif&quot;
   &quot;ffmpeg -loglevel quiet -stats -y -i &lt;&lt;f&gt;&gt; -pix_fmt rgb24 -r 15 &lt;&lt;fne&gt;&gt;.gif&quot;
   :utils &quot;ffmpeg&quot;))
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/togif_x1.5.gif" alt=""></p>
<p>This makes wrapping one-liners a breeze, so let's do some more…</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-command-convert-audio-to-mp3 ()
  &quot;Convert all marked audio to mp3(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert to mp3&quot;
   &quot;ffmpeg -stats -n -i '&lt;&lt;f&gt;&gt;' -acodec libmp3lame '&lt;&lt;fne&gt;&gt;.mp3'&quot;
   :utils &quot;ffmpeg&quot;))

(defun dwim-shell-command-convert-image-to-jpg ()
  &quot;Convert all marked images to jpg(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert to jpg&quot;
   &quot;convert -verbose '&lt;&lt;f&gt;&gt;' '&lt;&lt;fne&gt;&gt;.jpg'&quot;
   :utils &quot;convert&quot;))

(defun dwim-shell-command-drop-video-audio ()
  &quot;Drop audio from all marked videos.&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Drop audio&quot; &quot;ffmpeg -i '&lt;&lt;f&gt;&gt;' -c copy -an '&lt;&lt;fne&gt;&gt;_no_audio.&lt;&lt;e&gt;&gt;'&quot;
   :utils &quot;ffmpeg&quot;))
</code></pre>
<h3>Make it spin ;)</h3>
<p>Ok, not quite, but use Emacs's <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Progress.html">progress-reporter</a> just for kicks.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-shell-command/progress.gif" alt=""></p>
<h2>Use it everywhere</h2>
<p><code>dwim-shell-command</code> covers my needs (so far anyway), so I'm binding it to existing bindings.</p>
<pre><code class="language-{.commonlisp">(use-package dwim-shell-command
  :bind
  (&quot;M-!&quot; . dwim-shell-command))

(use-package dired
  :bind (:map dired-mode-map
              ([remap dired-do-async-shell-command] . dwim-shell-command)
              ([remap dired-do-shell-command] . dwim-shell-command)
              ([remap dired-smart-shell-command] . dwim-shell-command)))
</code></pre>
<h2>Bring those command line utilities</h2>
<p>On the whole, this really changes things for me. I'll be more inclined to bring command line utilities to seamless Emacs usage. Take this recent <a href="https://news.ycombinator.com/item?id=32028752">Hacker News post</a> on <a href="https://github.com/ocrmypdf/OCRmyPDF">ocrmypdf</a> as an example. Their <a href="https://ocrmypdf.readthedocs.io/en/latest/cookbook.html">cookbook</a> has lots of examples that can be easily used via <code>dwim-shell-command--on-marked-files</code>. What command line utilities would you bring?</p>
<h2>Where's the code?</h2>
<p>UPDATE: <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a> is now available on <a href="https://melpa.org/#/dwim-shell-command">melpa</a>.</p>
<p>The code for <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/dwim-shell-command.el">dwim-shell-command.el</a> is likely a bit rough still, but you can take a peek if interested. Keep in mind this is DWIM, tailored for what ✨I✨ mean. Some of the current behavior may not be your cup of tea, but this is Emacs. You can bend it to do what ✨you✨ mean. Happy Emacsing.</p>
]]></description>
    <pubDate>Thu, 07 Jul 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Password-protect current pdf</title>
<link>https://xenodium.com/emacs-password-protect-current-pdf</link>
<guid isPermaLink="false">https://xenodium.com/emacs-password-protect-current-pdf</guid>
    <description><![CDATA[<p>UPDATE: Check out <a href="https://xenodium.com/emacs-password-protect-current-pdf-revisited">Password-protect current pdf (revisted)</a> for a simpler version.</p>
<p>Every so often, I need to password-protect a pdf. On macOS, <a href="https://support.apple.com/en-gb/guide/preview/prvw587dd90f/mac">Preview has a simple solution</a>, but I figured there must be a command line utility to make this happen. There are options, but <a href="https://github.com/qpdf/qpdf">qdf</a> did the job just fine.</p>
<pre><code class="language-{.bash">qpdf --verbose --encrypt USER-PASSWORD OWNER-PASSWORD KEY-LENGTH -- input.pdf output.pdf
</code></pre>
<p>So what does <code>qpdf</code> have to do with Emacs? Command-line utilities are easy to invoke from Emacs via <code>shell-command</code> (M-!), but I don't want to remember the command nor the parameters. I may as well add a function that <a href="https://xenodium.com/emacs-dwim-do-what-i-mean/">does what I mean</a> and password-protect either buffers or <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> files.</p>
<pre><code class="language-{.commonlisp">(defun pdf-password-protect ()
    &quot;Password protect current pdf in buffer or `dired' file.&quot;
    (interactive)
    (unless (executable-find &quot;qpdf&quot;)
      (user-error &quot;qpdf not installed&quot;))
    (unless (equal &quot;pdf&quot;
                   (or (when (buffer-file-name)
                         (downcase (file-name-extension (buffer-file-name))))
                       (when (dired-get-filename nil t)
                         (downcase (file-name-extension (dired-get-filename nil t))))))
      (user-error &quot;no pdf to act on&quot;))
    (let* ((user-password (read-passwd &quot;user-password: &quot;))
           (owner-password (read-passwd &quot;owner-password: &quot;))
           (input (or (buffer-file-name)
                      (dired-get-filename nil t)))
           (output (concat (file-name-sans-extension input)
                           &quot;_enc.pdf&quot;)))
      (message
       (string-trim
        (shell-command-to-string
         (format &quot;qpdf --verbose --encrypt '%s' '%s' 256 -- '%s' '%s'&quot;
                 user-password owner-password input output))))))
</code></pre>
]]></description>
    <pubDate>Thu, 02 Jun 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org v1.4 released</title>
<link>https://xenodium.com/plain-org-v14-released</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-v14-released</guid>
    <description><![CDATA[<p><a href="https://plainorg.com">Plain Org</a> v1.4 is now available on the <a href="https://apps.apple.com/app/id1578965002">App Store</a>.</p>
<p>I was on a long flight recently 🦘, so I gave list and checkbox editing a little love. There's a couple of other minor improvements included.</p>
<p>If you haven't heard of <a href="https://plainorg.com">Plain Org</a>, it gives you access to <a href="https://orgmode.org">org</a> files on iPhone while away from your beloved <a href="https://www.gnu.org/software/emacs/">Emacs</a>.</p>
<p>I love org markup, but we (iPhone + org users) are a fairly niche bunch. If you're finding Plain Org useful, <strong>please help support this effort</strong> by getting the word out. Tell your friends, <a href="https://twitter.com/intent/tweet?text=Plain%20Org%20https%3A%2F%2Fapps.apple.com%2Fapp%2Fid1578965002%20">tweet</a>, or blog about it.</p>
<p>On to v1.4 release notes…</p>
<h2>Improved list/checkbox editing</h2>
<p>Adding list or checkbox items is traditionally cumbersome via the iPhone's keyboard. This release adds new toolbar actions and smart return to simplify things.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v14-released/list_this.gif" alt=""></p>
<h2>Render form feed characters</h2>
<p>Form feed characters are now rendered within expanded headings.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v14-released/form_feed.jpg" alt=""></p>
<p>Note: There's a limitation. Form feed characters at the end of a heading aren't currently displayed.</p>
<h2>Other</h2>
<p>Increased all button tap areas in edit toolbar. This should hopefully improve interaction.</p>
]]></description>
    <pubDate>Sun, 24 Apr 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org v1.3 released</title>
<link>https://xenodium.com/plain-org-v130-released</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-v130-released</guid>
    <description><![CDATA[<p><a href="https://plainorg.com">Plain Org</a> v1.3 is now available on the <a href="https://apps.apple.com/app/id1578965002">App Store</a>. The update receives a few features, bug fixes, and improvements.</p>
<p>If you haven't heard of <a href="https://plainorg.com">Plain Org</a>, it gives you access to <a href="https://orgmode.org">org</a> files on iPhone while away from your beloved <a href="https://www.gnu.org/software/emacs/">Emacs</a>.</p>
<p>I love org markup, but we (iPhone + org users) are a fairly niche bunch. If you're finding Plain Org useful, <strong>please help support this effort</strong> by getting the word out. Tell your friends, <a href="https://twitter.com/intent/tweet?text=Plain%20Org%20https%3A%2F%2Fapps.apple.com%2Fapp%2Fid1578965002%20">tweet</a>, or blog about it.</p>
<p>On to v1.3 release notes…</p>
<h2>Toggle recurring tasks</h2>
<p>You can now toggle recurring tasks with either catchup <code>&lt;2022-04-15 Fri ++1d&gt;</code>, restart <code>&lt;2022-04-15 Fri .+1d&gt;</code>, or cumulate <code>&lt;2022-04-15 Fri +1d&gt;</code> repeaters.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v130-released/recurring.gif" alt=""></p>
<h2>Log state transitions</h2>
<p><img src="https://xenodium.github.io/images/plain-org-v130-released/logging.gif" alt=""></p>
<h2>Fullscreen view</h2>
<p>The navigation bar now hides on scroll. This can be enabled/disabled via <code>View &gt; Full Screen</code> menu.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v130-released/fullscreen.gif" alt=""></p>
<p>The previous screenshot text comes from <a href="http://doc.norang.ca/org-mode.html">Org Mode - Organize Your Life In Plain Text</a>, a magnificent org resource.</p>
<h2>Deadline and scheduled date rendered</h2>
<p>In the past, <code>SCHEDULED</code> and <code>DEADLINE</code> were rendered (but only one of them at a time). Now both are rendered alongside each other (deadline has an orange tint).</p>
<p><img src="https://xenodium.github.io/images/plain-org-v130-released/deadline_scheduled.png" alt=""></p>
<h2>Roundtripping fidelity</h2>
<p>Many roundtripping fidelity improvements included in 1.3. Shoutout to <a href="https://www.reddit.com/user/Oerm/">u/Oerm</a> who reported <a href="https://www.reddit.com/r/plainorg/comments/ty7onh/changing_todo_status_of_one_item_triggers/">unnecessary formatting changes</a> in unmodified areas and helped test all fixes.</p>
<h2>Other bug fixes improvements</h2>
<ul>
<li>Disable raw text edit menu when file is not accessible.</li>
<li>Minor improvements to inline editing layouts (vertical height and drawers).</li>
<li>ABRT and HABIT now recognized as a popular keywords.</li>
<li>Improve state transition alignment to match org mode behaviour.</li>
<li>Fixes roundtripping state transition notes (leading to data loss).</li>
<li>Log creation from share sheet.</li>
<li>Increment DEADLINE <strong>and</strong> SCHEDULED, not just first found.</li>
<li>Roundtrip more whitespace in untouched areas.</li>
<li>Fixes org syntax inadvertently parsed within begin_src blocks (leading to data loss).</li>
</ul>
]]></description>
    <pubDate>Fri, 15 Apr 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org v1.2.1 released</title>
<link>https://xenodium.com/plain-org-v121-released</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-v121-released</guid>
    <description><![CDATA[<p><a href="https://plainorg.com">Plain Org</a> v1.2.1 is now available on the <a href="https://apps.apple.com/app/id1578965002">App Store</a>. The update receives minor features, bug fixes, and improvements.</p>
<p>If you haven't heard of <a href="https://plainorg.com">Plain Org</a>, it gives you access to <a href="https://orgmode.org">org</a> files on iPhone while away from your beloved <a href="https://www.gnu.org/software/emacs/">Emacs</a>.</p>
<p>I love org markup, but we (iPhone + org users) are a fairly niche userbase. If you're finding Plain Org useful, <strong>please help support this effort</strong> by getting the word out. Tell your friends, <a href="https://twitter.com/intent/tweet?text=Plain%20Org%20https%3A%2F%2Fapps.apple.com%2Fapp%2Fid1578965002%20">tweet</a>, or blog about it.</p>
<p>On to v1.2.1 release notes…</p>
<h2>Render LOGBOOK</h2>
<p>State transitions and LOGBOOK drawers are now recognized and rendered as such.</p>
<p>Either of the following snippets are rendered as togglable LOGBOOK drawers.</p>
<pre><code class="language-org">* TODO Feed the fish
- State &quot;DONE&quot;       from &quot;TODO&quot;       [2022-03-11 Fri 12:23]
</code></pre>
<pre><code class="language-org">* TODO Feed the cat
:LOGBOOK:
- State &quot;DONE&quot;       from &quot;TODO&quot;       [2022-03-11 Fri 12:23]
:END:
</code></pre>
<p><img src="https://xenodium.github.io/images/plain-org-v121-released/logbook.jpg" alt=""></p>
<h2>Add task to top/bottom</h2>
<p>Up until now, tasks were always appended to the bottom of things. This didn't work so well if you like seeing recent items bubbling up to the top.</p>
<p>This version adds a new setting: <em>Settings</em> &gt; <em>Add new tasks to</em> &gt; <em>Top/Bottom</em>, giving you the choice.</p>
<p>Note: Top is the new default value, please change this setting if you'd like to keep the previous behaviour.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v121-released/top_bottom.png" alt=""></p>
<h2>Checking for changes</h2>
<p>Local file changes aren't always detected via <a href="https://developer.apple.com/documentation/uikit/uidocument/1619945-statechangednotification">state change notifications</a>, so additional checks are now in place to offer reloading files.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v121-released/reload.jpg" alt=""></p>
<h2>Open inactive files</h2>
<p>After adding new tasks via iOS's share sheet, if the item was added to a file other than the active one, offer to open that instead.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v121-released/load_other.jpg" alt=""></p>
<h2>Other improvements</h2>
<ul>
<li>Color keyword red/green depending on #+TODO: position.</li>
<li>Round-trip planning order (SCHEDULED, CLOSED, DEADLINE).</li>
<li>Improve tag alignment to match org mode behaviour (best effort, sorry).</li>
<li>Improve vertical spacing prior to lists.</li>
<li>Improve share sheet reliability.</li>
<li>Fix opening local links from list items.</li>
<li>Fix indent for list items without previous content.</li>
<li>Fix race condition in adding TITLE and ID to new files.</li>
<li>Fix incorrect keyword color selection in search toolbar.</li>
<li>Fix menu inadvertently closing.</li>
<li>Fix menu tapping for iPad.</li>
</ul>
]]></description>
    <pubDate>Sun, 27 Mar 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs DWIM: swiper vs isearch vs phi-search</title>
<link>https://xenodium.com/emacs-dwim-swiper-vs-isearch-vs-phi-search</link>
<guid isPermaLink="false">https://xenodium.com/emacs-dwim-swiper-vs-isearch-vs-phi-search</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/emacs-dwim-swiper-vs-isearch-vs-phi-search/search-dwim.gif" alt=""></p>
<p>I've <a href="https://xenodium.com/emacs-dwim-do-what-i-mean/">talked about DWIM</a> in the past, that wonderful Emacs ability to <a href="https://en.wikipedia.org/wiki/DWIM">do what ✨I✨ mean</a>.</p>
<p>Emacs being hyper-configurable, we can always teach it more things, so it can do exactly what we mean.</p>
<p>There are no shortages of buffer searching packages for Emacs. I'm a fan of Oleh Krehel's <a href="https://github.com/abo-abo/swiper">swiper</a>, but before that, I often relied on the built-in <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Isearch.html">isearch</a>. Swiper is my default goto mechanism and have it bound to <code>C-s</code> (replacing the built-in <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Isearch.html">isearch-forward</a>).</p>
<p>Swiper services most needs until I start combining with other tools. Take <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html">keyboard macros</a> and <a href="https://github.com/magnars/multiple-cursors.el">multiple cursors</a>. Both wonderful, but neither can rely on swiper to do their thing. Ok, swiper does, but <a href="https://xenodium.com/emacs-swiper-and-multiple-cursors/">in a different way</a>.</p>
<p>Rather than binding <code>C-s</code> to swiper, let's write a DWIM function that's aware of macros and multiple cursors. It must switch between swiper, isearch, and <a href="https://github.com/avkoval/phi-search">phi-search</a> depending on what I want (search buffer, define macro, or search multiple cursors).</p>
<p>Let's also tweak swiper's behavior a little further and prepopulate its search term with the active region. Oh, and I also would like swiper to wrap around (see <a href="http://oremacs.com/swiper/">ivy-wrap</a>). But only swiper, not other ivy utilities. I know, I'm picky, but that's the whole point of DWIM… so here's my function to search forward that does exactly what ✨I✨ mean:</p>
<pre><code class="language-{.commonlisp">(defun ar/swiper-isearch-dwim ()
  (interactive)
  ;; Are we using multiple cursors?
  (cond ((and (boundp 'multiple-cursors-mode)
              multiple-cursors-mode
              (fboundp  'phi-search))
         (call-interactively 'phi-search))
        ;; Are we defining a macro?
        (defining-kbd-macro
          (call-interactively 'isearch-forward))
        ;; Fall back to swiper.
        (t
         ;; Wrap around swiper results.
         (let ((ivy-wrap t))
           ;; If region is active, prepopulate swiper's search term.
           (if (and transient-mark-mode mark-active (not (eq (mark) (point))))
               (let ((region (buffer-substring-no-properties (mark) (point))))
                 (deactivate-mark)
                 (swiper-isearch region))
             (swiper-isearch))))))
</code></pre>
<p>The above snippet searches forward, but I'm feeling a little off-balance. Let's write an equivalent to search backwards. We can then bind it to <code>C-r</code>, also overriding the built-in <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Isearch.html">isearch-backward</a>.</p>
<pre><code class="language-{.commonlisp">(defun ar/swiper-isearch-backward-dwim ()
  (interactive)
  ;; Are we using multiple cursors?
  (cond ((and (boundp 'multiple-cursors-mode)
              multiple-cursors-mode
              (fboundp  'phi-search-backward))
         (call-interactively 'phi-search-backward))
        ;; Are we defining a macro?
        (defining-kbd-macro
          (call-interactively 'isearch-backward))
        ;; Fall back to swiper.
        (t
         ;; Wrap around swiper results.
         (let ((ivy-wrap t))
           ;; If region is active, prepopulate swiper's search term.
           (if (and transient-mark-mode mark-active (not (eq (mark) (point))))
               (let ((region (buffer-substring-no-properties (mark) (point))))
                 (deactivate-mark)
                 (swiper-isearch-backward region))
             (swiper-isearch-backward))))))
</code></pre>
<p>These may be on the hacky side of things, but hey… they do the job. If there are better/supported ways of accomplishing a similar thing, I'd love to <a href="https://twitter.com/xenodium">hear about it</a>.</p>
]]></description>
    <pubDate>Sat, 26 Mar 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Grandma's vanilla pound cake</title>
<link>https://xenodium.com/grandmas-vanilla-pound-cake</link>
<guid isPermaLink="false">https://xenodium.com/grandmas-vanilla-pound-cake</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/grandmas-vanilla-pound-cake/pound_cake.jpg" alt=""></p>
<p>My grandmother Hilda used to bake this for us grandkids. I don't know the origin of the recipe, but my parents, aunts, and cousins, they all bake it too. I'm a big fan, but only get to eat it when visiting. Yesterday, I changed that. Finally baked it myself ø/</p>
<h2>Ingredients</h2>
<ul>
<li>200g salted butter</li>
<li>2 cups (400 g) sugar</li>
<li>4 eggs</li>
<li>3 cups (375 g) plain flour</li>
<li>3 teaspoons baking powder</li>
<li>1 tablespoon (15 ml) vanilla extract</li>
<li>1 cup (250 ml) milk</li>
<li>2 tablespoons (30 ml) Málaga Virgen wine (port works too)</li>
</ul>
<h2>Prep</h2>
<ul>
<li>Ensure all ingredients are at room temperature before you start.</li>
<li>Preheat oven at 175C.</li>
<li>Separate egg yolks and whites. Keep both.</li>
<li>Consolidate liquids into a bowl (milk + wine + vanilla).</li>
<li>Consolidate sifted powders into a bowl (flour + baking powder).</li>
</ul>
<h2>Meringue</h2>
<ul>
<li>Beat egg whites into a snowy meringue. Set aside.</li>
</ul>
<h2>Mixer</h2>
<ul>
<li>Beat butter in the mixer until creamy (important).</li>
<li>Add sugar and mix thoroughly ensuring creamy consistency remains (important).</li>
<li>Mix yolks in thoroughly one by one.</li>
<li>Mix in the meringue.</li>
<li>You're done with the mixer.</li>
</ul>
<h2>Hand mixing</h2>
<ul>
<li>With a wooden spoon, alternate hand mixing the liquids and the powders. Start with liquids and end with powders.</li>
</ul>
<h2>Pour into mould</h2>
<ul>
<li>Pour the mix into a non-stick baking mould.</li>
</ul>
<h2>Bake</h2>
<ul>
<li>Bake in oven between 60 and 70 mins, but don’t be afraid to leave longer if needed. Mileage varies across ovens.</li>
<li>Use a cake tester after 60 minutes to decide how much longer to bake for (if needed).</li>
</ul>
]]></description>
    <pubDate>Sat, 12 Mar 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: viewing webp images</title>
<link>https://xenodium.com/emacs-viewing-webp-images</link>
<guid isPermaLink="false">https://xenodium.com/emacs-viewing-webp-images</guid>
    <description><![CDATA[<p>There's a recent reddit post asking how to <a href="https://www.reddit.com/r/emacs/comments/t76isx/viewing_webp_images_in_emacs/">view webp images in Emacs</a>. I didn't know the answer, but it's something I had wanted for some time. This post was a nice reminder to go and check things out. Was happy to <a href="https://www.reddit.com/r/emacs/comments/t76isx/comment/hzft7ww/?utm_source=share&amp;utm_medium=web2x&amp;context=3">contribute an answer</a>.</p>
<p>Turns out, it's very simple. Just set <code>image-use-external-converter</code> and install relevant external tools.</p>
<pre><code class="language-{.commonlisp">(setq image-use-external-converter t)
</code></pre>
<p>I'm a <code>use-package</code> user, so I prefer to set with:</p>
<pre><code class="language-{.commonlisp">(use-package image
  :custom
  ;; Enable converting external formats (ie. webp) to internal ones.
  (image-use-external-converter t))
</code></pre>
<p>So what are the external tools needed? <code>C-h v</code> <code>image-use-external-converter</code> gives us the info we need:</p>
<blockquote>
<p>If non-nil, create-image will use external converters for exotic formats.</p>
<p>Emacs handles most of the common image formats (SVG, JPEG, PNG, GIF and some others) internally, but images that don't have native support in Emacs can still be displayed if an external conversion program (like ImageMagick &quot;convert&quot;, GraphicsMagick &quot;gm&quot; or &quot;ffmpeg&quot;) is installed.</p>
<p>This variable was added, or its default value changed, in Emacs 27.1.</p>
</blockquote>
<p>I happen to be a macOS user, so I install ImageMagick with:</p>
<pre><code class="language-{.bash">brew install imagemagick
</code></pre>
]]></description>
    <pubDate>Sat, 05 Mar 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Fuzzy search Apple's online docs</title>
<link>https://xenodium.com/emacs-fuzzy-search-apples-online-docs</link>
<guid isPermaLink="false">https://xenodium.com/emacs-fuzzy-search-apples-online-docs</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/emacs-fuzzy-search-apples-online-docs/color_search.gif" alt=""></p>
<p>When building software for the Apple ecosystem, Xcode is often the editor of choice. With <a href="https://www.gnu.org/software/emacs/">Emacs</a> being my personal preference, I rarely find other iOS devs with a similar mindset.</p>
<p>When I saw <a href="https://twitter.com/konrad1977">Mikael Konradsson</a>'s post describing <a href="https://www.reddit.com/r/emacs/comments/sndriv/i_finally_got_full_autocompetion_in_swift_with/">his Emacs Swift development setup</a>, I reached out to say hello. While exchanging tips and tricks, the topic of searching Apple's docs came up. It had been a while since I looked into this, so it was a great reminder to revisit the space.</p>
<p>Back in June 2020, I wrote a snippet to <a href="https://xenodium.com/emacs-search-hackingwithswiftcom/">fuzzy search hackingwithswift.com</a>, using Emacs's <a href="https://github.com/abo-abo/swiper">ivy</a> completion framework. With a similar online API, we could also search Apple's docs. Turns out, there is and we can we can use it to search <a href="https://developer.apple.com/search">developer.apple.com</a> from our beloved editor.</p>
<pre><code class="language-{.commonlisp">;;; counsel-apple-search.el -*- lexical-binding: t; -*-

(defun ar/counsel-apple-search ()
  &quot;Ivy interface for dynamically querying apple.com docs.&quot;
  (interactive)
  (require 'request)
  (require 'json)
  (require 'url-http)
  (ivy-read &quot;apple docs: &quot;
            (lambda (input)
              (let* ((url (url-encode-url (format &quot;https://developer.apple.com/search/search_data.php?q=%s&quot; input)))
                     (c1-width (round (* (- (window-width) 9) 0.3)))
                     (c2-width (round (* (- (window-width) 9) 0.5)))
                     (c3-width (- (window-width) 9 c1-width c2-width)))
                (or
                 (ivy-more-chars)
                 (let ((request-curl-options (list &quot;-H&quot; (string-trim (url-http-user-agent-string)))))
                   (request url
                     :type &quot;GET&quot;
                     :parser 'json-read
                     :success (cl-function
                               (lambda (&amp;key data &amp;allow-other-keys)
                                 (ivy-update-candidates
                                  (mapcar (lambda (item)
                                            (let-alist item
                                              (propertize
                                               (format &quot;%s   %s   %s&quot;
                                                       (truncate-string-to-width (propertize (or .title &quot;&quot;)
                                                                                             'face '(:foreground &quot;yellow&quot;)) c1-width nil ?\s &quot;…&quot;)
                                                       (truncate-string-to-width (or .description &quot;&quot;) c2-width nil ?\s &quot;…&quot;)
                                                       (truncate-string-to-width (propertize (string-join (or .api_ref_data.languages &quot;&quot;) &quot;/&quot;)
                                                                                             'face '(:foreground &quot;cyan1&quot;)) c3-width nil ?\s &quot;…&quot;))
                                               'url .url)))
                                          (cdr (car data)))))))
                   0))))
            :action (lambda (selection)
                      (browse-url (concat &quot;https://developer.apple.com&quot;
                                          (get-text-property 0 'url selection))))
            :dynamic-collection t
            :caller 'ar/counsel-apple-search))
</code></pre>
]]></description>
    <pubDate>Mon, 21 Feb 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org v1.2 released</title>
<link>https://xenodium.com/plain-org-v12-released</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-v12-released</guid>
    <description><![CDATA[<p>Although <a href="https://plainorg.com">Plain Org</a> v1.2 has been in the <a href="https://apps.apple.com/app/id1578965002">App Store</a> for a little while, the release write-up was overdue, sorry. The update receives some new features and bugfixes.</p>
<p>If you haven't heard of <a href="https://plainorg.com">Plain Org</a>, it gives ya access to your <a href="https://orgmode.org">org files</a> on iOS while away from your beloved <a href="https://www.gnu.org/software/emacs/">Emacs</a>.</p>
<p>If you're finding Plain Org useful, <strong>please help support this effort</strong> by getting the word out. Tell your friends, <a href="https://twitter.com/intent/tweet?text=Plain%20Org%20https%3A%2F%2Fapps.apple.com%2Fapp%2Fid1578965002%20">tweet</a>, or blog about it.</p>
<p>Ok, now on to what's included in the v1.2 release…</p>
<h2>Edit heading sections inline</h2>
<p>v1.0 introduced outline editing (for headings only). In v1.2, we can also edit section content. Press the <code>return</code> key multiple times to exit out section editing.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/inline.gif" alt=""></p>
<h2>Filter by keyword/priority/tag</h2>
<p>From the search dialog, you can now filter by keyboard, priority, and tag.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/select_filter.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/filter_results.png" alt=""></p>
<h2>Render drawers and properties</h2>
<p>Drawers are now rendered and can be expanded to view their content.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/drawer.gif" alt=""></p>
<h2>Open files via the Files app's &quot;Share&quot; sheet</h2>
<p>From the Files app, you can now explicitly request launching files in Plain Org by using the &quot;Share&quot; menu.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/share.png" alt=""></p>
<h2>Render LaTeX src blocks (experimental)</h2>
<p>This one has its rough edges at the moment, so have to mark it [experimental]{.underline}, but… you can can now render <code>#+begin_src latex</code> blocks.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/latex_src.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/latex_render.png" alt=""></p>
<h2>Insert title/id in new files</h2>
<p>New files created via Plain Org automatically get <code>#+TITLE:</code> and <code>:ID:</code> inserted by default as follows:</p>
<pre><code class="language-org">#+TITLE: My favorite title
:PROPERTIES:
:ID:       7C845D38-8D80-41B5-BEB1-94F673807355
:END:
</code></pre>
<p><em>UPDATE</em>: Sorry, this feature currently has a bug. You may not get these values inserted into your new document. Working on a fix.</p>
<h2>Adding new tags quicker</h2>
<p>Add tags quicker via the new + button.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/new_tag.png" alt=""></p>
<h2>Enable/disable sticky tags</h2>
<p>Keywords, indent, and tags are maintained when adding new headings via outline editing. If you prefer disabling sticky tags, this can now be disabled.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/sticky_tags_setting.png" alt=""></p>
<h2>Improved navigation bar</h2>
<p>v1.2 makes the navigation bar feel more at home on your iPhone. It uses a large title which scrolls into the navigation bar.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v12-released/navbar.gif" alt=""></p>
<h2>Bugfixes</h2>
<ul>
<li>Fix table rendering for iPad width.</li>
<li>Fix image's horizontal padding.</li>
<li>Fix adding new tags on new headings.</li>
<li>Fix snapshotting bug resulting in Syncthing conflicts.</li>
<li>Fix tapping menu after presenting other dialogs.</li>
<li>Filter out parenthesis in file-local keywords like <code>TODO(t)</code>.</li>
<li>Commit pending inline changes if search is requested.</li>
<li>Fix opening local links inside tables.</li>
<li>Roundtrip whitespace in empty headings.</li>
<li>Roundtrip trailing whitespace when raw-editing heading content.</li>
<li>Tapping on body content should not toggle expansion.</li>
</ul>
<br/>
<center>
  <a href="https://apps.apple.com/app/id1578965002">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Sun, 13 Feb 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Happy New Year and forming new habits</title>
<link>https://xenodium.com/happy-new-year-and-forming-new-habits</link>
<guid isPermaLink="false">https://xenodium.com/happy-new-year-and-forming-new-habits</guid>
    <description><![CDATA[<p>Hacker News has a <a href="https://news.ycombinator.com/item?id=29774859">summary of Atomic Habits</a> (the <a href="https://jamesclear.com/atomic-habits">book</a>). In my case, I really enjoyed reading the entire book. I liked its narrative, mixing [actionable]{.underline} and [concrete]{.underline} advice with personal stories and experiments.</p>
<p>After reading Atomic Habits during the first lockdown, I was excited to try out its actionables, specially tracking to keep me honest.</p>
<p>I tried a bunch of iOS apps, but wanted no friction, no tracking, no cloud, no social, no analytics, no account, etc. so eventually <a href="https://xenodium.com/frictionless-org-habits-on-ios/">built Flat Habits</a> (<a href="https://flathabits.com">flathabits.com</a>). Also wanted to own my habit data (as plain text), so I made sure Flat Habits stored its data locally as an org file.</p>
<p>I'm an Emacs nutter and can say the strength in habit tracking lies in removing daily friction from the tracking process itself. A quickly accessible mobile app can really help with that. For me, Emacs plays a less important role here. The plain text part is cherry on top (bringing piece of mind around lock-in). In my case, it's been months since I looked at the plain text file itself from an Emacs org buffer. The iOS app, on the other hand, gets daily usage.</p>
<p>As for forming lasting habits (the actual goal here)… it's been well over a year since I started running as a regular form of exercise. While reading Atomic Habits really changed how I think of habits, a tracker played a crucial part in the daily grind. I happen to have built a tracker that <a href="https://xenodium.com/flat-habits-meets-org-agenda/">plays nice with Emacs</a>.</p>
<p>It's a new year. If you're looking at forming new habits, you may want some inspiration and also practical and concrete guidance. The book Atomic Habits can help with that. You can decide on which apps and how to implement the tracking process later on. Pen and paper is also a viable option and there are plenty of templates you can download.</p>
<p>There's a surplus of habit-tracking apps on the app stores. I built yet another one for iOS, modeled after my needs.</p>
<center>
  <img src="https://xenodium.github.io/images/flat-habits-for-ios/today_no_filter.png" alt="today_no_filter.png" width="300px">
  <img src="https://xenodium.github.io/images/flat-habits-for-ios/meditate.png" alt="today_no_filter.png" width="300px">
  <a href="https://apps.apple.com/app/id1558358855">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="today_no_filter.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Mon, 03 Jan 2022 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org v1.1 released 🎄☃️</title>
<link>https://xenodium.com/plain-org-v11-released</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-v11-released</guid>
    <description><![CDATA[<p><a href="https://plainorg.com">Plain Org</a> v1.1 is now available on the <a href="https://apps.apple.com/app/id1578965002">App Store</a>. The update receives new features and bugfixes.</p>
<p>If you're finding Plain Org useful, <strong>please help support this effort</strong> by getting the word out. Tell your friends, <a href="https://twitter.com/intent/tweet?text=Plain%20Org%20https%3A%2F%2Fapps.apple.com%2Fapp%2Fid1578965002%20">tweet</a>, or blog about it.</p>
<h2>What is Plain Org?</h2>
<p>Ok, now on to what's included in the v1.1 release…</p>
<h2>Compact mode</h2>
<p>By default, Plain Org layout uses generous padding. The new option <code>Menu -&gt; View -&gt; Compact mode</code> packs more content into your screen.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/compact.gif" alt=""></p>
<h2>Regroup active and inactive tasks</h2>
<p>Regrouping tasks now bubbles active ones up. Similarly, inactive tasks drop to the bottom of their node. Changes are persisted to the org file.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/regroup.gif" alt=""></p>
<h2>Native table rendering</h2>
<p>Tables are now rendered natively but also support displaying links and other formatting within cells.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/table.gif" alt=""></p>
<h2>Open local ID links</h2>
<p>If your file provider supports granting access to folders, local ID links (ie. <code>id:eb155a82-92b2-4f25-a3c6-0304591af2f9</code>) can now be resolved and opened from Plain Org. Note that for ID links to resolve, other org files must live in either the same directory or a subdirectory.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/idlink.gif" alt=""></p>
<h2>Fill paragraphs</h2>
<p>If your org paragraphs contain newlines optimizing for bigger screens, you can toggle <code>Menu -&gt; View -&gt; Fill paragraph</code> to optimize rendering for your iPhone. This rendering option makes no file modifications.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/fillparagraph.gif" alt=""></p>
<p>By the way, the previous screenshot text comes from <a href="http://doc.norang.ca/org-mode.html">Org Mode - Organize Your Life In Plain Text</a>, a magnificent org resource.</p>
<h2>Show/hide basic scheduling</h2>
<p>Use the new <code>Menu -&gt; View -&gt; Scheduling</code> to toggle showing <code>SCHEDULED</code> or <code>DEADLINE</code> dates.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/scheduling.gif" alt=""></p>
<h2>Show/hide tags</h2>
<p>Similarly, the new <code>Menu -&gt; View -&gt; Tags</code> option toggles displaying tags.</p>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/hidetags.gif" alt=""></p>
<h2>Native list rendering</h2>
<p>Lists are now rendered natively. With the exception of numbered cases, list items now share a common bullet icon. Description lists are also recognized and receive additional formatting when rendered.</p>
<pre><code class="language-org">- First list item
* Second list item
+ Third list item
1. Numbered list item
+ Term :: Description for term
</code></pre>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/listitems.png" alt=""></p>
<p>Numbered checkboxes are now recognized and receive the same formatting and interaction as their non-numbered counterparts.</p>
<pre><code class="language-org">1. [ ] First checkbox
2. [X] Second checkbox
3. [X] Third checkbox
</code></pre>
<p><img src="https://xenodium.github.io/images/plain-org-v11-released/numbered.png" alt=""></p>
<h2>Reload current file</h2>
<p>Plain Org may not be able to automatically reload files for some syncing providers. In those instances, use <code>Menu -&gt; Reload</code> to explicitly request a reload.</p>
<h2>Open .txt files</h2>
<p>Although .org files are plain text files, they aren't always recognized by other text-editing apps. This release enables opening .txt files, so you can choose to render them in Plain Org, while giving you the option to edit elsewhere.</p>
<h2>Bugfixes</h2>
<ul>
<li>Improve vertical whitespace handling.</li>
<li>Fixes rendering edge cases.</li>
<li>Fail gracefully when creating new files on unsupported cloud providers.</li>
<li>Prevent creating new files with redundant extensions.</li>
<li>File access improvements.</li>
<li>Replicates property spacing behaviour using Emacs's <code>org-property-format</code> default value.</li>
<li>Fixes keyword picker border rendering.</li>
<li>Improves rendering performance for large nodes.</li>
</ul>
<br/>
<center>
  <a href="https://apps.apple.com/app/id1578965002">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Sun, 12 Dec 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs bends again</title>
<link>https://xenodium.com/emacs-bends-again</link>
<guid isPermaLink="false">https://xenodium.com/emacs-bends-again</guid>
    <description><![CDATA[<p>While adding more rendering capabilities to <a href="https://plainorg.com">Plain Org</a>, it soon became apparent some sort of screenshot/snapshot testing was necessary to prevent regressing existing features. That is, we first generate a rendered snapshot from a given org snippet, followed by some visual inspection, right before we go and save the blessed snapshot (often referred to as golden) to our project. Future changes are validated against the golden snapshot to ensure rendering is still behaving as expected.</p>
<p>Let's say we'd like to validate table rendering with links, we can write a test as follows:</p>
<pre><code class="language-swift">func testTableWithLinks() throws {
  assertSnapshot(
    matching: OrgMarkupText.make(
      &quot;&quot;&quot;
      | URL                    | Org link    |
      |------------------------+-------------|
      | https://flathabits.com | [[https://flathabits.com][Flat Habits]] |
      | Regular text           | Here too    |
      |------------------------+-------------|
      &quot;&quot;&quot;),
    as: .image(layout: .sizeThatFits))
}
</code></pre>
<p>The corresponding snapshot golden can be seen below.</p>
<p><img src="https://xenodium.github.io/images/emacs-bends-again/testTableWithLinks.1.png" alt=""></p>
<p>This is all done rather effortlessly thanks to <a href="https://twitter.com/pointfreeco">Point Free</a>'s wonderful <a href="https://github.com/pointfreeco/swift-snapshot-testing">swift-snapshot-testing</a> utilities.</p>
<p>So what does any of this have to do with Emacs? You see, as I added more snapshot tests and made modifications to the rendering logic, I needed a quick way to visually inspect and override all goldens. All the main pieces were already there, I just needed some elisp glue to <em>bend Emacs my way™.</em></p>
<p>First, I needed to run my Xcode builds from the command line. This is already <a href="https://developer.apple.com/library/archive/technotes/tn2339/_index.html">supported via xcodebuild</a>. Next, I needed a way to parse test execution data to extract failing tests. <a href="https://twitter.com/davidahouse">David House</a>'s <a href="https://github.com/davidahouse/xcodebuild-to-json">xcodebuild-to-json</a> handles this perfectly. What's left? Glue it all up with some elisp.</p>
<p>Beware, the following code snippet is packed with assumptions about my project, it's messy, surely has bugs, can be optimized, etc. But the important point here is that Emacs is such an amazing malleable power tool. Throw some elisp at it and you can to bend it to your liking. After all, it's [your]{.underline} editor.</p>
<p>And so here we are, I can now run snapshot tests from Emacs using my hacked up <code>plainorg-snapshot-test-all</code> function and quickly override (or ignore) all newly generated snapshots by merely pressing y/n keys. Oh, and our beloved web browser was also invited to the party. Press &quot;d&quot; to open two browser tabs if you'd like to take a closer look (not demoed below).</p>
<p>Success. <em>Emacs bends again</em>.</p>
<p><img src="https://xenodium.github.io/images/emacs-bends-again/diff.gif" alt=""></p>
<pre><code class="language-{.commonlisp">;;; -*- lexical-binding: t; -*-

(defun plainorg-snapshot-test-all ()
  &quot;Invoke xcodebuild, compare failed tests screenshots side-to-side,
and offer to override them.&quot;
  (interactive)
  (let* ((project (cdr (project-current)))
         (json-tmp-file (make-temp-file &quot;PlainOrg_Tests_&quot; nil &quot;.json&quot;))
         (default-directory project))
    (unless (file-exists-p (concat project &quot;PlainOrg.xcodeproj&quot;))
      (user-error &quot;Not in PlainOrg project&quot;))
    (set-process-sentinel
     (start-process
      &quot;xcodebuild&quot;
      (with-current-buffer
          (get-buffer-create &quot;*xcodebuild*&quot;)
        (let ((inhibit-read-only t))
          (erase-buffer))
        (current-buffer))
      &quot;/usr/bin/xcodebuild&quot;
      &quot;-scheme&quot; &quot;PlainOrg&quot; &quot;-target&quot; &quot;PlainOrgTests&quot; &quot;-destination&quot; &quot;name=iPhone 13&quot; &quot;-quiet&quot; &quot;test&quot;)
     (lambda (p e)
       (with-current-buffer (get-buffer &quot;*xcodebuild*&quot;)
         (let ((inhibit-read-only t))
           (insert (format &quot;xcodebuild exit code: %d\n\n&quot; (process-exit-status p)))))
       (when (not (eq 0 (process-exit-status p)))
         (set-process-sentinel
          (start-process
           &quot;xcodebuild-to-json&quot;
           &quot;*xcodebuild*&quot;
           &quot;/opt/homebrew/bin/xcodebuild-to-json&quot;
           &quot;--derived-data-folder&quot; (format &quot;/Users/%s/Library/Developer/Xcode/DerivedData/&quot;
                                           (user-login-name)) &quot;--output&quot; json-tmp-file)
          (lambda (p e)
            (with-current-buffer (get-buffer &quot;*xcodebuild*&quot;)
              (let ((inhibit-read-only t))
                (insert (format &quot;xcodebuild-to-json exit code: %d\n\n&quot; (process-exit-status p)))))
            (when (= 0 (process-exit-status p))
              (with-current-buffer (get-buffer &quot;*xcodebuild*&quot;)
                (let ((inhibit-read-only t))
                  (insert &quot;Screenshot comparison started\n\n&quot;)))
              (plainorg--snapshot-process-json (get-buffer &quot;*xcodebuild*&quot;) json-tmp-file)
              (with-current-buffer (get-buffer &quot;*xcodebuild*&quot;)
                (let ((inhibit-read-only t))
                  (insert &quot;\nScreenshot comparison finished\n&quot;))
                (read-only-mode +1))))))))
    (switch-to-buffer-other-window &quot;*xcodebuild*&quot;)))

(defun plainorg--snapshot-process-json (result-buffer json)
  &quot;Find all failed snapshot tests in JSON and offer to override
 screenshots, comparing them side to side.&quot;
  (let ((hashtable (with-current-buffer (get-buffer-create &quot;*build json*&quot;)
                     (erase-buffer)
                     (insert-file-contents json)
                     (json-parse-buffer))))
    (mapc
     (lambda (item)
       (when (equal (gethash &quot;id&quot; item)
                    &quot;SnapshotTests&quot;)
         (mapc
          (lambda (testCase)
            (when (and (gethash &quot;failureMessage&quot; testCase)
                       (string-match-p &quot;Snapshot does not match reference&quot;
                                       (gethash &quot;failureMessage&quot; testCase)))
              (let* ((paths (plainorg--snapshot-screenshot-paths
                             (gethash &quot;failureMessage&quot; testCase)))
                     (override-result (plainorg--snapshot-override-image
                                       &quot;Expected screenshot&quot;
                                       (nth 0 paths) ;; old
                                       &quot;Actual screenshot&quot;
                                       (nth 1 paths) ;; new
                                       (nth 0 paths))))
                (when override-result
                  (with-current-buffer result-buffer
                    (let ((inhibit-read-only t))
                      (insert override-result)
                      (insert &quot;\n&quot;)))))))
          (gethash &quot;testCases&quot; item))))
     (gethash &quot;classes&quot; (gethash &quot;details&quot; hashtable)))))

(defun plainorg--snapshot-screenshot-paths (failure-message)
  &quot;Extract a paths list from FAILURE-MESSAGE of the form:

failed - Snapshot does not match reference.

@−
\&quot;/path/to/expected/screenshot.1.png\&quot;
@+
\&quot;/path/to/actual/screenshot.1.png\&quot;

Newly-taken snapshot does not match reference.
&quot;
  (mapcar
   (lambda (line)
     (string-remove-suffix &quot;\&quot;&quot;
                           (string-remove-prefix &quot;\&quot;&quot; line)))
   (seq-filter
    (lambda (line)
      (string-prefix-p &quot;\&quot;&quot; line))
    (split-string failure-message &quot;\n&quot;))))

(defun plainorg--snapshot-override-image (old-buffer old new-buffer new destination)
  (let ((window-configuration (current-window-configuration))
        (action)
        (result))
    (unwind-protect
        (progn
          (delete-other-windows)
          (split-window-horizontally)
          (switch-to-buffer (with-current-buffer (get-buffer-create old-buffer)
                              (let ((inhibit-read-only t))
                                (erase-buffer))
                              (insert-file-contents old)
                              (image-mode)
                              (current-buffer)))
          (switch-to-buffer-other-window (with-current-buffer (get-buffer-create new-buffer)
                                           (let ((inhibit-read-only t))
                                             (erase-buffer))
                                           (insert-file-contents new)
                                           (image-mode)
                                           (current-buffer)))
          (while (null result)
            (setq action (read-char-choice (format &quot;Override %s? (y)es (n)o (d)iff in browser? &quot;
                                                   (file-name-base old))
                                           '(?y ?n ?d ?q)))
            (cond ((eq action ?n)
                   (setq result
                         (format &quot;Keeping old %s&quot; (file-name-base old))))
                  ((eq action ?y)
                   (copy-file new old t)
                   (setq result
                         (format &quot;Overriding old %s&quot; (file-name-base old))))
                  ((eq action ?d)
                   (shell-command (format &quot;open -a Firefox %s --args --new-tab&quot; old))
                   (shell-command (format &quot;open -a Firefox %s --args --new-tab&quot; new)))
                  ((eq action ?q)
                   (set-window-configuration window-configuration)
                   (setq result (format &quot;Quit %s&quot; (file-name-base old)))))))
      (set-window-configuration window-configuration)
      (kill-buffer old-buffer)
      (kill-buffer new-buffer))
    result))
</code></pre>
]]></description>
    <pubDate>Sun, 28 Nov 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org has joined the chat (iOS)</title>
<link>https://xenodium.com/plain-org-has-joined-the-chat</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-has-joined-the-chat</guid>
    <description><![CDATA[<p>The App Store is a crowded space when it come to markdown apps. A quick search yields a wonderful wealth of choice. Kinda overwhelming, but a great problem to have nonetheless.</p>
<p>For those of us with org as our markup of choice, the App Store is far less crowded. I wish we could fill more than a screen's worth of search results, so you know… I could show you another pretty gif scrolling through org results. For now, we'll settle on a single frame showcasing our 4 org options.</p>
<p><img src="https://xenodium.github.io/images/plain-org-has-joined-the-chat/store-side-comparison-mid.gif" alt=""></p>
<p><a href="https://beorg.app/">Beorg</a>, <a href="http://mobileorg.github.io/">MobileOrg</a>, <a href="https://flathabits.com/">Flat Habits</a>, and <a href="https://orgro.org/">Orgro</a> are all great options. Each with strengths of their own. <a href="https://organice.200ok.ch/">Organice</a>, while not on the App Store, is another option for those looking for a web alternative. Of these, I had already authored one of them. More on that in a sec… You see, about a year ago I wanted to play with Swift, SPM, and lsp itself. Also, having Swift code completion in Emacs via <a href="https://github.com/emacs-lsp/lsp-sourcekit">lsp-sourcekit</a> sounded like a fun thing to try out, so I started using it while writing a Swift org parser.</p>
<p><img src="https://xenodium.github.io/images/plain-org-has-joined-the-chat/magit.png" alt=""></p>
<p>While working on the parser, I happened to be reading <a href="https://jamesclear.com/atomic-habits">Atomic Habits</a> (awesome book btw)… It was also a great time to play around with SwiftUI, which by the way, is pretty awesome too. With Atomic Habits fresh in mind, org parser in one hand, and SwiftUI in the other, I built <a href="https://flathabits.com">Flat Habits</a>: a lightweight habit tracker powered by org.</p>
<p><img src="https://xenodium.github.io/images/frictionless-org-habits-on-ios/flat_habits.gif" alt=""></p>
<p>I love being able to save habit data to plain text and easily track on my iPhone (via Flat Habits) or laptop (via Emacs). I wanted to <a href="https://xenodium.com/org-habits-on-ios-check-tasks-youre-next/">extend similar convenience to org tasks</a>, so I built <a href="https://plainorg.com">Plain Org</a>.</p>
<p>My previous <a href="https://xenodium.com/org-habits-on-ios-check-tasks-youre-next/">post</a> mentioned <em>quickly adding new tasks and searching existing ones</em> as Plain Org's driving goals. Of course, neither of those are as useful without automatic cloud syncing, so pluging into <a href="https://support.apple.com/en-gb/HT206481#thirdparty">iOS's third party cloud support</a> was a must-have.</p>
<p>With these baseline features in place, I <a href="https://www.reddit.com/r/orgmode/comments/p5bonn/ios_plain_org_alpha_builds_now_on_testflight_dm/">started an alpha/beta group</a> via <a href="https://testflight.apple.com/">TestFlight</a>. Early Plain Org adopters have been wonderfully supportive, given lots of great feedback, and helped shape the initial feature set you see below.</p>
<p><em>There's plenty more that can be supported, but hey let's get v1 out the door. Gotta start somewhere.</em></p>
<h2>Plain Org v1 features</h2>
<ul>
<li>View and edit your org mode tasks while on the go.</li>
<li>Beautifully rendered org markup.</li>
<li>Sync your org files using your favorite cloud provider.</li>
<li>Create new files.</li>
<li>Outline-style editing with toolbar
<ul>
<li>Keywords</li>
<li>Indent</li>
<li>Priority</li>
<li>Tags</li>
<li>Formatting: bold, italic, underline, strikethrough, verbatim, and code.</li>
</ul>
</li>
<li>Add links from Safari via share extension.</li>
<li>Add new tasks via Spotlight.</li>
<li>Reorder headings via drag/drop.</li>
<li>Checkboxes
<ul>
<li>Interactive toggling.</li>
<li>Quickly reset multiple checkboxes.</li>
</ul>
</li>
<li>Follow local links.</li>
<li>Show inline images.</li>
<li>File-local keywords and visibility.</li>
<li>Filter open/closed tasks.</li>
<li>Show/hide stars.</li>
<li>Edit raw text.</li>
<li>Light/dark mode.</li>
</ul>
<h2>Plain Org joins the chat</h2>
<p>Today Plain Org joins the likes of <a href="https://beorg.app/">Beorg</a>, <a href="http://mobileorg.github.io/">MobileOrg</a>, <a href="https://flathabits.com/">Flat Habits</a>, and <a href="https://orgro.org/">Orgro</a> on the App Store.</p>
<p><img src="https://xenodium.github.io/images/plain-org-has-joined-the-chat/intro.png" alt=""></p>
<br/>
<center>
  <a href="https://apps.apple.com/app/id1578965002">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="download-on-app-store.png" width="180px">
  </a>
</center>
<center>
  This post was written in   <a href="https://orgmode.org">org mode</a>.
</center>
]]></description>
    <pubDate>Wed, 10 Nov 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plain Org for iOS (a month later)</title>
<link>https://xenodium.com/plain-org-for-ios-a-month-later</link>
<guid isPermaLink="false">https://xenodium.com/plain-org-for-ios-a-month-later</guid>
    <description><![CDATA[<p>A month ago, I posted about my desire to <a href="https://xenodium.com/org-habits-on-ios-check-tasks-youre-next/">bring org tasks/TODOs to iOS</a> and make them quickly available from my iPhone.</p>
<p>Since then, I've received some great feedback, which I've been slowly chipping away at. My intent isn't so much to move my org workflow over to iOS, but to supplement Emacs while away from my laptop.</p>
<p>As of now, this is what the inline edit experience looks like:</p>
<p><img src="https://xenodium.github.io/images/plain-org-for-ios-a-month-later/inline_keyword_toolbar.gif" alt=""></p>
<p>If, like me, you prefer dark mode. The app's got ya covered:</p>
<p><img src="https://xenodium.github.io/images/plain-org-for-ios-a-month-later/dark.png" alt=""></p>
<p><em>Plain Org</em> is not yet available on the App Store, but you can get a TestFlight invite if you send me an email address. Ping me on <a href="https://www.reddit.com/user/xenodium">reddit</a>, <a href="https://twitter.com/xenodium">twitter</a>, or email me at &quot;plainorg&quot; + &quot;@&quot; + &quot;xenodium.com&quot;.</p>
<p>You can also check out progress over at the <a href="https://www.reddit.com/r/plainorg/">r/plainorg</a> subreddit.</p>
]]></description>
    <pubDate>Sun, 19 Sep 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Org habits on iOS? Check! Tasks, you're next</title>
<link>https://xenodium.com/org-habits-on-ios-check-tasks-youre-next</link>
<guid isPermaLink="false">https://xenodium.com/org-habits-on-ios-check-tasks-youre-next</guid>
    <description><![CDATA[<p>I'm an <a href="https://orgmode.org">org mode</a> fan. This blog is powered by org. It's more of an accidental blog that started as a <a href="https://github.com/xenodium/xenodium.github.io/blob/master/index.org">single org file</a> keeping notes. I use <a href="https://orgmode.org/worg/org-contrib/babel/intro.html">org babel</a> too. Oh and <a href="https://orgmode.org/manual/Tracking-your-habits.html">org habits</a>. My never-ending list of TODOs is also powered by org. I manage all of this from Emacs and peek at TODOs using <a href="https://orgmode.org/manual/Agenda-Views.html">org agenda</a>. This all works really well while I'm sitting in front of my laptop running Emacs.</p>
<p>But then I'm away from my laptop… and I need to quickly record habits on the go. I need it to be low-friction. Ssh'ing to an Emacs instance from a smartphone isn't an option. I'm an iPhone user, so whatever the solution, it should play nice with Emacs and org mode. I built <a href="https://flathabits.com">Flat Habits</a> for habit tracking and I'm fairly happy with the result. As of today, my longest-tracked habit is on a 452-day streak.</p>
<p><img src="https://xenodium.github.io/images/frictionless-org-habits-on-ios/flat_habits.gif" alt=""></p>
<p>Moving on to org tasks/TODOs… I want something fairly frictionless while on the go. With <em>Flat Habits</em> as a stepping stone, I can now reuse some parts to build <a href="https://reddit.com/r/plainorg">Plain Org</a>. This new app should give me quick access to my tasks. The two driving goals are: quickly add new tasks and search existing ones while away from my laptop. Ok, maybe basic editing helps too. Oh and it should sync over cloud, of course.</p>
<p><img src="https://xenodium.github.io/images/org-habits-on-ios-check-tasks-youre-next/plainorgdemo.gif" alt=""></p>
<p>I now have an early implementation of sorts, <a href="https://www.reddit.com/r/plainorg/comments/p5bnji/ios_more_improvements_alpha_builds_now_on/">available on TestFlight</a>. If you'd like to give it a try, <em>send me an email address</em> to receive the the invite. Ping me on <a href="https://reddit.com/u/xenodium">reddit</a>, <a href="https://twitter.com/xenodium">twitter</a>, or email me at &quot;plainorg&quot; + &quot;@&quot; + &quot;xenodium.com&quot;.</p>
]]></description>
    <pubDate>Thu, 19 Aug 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flat Habits 1.1 released</title>
<link>https://xenodium.com/flat-habits-11-released</link>
<guid isPermaLink="false">https://xenodium.com/flat-habits-11-released</guid>
    <description><![CDATA[<p><a href="https://flathabits.com/">Flat Habits</a> 1.1 is now available on the <a href="https://apps.apple.com/app/id1558358855">App Store</a>. Flat Habits is a habit tracker that’s mindful of your time, data, and privacy. It's powered by <a href="https://orgmode.org">org</a> plain text markup, enabling you to use your <a href="https://xenodium.com/frictionless-org-habits-on-ios/">favorite editor</a> (Emacs, Vim, VSCode, etc.) to poke at your habit data.</p>
<h2>What's new?</h2>
<p>This release implements a few of features requested by users.</p>
<h2>Multiday weekly habits</h2>
<p>This is the chunkiest addition and most requested feature. You can now select multiple days when scheduling weekly habits.</p>
<p><img src="https://xenodium.github.io/images/flat-habits-11-released/multi_day_creation.gif" alt=""></p>
<p><img src="https://xenodium.github.io/images/flat-habits-11-released/multi_day_calendar.png" alt=""></p>
<h2>Historical management</h2>
<p>Sometimes you forget to mark a habit done or make a mistake toggling one. Either way, you can now toggle any habit day from the calendar/streak view.</p>
<h3>Long tap</h3>
<p>Long tap shows you the editing option available for that day.</p>
<p><img src="https://xenodium.github.io/images/flat-habits-11-released/long_tap.gif" alt=""></p>
<h3>Short tap</h3>
<p>Short tap typically toggles between &quot;Done&quot; and &quot;Not done&quot;.</p>
<p><img src="https://xenodium.github.io/images/flat-habits-11-released/short_tap.gif" alt=""></p>
<h2>Where's today?</h2>
<p>A few folks rightfully asked for today's date to be highlighted in the calendar view, and so we now have a red circle.</p>
<p><img src="https://xenodium.github.io/images/flat-habits-11-released/today.png" alt=""></p>
<h2>Improved error messages</h2>
<p>Hopefully you don't run into issues, but if you do, I hope the app helps ya sort them out.</p>
<h2>Bugfixes</h2>
<ul>
<li>Tapping on blur now dismisses habit edit dialog.</li>
<li>Future habits now longer editable.</li>
<li>Skipped habits no longer have a default tap action.</li>
<li>Undoing from streak/calendar view now refreshes correctly.</li>
<li>Undoing habit addition on iPad removes streak/calendar view.</li>
</ul>
]]></description>
    <pubDate>Sun, 11 Jul 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>macOS: Show in Finder / Show in Emacs</title>
<link>https://xenodium.com/show-in-finder--show-in-emacs</link>
<guid isPermaLink="false">https://xenodium.com/show-in-finder--show-in-emacs</guid>
    <description><![CDATA[<p>From Christian Tietze's <a href="https://christiantietze.de/posts/2021/07/open-finder-window-in-dired/">Open macOS Finder Window in Emacs Dired</a>, I learned about <a href="https://github.com/kaz-yos/reveal-in-osx-finder">reveal-in-osx-finder</a>. This is handy for the few times I want to transition from Emacs to Finder for file management. I say few times since Emacs's directory editor, <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a>, is just awesome. I've written about dired customizations <a href="https://xenodium.com/showhide-emacs-dired-details-in-style/">here</a> and <a href="https://xenodium.com/showhide-emacs-dired-details-in-style/">here</a>, but since dired is <em>just another buffer,</em> you can apply your Emacs magic like multiple cursors to <a href="https://xenodium.com/batch-renaming-with-counsel-find-dired-and-wdired/">batch rename files in an editable dired buffer</a>.</p>
<p>To transition from macOS Finder to Emacs, Christian offers an Emacs interactive command that fetches Finder's location and opens a dired buffer via AppleScript. On a similar note, I learned from redditor <a href="https://www.reddit.com/user/pndc/">u/pndc</a> that <a href="https://www.reddit.com/r/emacs/comments/ohgz0s/open_macos_finder_windows_path_in_dired/h4p8a8f?utm_source=share&amp;utm_medium=web2x&amp;context=3">Finder's proxy icons can be dragged over to Emacs</a>, which handily drops ya into a dired buffer.</p>
<p>With these two solutions in mind, I looked into a third one to offer a context menu option in Finder to show the file in Emacs. This turned out to be fairly easy using Automator, which I've rarely used.</p>
<p><img src="https://xenodium.github.io/images/show-in-finder--show-in-emacs/show_in_emacs.gif" alt=""></p>
<p>I created a flow that runs a shell script to &quot;Show in Emacs&quot;, revealing the selected file or folder in an dired buffer. This is similar to Christian's solution, but invoked from Finder itself. The flow also uses <em>dired-goto-file</em> which moves the point (cursor) to the file listed under dired.</p>
<p><img src="https://xenodium.github.io/images/show-in-finder--show-in-emacs/show_in_emacs.png" alt=""></p>
<pre><code class="language-{.bash">current_dir=$(dirname &quot;$1&quot;)
osascript -e 'tell application &quot;Emacs&quot; to activate'
path/to/emacsclient --eval &quot;(progn (dired \&quot;$current_dir\&quot;) (dired-goto-file \&quot;$1\&quot;))&quot;
</code></pre>
<p>As a bonus, I added an &quot;Open in Emacs&quot; option, which does as it says on the tin. Rather than show the file listed in a dired buffer, it gets Emacs to open it in your favorite major mode. This option is not technically needed since Finder already provides an &quot;Open With&quot; context menu, but it does remove a few click here and there.</p>
<p><img src="https://xenodium.github.io/images/show-in-finder--show-in-emacs/open_in_emacs.png" alt=""></p>
<pre><code class="language-{.bash">osascript -e 'tell application &quot;Emacs&quot; to activate'
/Users/alvaro/homebrew/bin/emacsclient --eval &quot;(find-file \&quot;$1\&quot;)&quot;
</code></pre>
<p>On a side note, Emacs defaults to creating new frames when opening files via &quot;Open With&quot; menu (or &quot;open -a Emacs foo.txt&quot;). I prefer to use my existing Emacs frame, which can be accomplished by setting ns-pop-up-frames to nil.</p>
<pre><code class="language-{.commonlisp">(setq ns-pop-up-frames nil)
</code></pre>
]]></description>
    <pubDate>Sun, 11 Jul 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: smarter search and replace</title>
<link>https://xenodium.com/emacs-smarter-search-and-replace</link>
<guid isPermaLink="false">https://xenodium.com/emacs-smarter-search-and-replace</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/emacs-smarter-search-and-replace/smarter_replace.gif" alt=""></p>
<p>Not long ago, I made a note to go back and read <a href="https://mac4translators.blogspot.com">Mac for Translators</a>'s <a href="https://mac4translators.blogspot.com/2021/06/regex-with-elisp.html">Emacs regex with Emacs lisp</a> post. The author highlights Emacs's ability to apply additional logic when replacing text during a search-and-replace session. It does so by leveraging elisp expressions.</p>
<p>Coincidentally, a redditor recently asked <a href="https://www.reddit.com/r/emacs/comments/o878am/what_is_the_simplest_way_to_apply_a_math_formula/">What is the simplest way to apply a math formula to all numbers in a buffer/region?</a> Some of the answers also point to <em>search and replace</em> leveraging elisp expressions.</p>
<p>While I rarely need to apply additional logic when replacing matches, it's nice to know we have options available in our Emacs toolbox. This prompted me to check out <a href="https://github.com/emacs-mirror/emacs/blob/b8f9e58ef72402e69a1f0960816184d52e5d2d29/lisp/replace.el#L709">replace-regexp</a>'s documentation (via M-x <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Name-Help.html">describe-function</a> or my favorite M-x <a href="https://github.com/Wilfred/helpful">helpful-callable</a>). There's lots in there. Go check its docs out. You may be pleasantly surprised by all the features packed under this humble function.</p>
<p>For instance, \&amp; expands to the current match. Similarly, \#&amp; expands to the current match, fed through <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/String-Conversion.html">string-to-number</a>. But what if you'd like to feed the match to another function? You can use \, to signal evaluation of an elisp expression. In other words, you could multiply by 3 using \,(* 3 \#&amp;) or inserting whether a number is odd or even with something like \,(if (oddp \#&amp;) &quot;(odd)&quot; &quot;(even)&quot;).</p>
<p>Take the following text:</p>
<pre><code class="language-example">1
2
3
4
5
6
</code></pre>
<p>We can label each value &quot;(odd)&quot; or &quot;(even)&quot; as well as multiply by 3, by invoking <em>replace-regexp</em> as follows:</p>
<blockquote>
<p>M-x replace-regexp</p>
</blockquote>
<p>[PCRE] Replace regex:</p>
<blockquote>
<p>[-0-9.]+</p>
</blockquote>
<p>Replace regex [-0-9.]+:</p>
<blockquote>
<p>\&amp; \,(if (oddp \#&amp;) &quot;(odd)&quot; &quot;(even)&quot;) x 3 = \,(* 3 \#&amp;)</p>
</blockquote>
<pre><code class="language-example">1 (odd) x 3 = 3
2 (even) x 3 = 6
3 (odd) x 3 = 9
4 (even) x 3 = 12
5 (odd) x 3 = 15
6 (even) x 3 = 18
</code></pre>
<p>It's worth noting that <em>replace-regexp</em>'s cousin <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Query-Replace.html">query-replace-regexp</a> also handles all this wonderful magic.</p>
<p>Happy searching and replacing!</p>
]]></description>
    <pubDate>Sun, 27 Jun 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Previewing SwiftUI layouts in Emacs (revisited)</title>
<link>https://xenodium.com/previewing-swiftui-layouts-in-emacs-revisited</link>
<guid isPermaLink="false">https://xenodium.com/previewing-swiftui-layouts-in-emacs-revisited</guid>
    <description><![CDATA[<p>Back in May 2020, I shared a snippet to extend <a href="https://github.com/zweifisch/ob-swift">ob-swift</a> to <a href="https://xenodium.com/swiftui-layout-previews-using-emacs-org-blocks/">preview SwiftUI layouts using Emacs org blocks</a>.</p>
<p><img src="https://xenodium.github.io/images/swiftui-layout-previews-using-emacs-org-blocks/ob-swiftui.gif" alt=""></p>
<p>When I say extend, I didn't quite modify ob-swift itself, but rather <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html">advised</a> <a href="https://github.com/zweifisch/ob-swift/blob/ed478ddbbe41ce5373efde06b4dd0c3663c9055f/ob-swift.el#L37">org-babel-execute:swift</a> to modify its behavior at runtime.</p>
<p>Fast-forward to June 2021 and Scott Nicholes <a href="https://github.com/zweifisch/ob-swift/issues/4#issuecomment-858196354">reminded me there's still interest</a> in org babel SwiftUI support. ob-swift <a href="https://github.com/zweifisch/ob-swift/commits/master">seems a little inactive</a>, but no worries there. The package offers great general-purpose Swift support. On the other hand, SwiftUI previews can likely live as a single-purpose package all on its own… and so I set off to bundle the rendering functionality into a new <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> package.</p>
<p>Luckily, org babel's documentation has a straightforward section to help you <a href="https://orgmode.org/worg/org-contrib/babel/languages/index.html">develop support for new babel languages</a>. They simplified things by offering <a href="https://code.orgmode.org/bzg/worg/raw/master/org-contrib/babel/ob-template.el">template.el</a>, which serves as the foundation for your language implementation. For the most part, it's a matter of searching, replacing strings, and removing the bits you don't need.</p>
<p>The elisp core of ob-swiftui is fairly simple. It expands the org block body, inserts the expanded body into a temporary buffer, and finally feeds the code to the Swift toolchain for execution.</p>
<pre><code class="language-{.commonlisp">(defun org-babel-execute:swiftui (body params)
  &quot;Execute a block of SwiftUI code in BODY with org-babel header PARAMS.
This function is called by `org-babel-execute-src-block'&quot;
  (message &quot;executing SwiftUI source code block&quot;)
  (with-temp-buffer
    (insert (ob-swiftui--expand-body body params))
    (shell-command-on-region
     (point-min)
     (point-max)
     &quot;swift -&quot; nil 't)
    (buffer-string)))
</code></pre>
<p>The expansion in <em>ob-swiftui–expand-body</em> is a little more interesting. It decorates the block's body, so it can become a fully functional and stand-alone SwiftUI macOS app. If you're familiar with Swift and SwiftUI, the code should be fairly self-explanatory.</p>
<p>From an org babel's perspective, the expanded code is executed whenever we press <em>C-c C-c</em> (or M-x <a href="https://orgmode.org/manual/The-Very-Busy-C_002dc-C_002dc-Key.html#The-Very-Busy-C_002dc-C_002dc-Key">org-ctrl-c-ctrl-c</a>) within the block itself.</p>
<p>It's worthing mentioning that our new implementation supports two babel <a href="https://www.orgmode.org/worg/org-contrib/babel/header-args.html">header arguments</a> (results and view). Both extracted from params using <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/map.el#L106">map-elt</a> and replaced in the expanded Swift code to enable/disable snapshotting or explicitly setting a SwiftUI root view.</p>
<pre><code class="language-{.commonlisp">(defun ob-swiftui--expand-body (body params)
  &quot;Expand BODY according to PARAMS and PROCESSED-PARAMS, return the expanded body.&quot;
  (let ((write-to-file (member &quot;file&quot; (map-elt params :result-params)))
        (root-view (when (and (map-elt params :view)
                              (not (string-equal (map-elt params :view) &quot;none&quot;)))
                     (map-elt params :view))))
    (format
     &quot;
// Swift snippet heavily based on Chris Eidhof's code at:
// https://gist.github.com/chriseidhof/26768f0b63fa3cdf8b46821e099df5ff

import Cocoa
import SwiftUI
import Foundation

let screenshotURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(ProcessInfo.processInfo.globallyUniqueString + \&quot;.png\&quot;)
let preview = %s

// Body to run.
%s

extension NSApplication {
  public func run&lt;V: View&gt;(_ view: V) {
    let appDelegate = AppDelegate(view)
    NSApp.setActivationPolicy(.regular)
    mainMenu = customMenu
    delegate = appDelegate
    run()
  }

  public func run&lt;V: View&gt;(@ViewBuilder view: () -&gt; V) {
    let appDelegate = AppDelegate(view())
    NSApp.setActivationPolicy(.regular)
    mainMenu = customMenu
    delegate = appDelegate
    run()
  }
}

extension NSApplication {
  var customMenu: NSMenu {
    let appMenu = NSMenuItem()
    appMenu.submenu = NSMenu()

    let quitItem = NSMenuItem(
      title: \&quot;Quit \(ProcessInfo.processInfo.processName)\&quot;,
      action: #selector(NSApplication.terminate(_:)), keyEquivalent: \&quot;q\&quot;)
    quitItem.keyEquivalentModifierMask = []
    appMenu.submenu?.addItem(quitItem)

    let mainMenu = NSMenu(title: \&quot;Main Menu\&quot;)
    mainMenu.addItem(appMenu)
    return mainMenu
  }
}

class AppDelegate&lt;V: View&gt;: NSObject, NSApplicationDelegate, NSWindowDelegate {
  var window = NSWindow(
    contentRect: NSRect(x: 0, y: 0, width: 414 * 0.2, height: 896 * 0.2),
    styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
    backing: .buffered, defer: false)

  var contentView: V

  init(_ contentView: V) {
    self.contentView = contentView
  }

  func applicationDidFinishLaunching(_ notification: Notification) {
    window.delegate = self
    window.center()
    window.contentView = NSHostingView(rootView: contentView)
    window.makeKeyAndOrderFront(nil)

    if preview {
      screenshot(view: window.contentView!, saveTo: screenshotURL)
      // Write path (without newline) so org babel can parse it.
      print(screenshotURL.path, terminator: \&quot;\&quot;)
      NSApplication.shared.terminate(self)
      return
    }

    window.title = \&quot;press q to exit\&quot;
    window.setFrameAutosaveName(\&quot;Main Window\&quot;)
    NSApp.activate(ignoringOtherApps: true)
  }
}

func screenshot(view: NSView, saveTo fileURL: URL) {
  let rep = view.bitmapImageRepForCachingDisplay(in: view.bounds)!
  view.cacheDisplay(in: view.bounds, to: rep)
  let pngData = rep.representation(using: .png, properties: [:])
  try! pngData?.write(to: fileURL)
}

// Additional view definitions.
%s
&quot;
     (if write-to-file
         &quot;true&quot;
       &quot;false&quot;)
     (if root-view
         (format &quot;NSApplication.shared.run(%s())&quot; root-view)
       (format &quot;NSApplication.shared.run {%s}&quot; body))
     (if root-view
         body
       &quot;&quot;))))
</code></pre>
<p>For rendering inline SwiftUI previews in Emacs, we rely on NSView's <a href="https://developer.apple.com/documentation/appkit/nsview/1483440-bitmapimagerepforcachingdisplay">bitmapImageRepForCachingDisplay</a> to capture an image snapshot. We write its output to a temporary file and piggyback-ride off org babel's <em>:results file</em> header argument to automatically render the image inline.</p>
<p>Here's ob-swiftui inline rendering in action:</p>
<p><img src="https://xenodium.github.io/images/previewing-swiftui-layouts-in-emacs-revisited/obswiftui50.gif" alt=""></p>
<p>When rendering SwiftUI externally, we're effectively running and interacting with the generated macOS app itself.</p>
<p><img src="https://xenodium.github.io/images/previewing-swiftui-layouts-in-emacs-revisited/ob-swiftui-window.gif" alt=""></p>
<p>The two snippets give a general sense of what's needed to enable org babel to handle SwiftUI source blocks. Having said that, the full source and setup instructions are both available on <a href="https://github.com/xenodium/ob-swiftui">github</a>.</p>
<p><a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> is now available on <a href="https://melpa.org/#/ob-swiftui">melpa</a>.</p>
]]></description>
    <pubDate>Sun, 20 Jun 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Blurring the lines between shell and editor</title>
<link>https://xenodium.com/yasnippet-in-emacs-eshell</link>
<guid isPermaLink="false">https://xenodium.com/yasnippet-in-emacs-eshell</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/yasnippet-in-emacs-eshell/yas-eshell.gif" alt=""></p>
<p>I recently <a href="https://twitter.com/xenodium/status/1404746233860837378">tweeted</a> that Vivek Haldar's <a href="https://blog.vivekhaldar.com/post/3996068979/the-levels-of-emacs-proficiency">10-year old post</a> rings true today just the same. He writes about <a href="https://blog.vivekhaldar.com/post/3996068979/the-levels-of-emacs-proficiency">the levels of Emacs proficiency</a>. All 6 levels are insightful in their own right, but for the sake of this post, let's quote an extract from level <em>4. Shell inside Emacs</em>:</p>
<blockquote>
<p>&quot;And then, you learned about it: M-x shell.</p>
<p>It was all just text. Why did you need another application for it? Why should only the shell prompt be editable? Why can’t I move my cursor up a few lines to where the last command spewed out its results? All these problems simply disappear when your shell (or shells) simply becomes another Emacs buffer, upon which all of the text manipulation power of Emacs can be brought to bear.&quot;</p>
</blockquote>
<p>In other words, we aren't merely removing shell restrictions, but opening up possibilities…</p>
<p>Take Emacs eshell looping, for example. I use it so infrequently, I could never remember eshell's syntax. I would refer back to EmacsWiki's <a href="https://www.emacswiki.org/emacs/EshellForLoop">Eshell For Loop</a> or Mastering Emacs's <a href="https://masteringemacs.org/article/complete-guide-mastering-eshell">Mastering Eshell</a> comments for a reminder. It finally dawned on me. I don't need to internalize this eshell syntax. I have <a href="https://github.com/joaotavora/YASnippet">YASnippet</a> available like any other buffer. I could just type &quot;for&quot; and let YASnippet do the rest for me.</p>
<p><img src="https://xenodium.github.io/images/yasnippet-in-emacs-eshell/yas-for.gif" alt=""></p>
<p>All I need is a tiny YASnippet:</p>
<pre><code class="language-YASnippet">#name : Eshell for loop
#key : for
# --
for f in ${1:*} { ${2:echo} &quot;$f&quot;; $3} $0
</code></pre>
<p>Want a gentle and succinct YASnippet intro? Check out Jake's <a href="https://www.reddit.com/r/emacs/comments/o282fq/YASnippet_snippetstemplating_introductiontutorial/">YASnippet introduction video</a>.</p>
<p>If you're a <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Mode.html">shell-mode</a> user, YASnippet would have you covered in your favorite shell. The expansion snippet can be modified to a Bash equivalent, giving us the same benefit. We type &quot;for&quot; and let YASnippet expand and hop over arguments. Here's a Bash equivalent emphasizing the hopping a little more:</p>
<p><img src="https://xenodium.github.io/images/yasnippet-in-emacs-eshell/yasbash.gif" alt=""></p>
<pre><code class="language-YASnippet">#name : bash for loop
#key : for
# --
for f in ${1:*}; do ${2:echo} $f; done $0
</code></pre>
<p>ps. Looks like <a href="https://github.com/akermu/emacs-libvterm">vterm</a>, <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Term-Mode.html">term</a>, or <a href="https://www.emacswiki.org/emacs/AnsiTerm">ansi-term</a> work too. See Shane Mulligan's post: <a href="https://mullikine.github.io/posts/use-yasnippets-in-term/">Use YASnippets in term and vterm in emacs</a>.</p>
]]></description>
    <pubDate>Sat, 19 Jun 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>xcodebuild's SPM support (Xcode 11)</title>
<link>https://xenodium.com/xcodebuilds-spm-support-xcode-11</link>
<guid isPermaLink="false">https://xenodium.com/xcodebuilds-spm-support-xcode-11</guid>
    <description><![CDATA[<p>Had been a while since I looked into generating Xcode projects from a Swift package. On my latest use of the <em>generate-xcodeproj</em> subcommand, I was greeted by a nice <s>warning</s> surprise…</p>
<pre><code class="language-{.bash">swift package generate-xcodeproj
</code></pre>
<p>Xcode can handle Swift packages directly. Similarly, xcodebuild can handle them too. This isn't new. It's likely been available since Xcode 11. I just totally missed it.</p>
<p><em>Note: I've yet to dig into Xcode 13 beta, as Swift packages may already support the build/test features I was after in xcodebuild (like <a href="https://developer.apple.com/documentation/swift_packages/supportedplatform/3788290-maccatalyst">build/test on Catalyst</a>).</em></p>
<p>In any case, on to xcodebuild… but let's first create a brand new Swift package.</p>
<h2>Creating a Swift package library</h2>
<pre><code class="language-{.bash">mkdir FooBar &amp;&amp; cd FooBar
swift package init --type library
</code></pre>
<h2>List package schemes</h2>
<p>We can use xcodebuild to list the available schemes.</p>
<pre><code class="language-{.bash">xcodebuild -list
</code></pre>
<h2>Show supported platform, architecture, etc</h2>
<p>Similarly, we can list destinations supported for the schemes.</p>
<pre><code class="language-{.bash">xcodebuild -showdestinations -scheme FooBar
</code></pre>
<h2>macOS builds</h2>
<p>Let's build for macOS, though let's first import UIKit into FooBar.swift. This ensures we get an expected failure when building for macOS.</p>
<pre><code class="language-swift">import UIKit

struct FooBar {
  var text = &quot;Hello, World!&quot;
}
</code></pre>
<p>Now let's attempt to build it…</p>
<pre><code class="language-{.bash">xcodebuild build -quiet -scheme FooBar -destination 'platform=macOS'
</code></pre>
<p>The failure expected as UIKit isn't available on your typical macOS builds.</p>
<h2>macOS Catalyst builds</h2>
<p>We do, however, have Catalyst available, so we can use its variant to build for macOS with UIKit support, and.. voilà!</p>
<pre><code class="language-{.bash">xcodebuild build -quiet -scheme FooBar -destination 'platform=macOS,variant=Mac Catalyst' &amp;&amp; echo \\o/
</code></pre>
]]></description>
    <pubDate>Wed, 16 Jun 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs org block completion on melpa</title>
<link>https://xenodium.com/emacs-org-block-completion-on-melpa</link>
<guid isPermaLink="false">https://xenodium.com/emacs-org-block-completion-on-melpa</guid>
    <description><![CDATA[<p>When enabled, the character &quot;&lt;&quot; triggers company completion of org blocks.</p>
<p><img src="https://xenodium.github.io/images/emacs-org-block-completion-on-melpa/hello-company-org-block.gif" alt=""></p>
<p>I get the occasional ping to package the <a href="https://xenodium.com/emacs-org-block-company-completion">code from this post</a> and publish it <a href="https://melpa.org/#/company-org-block">on melpa</a>. Finally gave it a go. Moved the code <a href="https://github.com/xenodium/company-org-block">here</a>.</p>
<p>This was my first time publishing on melpa. The process was very <a href="https://github.com/melpa/melpa/pull/7593">smooth</a>. Big thanks to melpa volunteers!</p>
]]></description>
    <pubDate>Sun, 06 Jun 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs DWIM: do what ✨I✨ mean</title>
<link>https://xenodium.com/emacs-dwim-do-what-i-mean</link>
<guid isPermaLink="false">https://xenodium.com/emacs-dwim-do-what-i-mean</guid>
    <description><![CDATA[<p>Update: There's a DWIM <a href="https://xenodium.com/emacs-dwim-swiper-vs-isearch-vs-phi-search/">follow-up for searching</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-do-what-i-mean/do-what-i-mean.gif" alt=""></p>
<p>I was a rather puzzled the first time I spotted DWIM in an Emacs interactive command name. Don't think I remember what the command itself was, but what's important here is that <a href="https://en.wikipedia.org/wiki/DWIM">DWIM</a> stands for <a href="https://en.wikipedia.org/wiki/DWIM">do what I mean</a>.</p>
<p>I love DWIM interactive commands. They enable commands to be smarter and thus pack more functionality, without incurring the typical cognitive overhead associated with remembering multiple commands (or key bindings). The Emacs manual does a great job describing DWIM for the <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Comment-Commands.html">comment-dwim</a> command:</p>
<pre><code>The word “dwim” is an acronym for “Do What I Mean”; it indicates that this command can be used for many different jobs relating to comments, depending on the situation where you use it.
</code></pre>
<p>It's really great to find built-in DWIM-powered Emacs commands. Third-party packages often include them too. I typically gravitate towards these commands and bind them in my Emacs config. Examples being upcase-dwim, downcase-dwim, or mc/mark-all-dwim.</p>
<p>But what if the DWIM command doesn't exist or the author has written a command for what <em>they</em> mean? This is your editor, so you can make it do what <em>you</em> mean.</p>
<p>Take for example, <a href="https://orgmode.org/manual/Handling-Links.html">org-insert-link</a>, bound to <em>C-c C-l</em> by default. It's handy for inserting <a href="https://orgmode.org/guide/Hyperlinks.html">org mode links</a>. I used it so frequently that I quickly internalized its key binding. Having said that, I often found myself doing some lightweight preprocessing prior to invoking <em>org-insert-link</em>. What if I can <em>make org-insert-link do what I mean</em>?</p>
<h2>What do I mean?</h2>
<h3>Use URLs when in clipboard</h3>
<p>If the URL is already in the clipboard, don't ask me for it. Just use it.</p>
<h3>Use the region too</h3>
<p>If I have a region selected and there's a URL in the clipboard, just sort it out without user interaction.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-do-what-i-mean/link-this-text.gif" alt=""></p>
<h3>Automatically fetch titles</h3>
<p>Automatically fetch URL titles from their HTML tag, but ask me for tweaks before insertion.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-do-what-i-mean/do-what-i-mean.gif" alt=""></p>
<h3>Fallback to org-insert-link</h3>
<p>If my DWIM rules don't apply, fall back to using good ol' <a href="https://orgmode.org/manual/Handling-Links.html">org-insert-link</a>.</p>
<p>My most common use case here is when editing an existing link where I don't want neither its title nor URL automatically handled.</p>
<p><img src="https://xenodium.github.io/images/emacs-dwim-do-what-i-mean/edit-link.gif" alt=""></p>
<h2>The code</h2>
<p>This is your own DWIM command that does what <em>you</em> mean. Strive to write a clean implementation, but hey you can be forgiven for not handling all the cases that other folks <em>may</em> want or inlining more code than usual. The goal is to bend your editor a little, not write an Emacs package.</p>
<pre><code class="language-{.commonlisp">(defun ar/org-insert-link-dwim ()
  &quot;Like `org-insert-link' but with personal dwim preferences.&quot;
  (interactive)
  (let* ((point-in-link (org-in-regexp org-link-any-re 1))
         (clipboard-url (when (string-match-p &quot;^http&quot; (current-kill 0))
                          (current-kill 0)))
         (region-content (when (region-active-p)
                           (buffer-substring-no-properties (region-beginning)
                                                           (region-end)))))
    (cond ((and region-content clipboard-url (not point-in-link))
           (delete-region (region-beginning) (region-end))
           (insert (org-make-link-string clipboard-url region-content)))
          ((and clipboard-url (not point-in-link))
           (insert (org-make-link-string
                    clipboard-url
                    (read-string &quot;title: &quot;
                                 (with-current-buffer (url-retrieve-synchronously clipboard-url)
                                   (dom-text (car
                                              (dom-by-tag (libxml-parse-html-region
                                                           (point-min)
                                                           (point-max))
                                                          'title))))))))
          (t
           (call-interactively 'org-insert-link)))))
</code></pre>
<h2>Org web tools package</h2>
<p>I showed how to write your own DWIM command, so you can make Emacs do what ✨you✨ mean. <em>ar/org-insert-link-dwim</em> was built for my particular needs.</p>
<p>Having said all of this, alphapapa has built a great package with helpers for the org web/link space. It doesn't do what I mean (for now anyway), but it may work for you: <a href="https://github.com/alphapapa/org-web-tools">org-web-tools: View, capture, and archive Web pages in Org-mode</a>[^2].</p>
]]></description>
    <pubDate>Tue, 01 Jun 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs link scraping (2021 edition)</title>
<link>https://xenodium.com/emacs-link-scraping-2021-edition</link>
<guid isPermaLink="false">https://xenodium.com/emacs-link-scraping-2021-edition</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/emacs-link-scraping-2021-edition/scrape.png" alt=""></p>
<p>A recent Hacker News post, <a href="https://news.ycombinator.com/item?id=27302195">Ask HN: Favorite Blogs by Individuals</a>, led me to dust off my oldie but trusty <a href="https://github.com/xenodium/dotsies/blob/92ef8259f016cdd4f67caf0e520096f6da4f7a18/emacs/ar/ar-url.el#L42">command to extract comment links</a>. I use it to dissect these wonderful references more effectively.</p>
<p>You see, I wrote this command <a href="https://xenodium.com/get-emacs-to-gather-links-in-posts/">back in 2015</a>. We can likely revisit and improve. The <a href="https://github.com/zweifisch/enlive">enlive</a> package continues to do a fine job <a href="https://github.com/zweifisch/enlive/blob/604a8ca272b6889f114e2b5a13adb5b1dc4bae86/enlive.el#L39">fetching</a>, parsing, and <a href="https://github.com/zweifisch/enlive/blob/604a8ca272b6889f114e2b5a13adb5b1dc4bae86/enlive.el#L142">querying</a> HTML. Let's improve my code instead… we can shed a few redundant bits and maybe use <a href="https://xenodium.com/modern-elisp-libraries/">newer libraries and features</a>.</p>
<p>Most importantly, let's improve the user experience by sanitizing and filtering URLs a little better.</p>
<p>We start by writing a function that looks for a URL in the clipboard and subsequently fetches, parses, and extracts all links found in the target page.</p>
<pre><code class="language-{.commonlisp">(require 'enlive)
(require 'seq)

(defun ar/scrape-links-from-clipboard-url ()
  &quot;Scrape links from clipboard URL and return as a list. Fails if no URL in clipboard.&quot;
  (unless (string-prefix-p &quot;http&quot; (current-kill 0))
    (user-error &quot;no URL in clipboard&quot;))
  (thread-last (enlive-query-all (enlive-fetch (current-kill 0)) [a])
    (mapcar (lambda (element)
              (string-remove-suffix &quot;/&quot; (enlive-attr element 'href))))
    (seq-filter (lambda (link)
                  (string-prefix-p &quot;http&quot; link)))
    (seq-uniq)
    (seq-sort (lambda (l1 l2)
                (string-lessp (replace-regexp-in-string &quot;^http\\(s\\)*://&quot; &quot;&quot; l1)
                              (replace-regexp-in-string &quot;^http\\(s\\)*://&quot; &quot;&quot; l2))))))
</code></pre>
<p>Let's chat <em>(current-kill 0)</em> for a sec. No improvement from my previous usage, but let's just say building interactive commands that work with your current clipboard (or <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Kill-Ring.html">kill ring</a> in Emacs terminology) is super handy (see <a href="https://xenodium.com/emacs-clone-git-repo-from-clipboard/">clone git repo from clipboard</a>).</p>
<p>Moving on to sanitizing and filtering URLs… Links often have trailing slashes. Let's flush them. <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/subr-x.el#L261">string-remove-suffix</a> to the rescue. This and other handy string-manipulating functions are built into Emacs since 24.4 as part of <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/subr-x.el">subr-x.el</a>.</p>
<p>Next, we can keep http(s) links and ditch everything else. The end-goal is to extract links posted by users, so these are typically fully qualified external URLs. <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/seq.el">seq-filter</a> steps up to the task, included in Emacs since 25.1 as part of the <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/seq.el">seq.el family</a>. We remove duplicate links using <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/seq.el#L431">seq-uniq</a> and sort them via <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/seq.el#L255">seq-sort</a>. All part of the same package.</p>
<p>When sorting, we could straight up use <em>seq-sort</em> and <em>string-lessp</em> and nothing else, but it would separate http and https links. Let's not do that, so we drop <em>http(s)</em> prior to comparing strings in <em>seq-sort</em>'s predicate. <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/subr.el#L4468">replace-regexp-in-string</a> does the job here, but if you'd like to skip regular expressions, <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/subr-x.el#L255">string-remove-prefix</a> works just as well.</p>
<p>Yay, sorting no longer cares about http vs https:</p>
<pre><code>https://andymatuschak.org
http://antirez.com
https://apenwarr.ca/log
...
</code></pre>
<p>With all that in mind, let's flatten list processing using <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/subr-x.el#L69">thread-last</a>. This isn't strictly necessary, but since this is the 2021 edition, we'll throw in this macro added to Emacs in 2016 as part of 25.1. Arthur Malabarba has a <a href="https://endlessparentheses.com/new-in-emacs-25-1-more-flow-control-macros.html">great post on thread-last</a>.</p>
<p>Now that we've built out <em>ar/scrape-links-from-clipboard-url</em> function, let's make its content consumable!</p>
<h2>The completing frameworks way</h2>
<p>This is the 2021 edition, so power up your completion framework du jour and feed the output of <em>ar/scrape-links-from-clipboard-url</em> to our completion robots…</p>
<p><img src="https://xenodium.github.io/images/emacs-link-scraping-2021-edition/scrape_complete.gif" alt=""></p>
<p>I'm heavily vested in <a href="https://github.com/abo-abo/swiper">ivy</a>, but since we're using the built-in <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion.html">completing-read</a> function, any completion framework like <a href="https://github.com/minad/vertico">vertico</a>, <a href="https://github.com/raxod502/selectrum/">selectrum</a>, <a href="https://github.com/emacs-helm/helm">helm</a>, or <a href="https://www.gnu.org/software/emacs/manual/html_node/ido/index.html">ido</a> should kick right in to give you extra powers.</p>
<pre><code class="language-{.commonlisp">(defun ar/view-completing-links-at-clipboard-url ()
  &quot;Scrape links from clipboard URL and open all in external browser.&quot;
  (interactive)
  (browse-url (completing-read &quot;links: &quot;
                               (ar/scrape-links-from-clipboard-url))))
</code></pre>
<h2>The auto-open way (use with caution)</h2>
<p>Sometimes you just want to open every link posted in the comments and use your browser to discard, closing tabs as needed. The recent HN news instance wasn't one of these cases, with a whopping 398 links returned by our <em>ar/scrape-links-from-clipboard-url</em>.</p>
<p><img src="https://xenodium.github.io/images/emacs-link-scraping-2021-edition/scrape_browse.gif" alt=""></p>
<p><em>Note: I capped the results to 5 in this gif/demo to prevent a Firefox tragedy (see <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/emacs-lisp/seq.el#L231">seq-take</a>).</em></p>
<p>In a case like Hacker News's, we don't want to surprise-attack the user and bomb their browser by opening a gazillion tabs, so let's give a little heads-up using <a href="https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/lisp/subr.el#L2869">y-or-n-p</a>.</p>
<pre><code class="language-{.commonlisp">(defun ar/browse-links-at-clipboard-url ()
  (interactive)
  (let ((links (ar/scrape-links-from-clipboard-url)))
    (when (y-or-n-p (format &quot;Open all %d links? &quot; (length links)))
      (mapc (lambda (link)
              (browse-url link))
            links))))
</code></pre>
<h2>The org way</h2>
<p>My <a href="https://xenodium.com/get-emacs-to-gather-links-in-posts/">2015 solution</a> leveraged an <a href="https://orgmode.org/">org mode</a> buffer to dump the fetched links. The org way is still my favorite. You can use whatever existing Emacs super powers you already have on top of the org buffer, including searching and filtering fueled by your favourite completion framework. I'm a fan of <a href="https://oremacs.com/">Oleh</a>'s <a href="https://github.com/abo-abo/swiper">swiper</a>.</p>
<p><img src="https://xenodium.github.io/images/emacs-link-scraping-2021-edition/scrape_org.gif" alt=""></p>
<p>The 2021 implementation is mostly a tidy-up, removing some cruft, but also uses our new <em>ar/scrape-links-from-clipboard-url</em> function to filter and sort accordingly.</p>
<pre><code class="language-{.commonlisp">(require 'org)

(defun ar/view-links-at-clipboard-url ()
  &quot;Scrape links from clipboard URL and dump to an org buffer.&quot;
  (interactive)
  (with-current-buffer (get-buffer-create &quot;*links*&quot;)
    (org-mode)
    (erase-buffer)
    (mapc (lambda (link)
            (insert (org-make-link-string link) &quot;\n&quot;))
          (ar/scrape-links-from-clipboard-url))
    (goto-char (point-min))
    (switch-to-buffer (current-buffer))))
</code></pre>
<h2>Emacs + community + packages + your own glue = awesome</h2>
<p>To power our 2021 link scraper, we've used newer libraries included in more recent versions of Emacs, leveraged an older but solid HTML-parsing package, pulled in org mode (the epicenter of Emacs note-taking), dragged in our favorite completion framework, and tickled our handy browser all by smothering the lot with some elisp glue to make Emacs do exactly what we want. <a href="http://emacsrocks.com/">Emacs does rock</a>.</p>
]]></description>
    <pubDate>Fri, 28 May 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>OCR bookmarks</title>
<link>https://xenodium.com/ocr-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ocr-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/schappim/macOCR">schappim/macOCR: Get any text on your screen into your clipboard.</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 23 May 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>gpg: decryption failed: No secret key (macOS)</title>
<link>https://xenodium.com/gpg-decryption-failed-no-secret-key-macos</link>
<guid isPermaLink="false">https://xenodium.com/gpg-decryption-failed-no-secret-key-macos</guid>
    <description><![CDATA[<pre><code>gpg: decryption failed: No secret key
</code></pre>
<p>OMG! Where's my secret key gone!?</p>
<p>But but but, <em>gpg –list-secret-keys</em> says they're there. Puzzled…</p>
<p>Ray Oei's Stack Overflow <a href="https://stackoverflow.com/a/66234166">answer</a> solved the mystery for me: pinentry never got invoked, so likely something's up with the agent… Killing (and thus restaring) the gpg-agent did the trick:</p>
<pre><code class="language-{.bash">gpgconf --kill gpg-agent
</code></pre>
<p>Thank you internet stranger. Balance restored.</p>
]]></description>
    <pubDate>Wed, 19 May 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs plus –with-native-comp</title>
<link>https://xenodium.com/emacs-plus-with-native-comp</link>
<guid isPermaLink="false">https://xenodium.com/emacs-plus-with-native-comp</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/emacs-plus-with-native-comp/brew-native-comp.png" alt=""></p>
<p>I'm a big fan of <a href="https://d12frosted.io/">Boris Buliga</a>'s <a href="https://github.com/d12frosted/homebrew-emacs-plus">Emacs Plus</a> <a href="https://brew.sh/">homebrew</a> recipe for customizing and installing Emacs builds on macOS.</p>
<p>For a little while, I took a detour and built Emacs myself, so I could enable <a href="https://twitter.com/Koral_001">Andrea Corallo</a>'s fantastic <a href="http://akrl.sdf.org/gccemacs.html">native compilation</a>. I documented the steps <a href="https://xenodium.com/trying-out-gccemacs-on-macos/">here</a>. Though it was fairly straightforward, I did miss Emacs Plus's convenience.</p>
<p>I had been meaning to check back on Emacs Plus for native compilation support. Turns out, it was merged back in <a href="https://github.com/d12frosted/homebrew-emacs-plus/pull/188">Dec 2020</a>, and it works great!</p>
<p>Enabling native compilation is simple (just use <em>–with-native-comp</em>). As a bonus, you get all the Emacs Plus goodies. I'm loving <em>–with-elrumo2-icon</em>, enabling a spiffy icon to go with macOS Big Sur. <em>–with-no-frame-refocus</em> is also handy to <a href="https://xenodium.com/no-emacs-frame-refocus-on-macos/">avoid refocusing other frames</a> when another one is closed.</p>
<p>In any case, here's the minimum needed to install Emacs Plus with native compilation support enabled:</p>
<pre><code class="language-{.bash">brew tap d12frosted/emacs-plus
brew install emacs-plus@28 --with-native-comp
</code></pre>
<p>Sit tight. Homebrew will build and install some chunky dependencies (including gcc and libgccjit).</p>
<p>Note: Your init.el needs tweaking to take advantage of native compilation. See my <a href="https://xenodium.com/trying-out-gccemacs-on-macos/">previous post</a> for how I set mine, or go straight to <a href="https://github.com/xenodium/dotsies/blob/main/emacs/features/fe-package-extensions.el#L19">my config</a>.</p>
]]></description>
    <pubDate>Mon, 17 May 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cycling window layouts with hammerspoon</title>
<link>https://xenodium.com/cycling-window-layouts-via-hammerspoon</link>
<guid isPermaLink="false">https://xenodium.com/cycling-window-layouts-via-hammerspoon</guid>
    <description><![CDATA[<p>Back in January, Patrik Collison <a href="https://twitter.com/patrickc/status/1351650517869465601">tweeted</a> about <a href="https://rectangleapp.com/">Rectangle</a>'s <a href="https://github.com/rxhanson/Rectangle/wiki/Todo-Mode">Todo mode</a>. Rectangle looks great. Although I've not yet adopted it, Todo mode really resonates with me. I've been achieving similar functionality with <a href="https://www.hammerspoon.org/">hammerspoon</a>.</p>
<p><img src="https://xenodium.github.io/images/cycling-window-layouts-via-hammerspoon/cycle.gif" alt=""></p>
<p>Here's a quick and dirty function to cycle through my window layouts:</p>
<pre><code class="language-python">function reframeFocusedWindow()
   local win = hs.window.focusedWindow()
   local maximizedFrame = win:screen():frame()
   maximizedFrame.x = maximizedFrame.x + 15
   maximizedFrame.y = maximizedFrame.y + 15
   maximizedFrame.w = maximizedFrame.w - 30
   maximizedFrame.h = maximizedFrame.h - 30

   local leftFrame = win:screen():frame()
   leftFrame.x = leftFrame.x + 15
   leftFrame.y = leftFrame.y + 15
   leftFrame.w = leftFrame.w - 250
   leftFrame.h = leftFrame.h - 30

   local rightFrame = win:screen():frame()
   rightFrame.x = rightFrame.w - 250 + 15
   rightFrame.y = rightFrame.y + 15
   rightFrame.w = 250 - 15 - 15
   rightFrame.h = rightFrame.h - 30

   -- Make space on right
   if win:frame() == maximizedFrame then
     win:setFrame(leftFrame)
     return
   end

   -- Make space on left
   if win:frame() == leftFrame then
     win:setFrame(rightFrame)
     return
   end

   win:setFrame(maximizedFrame)
end
</code></pre>
<p>A here's my <strong>⌥-F</strong> binding to <strong>reframeFocusedWindow</strong>:</p>
<pre><code class="language-python">hs.hotkey.bind({&quot;alt&quot;}, &quot;F&quot;, reframeFocusedWindow)
</code></pre>
]]></description>
    <pubDate>Sun, 02 May 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flat Habits meets org agenda</title>
<link>https://xenodium.com/flat-habits-meets-org-agenda</link>
<guid isPermaLink="false">https://xenodium.com/flat-habits-meets-org-agenda</guid>
    <description><![CDATA[<p>UPDATE: Flat Habits now has its own page at <a href="https://flathabits.com/">flathabits.com</a>.</p>
<p>Flat Habits v1.0.2 is <a href="https://apps.apple.com/app/id1558358855">out today</a>, with habit-toggling now supported from the streak view.</p>
<p>Flat Habits runs on org, making it a great complement to Emacs and org agenda ø/</p>
<p><img src="https://xenodium.github.io/images/flat-habits-meets-org-agenda/flat_agenda.gif" alt=""></p>
<center>
  <a href="https://apps.apple.com/app/id1558358855">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="today_no_filter.png" width="180px">
  </a>
</center>
]]></description>
    <pubDate>Sat, 10 Apr 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flat Habits v1.0.1 (org import menu)</title>
<link>https://xenodium.com/flat-habits-v101-org-import-menu</link>
<guid isPermaLink="false">https://xenodium.com/flat-habits-v101-org-import-menu</guid>
    <description><![CDATA[<p>UPDATE: Flat Habits now has its own page at <a href="https://flathabits.com/">flathabits.com</a>.</p>
<p>Flat Habits v1.0.1 is now released and <a href="https://apps.apple.com/app/id1558358855">available</a> in the App Store.</p>
<h2>org import (import vs in-place)</h2>
<p>We can now import org files from the menu. Importing gives ya the option to either import (copy into the app) or open in-place. The latter enables users to sync org files with other iOS apps or just open/edit from Emacs for the full org-mode/agenda experience.</p>
<center>
  <img src="https://xenodium.github.io/images/flat-habits-v101-org-import-menu/menu.png" alt="today_no_filter.png" width="300px">
  <img src="https://xenodium.github.io/images/flat-habits-v101-org-import-menu/filebrowse.png" alt="today_no_filter.png" width="300px">
</center>
<p>Syncing with your desktop can be achieved by either iCloud or by enabling other providers in the Files app (after installing the likes of Google Drive, Dropbox, etc).</p>
<p><em>Please note that importing (copying into the app) is currently the recommended flow.</em> Opening in-place and syncing is still fairly experimental, so please back up your org files regularly. If you do run into syncing issues, please get in touch.</p>
<p>Good luck with your habits!</p>
]]></description>
    <pubDate>Tue, 23 Mar 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flat Habits for iOS (powered by org)</title>
<link>https://xenodium.com/flat-habits-for-ios-powered-by-org</link>
<guid isPermaLink="false">https://xenodium.com/flat-habits-for-ios-powered-by-org</guid>
    <description><![CDATA[<p>UPDATE: Flat Habits now has its own page at <a href="https://flathabits.com/">flathabits.com</a>.</p>
<p><em>No friction. No social. No analytics. No account. No cloud. No lock-in.</em></p>
<h2>So what is it?</h2>
<p>An iOS app to help you form and track lasting habits.</p>
<center>
  <img src="https://xenodium.github.io/images/flat-habits-for-ios/today_no_filter.png" alt="today_no_filter.png" width="300px">
  <img src="https://xenodium.github.io/images/flat-habits-for-ios/meditate.png" alt="today_no_filter.png" width="300px">
  <a href="https://apps.apple.com/app/id1558358855">
    <img src="https://xenodium.github.io/images/flat-habits-for-ios/download-on-app-store.png" alt="today_no_filter.png" width="180px">
  </a>
</center>
<h2>Why an app?</h2>
<p>Tracking and accountability may help you develop positive habits. A simple habit-tracking app should make this easy. I'm not a habits expert, but got inspired by James Clear's <a href="https://jamesclear.com/atomic-habits">Atomic Habits</a>. Read that book if you're interested in the topic.</p>
<p>I wanted a frictionless habit tracker that gets out of the way, so I built one to my taste.</p>
<h2>Sounds like a lot of work?</h2>
<p>You mean habit tracking? It's not. I tried to make the app simple and focused. Mark a habit done whenever you do it. It's really encouraging to see your daily streaks grow. I really don't want to break them.</p>
<h2>What kind of habits?</h2>
<p>Any recurring habit you'd like to form like exercise, water the plants, read, make your bed, recycle, call grandma, yoga, cleaning, drink water, meditate, take a nap, make your lunch, journal, laundry, push-ups, sort out the dryer filter, floz, take your vitamins, take your meds, eat salad, eat fruit, practice a language, practice an instrument, go to bed early…</p>
<h2>So it's like a task/todo app?</h2>
<p>Nope. This app focuses solely on habits. Unlike todos/tasks, habits must happen regularly. If you don't water the plants, they will die. If you don't exercise regularly, you won't get the health benefits. Keep your habits separate from that long list of todos. You know, that panic-inducing list you're too afraid to look at.</p>
<h2>Where is my data stored?</h2>
<p>On your iPhone as a plain text file (in <a href="https://orgmode.org/">org mode</a> format). You can view, edit, or migrate your data at any time (use export from the menu). You may also save it to a shared location, so you can access it from multiple devices/apps. Some of us like to <a href="http://xenodium.com/frictionless-org-habits-on-ios/">use our beloved text editors</a> (Emacs, Vim, VSCode, etc.) to poke at <a href="https://orgmode.org/manual/Tracking-your-habits.html">habits</a>.</p>
<h2>Got more questions?</h2>
<p>I may not have the answer, but I can try. Ping me at <em>flathabits*at*xenodium.com</em>.</p>
<h2>Privacy policy</h2>
<p>No personal data is sent to any server, as there is no server component to this app. There are neither third party integrations, accounts, analytics, nor trackers in this app. All your data is kept on your iPhone, unless you choose a cloud provider to sync or store your data. See your cloud provider's privacy policy for details on how they may handle it.</p>
<p>If you choose to send feedback by email, you have the option to review and attach logs to help diagnose issues. If you'd like an email thread to be deleted, just ask.</p>
<p>To join TestFlight as a beta tester, you likely gave your email address. If you'd like your email removed, just ask. Note that TestFlight has its own <a href="https://www.apple.com/legal/internet-services/itunes/testflight/sren/terms.html">Terms Of Service</a>.</p>
]]></description>
    <pubDate>Wed, 17 Mar 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Frictionless org habits on iOS</title>
<link>https://xenodium.com/frictionless-org-habits-on-ios</link>
<guid isPermaLink="false">https://xenodium.com/frictionless-org-habits-on-ios</guid>
    <description><![CDATA[<p>UPDATE: Flat Habits now has its own page at <a href="https://flathabits.com/">flathabits.com</a>.</p>
<p><img src="https://xenodium.github.io/images/frictionless-org-habits-on-ios/flat_habits.gif" alt=""></p>
<p>I've been wanting org to keep track of my daily habits for a little while. The catalyst: reading James Clear's wonderful <a href="https://jamesclear.com/atomic-habits">Atomic Habits</a> (along with plenty of lock-down inspiration).</p>
<p>As much as I live in Emacs and org mode, it just wasn't practical enough to rely on my laptop for tracking habits. I wanted less friction, so I've been experimenting with building a toy app for my needs. Naturally, org support was a strict requirement, so I could always poke at it from my beloved editor.</p>
<p>I've been using the app every day with success. The habits seem to be sticking, but equally important, it's been really fun to join the fabulous world of Emacs/Org with iOS/SwiftUI.</p>
<p>This is all very experimental[^3] and as mentioned on <a href="https://www.reddit.com/r/emacs/comments/ljurwx/org_habits_ios_app_want_to_try_it/">reddit</a> (follow-up <a href="https://www.reddit.com/r/emacs/comments/lp62vn/org_habits_ios_app_followup_twoway_edit/">here</a>) and <a href="https://twitter.com/xenodium/status/1361034010047176705">twitter</a>, the app isn't available on the App Store. I may consider publishing if there's enough interest, but in the mean time, you can reach out and install via <a href="https://testflight.apple.com/">TestFlight</a>.</p>
<p>Send me an email address to <em>flathabits*at*xenodium.com</em> for a TestFlight invite.</p>
<h2>2021-03-12 Update: Now with iOS Files app/sync integration</h2>
<p>If you can sync your org file with your iPhone (ie. Drive/Dropbox/iCloud), and list it in the Files app, you should be able to open/edit[^4] with <em>Flat Habits</em> (that's the name now). With iOS Files integration, you should be able to sync your habits between your iPhone and your <a href="https://www.gnu.org/software/emacs/">funky editor</a> powering org mode[^5].</p>
<p><img src="https://xenodium.github.io/images/frictionless-org-habits-on-ios/filesapp_shorter.gif" alt=""></p>
]]></description>
    <pubDate>Sun, 21 Feb 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Symbolicating iOS crashes</title>
<link>https://xenodium.com/symbolicating-ios-crashes</link>
<guid isPermaLink="false">https://xenodium.com/symbolicating-ios-crashes</guid>
    <description><![CDATA[<pre><code class="language-{.bash">export DEVELOPER_DIR=$(xcode-select --print-path)
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash crashlog.crash MyFoo.app.dSYM
</code></pre>
]]></description>
    <pubDate>Sat, 20 Feb 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: mu4e icons</title>
<link>https://xenodium.com/mu4e-icons</link>
<guid isPermaLink="false">https://xenodium.com/mu4e-icons</guid>
    <description><![CDATA[<p>Recently spotted <a href="https://github.com/stardiviner/mu4e-marker-icons">mu4e-marker-icons</a>, which adds mu4e icons using <a href="https://github.com/domtronn/all-the-icons.el">all-the-icons</a>.</p>
<p>Although I'm not currently using all-the-icons, it did remind me to take a look at mu4e's built-in variables to spiff up my email. It's pretty simple. Find the icons you like and set them as follows:</p>
<p><img src="https://xenodium.github.io/images/mu4e-icons/mu4eicons.png" alt=""></p>
<pre><code class="language-{.commonlisp">(setq mu4e-headers-unread-mark    '(&quot;u&quot; . &quot;📩 &quot;))
(setq mu4e-headers-draft-mark     '(&quot;D&quot; . &quot;🚧 &quot;))
(setq mu4e-headers-flagged-mark   '(&quot;F&quot; . &quot;🚩 &quot;))
(setq mu4e-headers-new-mark       '(&quot;N&quot; . &quot;✨ &quot;))
(setq mu4e-headers-passed-mark    '(&quot;P&quot; . &quot;↪ &quot;))
(setq mu4e-headers-replied-mark   '(&quot;R&quot; . &quot;↩ &quot;))
(setq mu4e-headers-seen-mark      '(&quot;S&quot; . &quot; &quot;))
(setq mu4e-headers-trashed-mark   '(&quot;T&quot; . &quot;🗑️&quot;))
(setq mu4e-headers-attach-mark    '(&quot;a&quot; . &quot;📎 &quot;))
(setq mu4e-headers-encrypted-mark '(&quot;x&quot; . &quot;🔑 &quot;))
(setq mu4e-headers-signed-mark    '(&quot;s&quot; . &quot;🖊 &quot;))
</code></pre>
]]></description>
    <pubDate>Sat, 23 Jan 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Luxembourg travel bookmarks</title>
<link>https://xenodium.com/luxembourg-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/luxembourg-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.mullerthal-trail.lu/en">Hiking in Luxembourg - Mullerthal Trail</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 02 Jan 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>South Africa travel bookmarks</title>
<link>https://xenodium.com/south-africa-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/south-africa-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.tripsavvy.com/blyde-river-canyon-south-africa-guide-4157668">Blyde River Canyon, South Africa: The Complete Guide</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 02 Jan 2021 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Swift package code coverage (plus Emacs overlay)</title>
<link>https://xenodium.com/swift-package-code-coverage</link>
<guid isPermaLink="false">https://xenodium.com/swift-package-code-coverage</guid>
    <description><![CDATA[<p>While playing around with Swift package manager, I had a quick look into code coverage options. Luckily, coverage reporting and exporting are supported out of the box (via <a href="https://llvm.org/docs/CommandGuide/llvm-cov.html">llvm-cov</a>).</p>
<p>Ensure tests are invoked as follows:</p>
<pre><code class="language-{.bash">swift test --enable-code-coverage
</code></pre>
<p>A high level report can be generated with:</p>
<pre><code class="language-{.bash">xcrun llvm-cov report .build/x86_64-apple-macosx/debug/FooPackageTests.xctest/Contents/MacOS/FooPackageTests \
      -instr-profile=.build/x86_64-apple-macosx/debug/codecov/default.profdata -ignore-filename-regex=&quot;.build|Tests&quot;
</code></pre>
<p>llvm-cov can export as lcov format:</p>
<pre><code class="language-{.bash">xcrun llvm-cov export -format=&quot;lcov&quot; .build/x86_64-apple-macosx/debug/FooPackageTests.xctest/Contents/MacOS/FooPackageTests -instr-profile=.build/x86_64-apple-macosx/debug/codecov/default.profdata -ignore-filename-regex=&quot;.build|Tests&quot; &gt; coverage.lcov
</code></pre>
<p>With the report in lcov format, we can look for an Emacs package to visualize coverage in source files. Found <a href="https://github.com/twada/coverlay.el">coverlay.el</a> to require minimal setup. I was interested in highlighting only untested areas, so I set <em>tested-line-background-color</em> to nil:</p>
<pre><code class="language-{.commonlisp">(use-package coverlay
  :ensure t
  :config
  (setq coverlay:tested-line-background-color nil))
</code></pre>
<p>After installing coverlay, I enabled the minor mode via <em>M-x coverlay-minor-mode</em>, invoked <em>M-x coverlay-watch-file</em> to watch <em>coverage.lcov</em> for changes, and voilà!</p>
<p><img src="https://xenodium.github.io/images/swift-package-code-coverage/coverage.png" alt=""></p>
]]></description>
    <pubDate>Tue, 29 Dec 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hiking bookmarks</title>
<link>https://xenodium.com/hiking-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/hiking-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=25568856">A growing list of long distance hikes around the world (Hacker News)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 29 Dec 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Patience</title>
<link>https://xenodium.com/patience</link>
<guid isPermaLink="false">https://xenodium.com/patience</guid>
    <description><![CDATA[<p>Via <a href="https://twitter.com/orangebook_/status/1291844997097099265?s=12">Orange Book</a>, a reminder to myself:</p>
<ul>
<li>In investing, patience is rewarded.</li>
<li>In growing a talent, patience is rewarded.</li>
<li>In building a business, patience is rewarded.</li>
<li>In love and friendships, patience is rewarded.</li>
<li>Patience = success</li>
</ul>
<p>I feel like there's an Emacs lesson somewhere in there…</p>
]]></description>
    <pubDate>Mon, 28 Dec 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Chess bookmarks</title>
<link>https://xenodium.com/chess-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/chess-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://dwheeler.com/chess-openings/">A Beginner's Garden of Chess Openings</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=25446399">A Beginner's Garden of Chess Openings (2002) (Hacker News)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 26 Dec 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>40 Coolest neighbourhoods in the world</title>
<link>https://xenodium.com/40-coolest-neighborhoods-in-the-world</link>
<guid isPermaLink="false">https://xenodium.com/40-coolest-neighborhoods-in-the-world</guid>
    <description><![CDATA[<p>Via TimeOut's <a href="https://www.timeout.com/coolest-neighbourhoods-in-the-world">40 Coolest Neighbourhoods in the World Right Now</a>:</p>
<ol>
<li>Esquerra de l’Eixample, Barcelona</li>
<li>Downtown, Los Angeles</li>
<li>Sham Shui Po, Hong Kong</li>
<li>Bedford-Stuyvesant, New York</li>
<li>Yarraville, Melbourne</li>
<li>Wedding, Berlin</li>
<li>Shaanxi Bei Lu/Kangding Lu, Shanghai</li>
<li>Dennistoun, Glasgow</li>
<li>Haut-Marais, Paris</li>
<li>Marrickville, Sydney</li>
<li>Verdun, Montreal</li>
<li>Kalamaja, Tallinn</li>
<li>Hannam-dong, Seoul</li>
<li>Bonfim, Porto</li>
<li>Ghosttown, Oakland</li>
<li>Chula-Samyan, Bangkok</li>
<li>Alvalade, Lisbon</li>
<li>Noord, Amsterdam</li>
<li>Centro, São Paulo</li>
<li>Holešovice, Prague</li>
<li>Lavapiés, Madrid</li>
<li>Opebi, Lagos</li>
<li>Narvarte, Mexico City</li>
<li>Uptown, Chicago</li>
<li>Little Five Points, Atlanta</li>
<li>Wynwood, Miami</li>
<li>Phibsboro, Dublin</li>
<li>Nørrebro, Copenhagen</li>
<li>Bugis, Singapore</li>
<li>Gongguan, Taipei</li>
<li>Soho, London</li>
<li>Binh Thanh, Ho Chi Minh City</li>
<li>Melville, Johannesburg</li>
<li>Kabutocho, Tokyo</li>
<li>Porta Venezia, Milan</li>
<li>Taman Paramount, Kuala Lumpur</li>
<li>Allston, Boston</li>
<li>Bandra West, Mumbai</li>
<li>Arnavutköy, Istanbul</li>
<li>Banjar Nagi, Ubud</li>
</ol>
]]></description>
    <pubDate>Sun, 20 Dec 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Rotate my macOS display</title>
<link>https://xenodium.com/emacs-rotate-my-macos-display</link>
<guid isPermaLink="false">https://xenodium.com/emacs-rotate-my-macos-display</guid>
    <description><![CDATA[<p>Every so often, I rotate my monitor (vertical vs horizontal) for either work or to watch a movie. macOS enables changing the display rotation via a dropdown menu (under <em>Preferences &gt; Displays &gt; Rotation</em>) where you can pick between <em>Standard</em>, <em>90°</em>, <em>180°</em>, and <em>270°</em>. That's all fine, but what I'd really like is a quick way to toggle between my preferred two choices: <em>Standard</em> and <em>270°</em>.</p>
<p>Unsurprisingly, I'd also like to invoke it as an interactive command via Emacs's <em>M-x</em> (see <a href="http://xenodium.com/emacs-connect-my-bluetooth-speaker/index.html">Emacs: connect my Bluetooth speaker</a>). With narrowing frameworks like <a href="https://github.com/abo-abo/swiper">ivy</a>, <a href="https://emacs-helm.github.io/helm/">helm</a>, and <a href="https://www.gnu.org/software/emacs/manual/html_mono/ido.html">ido</a>, invoking these commands is just a breeze.</p>
<p>Turns out, this was pretty simple to accomplish, thanks to Eric Nitardy's <a href="https://github.com/CdLbB/fb-rotate">fb-rotate</a> command line utility. All that's left to do is wrap it in a tiny elisp <s>function</s> hack, add the toggling logic, and voilà!</p>
<p><img src="https://xenodium.github.io/images/emacs-rotate-my-macos-display/rotate.gif" alt=""></p>
<p><em>The screen capture goes a little funky when rotating the display, but you get the idea. It works better in person :)</em></p>
<p>…and here's the snippet:</p>
<pre><code class="language-{.commonlisp">(defun ar/display-toggle-rotation ()
  (interactive)
  (require 'cl-lib)
  (cl-assert (executable-find &quot;fb-rotate&quot;) nil
             &quot;Install fb-rotate from https://github.com/CdLbB/fb-rotate&quot;)
  ;; #  Display_ID    Resolution  ____Display_Bounds____  Rotation
  ;; 2  0x2b347692    1440x2560      0     0  1440  2560    270    [main]
  ;; From fb-rotate output, get the `current-rotation' from Column 7, row 1 zero-based.
  (let ((current-rotation (nth 7 (split-string (nth 1 (process-lines &quot;fb-rotate&quot; &quot;-i&quot;))))))
    (call-process-shell-command (format &quot;fb-rotate -d 1 -r %s&quot;
                                        (if (equal current-rotation &quot;270&quot;)
                                            &quot;0&quot;
                                          &quot;270&quot;)))))
</code></pre>
]]></description>
    <pubDate>Sat, 05 Dec 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Clone git repo from clipboard</title>
<link>https://xenodium.com/emacs-clone-git-repo-from-clipboard</link>
<guid isPermaLink="false">https://xenodium.com/emacs-clone-git-repo-from-clipboard</guid>
    <description><![CDATA[<p>Cloning git repositories is a pretty common task. For me, it typically goes something like:</p>
<ul>
<li>Copy git repo URL from browser.</li>
<li>Drop to Emacs eshell.</li>
<li>Change current directory.</li>
<li>Type &quot;git clone &quot;.</li>
<li>Paste git repo URL.</li>
<li>Run git command.</li>
<li>Change directory to cloned repo.</li>
<li>Open dired.</li>
</ul>
<p>No biggie, but why go through the same steps every time? We can do better. We have a hyper malleable editor, so let's get it to grab the URL from clipboard and do its thing.</p>
<p><em>shell-command</em> or <em>async-shell-command</em> can help in this space, but require additional work: change location, re-type command, what if directory already exists… This is Emacs, so we can craft the exact experience we want. I did take inspiration from <em>shell-command</em> to display the process buffer correctly (git progress, control codes, etc.) and landed on the following experience:</p>
<p><img src="https://xenodium.github.io/images/emacs-clone-git-repo-from-clipboard/git_clone_dired.gif" alt=""></p>
<pre><code class="language-{.commonlisp">;; -*- lexical-binding: t -*-

(defun ar/git-clone-clipboard-url ()
  &quot;Clone git URL in clipboard asynchronously and open in dired when finished.&quot;
  (interactive)
  (cl-assert (string-match-p &quot;^\\(http\\|https\\|ssh\\)://&quot; (current-kill 0)) nil &quot;No URL in clipboard&quot;)
  (let* ((url (current-kill 0))
         (download-dir (expand-file-name &quot;~/Downloads/&quot;))
         (project-dir (concat (file-name-as-directory download-dir)
                              (file-name-base url)))
         (default-directory download-dir)
         (command (format &quot;git clone %s&quot; url))
         (buffer (generate-new-buffer (format &quot;*%s*&quot; command)))
         (proc))
    (when (file-exists-p project-dir)
      (if (y-or-n-p (format &quot;%s exists. delete?&quot; (file-name-base url)))
          (delete-directory project-dir t)
        (user-error &quot;Bailed&quot;)))
    (switch-to-buffer buffer)
    (setq proc (start-process-shell-command (nth 0 (split-string command)) buffer command))
    (with-current-buffer buffer
      (setq default-directory download-dir)
      (shell-command-save-pos-or-erase)
      (require 'shell)
      (shell-mode)
      (view-mode +1))
    (set-process-sentinel proc (lambda (process state)
                                 (let ((output (with-current-buffer (process-buffer process)
                                                 (buffer-string))))
                                   (kill-buffer (process-buffer process))
                                   (if (= (process-exit-status process) 0)
                                       (progn
                                         (message &quot;finished: %s&quot; command)
                                         (dired project-dir))
                                     (user-error (format &quot;%s\n%s&quot; command output))))))
    (set-process-filter proc #'comint-output-filter)))
</code></pre>
<p>Comment on <a href="https://www.reddit.com/r/emacs/comments/k3iter/simplequick_git_repo_clone_from_browser_to_emacs/">reddit</a> or <a href="https://twitter.com/xenodium/status/1333111043791458309">twitter</a>.</p>
<h2>Updates</h2>
<ul>
<li>Added lexical binding.</li>
<li>Checks clipboard for ssh urls also.</li>
</ul>
]]></description>
    <pubDate>Sun, 29 Nov 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Pulled pork recipe</title>
<link>https://xenodium.com/pulled-pork-recipe</link>
<guid isPermaLink="false">https://xenodium.com/pulled-pork-recipe</guid>
    <description><![CDATA[<p>Made pulled pork a couple of times. Freestyled a bit. No expert here, but result was yummie.</p>
<h2>Grind/blend spices</h2>
<ul>
<li>2 teaspoons smoked paprika</li>
<li>2 teaspoons cumin seeds</li>
<li>2 teaspoons whole pepper corn mix</li>
<li>2 teaspoons chilly flakes</li>
</ul>
<p>If spices are whole, grind or blend them. Set aside.</p>
<p>Optionally: Substitute 1 teaspoon of paprika with chipotle pepper.</p>
<p><img src="https://xenodium.github.io/images/pulled-pork-recipe/grind.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/pulled-pork-recipe/ground.jpg" alt=""></p>
<h2>Mix into a paste</h2>
<ul>
<li>2 tablespoons honey</li>
<li>1 teaspoon of dijon mustard</li>
</ul>
<p>Mix the honey, mustard, and previous spices into a paste.</p>
<h2>Rub the mix in</h2>
<p>Rub mix thoroughly into the pork shoulder.</p>
<h2>Bake (1 hour)</h2>
<p>Place in a pot (lid off) and bake in the oven for 1 hour at 200 °C.</p>
<h2>Add liquids</h2>
<ul>
<li>1/2 cup of water.</li>
<li>4 tablespoons of apple cider vinegar.</li>
</ul>
<p>Add liquids to pot.</p>
<p><img src="https://xenodium.github.io/images/pulled-pork-recipe/almost.jpg" alt=""></p>
<h2>Bake (3-5 hours)</h2>
<p>Bake between 3 to 5 hours 150 °C. Check every hour or two. Does the meat fall easily when spread with two forks? If so, you're done.</p>
<p><img src="https://xenodium.github.io/images/pulled-pork-recipe/out.jpg" alt=""></p>
<h2>Pull apart</h2>
<p>Use two forks to pull the meat apart.</p>
<p><img src="https://xenodium.github.io/images/pulled-pork-recipe/final.jpg" alt=""></p>
]]></description>
    <pubDate>Mon, 23 Nov 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Zettelkasten bookmarks</title>
<link>https://xenodium.com/zettelkasten-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/zettelkasten-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://zettelkasten.de/introduction/">Introduction to the Zettelkasten Method</a>.</li>
<li><a href="https://blog.viktomas.com/posts/slip-box/#fnref:1">Zettelkasten note-taking in 10 minutes · Tomas Vik</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 01 Nov 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Battlestation bookmarks</title>
<link>https://xenodium.com/battlestation-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/battlestation-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/twostraws/status/1321064772276789248">Hacking with Swift's battlestation.</a>.</li>
<li><a href="https://www.reddit.com/r/battlestations/">/r/battlestations</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 28 Oct 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: chaining org babel blocks</title>
<link>https://xenodium.com/emacs-chaining-org-babel-blocks</link>
<guid isPermaLink="false">https://xenodium.com/emacs-chaining-org-babel-blocks</guid>
    <description><![CDATA[<p>Recently wanted to chain org babel blocks. That is, aggregate separate source blocks and execute as one combined block.</p>
<p><img src="https://xenodium.github.io/images/emacs-chaining-org-babel-blocks/chain.gif" alt=""></p>
<p>I wanted the chaining primarily driven through header arguments as follows:</p>
<pre><code class="language-org">#+name: block-0
#+begin_src swift
  print(&quot;hello 0&quot;)
#+end_src

#+name: block-1
#+begin_src swift :include block-0
  print(&quot;hello 1&quot;)
#+end_src

#+RESULTS: block-1
: hello 0
: hello 1
</code></pre>
<p>I didn't find the above syntax and behaviour supported out of the box (or didn't search hard enough?). Fortunately, this is our beloved and malleable editor, so we can always bend it our way! Wasn't quite sure how to go about it, so I looked at other babel packages for inspiration. <a href="https://github.com/astahlman/ob-async">ob-async</a> was great for that.</p>
<p>Turns out, advicing <em>org-babel-execute-src-block</em> did the job:</p>
<pre><code class="language-{.commonlisp">(defun adviced:org-babel-execute-src-block (&amp;optional orig-fun arg info params)
  (let ((body (nth 1 info))
        (include (assoc :include (nth 2 info)))
        (named-blocks (org-element-map (org-element-parse-buffer)
                          'src-block (lambda (item)
                                       (when (org-element-property :name item)
                                         (cons (org-element-property :name item)
                                               item))))))
    (while include
      (unless (cdr include)
        (user-error &quot;:include without value&quot; (cdr include)))
      (unless (assoc (cdr include) named-blocks)
        (user-error &quot;source block \&quot;%s\&quot; not found&quot; (cdr include)))
      (setq body (concat (org-element-property :value (cdr (assoc (cdr include) named-blocks)))
                         body))
      (setf (nth 1 info) body)
      (setq include (assoc :include
                           (org-babel-parse-header-arguments
                            (org-element-property :parameters (cdr (assoc (cdr include) named-blocks)))))))
    (funcall orig-fun arg info params)))

(advice-add 'org-babel-execute-src-block :around 'adviced:org-babel-execute-src-block)
</code></pre>
<p>Before I built my own support, I did find that <a href="https://orgmode.org/manual/Noweb-Reference-Syntax.html">noweb</a> got me most of what I needed, but required sprinkling blocks with placeholder references.</p>
<p><img src="https://xenodium.github.io/images/emacs-chaining-org-babel-blocks/noweb.gif" alt=""></p>
<p>Combining <a href="https://orgmode.org/manual/Noweb-Reference-Syntax.html">:noweb</a> and <a href="https://org-babel.readthedocs.io/en/latest/header-args/#prologue">:prologue</a> would have been a great match, if only prologue did expand the noweb reference. I'm sure there's an alternative I'm missing. Either way, it was fun to poke at babel blocks and build my own chaining support.</p>
]]></description>
    <pubDate>Tue, 27 Oct 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: quote wrap all in region</title>
<link>https://xenodium.com/emacs-quote-wrap-all-in-region</link>
<guid isPermaLink="false">https://xenodium.com/emacs-quote-wrap-all-in-region</guid>
    <description><![CDATA[<p>As I find myself moving more shell commands into Emacs interactive commands to <a href="http://xenodium.com/emacs-create-a-swift-packageproject/">create a Swift package/project</a>, <a href="http://xenodium.com/enrich-your-dired-batching-toolbox/">enrich dired's featureset</a>, or <a href="http://xenodium.com/emacs-searchplay-music-macos/">search/play Music (macOS)</a>, I often need to take a single space-separated string, make an elisp list of strings, and feed it to functions like <em>process-lines</em>. No biggie, but I thought it'd be a fun little function to write: take the region and wrap all items in quotes. As a bonus, made it toggable.</p>
<p><img src="https://xenodium.github.io/images/emacs-quote-wrap-all-in-region/wrap-toggle-region.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(defun ar/toggle-quote-wrap-all-in-region (beg end)
  &quot;Toggle wrapping all items in region with double quotes.&quot;
  (interactive (list (mark) (point)))
  (unless (region-active-p)
    (user-error &quot;no region to wrap&quot;))
  (let ((deactivate-mark nil)
        (replacement (string-join
                      (mapcar (lambda (item)
                                (if (string-match-p &quot;^\&quot;.*\&quot;$&quot; item)
                                    (string-trim item &quot;\&quot;&quot; &quot;\&quot;&quot;)
                                  (format &quot;\&quot;%s\&quot;&quot; item)))
                              (split-string (buffer-substring beg end)))
                      &quot; &quot;)))
    (delete-region beg end)
    (insert replacement)))
</code></pre>
]]></description>
    <pubDate>Sun, 25 Oct 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: org block complete and edit</title>
<link>https://xenodium.com/emacs-edit-after-org-block-completion</link>
<guid isPermaLink="false">https://xenodium.com/emacs-edit-after-org-block-completion</guid>
    <description><![CDATA[<p>I quickly got used to <a href="http://xenodium.com/emacs-org-block-company-completion/">Emacs org block company completion</a>. I did, however, almost always found myself running <em>org-edit-special</em> immediately after inserting completion. I use <strong>C-c '</strong> for that. That's all fine, but it just felt redundant.</p>
<p>Why not automatically edit the source block in corresponding major mode after completion? I think I can also get used to that!</p>
<p><img src="https://xenodium.github.io/images/emacs-edit-after-org-block-completion/automatic.gif" alt=""></p>
<p>Or maybe the automatic approach is too eager? There's also a middle ground: ask immediately after.</p>
<p><img src="https://xenodium.github.io/images/emacs-edit-after-org-block-completion/prompted.gif" alt=""></p>
<p>Or maybe I don't want either in the end? Time will tell, but I now have all three options available:</p>
<pre><code class="language-{.commonlisp">(defcustom company-org-block-edit-mode 'auto
  &quot;Customize whether edit mode, post completion was inserted.&quot;
  :type '(choice
          (const :tag &quot;nil: no edit after insertion&quot; nil)
          (const :tag &quot;prompt: ask before edit&quot; prompt)
          (const :tag &quot;auto edit, no prompt&quot; auto)))
</code></pre>
<p>The new option is now in the <a href="https://github.com/xenodium/dotsies/blob/main/emacs/ar/company-org-block.el">company-org-block snippet</a> with my latest config.</p>
]]></description>
    <pubDate>Sun, 18 Oct 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: create a Swift package/project</title>
<link>https://xenodium.com/emacs-create-a-swift-packageproject</link>
<guid isPermaLink="false">https://xenodium.com/emacs-create-a-swift-packageproject</guid>
    <description><![CDATA[<p>Been playing around with <a href="https://swift.org/package-manager/">Swift Package Manager (SPM)</a>. Creating a new Swift package (ie. project) is pretty simple.</p>
<p>To create a library package, we can use the following:</p>
<pre><code class="language-{.bash">swift package init --type library
</code></pre>
<p>Alternatively, to create a command-line utility use:</p>
<pre><code class="language-{.bash">swift package init --type executable
</code></pre>
<p>Turns out, there are a few options: empty, library, executable, system-module, manifest.</p>
<p>With a little elisp, we can write a completing function to quickly generate a Swift package/project without the need to drop to the shell.</p>
<p>Bonus: I won't have to look up SPM options if I ever forget them.</p>
<p><img src="https://xenodium.github.io/images/emacs-create-swift-package/swift-package.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(defun ar/swift-package-init ()
  &quot;Execute `swift package init', with optional name and completing type.&quot;
  (interactive)
  (let* ((name (read-string &quot;name (default): &quot;))
         (type (completing-read
                &quot;project type: &quot;
                ;; Splits &quot;--type empty|library|executable|system-module|manifest&quot;
                (split-string
                 (nth 1 (split-string
                         (string-trim
                          (seq-find
                           (lambda (line)
                             (string-match &quot;--type&quot; line))
                           (process-lines &quot;swift&quot; &quot;package&quot; &quot;init&quot; &quot;--help&quot;)))
                         &quot;   &quot;))
                 &quot;|&quot;)))
         (command (format &quot;swift package init --type %s&quot; type)))
    (unless (string-empty-p name)
      (append command &quot;--name &quot; name))
    (shell-command command))
  (dired default-directory)
  (revert-buffer))
</code></pre>
]]></description>
    <pubDate>Sun, 11 Oct 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Improved Ctrl-p/Ctrl-n macOS movement</title>
<link>https://xenodium.com/improved-ctrl-p-ctrl-n-macos-movement</link>
<guid isPermaLink="false">https://xenodium.com/improved-ctrl-p-ctrl-n-macos-movement</guid>
    <description><![CDATA[<p>macOS supports many Emacs bindings (out of the box). You can, for example, press C-p and C-n to move the cursor up and down (whether editing text in Emacs or any other macOS app). Jacob Rus's <a href="http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html">Customizing the Cocoa Text System</a> offers a more in-depth picture and also shows how to customize global macOS keybindings (via DefaultKeyBinding.dict).</p>
<p>In addition to moving Emacs <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Point.html">point</a> (cursor) up/down using C-p/C-n, I've internalized the same bindings to select an option from a list. Good Emacs examples of these are <a href="https://company-mode.github.io/">company mode</a> and <a href="https://github.com/abo-abo/swiper">ivy</a>.</p>
<p>Vertical cursor movement using Emacs bindings works well in most macOS apps, including forms and text boxes in web pages. However, selecting from a completion list doesn't quite work as expected. Although the binding is technically handled, it moves the cursor within the text widget, ignoring the suggested choices.</p>
<p><img src="https://xenodium.github.io/images/improved-ctrl-p-ctrl-n-macos-movement/bindings-borked.gif" alt=""></p>
<p>Atif Afzal's <a href="https://www.atfzl.com/use-emacs-key-bindings-everywhere">Use emacs key bindings everywhere</a> has a solution for the ignored case. He uses <a href="https://github.com/pqrs-org/Karabiner-Elements">Karabiner Elements</a> to remap c-p and c-n to arrow-up and arrow-down.</p>
<p>It's been roughly a week since I started using the Karabiner remapping, and I've yet to find a case where a web page (or any other macOS app) did not respond to c-p and c-n to move selection from a list.</p>
<p><img src="https://xenodium.github.io/images/improved-ctrl-p-ctrl-n-macos-movement/bindings-fixed.gif" alt=""></p>
<p>My ~/.config/karabiner/karabiner.json configuration is as follows:</p>
<pre><code class="language-json">{
    &quot;global&quot;: {
        &quot;check_for_updates_on_startup&quot;: true,
        &quot;show_in_menu_bar&quot;: true,
        &quot;show_profile_name_in_menu_bar&quot;: false
    },
    &quot;profiles&quot;: [
        {
            &quot;complex_modifications&quot;: {
                &quot;parameters&quot;: {
                    &quot;basic.simultaneous_threshold_milliseconds&quot;: 50,
                    &quot;basic.to_delayed_action_delay_milliseconds&quot;: 500,
                    &quot;basic.to_if_alone_timeout_milliseconds&quot;: 1000,
                    &quot;basic.to_if_held_down_threshold_milliseconds&quot;: 500,
                    &quot;mouse_motion_to_scroll.speed&quot;: 100
                },
                &quot;rules&quot;: [
                    {
                        &quot;description&quot;: &quot;Ctrl+p/Ctrl+n to arrow up/down&quot;,
                        &quot;manipulators&quot;: [
                            {
                                &quot;from&quot;: {
                                    &quot;key_code&quot;: &quot;p&quot;,
                                    &quot;modifiers&quot;: {
                                        &quot;mandatory&quot;: [
                                            &quot;control&quot;
                                        ]
                                    }
                                },
                                &quot;to&quot;: [
                                    {
                                        &quot;key_code&quot;: &quot;up_arrow&quot;
                                    }
                                ],
                                &quot;conditions&quot;: [
                                    {
                                        &quot;type&quot;: &quot;frontmost_application_unless&quot;,
                                        &quot;bundle_identifiers&quot;: [
                                            &quot;^org\\.gnu\\.Emacs&quot;
                                        ]
                                    }
                                ],
                                &quot;type&quot;: &quot;basic&quot;
                            },
                            {
                                &quot;from&quot;: {
                                    &quot;key_code&quot;: &quot;n&quot;,
                                    &quot;modifiers&quot;: {
                                        &quot;mandatory&quot;: [
                                            &quot;control&quot;
                                        ]
                                    }
                                },
                                &quot;to&quot;: [
                                    {
                                        &quot;key_code&quot;: &quot;down_arrow&quot;
                                    }
                                ],
                                &quot;conditions&quot;: [
                                    {
                                        &quot;type&quot;: &quot;frontmost_application_unless&quot;,
                                        &quot;bundle_identifiers&quot;: [
                                            &quot;^org\\.gnu\\.Emacs&quot;
                                        ]
                                    }
                                ],
                                &quot;type&quot;: &quot;basic&quot;
                            }
                        ]
                    }
                ]
            },
            &quot;devices&quot;: [],
            &quot;fn_function_keys&quot;: [],
            &quot;name&quot;: &quot;Default profile&quot;,
            &quot;parameters&quot;: {
                &quot;delay_milliseconds_before_open_device&quot;: 1000
            },
            &quot;selected&quot;: true,
            &quot;simple_modifications&quot;: [],
            &quot;virtual_hid_keyboard&quot;: {
                &quot;country_code&quot;: 0,
                &quot;mouse_key_xy_scale&quot;: 100
            }
        }
    ]
}
</code></pre>
<h2>Bonus (C-g to exit)</h2>
<p>Pressing Esc often dismisses or cancels macOS windows, menus, etc. This is also the case for web pages. As an Emacs user, I'm pretty used to pressing C-g to cancel, quit, or exit things. With that in mind, mapping C-g to Esc is surprisingly useful outside of Emacs. Here's the relevant Karabiner C-g binding for that:</p>
<pre><code class="language-json">{
    &quot;description&quot;: &quot;Ctrl+G to Escape&quot;,
    &quot;manipulators&quot;: [
        {
            &quot;description&quot;: &quot;emacs like escape&quot;,
            &quot;from&quot;: {
                &quot;key_code&quot;: &quot;g&quot;,
                &quot;modifiers&quot;: {
                    &quot;mandatory&quot;: [
                        &quot;left_control&quot;
                    ]
                }
            },
            &quot;to&quot;: [
                {
                    &quot;key_code&quot;: &quot;escape&quot;
                }
            ],
            &quot;conditions&quot;: [
                {
                    &quot;type&quot;: &quot;frontmost_application_unless&quot;,
                    &quot;bundle_identifiers&quot;: [
                        &quot;^org\\.gnu\\.Emacs&quot;
                    ]
                }
            ],
            &quot;conditions&quot;: [
                {
                    &quot;type&quot;: &quot;frontmost_application_unless&quot;,
                    &quot;bundle_identifiers&quot;: [
                        &quot;^org\\.gnu\\.Emacs&quot;
                    ]
                }
            ],
            &quot;type&quot;: &quot;basic&quot;
        }
    ]
}
</code></pre>
<p>ps. Note to self: Lennart's blog has <a href="https://blog.karssen.org/2024/06/05/using-emacs-key-bindings-in-gnome-firefox-and-other-applications/">notes on the topic but for linux</a>.</p>
<p>UPDATE: Ensure bindings are only active when Emacs is [not]{.underline} active.</p>
]]></description>
    <pubDate>Sun, 04 Oct 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Basmati rice pudding recipe</title>
<link>https://xenodium.com/basmati-rice-pudding-recipe</link>
<guid isPermaLink="false">https://xenodium.com/basmati-rice-pudding-recipe</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/basmati-rice-pudding-recipe/rice_pudding.jpg" alt=""></p>
<h2>Combine in a pot</h2>
<ul>
<li>2/3 cup of basmati rice</li>
<li>400 ml of coconut milk</li>
<li>4 cups of milk [^6]</li>
<li>3 tablespoons of honey [^7]</li>
<li>1/4 teaspoon of crushed cardamom seeds [^8]</li>
<li>1/8 teaspoon of salt</li>
</ul>
<p>Simple. Combine all ingredients in a pot.</p>
<h2>Boil and simmer</h2>
<p>Bring ingredients to a boil and simmer at low heat for 45 minutes. Stir occasionally.</p>
<h2>Mix in butter</h2>
<ul>
<li>1 tablespoon of butter.</li>
</ul>
<p>Turn stove off, add a tablespoon of butter, and mix in.</p>
<h2>Serve warm or cold</h2>
<p>After mixing in the butter, the rice pudding is done. You can serve warm or cold.</p>
<h2>Garnish (optional)</h2>
<ul>
<li>Pistachios</li>
<li>Cinnamon</li>
</ul>
<p>Optionally garnish with either pistachios or cinnamon (or both).</p>
]]></description>
    <pubDate>Sun, 04 Oct 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Adding images to pdfs (macOS)</title>
<link>https://xenodium.com/adding-images-to-pdfs-macos</link>
<guid isPermaLink="false">https://xenodium.com/adding-images-to-pdfs-macos</guid>
    <description><![CDATA[<p>The macOS Preview app does a great job inserting signatures to existing pdfs. I was hoping it could overlay images just as easily. Doesn't look like it's possible, without exporting/reimporting to image formats and losing pdf structure. Did I miss something?</p>
<p>In any case, I found <a href="https://code.google.com/archive/p/formulatepro/">formulatepro</a>. Dormant at Google Code Archive, but also <a href="https://github.com/adlr/formulatepro">checked in to github</a>. With a tiny <a href="https://github.com/xenodium/formulatepro/commit/cd43b1e73c2f180f4b4b7fb11fdec975b6960dc6">patch</a>, it builds and runs on Catalina. One can easily insert an image via &quot;File &gt; Place Image…&quot;.</p>
<p><img src="https://xenodium.github.io/images/adding-images-to-pdfs-macos/formulatepro.png" alt=""></p>
]]></description>
    <pubDate>Sun, 27 Sep 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>DIY bookmarks</title>
<link>https://xenodium.com/diy-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/diy-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://linuxhint.com/best_electrical_insulation_tape/">Best electrical insulation tape</a>.</li>
<li><a href="https://twitter.com/rosen/status/1317843289530376196">I’ve spent the last 3 months building the home office of my dreams</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 27 Sep 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Skiing bookmarks</title>
<link>https://xenodium.com/skiing-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/skiing-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lonelyplanet.com/articles/remote-ski-resorts-europe">7 far-flung European ski resorts - Lonely Planet</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 24 Sep 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: search/play Music (macOS)</title>
<link>https://xenodium.com/emacs-searchplay-music-macos</link>
<guid isPermaLink="false">https://xenodium.com/emacs-searchplay-music-macos</guid>
    <description><![CDATA[<p>While trying out macOS's Music app to manage offline media, I wondered if I could easily search and control playback from Emacs. Spoiler alert: yes it can be done and fuzzy searching music is rather gratifying.</p>
<p><img src="https://xenodium.github.io/images/emacs-searchplay-music-macos/music_search.gif" alt=""></p>
<p>Luckily, the hard work's already handled by <a href="https://github.com/hile/pytunes">pytunes</a>, a command line interface to macOS's iTunes/Music app. We add <a href="https://ffmpeg.org/ffprobe.html">ffprobe</a> and some elisp glue to the mix, and we can generate an Emacs media index.</p>
<p>Indexing takes roughly a minute per 1000 files. Prolly suboptimal, but I don't intend to re-index frequently. For now, we can use a separate process to prevent Emacs from blocking, so we can get back to playing tetris from our beloved editor:</p>
<pre><code class="language-{.commonlisp">(defun musica-index ()
  &quot;Indexes Music's tracks in two stages:
1. Generates \&quot;Tracks.sqlite\&quot; using pytunes (needs https://github.com/hile/pytunes installed).
2. Caches an index at ~/.emacs.d/.musica.el.&quot;
  (interactive)
  (message &quot;Indexing music... started&quot;)
  (let* ((now (current-time))
         (name &quot;Music indexing&quot;)
         (buffer (get-buffer-create (format &quot;*%s*&quot; name))))
    (with-current-buffer buffer
      (delete-region (point-min)
                     (point-max)))
    (set-process-sentinel
     (start-process name
                    buffer
                    (file-truename (expand-file-name invocation-name
                                                     invocation-directory))
                    &quot;--quick&quot; &quot;--batch&quot; &quot;--eval&quot;
                    (prin1-to-string
                     `(progn
                        (interactive)
                        (require 'cl-lib)
                        (require 'seq)
                        (require 'map)

                        (message &quot;Generating Tracks.sqlite...&quot;)
                        (process-lines &quot;pytunes&quot; &quot;update-index&quot;) ;; Generates Tracks.sqlite
                        (message &quot;Generating Tracks.sqlite... done&quot;)

                        (defun parse-tags (path)
                          (with-temp-buffer
                            (if (eq 0 (call-process &quot;ffprobe&quot; nil t nil &quot;-v&quot; &quot;quiet&quot;
                                                    &quot;-print_format&quot; &quot;json&quot; &quot;-show_format&quot; path))
                                (map-elt (json-parse-string (buffer-string)
                                                            :object-type 'alist)
                                         'format)
                              (message &quot;Warning: Couldn't read track metadata for %s&quot; path)
                              (message &quot;%s&quot; (buffer-string))
                              (list (cons 'filename path)))))

                        (let* ((paths (process-lines &quot;sqlite3&quot;
                                                     (concat (expand-file-name &quot;~/&quot;)
                                                             &quot;Music/Music/Music Library.musiclibrary/Tracks.sqlite&quot;)
                                                     &quot;select path from tracks&quot;))
                               (total (length paths))
                               (n 0)
                               (records (seq-map (lambda (path)
                                                   (let ((tags (parse-tags path)))
                                                     (message &quot;%d/%d %s&quot; (setq n (1+ n))
                                                              total (or (map-elt (map-elt tags 'tags) 'title) &quot;No title&quot;))
                                                     tags))
                                                 paths)))
                          (with-temp-buffer
                            (prin1 records (current-buffer))
                            (write-file &quot;~/.emacs.d/.musica.el&quot; nil))))))
     (lambda (process state)
       (if (= (process-exit-status process) 0)
           (message &quot;Indexing music... finished (%.3fs)&quot;
                    (float-time (time-subtract (current-time) now)))
         (message &quot;Indexing music... failed, see %s&quot; buffer))))))
</code></pre>
<p>Once media is indexed, we can feed it to <a href="https://github.com/abo-abo/swiper">ivy</a> for that narrowing-down fuzzy-searching goodness! It's worth mentioning the <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Size-of-Displayed-Text.html">truncate-string-to-width</a> function. Super handy for truncating strings to a fixed width and visually organizing search results in columns.</p>
<pre><code class="language-{.commonlisp">(defun musica-search ()
  (interactive)
  (cl-assert (executable-find &quot;pytunes&quot;) nil &quot;pytunes not installed&quot;)
  (let* ((c1-width (round (* (- (window-width) 9) 0.4)))
         (c2-width (round (* (- (window-width) 9) 0.3)))
         (c3-width (- (window-width) 9 c1-width c2-width)))
    (ivy-read &quot;Play: &quot; (mapcar
                        (lambda (track)
                          (let-alist track
                            (cons (format &quot;%s   %s   %s&quot;
                                          (truncate-string-to-width
                                           (or .tags.title
                                               (file-name-base .filename)
                                               &quot;No title&quot;) c1-width nil ?\s &quot;…&quot;)
                                          (truncate-string-to-width (propertize (or .tags.artist &quot;&quot;)
                                                                                'face '(:foreground &quot;yellow&quot;)) c2-width nil ?\s &quot;…&quot;)
                                          (truncate-string-to-width
                                           (propertize (or .tags.album &quot;&quot;)
                                                       'face '(:foreground &quot;cyan1&quot;)) c3-width nil ?\s &quot;…&quot;))
                                  track)))
                        (musica--index))
              :action (lambda (selection)
                        (let-alist (cdr selection)
                          (process-lines &quot;pytunes&quot; &quot;play&quot; .filename)
                          (message &quot;Playing: %s [%s] %s&quot;
                                   (or .tags.title
                                       (file-name-base .filename)
                                       &quot;No title&quot;)
                                   (or .tags.artist
                                       &quot;No artist&quot;)
                                   (or .tags.album
                                       &quot;No album&quot;)))))))

(defun musica--index ()
  (with-temp-buffer
    (insert-file-contents &quot;~/.emacs.d/.musica.el&quot;)
    (read (current-buffer))))
</code></pre>
<p>The remaining bits are straigtforward. We add a few interactive functions to control playback:</p>
<pre><code class="language-{.commonlisp">(defun musica-info ()
  (interactive)
  (let ((raw (process-lines &quot;pytunes&quot; &quot;info&quot;)))
    (message &quot;%s [%s] %s&quot;
             (string-trim (string-remove-prefix &quot;Title&quot; (nth 3 raw)))
             (string-trim (string-remove-prefix &quot;Artist&quot; (nth 1 raw)))
             (string-trim (string-remove-prefix &quot;Album&quot; (nth 2 raw))))))

(defun musica-play-pause ()
  (interactive)
  (cl-assert (executable-find &quot;pytunes&quot;) nil &quot;pytunes not installed&quot;)
  (process-lines &quot;pytunes&quot; &quot;play&quot;)
  (musica-info))

(defun musica-play-next ()
  (interactive)
  (cl-assert (executable-find &quot;pytunes&quot;) nil &quot;pytunes not installed&quot;)
  (process-lines &quot;pytunes&quot; &quot;next&quot;))

(defun musica-play-next-random ()
  (interactive)
  (cl-assert (executable-find &quot;pytunes&quot;) nil &quot;pytunes not installed&quot;)
  (process-lines &quot;pytunes&quot; &quot;shuffle&quot; &quot;enable&quot;)
  (let-alist (seq-random-elt (musica--index))
    (process-lines &quot;pytunes&quot; &quot;play&quot; .filename))
  (musica-info))

(defun musica-play-previous ()
  (interactive)
  (cl-assert (executable-find &quot;pytunes&quot;) nil &quot;pytunes not installed&quot;)
  (process-lines &quot;pytunes&quot; &quot;previous&quot;))
</code></pre>
<p>Finally, if we want some convenient keybindings, we can add something like:</p>
<pre><code class="language-{.commonlisp">(global-set-key (kbd &quot;C-c m SPC&quot;) #'musica-play-pause)
(global-set-key (kbd &quot;C-c m i&quot;) #'musica-info)
(global-set-key (kbd &quot;C-c m n&quot;) #'musica-play-next)
(global-set-key (kbd &quot;C-c m p&quot;) #'musica-play-previous)
(global-set-key (kbd &quot;C-c m r&quot;) #'musica-play-next-random)
(global-set-key (kbd &quot;C-c m s&quot;) #'musica-search)
</code></pre>
<p>Hooray! Controlling music is now an Emacs keybinding away: ø/</p>
<p>comments on <a href="https://twitter.com/xenodium/status/1307294369326731264">twitter</a>.</p>
<p>UPDATE1: Installing pytunes with <em>pip3 install pytunes</em> didn't just work for me. Instead, I cloned and installed as:</p>
<pre><code class="language-{.bash">git clone https://github.com/hile/pytunes
pip3 install file:///path/to/pytunes
pip3 install pytz
brew install libmagic
</code></pre>
<p>UPDATE2: Checked in to <a href="https://github.com/xenodium/dotsies/blob/master/emacs/ar/musica.el">dot files</a>.</p>
]]></description>
    <pubDate>Sat, 19 Sep 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cheese cake recipe (no crust)</title>
<link>https://xenodium.com/cheese-cake-recipe-no-crust</link>
<guid isPermaLink="false">https://xenodium.com/cheese-cake-recipe-no-crust</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/cheese-cake-recipe-no-crust/berried.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/cheese-cake-recipe-no-crust/inoven.jpg" alt=""></p>
<h2>Preheat oven</h2>
<p>Preheat oven at 175°C.</p>
<h2>Ingredients at room temperature</h2>
<p>Ensure the cream cheese, sour cream, and eggs are at room temperature before starting.</p>
<h2>Mix cream cheese</h2>
<ul>
<li>900g of cream cheese</li>
</ul>
<p>Mix the cream cheese thoroughly.</p>
<h2>Mix sugar</h2>
<ul>
<li>240g of sugar</li>
</ul>
<p>Add half the sugar. Mix in thoroughly. Add second half and mix.</p>
<h2>Mix sour cream, corn flour, and vanilla.</h2>
<ul>
<li>100g sour cream</li>
<li>40g corn flour</li>
<li>1tbsp vanilla bean paste</li>
</ul>
<p>Add the three ingredients and mix well.</p>
<h2>Mix eggs</h2>
<ul>
<li>3 eggs</li>
<li>1 egg yolk</li>
</ul>
<p>Add the eggs and mix for 30 seconds.</p>
<h2>Mix by hand</h2>
<p>Finish mixing thoroughly by hand, using a wooden spoon.</p>
<h2>Prepare pan</h2>
<ul>
<li>Springform pan</li>
<li>Parchment paper</li>
</ul>
<p>A springform pan works best here. Wrap its plate with parchment paper and lock it in place.</p>
<h2>Pour mix</h2>
<ul>
<li>Strainer</li>
</ul>
<p>Pour the mix through a strainer and into the prepared pan.</p>
<h2>Rest mix</h2>
<p>Let the mix rest in the pan for 10 minutes to let air bubbles out.</p>
<h2>Bake</h2>
<p>Bake for an 1 hour 10 minutes. Maybe add another 10 minutes (or more) if surface is still pale. Turn the oven off, leave door half open, and let it sit for 20 minutes.</p>
<h2>Cool off</h2>
<p>Take out and let it cool off to room temperature.</p>
<h2>Refrigerate</h2>
<p>Refrigerate for 4 hours (or overnight) before removing the sides of the pan.</p>
<h2>Eat!</h2>
<p>Nom nom. Yum yum.</p>
<h2>Bonus (topping)</h2>
<p>I winged this one and it worked out well. Heated up frozen berries with some honey and used it as topping. The whole combo was pretty tasty.</p>
]]></description>
    <pubDate>Sat, 12 Sep 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Faster macOS dock auto-hide</title>
<link>https://xenodium.com/faster-macos-dock-auto-hide</link>
<guid isPermaLink="false">https://xenodium.com/faster-macos-dock-auto-hide</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/faster-macos-dock-auto-hide/dock.gif" alt=""></p>
<p>Via Marcin Swieczkowski's <a href="https://www.bytedude.com/upgrading-the-osx-dock/">Upgrading The OSX Dock</a>, change default to make macOS's dock auto-hide faster:</p>
<pre><code class="language-bash">defaults write com.apple.dock autohide-time-modifier -float 0.2; killall Dock
</code></pre>
]]></description>
    <pubDate>Fri, 28 Aug 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Smarter Swift snippets</title>
<link>https://xenodium.com/smarter-snippets</link>
<guid isPermaLink="false">https://xenodium.com/smarter-snippets</guid>
    <description><![CDATA[<p><a href="https://twitter.com/safijari">Jari Safi</a> published a wonderful Emacs video <a href="https://youtu.be/xmBovJvQ3KU">demoing python yasnippets in action</a>. The constructor snippet, automatically setting ivars, is just magical. I wanted it for Swift!</p>
<p>I took a look at the <a href="https://github.com/jorgenschaefer/elpy/blob/060a4eb78ec8eba9c8fe3466c40a414d84b3dc81/snippets/python-mode/__init__">[[init]{.underline}]{.underline} snippet</a> from <a href="https://github.com/jorgenschaefer">Jorgen Schäfer</a>'s <a href="https://github.com/jorgenschaefer/elpy">elpy</a>. It uses <a href="https://github.com/jorgenschaefer/elpy/blob/060a4eb78ec8eba9c8fe3466c40a414d84b3dc81/snippets/python-mode/.yas-setup.el#L33">elpy-snippet-init-assignments</a> to generate the assignments.</p>
<p>With small tweaks, we can get the same action going on for Swift ø/</p>
<p><img src="https://xenodium.github.io/images/smarter-snippets/snippet.gif" alt=""></p>
<p>init.yasnippet:</p>
<pre><code class="language-snippet"># -*- mode: snippet -*-
# name: init with assignments
# key: init
# --
init(${1:, args}) {
  ${1:$(swift-snippet-init-assignments yas-text)}
}
$0
</code></pre>
<p>.yas-setup.el:</p>
<pre><code class="language-{.commonlisp">(defun swift-snippet-init-assignments (arg-string)
  (let ((indentation (make-string (save-excursion
                                    (goto-char start-point)
                                    (current-indentation))
                                  ?\s)))
    (string-trim (mapconcat (lambda (arg)
                              (if (string-match &quot;^\\*&quot; arg)
                                  &quot;&quot;
                                (format &quot;self.%s = %s\n%s&quot;
                                        arg arg indentation)))
                            (swift-snippet-split-args arg-string)
                            &quot;&quot;))))

(defun swift-snippet-split-args (arg-string)
  (mapcar (lambda (x)
            (if (and x (string-match &quot;\\([[:alnum:]]*\\):&quot; x))
                (match-string-no-properties 1 x)
              x))
          (split-string arg-string &quot;[[:blank:]]*,[[:blank:]]*&quot; t)))
</code></pre>
]]></description>
    <pubDate>Tue, 25 Aug 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Swift package manager build for iOS</title>
<link>https://xenodium.com/swift-package-manager-build-for-ios</link>
<guid isPermaLink="false">https://xenodium.com/swift-package-manager-build-for-ios</guid>
    <description><![CDATA[<p>While playing around with Swift package manager, it wasn't immediately obvious how to build for iOS from the command line. The default behaviour of invoking <em>swift build</em> is to build for the host. In my case, macOS. In any case, this was it:</p>
<pre><code class="language-{.bash">swift build -Xswiftc &quot;-sdk&quot; -Xswiftc &quot;/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk&quot; -Xswiftc &quot;-target&quot; -Xswiftc &quot;x86_64-apple-ios13.0-simulator&quot;
</code></pre>
<p>ps. Can get the SDK path with:</p>
<pre><code class="language-{.bash">xcrun --sdk iphonesimulator --show-sdk-path
</code></pre>
]]></description>
    <pubDate>Sun, 23 Aug 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>QR code bookmarks</title>
<link>https://xenodium.com/qr-code-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/qr-code-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/divan/txqr">divan/txqr: Transfer data via animated QR codes</a>.</li>
<li><a href="https://research.swtch.com/qart">research!rsc: QArt Codes</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24158125">Show HN: Photo Realistic QR-Codes (Hacker News)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 23 Aug 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trying out gccemacs on macOS</title>
<link>https://xenodium.com/trying-out-gccemacs-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/trying-out-gccemacs-on-macos</guid>
    <description><![CDATA[<p><em>UPDATE: I'm no longer using these steps. See <a href="https://xenodium.com/emacs-plus-with-native-comp/">Emacs plus –with-native-comp</a> for an easier alternative.</em></p>
<p>Below are the instructions I use to build Andrea Corallo's <a href="http://akrl.sdf.org/gccemacs.html">gccemacs</a> on macOS. It is based on <a href="https://github.com/AllenDang">Allen Dang</a>'s handy <a href="https://gist.github.com/AllenDang/f019593e65572a8e0aefc96058a2d23e">instructions</a> plus some changes of my own.</p>
<h2>Install gcc and libgccjit via homebrew</h2>
<pre><code class="language-{.bash">brew install gcc libgccjit
</code></pre>
<h2>Save configure script</h2>
<p>Create configure-gccemacs.sh</p>
<pre><code class="language-{.bash">#!/bin/bash

set -o nounset
set -o errexit

# Configures Emacs for building native comp support
# http://akrl.sdf.org/gccemacs.html

readonly GCC_DIR=&quot;$(realpath $(brew --prefix libgccjit))&quot;
[[ -d $GCC_DIR ]] ||  { echo &quot;${GCC_DIR} not found&quot;; exit 1; }

readonly SED_DIR=&quot;$(realpath $(brew --prefix gnu-sed))&quot;
[[ -d $SED_DIR ]] ||  { echo &quot;${SED_DIR} not found&quot;; exit 1; }

readonly GCC_INCLUDE_DIR=${GCC_DIR}/include
[[ -d $GCC_INCLUDE_DIR ]] ||  { echo &quot;${GCC_INCLUDE_DIR} not found&quot;; exit 1; }

readonly GCC_LIB_DIR=${GCC_DIR}/lib/gcc/10
[[ -d $GCC_LIB_DIR ]] ||  { echo &quot;${GCC_LIB_DIR} not found&quot;; exit 1; }

export PATH=&quot;${SED_DIR}/libexec/gnubin:${PATH}&quot;
export CFLAGS=&quot;-O2 -I${GCC_INCLUDE_DIR}&quot;
export LDFLAGS=&quot;-L${GCC_LIB_DIR} -I${GCC_INCLUDE_DIR}&quot;
export LD_LIBRARY_PATH=&quot;${GCC_LIB_DIR}&quot;
export DYLD_FALLBACK_LIBRARY_PATH=&quot;${GCC_LIB_DIR}&quot;

echo &quot;Environment&quot;
echo &quot;-----------&quot;
echo PATH: $PATH
echo CFLAGS: $CFLAGS
echo LDFLAGS: $LDFLAGS
echo DYLD_FALLBACK_LIBRARY_PATH: $DYLD_FALLBACK_LIBRARY_PATH
echo &quot;-----------&quot;

./autogen.sh

./configure \
     --prefix=&quot;$PWD/nextstep/Emacs.app/Contents/MacOS&quot; \
     --enable-locallisppath=&quot;${PWD}/nextstep/Emacs.app/Contents/MacOS&quot; \
     --with-mailutils \
     --with-ns \
     --with-imagemagick \
     --with-cairo \
     --with-modules \
     --with-xml2 \
     --with-gnutls \
     --with-json \
     --with-rsvg \
     --with-native-compilation \
     --disable-silent-rules \
     --disable-ns-self-contained \
     --without-dbus
</code></pre>
<p>Make it executable</p>
<pre><code class="language-shell">chmod +x configure-gccemacs.sh
</code></pre>
<h2>Clone Emacs source</h2>
<pre><code class="language-shell">git clone --branch master https://github.com/emacs-mirror/emacs gccemacs
</code></pre>
<h2>Configure build</h2>
<pre><code class="language-{.bash">cd gccemacs
../configure-gccemacs.sh
</code></pre>
<h2>Native lisp compiler found?</h2>
<p>Verify native lisp compiler is found:</p>
<pre><code class="language-fundamental">Does Emacs have native lisp compiler?                   yes
</code></pre>
<h2>Build</h2>
<p>Put those cores to use. Find out how many you got with:</p>
<pre><code class="language-{.bash">sysctl hw.logicalcpu
</code></pre>
<p>Ok so build with:</p>
<pre><code class="language-{.bash">make -j4 NATIVE_FAST_BOOT=1
cp -r lisp nextstep/Emacs.app/Contents/Resources/
cp -r native-lisp nextstep/Emacs.app/Contents
make install
</code></pre>
<p><strong>Note:</strong> Using <em>NATIVE_FAST_BOOT=1</em> significantly improves build time (totalling between 20-30 mins, depending on your specs). Without it, the build can take <strong>hours</strong>.</p>
<p>The macOS app build (under nextstep/Emacs.app) is ready, but read on before launching.</p>
<h2>Remove ~/emacs.d</h2>
<p>You likely want to start with a clean install, byte-compiling all packages with the latest Emacs version. In any case, rename ~/emacs.d (for backup?) or remove ~/emacs.d.</p>
<h2>init.el config</h2>
<p>Ensure <em>exec-path</em> includes the script's &quot;–prefix=&quot; value, <em>LIBRARY_PATH</em> points to gcc's lib dir, and finally set <em>comp-deferred-compilation</em>. I wrapped the snippet in my <em>exec-path-from-shell</em> config, but setting early in init.el should be enough.</p>
<pre><code class="language-{.commonlisp">(use-package exec-path-from-shell
  :ensure t
  :config
  (exec-path-from-shell-initialize)
  (if (and (fboundp 'native-comp-available-p)
           (native-comp-available-p))
      (progn
        (message &quot;Native comp is available&quot;)
        ;; Using Emacs.app/Contents/MacOS/bin since it was compiled with
        ;; ./configure --prefix=&quot;$PWD/nextstep/Emacs.app/Contents/MacOS&quot;
        (add-to-list 'exec-path (concat invocation-directory &quot;bin&quot;) t)
        (setenv &quot;LIBRARY_PATH&quot; (concat (getenv &quot;LIBRARY_PATH&quot;)
                                       (when (getenv &quot;LIBRARY_PATH&quot;)
                                         &quot;:&quot;)
                                       ;; This is where Homebrew puts gcc libraries.
                                       (car (file-expand-wildcards
                                             (expand-file-name &quot;~/homebrew/opt/gcc/lib/gcc/*&quot;)))))
        ;; Only set after LIBRARY_PATH can find gcc libraries.
        (setq comp-deferred-compilation t))
    (message &quot;Native comp is *not* available&quot;)))
</code></pre>
<h2>Launch Emacs.app</h2>
<p>You're good to go. Open Emacs.app via finder or shell:</p>
<pre><code class="language-{.bash">open nextstep/Emacs.app
</code></pre>
<h2>Deferred compilation logs</h2>
<p>After setting <em>comp-deferred-compilation</em> (in init.el config section), .elc files should be asyncronously compiled. Function definition should be updated to native compiled equivalent.</p>
<p>Look out for an <strong><strong>Async-native-compile-log</strong></strong> buffer. Should have content like:</p>
<pre><code class="language-fundamental">Compiling .emacs.d/elpa/moody-20200514.1946/moody.el...
Compiling .emacs.d/elpa/minions-20200522.1052/minions.el...
Compiling .emacs.d/elpa/persistent-scratch-20190922.1046/persistent-scratch.el...
Compiling .emacs.d/elpa/which-key-20200721.1927/which-key.el...
...
</code></pre>
<p>Can also check for .eln files:</p>
<pre><code class="language-{.bash">find ~/.emacs.d -iname *.eln | wc -l
</code></pre>
<p>UPDATE1: Added <em>Symlink Emacs.app/Contents/eln-cache</em> section for <a href="http://akrl.sdf.org/gccemacs.html#org4b11ea1">update 11</a>.</p>
<p>UPDATE2: Noted using NATIVE_FAST_BOOT makes the build much faster.</p>
<p>UPDATE3: Removed symlinks and copied content instead. This simplifies things. Inspired by Ian Wahbe's <a href="https://github.com/iwahbe/doom-config/blob/master/build-emacs.sh">build-emacs.sh</a>.</p>
<p>UPDATE4: Removed homebrew recipe patching. Thanks to Dmitry Shishkin's <a href="https://github.com/shshkn/emacs.d/blob/master/docs/nativecomp.md">instructions</a>.</p>
<p>UPDATE5: Use new flag –with-native-compilation and master branch.</p>
]]></description>
    <pubDate>Sun, 16 Aug 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>SwiftUI macOS desk clock</title>
<link>https://xenodium.com/swiftui-desk-clock</link>
<guid isPermaLink="false">https://xenodium.com/swiftui-desk-clock</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/swiftui-desk-clock/everclock.gif" alt=""></p>
<p>For time display, I've gone back and forth between an always-displayed macOS's menu bar to an auto-hide menu bar, and letting Emacs display the time. Neither felt great nor settled.</p>
<p>With some tweaks, Paul Hudson's <a href="https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-a-timer-with-swiftui">How to use a timer with SwiftUI</a>, led me to build a simple desk clock. Ok, let's not get fancy. It's really just an always-on-top floating window, showing a swiftUI label, but hey I like the minimalist feel ;)</p>
<p>Let's see if it sticks around or it gets in the way… Either way, here's standalone snippet. Run with <em>swift deskclock.swift</em>.</p>
<pre><code class="language-swift">import Cocoa
import SwiftUI

let application = NSApplication.shared
let appDelegate = AppDelegate()
NSApp.setActivationPolicy(.regular)
application.delegate = appDelegate
application.mainMenu = NSMenu.makeMenu()
application.run()

struct ClockView: View {
  @State var time = &quot;--:--&quot;

  let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

  var body: some View {
    GeometryReader { geometry in

      VStack {
        Text(time)
          .onReceive(timer) { input in
            let formatter = DateFormatter()
            formatter.dateFormat = &quot;HH:mm&quot;
            time = formatter.string(from: input)
          }
          .font(.system(size: 40))
          .padding()
      }.frame(width: geometry.size.width, height: geometry.size.height)
        .background(Color.black)
        .cornerRadius(10)
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
  }
}

extension NSWindow {
  static func makeWindow() -&gt; NSWindow {
    let window = NSWindow(
      contentRect: NSRect.makeDefault(),
      styleMask: [.closable, .miniaturizable, .resizable, .fullSizeContentView],
      backing: .buffered, defer: false)
    window.level = .floating
    window.setFrameAutosaveName(&quot;everclock&quot;)
    window.collectionBehavior = [.canJoinAllSpaces, .stationary, .ignoresCycle, .fullScreenPrimary]
    window.makeKeyAndOrderFront(nil)
    window.isMovableByWindowBackground = true
    window.titleVisibility = .hidden
    window.backgroundColor = .clear
    return window
  }
}

class AppDelegate: NSObject, NSApplicationDelegate {
  var window = NSWindow.makeWindow()
  var hostingView: NSView?

  func applicationDidFinishLaunching(_ notification: Notification) {
    hostingView = NSHostingView(rootView: ClockView())
    window.contentView = hostingView
    NSApp.activate(ignoringOtherApps: true)
  }
}

extension NSRect {
  static func makeDefault() -&gt; NSRect {
    let initialMargin = CGFloat(60)
    let fallback = NSRect(x: 0, y: 0, width: 100, height: 150)

    guard let screenFrame = NSScreen.main?.frame else {
      return fallback
    }

    return NSRect(
      x: screenFrame.maxX - fallback.width - initialMargin,
      y: screenFrame.maxY - fallback.height - initialMargin,
      width: fallback.width, height: fallback.height)
  }
}

extension NSMenu {
  static func makeMenu() -&gt; NSMenu {
    let appMenu = NSMenuItem()
    appMenu.submenu = NSMenu()

    appMenu.submenu?.addItem(
      NSMenuItem(
        title: &quot;Quit \(ProcessInfo.processInfo.processName)&quot;,
        action: #selector(NSApplication.terminate(_:)), keyEquivalent: &quot;q&quot;
      ))

    let mainMenu = NSMenu(title: &quot;Main Menu&quot;)
    mainMenu.addItem(appMenu)
    return mainMenu
  }
}

</code></pre>
]]></description>
    <pubDate>Sun, 02 Aug 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mending bookmarks</title>
<link>https://xenodium.com/mending-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/mending-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://youtu.be/S6UfWgMDlkQ">12 Great Sewing Tips and Tricks ! Best great sewing tips and tricks #7 - YouTube</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 30 Jul 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>ffmpeg bookmarks</title>
<link>https://xenodium.com/ffmpeg-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ffmpeg-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=23540704">FFmpeg 4.3 (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=26370704">FFMPEG from Zero to Hero | Hacker News</a>.</li>
<li><a href="https://el-tramo.be/blog/ken-burns-ffmpeg/">Ken Burns Effect Slideshows with FFMPeg (mko.re)</a>.</li>
<li><a href="https://ottverse.com/stack-videos-horizontally-vertically-grid-with-ffmpeg/">Stack Videos Horizontally, Vertically, in a Grid With FFmpeg - OTTVerse</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 17 Jun 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Black lives matter (BLM) bookmarks</title>
<link>https://xenodium.com/black-lives-matter-blm-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/black-lives-matter-blm-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://projects.fivethirtyeight.com/racism-polls/">Do You Know How Divided White And Black Americans Are On Racism? (FiveThirtyEight)</a>.</li>
<li><a href="https://marker.medium.com/its-time-we-dealt-with-white-supremacy-in-tech-8f7816fe809">It’s Time We Dealt With White Supremacy in Tech</a>.</li>
<li><a href="https://www.politico.com/magazine/story/2014/05/religious-right-real-origins-107133">The Real Origins of the Religious Right - POLITICO Magazine</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 14 Jun 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Dogs bookmarks</title>
<link>https://xenodium.com/dogs-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/dogs-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://thedogspov.com/need-know-romanian-rescue-dogs/">All You Need to Know About Romanian Rescue Dogs</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 14 Jun 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs, search hackingwithswift.com</title>
<link>https://xenodium.com/emacs-search-hackingwithswiftcom</link>
<guid isPermaLink="false">https://xenodium.com/emacs-search-hackingwithswiftcom</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/emacs-search-hackingwithswiftcom/hws.gif" alt=""></p>
<p><a href="https://twitter.com/twostraws">Paul Hudson</a> authors excellent Swift material at <a href="https://www.hackingwithswift.com/">hackingwithswift.com</a>. I regularly land on the site while searching for snippets from the browser. I was wondering if I could search for snippets directly from Emacs.</p>
<p>Turns out, hackingwithswift uses a JSON HTTP request for querying code examples. With this in mind, we can use <em>ivy-read</em> like Oleh Krehel's <a href="https://github.com/abo-abo/swiper/blob/8d840b2e8680e2768edb794c9ccecf975f6ba4cf/counsel.el#L6680">counsel-search</a> and search for Swift snippets from our favorite editor:</p>
<pre><code class="language-{.commonlisp">(require 'request)
(require 'json)

(defun ar/counsel-hacking-with-swift-search ()
  &quot;Ivy interface to query hackingwithswift.com.&quot;
  (interactive)
  (ivy-read &quot;hacking with swift: &quot;
            (lambda (input)
              (or
               (ivy-more-chars)
               (let ((request-curl-options (list &quot;-H&quot; (string-trim (url-http-user-agent-string)))))
                 (request
                   &quot;https://www.hackingwithswift.com/example-code/search&quot;
                   :type &quot;GET&quot;
                   :params (list
                            (cons &quot;search&quot; input))
                   :parser 'json-read
                   :success (cl-function
                             (lambda (&amp;key data &amp;allow-other-keys)
                               (ivy-update-candidates
                                (mapcar (lambda (item)
                                          (let-alist item
                                            (propertize .title 'url .url)))
                                        data)))))
                 0)))
            :action (lambda (selection)
                      (browse-url (concat &quot;https://www.hackingwithswift.com&quot;
                                          (get-text-property 0 'url selection))))
            :dynamic-collection t
            :caller 'ar/counsel-hacking-with-swift-search))
</code></pre>
]]></description>
    <pubDate>Sat, 06 Jun 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Preview SwiftUI layouts using Emacs org blocks</title>
<link>https://xenodium.com/swiftui-layout-previews-using-emacs-org-blocks</link>
<guid isPermaLink="false">https://xenodium.com/swiftui-layout-previews-using-emacs-org-blocks</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/swiftui-layout-previews-using-emacs-org-blocks/ob-swiftui.gif" alt=""></p>
<p>✨ <em>UPDATE: The snippets in this post are outdated. See <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> for better SwiftUI babel support</em>. ✨</p>
<p>Chris Eidhof <a href="https://twitter.com/chriseidhof/status/1261360332594974721">twitted</a> a handy <a href="https://gist.github.com/chriseidhof/26768f0b63fa3cdf8b46821e099df5ff">snippet</a> that enables quickly bootstrapping throwaway SwiftUI code. It can be easily integrated into other tools for rapid experimentation.</p>
<p>Being a SwiftUI noob, I could use some SwiftUI integration with my editor of choice. With some elisp glue and a small patch, Chris's snippet can be used to generate SwiftUI inline previews using Emacs org babel. This is particularly handy for playing around with SwiftUI layouts.</p>
<p>We can piggyback ride off zweifisch's <a href="https://github.com/zweifisch/ob-swift">ob-swift</a> by advicing <em>org-babel-execute:swift</em> to inject the org source block into the bootstrapping snippet. We also add a hook to <em>org-babel-after-execute-hook</em> to automatically refresh the inline preview.</p>
<p>If you're a <a href="https://github.com/jwiegley/use-package">use-package</a> user, the following snippet should make things fairly self-contained (if you have <a href="https://melpa.org/">melpa</a> set up already).</p>
<pre><code class="language-{.commonlisp">(use-package org
  :hook ((org-mode . org-display-inline-images))
  :config

  (use-package ob
    :config

    (use-package ob-swift
      :ensure t
      :config
      (org-babel-do-load-languages 'org-babel-load-languages
                                   (append org-babel-load-languages
                                           '((swift     . t))))

      (defun ar/org-refresh-inline-images ()
        (when org-inline-image-overlays
          (org-redisplay-inline-images)))

      ;; Automatically refresh inline images.
      (add-hook 'org-babel-after-execute-hook 'ar/org-refresh-inline-images)

      (defun adviced:org-babel-execute:swift (f &amp;rest args)
        &quot;Advice `adviced:org-babel-execute:swift' enabling swiftui header param.&quot;
        (let* ((body (nth 0 args))
               (params (nth 1 args))
               (swiftui (cdr (assoc :swiftui params)))
               (output))
          (when swiftui
            (assert (or (string-equal swiftui &quot;preview&quot;)
                        (string-equal swiftui &quot;interactive&quot;))
                    nil &quot;:swiftui must be either preview or interactive&quot;)
            (setq body (format
                        &quot;
import Cocoa
import SwiftUI
import Foundation

let screenshotURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(ProcessInfo.processInfo.globallyUniqueString + \&quot;.png\&quot;)
let preview = %s

NSApplication.shared.run {
  %s
}

extension NSApplication {
  public func run&lt;V: View&gt;(@ViewBuilder view: () -&gt; V) {
    let appDelegate = AppDelegate(view())
    NSApp.setActivationPolicy(.regular)
    mainMenu = customMenu
    delegate = appDelegate
    run()
  }
}

extension NSApplication {
  var customMenu: NSMenu {
    let appMenu = NSMenuItem()
    appMenu.submenu = NSMenu()

    let quitItem = NSMenuItem(
      title: \&quot;Quit \(ProcessInfo.processInfo.processName)\&quot;,
      action: #selector(NSApplication.terminate(_:)), keyEquivalent: \&quot;q\&quot;)
    quitItem.keyEquivalentModifierMask = []
    appMenu.submenu?.addItem(quitItem)

    let mainMenu = NSMenu(title: \&quot;Main Menu\&quot;)
    mainMenu.addItem(appMenu)
    return mainMenu
  }
}

class AppDelegate&lt;V: View&gt;: NSObject, NSApplicationDelegate, NSWindowDelegate {
  var window = NSWindow(
    contentRect: NSRect(x: 0, y: 0, width: 414 * 0.2, height: 896 * 0.2),
    styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
    backing: .buffered, defer: false)

  var contentView: V

  init(_ contentView: V) {
    self.contentView = contentView
  }

  func applicationDidFinishLaunching(_ notification: Notification) {
    window.delegate = self
    window.center()
    window.contentView = NSHostingView(rootView: contentView)
    window.makeKeyAndOrderFront(nil)

    if preview {
      screenshot(view: window.contentView!, saveTo: screenshotURL)
      // Write path (without newline) so org babel can parse it.
      print(screenshotURL.path, terminator: \&quot;\&quot;)
      NSApplication.shared.terminate(self)
      return
    }

    window.setFrameAutosaveName(\&quot;Main Window\&quot;)
    NSApp.activate(ignoringOtherApps: true)
  }
}

func screenshot(view: NSView, saveTo fileURL: URL) {
  let rep = view.bitmapImageRepForCachingDisplay(in: view.bounds)!
  view.cacheDisplay(in: view.bounds, to: rep)
  let pngData = rep.representation(using: .png, properties: [:])
  try! pngData?.write(to: fileURL)
}
&quot;
                        (if (string-equal swiftui &quot;preview&quot;)
                            &quot;true&quot;
                          &quot;false&quot;)
                        body))
            (setq args (list body params)))
          (setq output (apply f args))
          (when org-inline-image-overlays
            (org-redisplay-inline-images))
          output))

      (advice-add #'org-babel-execute:swift
                  :around
                  #'adviced:org-babel-execute:swift))))
</code></pre>
<p><s>Snippet also at github <a href="https://gist.github.com/xenodium/79154033bc26e733b8c43af228cbce5b">gist</a> and included in <a href="https://github.com/xenodium/dotsies/blob/master/emacs/features/fe-org.el">my emacs config</a></s>.</p>
<p><em>UPDATE: See <a href="https://github.com/xenodium/ob-swiftui">ob-swiftui</a> for a better version of babel SwiftUI support.</em></p>
<p>Once the snippet is evaluated, we're ready to use in an org babel block. We introduced the <em>:swiftui</em> header param to switch between inline static <em>preview</em> and <em>interactive</em> mode.</p>
<p>To try out an inline <em>preview</em>, create a new org file (eg. swiftui.org) and a source block like:</p>
<pre><code class="language-org">#+begin_src swift :results file :swiftui preview
  VStack(spacing: 10) {
      HStack(spacing: 10) {
        Rectangle().fill(Color.yellow)
        Rectangle().fill(Color.green)
      }
      Rectangle().fill(Color.blue)
      HStack(spacing: 10) {
        Rectangle().fill(Color.green)
        Rectangle().fill(Color.yellow)
      }
    }
    .frame(maxWidth: .infinity, maxHeight: .infinity)
#+end_src
</code></pre>
<pre><code class="language-org">#+results:
</code></pre>
<p><img src="https://xenodium.github.io/images/swiftui-layout-previews-using-emacs-org-blocks/vstack.jpg" alt=""></p>
<p>Place the cursor anywhere inside the source block (#+begin_src/#+end_src) and press C-c C-c (or M-x org-ctrl-c-ctrl-c).</p>
<p>To run interactively, change the <em>:swiftui</em> param to <em>interactive</em> and press C-c C-c (or M-x org-ctrl-c-ctrl-c). When running interactively, press &quot;q&quot; (without ⌘) to quit the Swift app.</p>
<p>comments on <a href="https://twitter.com/xenodium/status/1194224168709083137">twitter</a>.</p>
<h2>Update</h2>
<ul>
<li>Tweaked the snippet to make it more self-contained and made the steps more reproducible. Need to work out how to package things to make them more accessible. May be best to contribute as a patch to <a href="https://github.com/zweifisch/ob-swift">ob-swift</a> and we can avoid the icky <em>advice-add</em>.</li>
<li>Thanks to Chris Eidhof for PNG support (instead of TIFF). Also TIL Swift's <em>print</em> has got a terminator param.</li>
</ul>
]]></description>
    <pubDate>Sat, 23 May 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Open Emacs elfeed links in the background</title>
<link>https://xenodium.com/open-emacs-elfeed-links-in-background</link>
<guid isPermaLink="false">https://xenodium.com/open-emacs-elfeed-links-in-background</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/open-emacs-elfeed-links-in-background/background-browse.gif" alt=""></p>
<p>Christopher Wellons's <a href="https://github.com/skeeto/elfeed">elfeed</a> is a wonderful Emacs rss reader. In Mike Zamansky's <a href="https://cestlaz.github.io/post/using-emacs-72-customizing-elfeed/">Using Emacs 72 - Customizing Elfeed</a> video, he highlights a desire to open elfeed entries in the background. That is, open the current rss entry (or selected entries) without shifting focus from Emacs to your browser. This behaviour is somewhat analogous to ⌘-clicking/ctrl-clicking on multiple links in the browser without losing focus.</p>
<p>I've been wanting elfeed to open links in the background for some time. Zamansky's post was a great nudge to look into it. He points to the relevant <a href="https://github.com/skeeto/elfeed/blob/58ab1f8bcc3014206db42a7a26f3120ba5de4ca6/elfeed-search.el#L783">elfeed-search-browse-url</a> function, re-implemented to suit his needs. In a similar spirit, I wrote a function to open the current rss entry (or selected entries) in the background.</p>
<p>I'm running macOS, so I took a look at [browse-url-default-macosx-browser](https://github.com/emacs-mirror/emacs/blob/d714aa753b744c903d149a1f6c69262d958c313e/lisp/net/browse-url.el#L1018  I ) to get an idea of how URLs are opened. Simple. It let's macOS handle it via the &quot;open&quot; command, invoked through <em>start process</em>. Looking at open's command-line options, we find <em>–background</em> which &quot;does not bring the application to the foreground.&quot;</p>
<pre><code class="language-{.commonlisp">open --background http://xenodium.com
</code></pre>
<p>&quot;b&quot; is already bound to <em>elfeed-search-browse-url</em>, so in our snippet we'll bind &quot;B&quot; to our new background function, giving us some flexibility:</p>
<pre><code class="language-{.commonlisp">(use-package elfeed
  :ensure t
  :bind (:map elfeed-search-mode-map
              (&quot;B&quot; . ar/elfeed-search-browse-background-url))
  :config
  (defun ar/elfeed-search-browse-background-url ()
    &quot;Open current `elfeed' entry (or region entries) in browser without losing focus.&quot;
    (interactive)
    (let ((entries (elfeed-search-selected)))
      (mapc (lambda (entry)
              (assert (memq system-type '(darwin)) t &quot;open command is macOS only&quot;)
              (start-process (concat &quot;open &quot; (elfeed-entry-link entry))
                             nil &quot;open&quot; &quot;--background&quot; (elfeed-entry-link entry))
              (elfeed-untag entry 'unread)
              (elfeed-search-update-entry entry))
            entries)
      (unless (or elfeed-search-remain-on-entry (use-region-p))
        (forward-line)))))
</code></pre>
<p>Maybe xdg-open does a similar thing on linux (I've not looked). Ping me if you have a linux solution and I can update the function.</p>
<p>Happy Emacsing.</p>
<p>ps. I noticed elfeed uses <em>browse-url-generic</em> if <em>elfeed-search-browse-url</em>'s is invoked with a prefix. Setting <a href="https://github.com/emacs-mirror/emacs/blob/d0e2a341dd9a9a365fd311748df024ecb25b70ec/lisp/net/browse-url.el#L534">browse-url-generic-program</a> and <a href="https://github.com/emacs-mirror/emacs/blob/d0e2a341dd9a9a365fd311748df024ecb25b70ec/lisp/net/browse-url.el#L539">browse-url-generic-args</a> to use background options may be a more generic solution. For now, a custom function does the job.</p>
<p>comments on <a href="https://twitter.com/xenodium/status/1263839324023525376">twitter</a>.</p>
]]></description>
    <pubDate>Fri, 22 May 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Enrich Emacs dired's batching toolbox</title>
<link>https://xenodium.com/enrich-your-dired-batching-toolbox</link>
<guid isPermaLink="false">https://xenodium.com/enrich-your-dired-batching-toolbox</guid>
    <description><![CDATA[<h2>Update</h2>
<p>I now use <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>, which reduces the logic to:</p>
<pre><code class="language-{.commonlisp">(defun dwim-shell-commands-image-to-jpg ()
  &quot;Convert all marked images to jpg(s).&quot;
  (interactive)
  (dwim-shell-command-on-marked-files
   &quot;Convert to jpg&quot;
   &quot;convert -verbose '&lt;&lt;f&gt;&gt;' '&lt;&lt;fne&gt;&gt;.jpg'&quot;
   :utils &quot;convert&quot;))
</code></pre>
<h2>Original post</h2>
<p>Shell one-liners are super handy for batch-processing files. Say you'd like to convert a bunch of images from HEIC to jpg, you could use something like:</p>
<pre><code class="language-{.bash">for f in *.HEIC ; do convert &quot;$f&quot; &quot;${f%.*}.jpg&quot;; done
</code></pre>
<p>Save the one-liner (or memorize it) and pull it from your toolbox next time you need it. This is handy as it is, but <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">Emacs dired</a> is just a file-management powerhouse. Its <em>dired-map-over-marks</em> function is just a few elisp lines away from enabling all sorts of batch processing within your dired buffers.</p>
<p>Dired already enables selecting and deselecting files using all sorts of built-in mechanisms (<a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Marks-vs-Flags.html">dired-mark-files-regexp</a>, <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired-and-Find.html">find-name-dired</a>, etc) or wonderful third-party packages like Matus Goljer's <a href="https://github.com/Fuco1/dired-hacks">dired-filters</a>.</p>
<p>Regardless of how you selected your files, here's a snippet to run ImageMagick's <a href="https://imagemagick.org/script/convert.php">convert</a> on a bunch of selected files:</p>
<pre><code class="language-{.commonlisp">;;; -*- lexical-binding: t; -*-

(defun ar/dired-convert-image (&amp;optional arg)
  &quot;Convert image files to other formats.&quot;
  (interactive &quot;P&quot;)
  (assert (or (executable-find &quot;convert&quot;) (executable-find &quot;magick.exe&quot;)) nil &quot;Install imagemagick&quot;)
  (let* ((dst-fpath)
         (src-fpath)
         (src-ext)
         (last-ext)
         (dst-ext))
    (mapc
     (lambda (fpath)
       (setq src-fpath fpath)
       (setq src-ext (downcase (file-name-extension src-fpath)))
       (when (or (null dst-ext)
                 (not (string-equal dst-ext last-ext)))
         (setq dst-ext (completing-read &quot;to format: &quot;
                                        (seq-remove (lambda (format)
                                                      (string-equal format src-ext))
                                                    '(&quot;jpg&quot; &quot;png&quot;)))))
       (setq last-ext dst-ext)
       (setq dst-fpath (format &quot;%s.%s&quot; (file-name-sans-extension src-fpath) dst-ext))
       (message &quot;convert %s to %s ...&quot; (file-name-nondirectory dst-fpath) dst-ext)
       (set-process-sentinel
        (if (string-equal system-type &quot;windows-nt&quot;)
            (start-process &quot;convert&quot;
                           (generate-new-buffer (format &quot;*convert %s*&quot; (file-name-nondirectory src-fpath)))
                           &quot;magick.exe&quot; &quot;convert&quot; src-fpath dst-fpath)
          (start-process &quot;convert&quot;
                         (generate-new-buffer (format &quot;*convert %s*&quot; (file-name-nondirectory src-fpath)))
                         &quot;convert&quot; src-fpath dst-fpath))
        (lambda (process state)
          (if (= (process-exit-status process) 0)
              (message &quot;convert %s ✔&quot; (file-name-nondirectory dst-fpath))
            (message &quot;convert %s ❌&quot; (file-name-nondirectory dst-fpath))
            (message (with-current-buffer (process-buffer process)
                       (buffer-string))))
          (kill-buffer (process-buffer process)))))
     (dired-map-over-marks (dired-get-filename) arg))))
</code></pre>
<p>The snippet can be shorter, but wouldn't be as friendly. We ask users to provide desired image format, spawn separate processes (avoids blocking Emacs), and generate a basic report. Also adds support for Windows.</p>
<p><img src="https://xenodium.github.io/images/enrich-your-dired-batching-toolbox/batch-dired.gif" alt=""></p>
<h2>BEWARE</h2>
<p>The snippet isn't currently capping the number of processes, but hey we can revise in the future…</p>
<h2>Update</h2>
<p>Thanks to <a href="https://github.com/pbeliveau">Philippe Beliveau</a> for pointing out a bug in snippet (now updated) and changes to make it Windows compatible.</p>
]]></description>
    <pubDate>Mon, 11 May 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Banana oats pancakes recipe</title>
<link>https://xenodium.com/banana-oats-pancakes-recipe</link>
<guid isPermaLink="false">https://xenodium.com/banana-oats-pancakes-recipe</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/banana-oats-pancakes-recipe/banpan.jpg" alt=""></p>
<h2>Blend</h2>
<ul>
<li>Ripe banana.</li>
<li>2 Eggs.</li>
<li>1/3 cup instant oats.</li>
<li>1/2 teaspoon baking powder.</li>
</ul>
<p>Really is this easy. Add all ingredients and blend.</p>
<h2>Cook</h2>
<p>Medium to low heat. Cook for 3 minutes. Flip. Cook for 1 minute. You're done.</p>
]]></description>
    <pubDate>Sat, 09 May 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: connect my Bluetooth speaker</title>
<link>https://xenodium.com/emacs-connect-my-bluetooth-speaker</link>
<guid isPermaLink="false">https://xenodium.com/emacs-connect-my-bluetooth-speaker</guid>
    <description><![CDATA[<p>Connecting and disconnecting bluetooth devices on macOS is fairly simple: use the menu bar utility.</p>
<p><img src="https://xenodium.github.io/images/emacs-connect-my-bluetooth-speaker/macos-menu.png" alt=""></p>
<p><em>But could we make it quicker from our beloved editor?</em></p>
<p>Turns out with a little elisp glue, we can fuzzy search our Bluetooth devices and toggle connections. We can use <a href="https://twitter.com/_abo_abo">Oleh Krehel's</a> <a href="https://github.com/abo-abo/swiper">ivy-read</a> for fuzzy searching and <a href="https://twitter.com/lap_felix">Felix Lapalme</a>'s nifty <a href="https://github.com/lapfelix/BluetoothConnector">BluetoothConnector</a> to list devices and toggle Bluetooth connections.</p>
<p>As a bonus, we can make it remember the last selected device, so you can quickly toggle it again.</p>
<pre><code class="language-{.commonlisp">(defun ar/ivy-bluetooth-connect ()
  &quot;Connect to paired bluetooth device.&quot;
  (interactive)
  (assert (string-equal system-type &quot;darwin&quot;)
          nil &quot;macOS only. Sorry :/&quot;)
  (assert (executable-find &quot;BluetoothConnector&quot;)
          nil &quot;Install BluetoothConnector from https://github.com/lapfelix/BluetoothConnector&quot;)
  (ivy-read &quot;(Dis)connect: &quot;
            (seq-map
             (lambda (item)
               (let* ((device (split-string item &quot; - &quot;))
                      (mac (nth 0 device))
                      (name (nth 1 device)))
                 (propertize name
                             'mac mac)))
             (seq-filter
              (lambda (line)
                ;; Keep lines like: af-8c-3b-b1-99-af - Device name
                (string-match-p &quot;^[0-9a-f]\\{2\\}&quot; line))
              (with-current-buffer (get-buffer-create &quot;*BluetoothConnector*&quot;)
                (erase-buffer)
                ;; BluetoothConnector exits with 64 if no param is given.
                ;; Invoke with no params to get a list of devices.
                (unless (eq 64 (call-process &quot;BluetoothConnector&quot; nil (current-buffer)))
                  (error (buffer-string)))
                (split-string (buffer-string) &quot;\n&quot;))))
            :require-match t
            :preselect (when (boundp 'ar/misc-bluetooth-connect--history)
                         (nth 0 ar/misc-bluetooth-connect--history))
            :history 'ar/misc-bluetooth-connect--history
            :caller 'ar/toggle-bluetooth-connection
            :action (lambda (device)
                      (start-process &quot;BluetoothConnector&quot;
                                     (get-buffer-create &quot;*BluetoothConnector*&quot;)
                                     &quot;BluetoothConnector&quot; (get-text-property 0 'mac device) &quot;--notify&quot;))))
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-connect-my-bluetooth-speaker/connect-disconnect.gif" alt=""></p>
<p>comments on <a href="https://twitter.com/xenodium/status/1258148035319734273">twitter</a>.</p>
]]></description>
    <pubDate>Wed, 06 May 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Duti: changing default macOS apps</title>
<link>https://xenodium.com/duti-changing-default-macos-apps</link>
<guid isPermaLink="false">https://xenodium.com/duti-changing-default-macos-apps</guid>
    <description><![CDATA[<p>Future self example, setting <a href="https://mpv.io/">mpv.io</a> to open all aiff files on macOS:</p>
<pre><code class="language-bash">duti -s io.mpv aiff
</code></pre>
]]></description>
    <pubDate>Sat, 02 May 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Neapolitan pizza recipe</title>
<link>https://xenodium.com/neapolitan-pizza-recipe</link>
<guid isPermaLink="false">https://xenodium.com/neapolitan-pizza-recipe</guid>
    <description><![CDATA[<p>Full disclosure: I'm a complete noob at making pizza. It's my second pizza, but hey, it was tasty and fun to make! Making pizza at home is not as far-fetched as I initially thought.</p>
<h2>UPDATES:</h2>
<p>I've made this recipe a couple of times. Made two improvements worth mentioning.</p>
<h3>Flan tin / quiche pan</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/round_pie.jpg" alt=""></p>
<p>My first pizzas were rectangular, matching the baking tray shape, but I really wanted round pies. I found a quiche pan at home and gave that a try. Worked pretty well. The dish bottom comes up, which is pretty handy.</p>
<h3>Double baking</h3>
<p>Bake in two stages:</p>
<ol>
<li>Bake the pizza for 6 minutes (without the mozarella) at bottom of oven.</li>
<li>Add mozzarella and make for 4 minutes at top of the oven.</li>
</ol>
<h2>Recipe</h2>
<p>Ok, on to the recipe now…</p>
<h3>Dissolve the yeast</h3>
<ul>
<li>7g of yeast.</li>
<li>325ml of lukewarm water.</li>
</ul>
<p>Dissolve the yeast in the lukewarm water.</p>
<h3>Mixing the dough</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/mix1.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/mix2.jpg" alt=""></p>
<ul>
<li>500g of flour.</li>
<li>1 teaspoon of salt.</li>
</ul>
<p>Gradually add flour to the yeast and water mix, using the bottom of a spoon to work it until smooth (no lumps). The dough will be very sticky at first. Stay faithful to the spoon. It'll work. BBC's <a href="http://www.bbc.com/travel/story/20200415-how-to-make-pizza-like-a-neapolitan-master">How to make pizza like a Neapolitan master</a> has a great demo. I followed the dough technique.</p>
<h3>Kneading the dough</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/knead1.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/knead2.jpg" alt=""></p>
<p>Sprinkle some flour on the table and knead the dough (punch, stretch, and fold many times) from previous step. Eventually, the dough will hold its shape.</p>
<h3>Make 4 balls</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/cut_in_four.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/four_balls.jpg" alt=""></p>
<p>Roll the dough into a cylinder and cut into 4 pieces. Make 4 balls.</p>
<h3>Make the tomato sauce</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/garlic_slice.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/sauce_done.jpg" alt=""></p>
<ul>
<li>500g of passata.</li>
<li>3 cloves of garlic.</li>
</ul>
<p>I love garlic. Who doesn't? Slice the garlic finely and combine with the passata in a class jar. Shake it a little. Garlic and passata. That's your sauce.</p>
<h3>Cover for 2 hours</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/put_away.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/after_hours.jpg" alt=""></p>
<p>Place the 4 dough balls into a container and cover with a damp cloth for 2 hours. You can make 4 pizzas.</p>
<p><em>*Rookie mistake: I should have used a bigger container. The balls grew and merged.</em></p>
<h3>Preheat oven</h3>
<p>Preheat the oven at 250°C.</p>
<h3>Stretch base</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/stretch.jpg" alt=""></p>
<p>Sprinkle more flour on table prior to shaping the dough. Place ball on table, flatten. Flip over, flatten again. Gradually stretch until you have the shape and thickness desired.</p>
<h3>Place base on baking tray</h3>
<ul>
<li>Semolina</li>
<li>Aluminium foil</li>
</ul>
<p>Line up the tray with some aluminium foil. Before transferring the base on to the baking tray, sprinkle semolina (or breadcrumbs) on the foil (it helps prevent the dough from sticking).</p>
<h3>Toppings</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/oiled.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/parmesan.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/mozarella.jpg" alt=""></p>
<ul>
<li>Tomato sauce.</li>
<li>Salt.</li>
<li>Olive oil.</li>
<li>Parmesan cheese.</li>
<li>125g of Mozzarella cheese.</li>
<li>Fresh basil.</li>
</ul>
<p>Spread some of the tomato sauce with a spoon. Sprinkle salt, olive oil, and parmesan cheese. Break the mozzarella into pieces and spread throughout. Add some basil leaves. Your basic margherita pizza is now ready for the oven.</p>
<h3>Bake pizza</h3>
<p>Place the tray in the oven for 10 minutes. This worked for my oven, which goes up to 250°C. Either way, keep an eye on it.</p>
<h3>Post baking toppings</h3>
<p><img src="https://xenodium.github.io/images/neapolitan-pizza-recipe/final.jpg" alt=""></p>
<ul>
<li>Anchovies.</li>
</ul>
<p>Controversial, but I really like anchovies. Add them post-baking and you're good to go. Enjoy your pizza.</p>
<h3>Helpful references</h3>
<ul>
<li><a href="http://www.bbc.com/travel/story/20200415-how-to-make-pizza-like-a-neapolitan-master">How to make pizza like a Neapolitan master (BBC)</a>.</li>
<li><a href="https://www.youtube.com/watch?v=1-SJGQ2HLp8">How to Make Perfect Pizza (Gennaro Contaldo - YouTube)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 26 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Oatmeal cookie recipe</title>
<link>https://xenodium.com/oatmeal-cookie-recipe</link>
<guid isPermaLink="false">https://xenodium.com/oatmeal-cookie-recipe</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/oatmeal-cookie-recipe/oatcookies.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/oatmeal-cookie-recipe/ingredients.jpg" alt=""></p>
<p>I combined elements from two recipes: <a href="https://thefoodmedic.co.uk/2020/01/3-ingredient-oatmeal-cookies/">3 Ingredient oatmeal cookies (The Food Medic)</a>, Amy's <a href="https://amyshealthybaking.com/blog/2018/01/21/banana-oatmeal-raisin-cookies/">Healthy Banana Oatmeal Raisin Cookies (Amy's Healthy Baking)</a> and added my own touches.</p>
<h2>Preheat oven</h2>
<p>Preheat the oven at 180°C.</p>
<h2>Mash bananas</h2>
<ul>
<li>2 medium ripe bananas.</li>
</ul>
<p>Mash until bananas have no significant lumps.</p>
<h2>Mix most ingredients (except oats)</h2>
<ul>
<li>4 tablespoons crunchy peanut butter.</li>
<li>1/2 teaspoon of ground cinnamon.</li>
<li>1/2 teaspoon of ground cardamom.</li>
<li>1/4 teaspoon of vanilla.</li>
<li>1/3 cup raisins.</li>
</ul>
<p>Add the peanut butter, cinnamon, cardamom, and vanilla into the mashed bananas. Mix well. Add raisins and mix a little further to spread them out.</p>
<h2>Add oats</h2>
<ul>
<li>1 3/4 cups of oats.</li>
</ul>
<p>Add the oats to the mix in a few rounds to ensure its evenly mixed.</p>
<h2>Flattened balls in tray</h2>
<p>Make balls, place on baking tray, and gently flatten. They'll be on the chunky side.</p>
<p><em>Note: They won't spread as much as traditional cookies.</em></p>
<h2>Bake for 15 mins</h2>
<p>Bake for about 15 minutes or until golden.</p>
<h2>Let cool off and enjoy</h2>
<p>Wait a little and nom nom nom…</p>
<p>ps. Full recipe source in <a href="https://github.com/xenodium/xenodium.github.io/blob/master/index.org">org file</a>.</p>
]]></description>
    <pubDate>Tue, 21 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>TIL (today I learned) bookmarks</title>
<link>https://xenodium.com/til-today-i-learned-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/til-today-i-learned-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://til.hashrocket.com/">Hashrocket - Today I Learned</a>.</li>
<li><a href="https://github.com/jbranchaud/til">jbranchaud/til: Today I Learned</a>.</li>
<li><a href="https://til.secretgeek.net/">secretgeek: Today I Learned</a>.</li>
<li><a href="https://til.simonwillison.net/">Simon Willison: TIL</a>.</li>
<li><a href="https://zerokspot.com/tags/til">til - zerokspot.com</a>.</li>
<li><a href="https://www.sarasoueidan.com/today-i-learned/">Today I Learned — Sara Soueidan – Freelance-Front-End UI/UX Developer</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 21 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>mu/mu4e 1.4 released</title>
<link>https://xenodium.com/mumu4e-14-released</link>
<guid isPermaLink="false">https://xenodium.com/mumu4e-14-released</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/mumu4e-14-released/mu14.png" alt=""></p>
<p><a href="https://www.reddit.com/r/emacs/comments/g3nsgg/mumu4e_14_has_been_released/">mu/mu4e 1.4 is out</a>. About a week ago, I built and installed its <a href="https://github.com/djcb/mu/releases/tag/1.3.10">pre-release version (1.3.10)</a> and noted <a href="http://xenodium.com/building-mumu4e-on-macos/">build steps on macOS</a>. It's been working great for me. Today, I updated to 1.4.</p>
<p>I was keen to try the new release out. I had been experiencing a short delay immediately after syncing/indexing mail. An initial investigation pointed to contact syncing, but I didn't dig further. The 1.4 release notes had a promising entry:</p>
<blockquote>
<p>In many cases, `mu4e' used to receive <em>all</em> contacts after each indexing operation; this was slow for some users, so we have updated this to <em>only</em> get the contacts that have changed since the last round.</p>
</blockquote>
<p>After upgrading. The delay is gone for me ø/</p>
<p><strong>Note</strong>: there are a few config tweaks needed for the 1.4 upgrade, but these are well-documented in the <a href="https://github.com/djcb/mu/releases/tag/1.4">release notes</a>. For me, it primarily consisted of:</p>
<ul>
<li>Swapping elisp <em>mu4e-maildir</em> var for <em>mu init –maildir path/to/local/IMAP</em>.</li>
<li>Swapping elisp <em>mu4e-user-mail-address-list</em> for <em>mu init –my-address address1@domain.com –my-address address2@domain.com</em>.</li>
<li>Disabling <em>mu4e-maildirs-extension</em> (not yet compatible with mu 1.4). No issues here, since I hardly ever look at the <em>mu4e-main</em> buffer. I have global binding to my unread messages that looks a little something like this:</li>
</ul>
<pre><code class="language-{.commonlisp">(defun ar/mu4e-view-unread-messages ()
  (interactive)
  (mu4e-headers-search-bookmark (concat &quot;flag:unread AND &quot;
                                        &quot;flag:unread AND &quot;
                                        &quot;NOT flag:trashed AND &quot;
                                        &quot;(maildir:/box1/INBOX OR &quot;
                                        &quot;maildir:/box2/INBOX)&quot;)))
</code></pre>
<p>comments on <a href="https://twitter.com/xenodium/status/1251852526246379520">twitter</a>.</p>
]]></description>
    <pubDate>Sun, 19 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Libya travel bookmarks</title>
<link>https://xenodium.com/libya-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/libya-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/wrathofgnon/status/1249544131715534849?s=12">The city of Ghadames on the edge of the Saharan desert</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 14 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trimming videos with ffmpeg</title>
<link>https://xenodium.com/trimming-videos-with-ffmpeg</link>
<guid isPermaLink="false">https://xenodium.com/trimming-videos-with-ffmpeg</guid>
    <description><![CDATA[<p>Via Bernd Verst's <a href="https://bernd.dev/2020/04/trim-videos-instantly/">Trim Videos Instantly</a>:</p>
<p>Start time + duration</p>
<pre><code class="language-bash">ffmpeg -ss hh:mm:ss.msec -i in.mpeg -c copy -map 0 -t hh:mm:ss.msec out.mpeg
</code></pre>
<p>Start time + end time</p>
<pre><code class="language-bash">ffmpeg -ss hh:mm:ss.msec -i in.mpeg -c copy -map 0 -to hh:mm:ss.msec out.mpeg
</code></pre>
]]></description>
    <pubDate>Tue, 07 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs's counsel-M-x meets multiple cursors</title>
<link>https://xenodium.com/emacss-counsel-m-x-meets-multiple-cursors</link>
<guid isPermaLink="false">https://xenodium.com/emacss-counsel-m-x-meets-multiple-cursors</guid>
    <description><![CDATA[<p>I'm a fan of Magnar Sveen's <a href="https://github.com/magnars/multiple-cursors.el">multiple cursors</a> Emacs implementation. It's just so fun to use and works very well with commands bound to my favorite keys.</p>
<p>Every now and then I'd like to execute extended commands on all cursors, but they have no keys bound to them. If you're an <a href="https://github.com/abo-abo/swiper">ivy/counsel</a> fan like me (and all packages by <a href="https://oremacs.com/about/">Abo Abo</a>), you use <em>counsel-M-x</em> to invoke commands. However, <em>counsel-M-x</em> doesn't support multiple cursors out of the box. Luckily, this is Emacs and we can fix that…</p>
<p>Back in December 2019, I made a note to revisit <a href="https://www.reddit.com/user/snippins1987/">u/snippins1987</a>'s weekly tip to pair <a href="https://www.reddit.com/r/emacs/comments/eeyhdz/weekly_tipstricketc_thread/fch1bkv?utm_source=share&amp;utm_medium=web2x">helm-M-x with multiple cursors</a>. Finally got back to it. With a few changes, we can also make the snippet work with <em>counsel-M-x</em> ø/.</p>
<pre><code class="language-{.commonlisp">(defun adviced:counsel-M-x-action (orig-fun &amp;rest r)
  &quot;Additional support for multiple cursors.&quot;
  (apply orig-fun r)
  (let ((cmd (intern (car r))))
    (when (and (boundp 'multiple-cursors-mode)
               multiple-cursors-mode
               cmd
               (not (memq cmd mc--default-cmds-to-run-once))
               (not (memq cmd mc/cmds-to-run-once))
               (or mc/always-run-for-all
                   (memq cmd mc--default-cmds-to-run-for-all)
                   (memq cmd mc/cmds-to-run-for-all)
                   (mc/prompt-for-inclusion-in-whitelist cmd)))
      (mc/execute-command-for-all-fake-cursors cmd))))

(advice-add #'counsel-M-x-action
            :around
            #'adviced:counsel-M-x-action)
</code></pre>
<p><img src="https://xenodium.github.io/images/emacss-counsel-m-x-meets-multiple-cursors/counsel-mx-mc.gif" alt=""></p>
]]></description>
    <pubDate>Mon, 06 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Portland travel bookmarks</title>
<link>https://xenodium.com/portland-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/portland-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.powells.com/">Powell’s Books | The World’s Largest Independent Bookstore</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 05 Apr 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>String inflection Emacs package</title>
<link>https://xenodium.com/string-inflection-emacs-package</link>
<guid isPermaLink="false">https://xenodium.com/string-inflection-emacs-package</guid>
    <description><![CDATA[<p><a href="https://github.com/akicho8/string-inflection">string-inflection</a> (by <a href="https://github.com/akicho8">Akira Ikeda</a>) is a nifty package to cycle through string case styles: <a href="https://en.wikipedia.org/wiki/Letter_case#Special_case_styles">camel, snake, kebab…</a> The package includes a handful of cycling functions for different languages (Ruby, Python and Java), but it's easy to mix and match to roll your own. For now, I'm binding <em>C-M-j</em> to <em>string-inflection-cycle</em>, which is an alias to <em>string-inflection-ruby-style-cycle</em>.</p>
<pre><code class="language-{.commonlisp">(use-package string-inflection
  :ensure t
  :bind (:map prog-mode-map
              (&quot;C-M-j&quot; . string-inflection-cycle)))
</code></pre>
<p><img src="https://xenodium.github.io/images/string-inflection-emacs-package/string_inflection.gif" alt=""></p>
<p>comments on <a href="https://twitter.com/xenodium/status/1244355205698912261?s=20">twitter</a></p>
]]></description>
    <pubDate>Sun, 29 Mar 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Turkey travel bookmarks</title>
<link>https://xenodium.com/turkey-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/turkey-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Tomb_of_Amyntas">Tomb of Amyntas - Wikipedia</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 28 Mar 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Dal Makhani (black lentils) recipe</title>
<link>https://xenodium.com/dal-makhani-black-lentils-recipe</link>
<guid isPermaLink="false">https://xenodium.com/dal-makhani-black-lentils-recipe</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/dal-makhani-black-lentils-recipe/dal.jpg" alt=""></p>
<h2>Soak beans (overnight)</h2>
<ul>
<li>1 cup of rajmah (kidney beans).</li>
<li>2 cups of sabut urad (black lentils).</li>
</ul>
<p>Place the beans in a bowl with plenty of water. The beans will soak it up so ensure there's enough.</p>
<h2>Cooking the beans</h2>
<ul>
<li>3 liters of water.</li>
<li>1 cinamon stick.</li>
<li>1 tablespoon of turmeric.</li>
<li>2 bay leaves.</li>
</ul>
<p>Drain the beans and combine new ingredients into a pot. Bring to a boil and simer for 1.5 hours. Check beans aren't firm (give 'em a try'). If so extend another 15-30 mins.</p>
<h2>Prepare paste</h2>
<ul>
<li>1 4 cm piece of ginger.</li>
<li>1 large onion.</li>
<li>6 garlic cloves.</li>
<li>2 tomatoes.</li>
</ul>
<p>Put through blender (with choppin pulse) or food processor until you get a paste.</p>
<h2>Golden paste</h2>
<ul>
<li>Paste.</li>
<li>3 tablespoons of butter.</li>
<li>1 tablespoon of cumin seeds.</li>
<li>1 tablespoon of coriander powder.</li>
<li>1 tablespoon of chilly powder (or less to make milder).</li>
<li>1 fresh red hot pepper (find one with medium heat level) chopped.</li>
<li>1 tablespoon of cumin powder.</li>
<li>1/4 cup of water.</li>
<li>3/4 tablespoon of salt.</li>
</ul>
<p>Heat up the butter (medium heat) and brown the cumin seeds (maybe 30 seconds). Add the paste from previous step. Cook for about 4 minutes or until golden. Add the remaining ingredients in step (except water) and cook for another 30 seconds. Add the water and salt and mix to make more fluid and remove from heat.</p>
<h2>Tying it all together</h2>
<ul>
<li>1 tablespoon of panchpuram (cumin, fenugreek, mistard, and fennel seeds).</li>
<li>300 ml of double cream.</li>
</ul>
<p>Combine the cooked beans, golden paste, and seeds. Simmer for about 15 minutes. Add the cream and cook for about 2 minutes. You are effectively done.</p>
<h2>Garnish (optional)</h2>
<p>You can serve and optionally garnish with some chopped coriander. Recommended.</p>
<h2>Serve with</h2>
<p>Basmati rice, rotis, buttered buns, or even corn tortillas (unorthodox, but hey).</p>
]]></description>
    <pubDate>Wed, 25 Mar 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Modern Emacs lisp libraries</title>
<link>https://xenodium.com/modern-elisp-libraries</link>
<guid isPermaLink="false">https://xenodium.com/modern-elisp-libraries</guid>
    <description><![CDATA[<p>Quickly finding related built-in elisp functions (without prefixes) can sometimes take a little poking around.</p>
<p>Some modern and predictable built-in exceptions I now reach out to are:</p>
<ul>
<li><a href="https://nicolas.petton.fr/ressources/emacsconf2015/">map.el</a> for key/values, alists, hash-tables and arrays (built-in as of Emacs 25.1).</li>
<li><a href="https://nicolas.petton.fr/ressources/emacsconf2015/">seq.el</a> for sequence manipulation functions (built-in as of Emacs 25.1).</li>
<li><a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/subr-x.el">subr-x.el</a> has a handful of string functions (built-in as of Emacs 24.4).</li>
<li><a href="https://endlessparentheses.com/new-on-elpa-and-in-emacs-25-1-let-alist.html">let-alist.el</a> wonderful syntax for alists, great for json (built-in as of Emacs 25.1).</li>
</ul>
<p>If you don't mind reaching out to third-party libs (you likely have some of these already installed), here are some modern, predictable, and well-documented ones that always get me out of trouble:</p>
<ul>
<li><a href="https://github.com/magnars/s.el#functions">s.el</a> string manipulation.</li>
<li><a href="https://github.com/rejeep/f.el">f.el</a> file/path handling.</li>
<li><a href="https://github.com/magnars/dash.el#functions">dash.el</a> for lists.</li>
<li><a href="https://github.com/Wilfred/ht.el">ht.el</a> for hashtables.</li>
<li><a href="https://github.com/alphapapa/ts.el">ts.el</a> for date and time.</li>
</ul>
<p>I'm happy with built-ins like map.el, seq.el, and let-alist.el. subr-x.el is also pretty nice, although not as full-featured as third-party s.el.</p>
<p>Am I missing out on other modern built-ins or third-party libraries?</p>
<p>UPDATE: Added a handful of newly discovered libraries plus <a href="https://twitter.com/dmartincy/status/1241444701754085383?s=20">suggestions by Daniel Martín</a> (thanks!). Not tried any of these myself.</p>
<ul>
<li><a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/rtree.el">rtree.el</a> binary tree that stores ranges (Built-in).</li>
<li><a href="https://github.com/emacsorphanage/ov">ov.el</a> simple way to manipulate overlay.</li>
<li>Toby Cubitt's <a href="http://www.dr-qubit.org/tags/computing-code-emacs.html">libraries</a> (heap, overlays, queue, avl-tree, trie, dict-tree, etc).</li>
<li><a href="https://github.com/VincentToups/shadchen-el">shadchen.el</a> pattern-matching.</li>
<li><a href="https://phillord.github.io/m-buffer-el">m-buffer.el</a> buffers.</li>
<li><a href="https://github.com/tali713/esxml">esxml.el</a> xml and html.</li>
<li><a href="https://github.com/plexus/a.el">a.el</a> associative structures.</li>
<li><a href="https://github.com/troyp/asoc.el">asoc.el</a> association list library.</li>
<li><a href="https://github.com/yurikhan/yk-color">yk-color.el</a> linear RGB color manipulation.</li>
</ul>
<p>comments on <a href="https://twitter.com/xenodium/status/1241439306511720448">twitter</a></p>
]]></description>
    <pubDate>Sat, 21 Mar 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs smartparens auto-indent</title>
<link>https://xenodium.com/emacs-smartparens-auto-indent</link>
<guid isPermaLink="false">https://xenodium.com/emacs-smartparens-auto-indent</guid>
    <description><![CDATA[<p>While I do most editing in Emacs, I use Xcode every now and then. I like Xcode's pair matching (of brackets) combined with its auto-indent.</p>
<p><img src="https://xenodium.github.io/images/emacs-smartparens-auto-indent/xcode_indent.gif" alt=""></p>
<p>While the wonderful <a href="https://github.com/Fuco1/smartparens">smartparens</a> gives Emacs pair-matching powers, it doesn't automatically indent between pairs (out of the box anyway).</p>
<p><img src="https://xenodium.github.io/images/emacs-smartparens-auto-indent/indent_bracket_before.gif" alt=""></p>
<p>Luckily, smartparens does provide <em>sp-local-pair,</em> which enables us to achieve a similar goal.</p>
<p>With a short snippet, we can autoindent between {}, [], and () when pressing return in-between.</p>
<pre><code class="language-{.commonlisp">(defun indent-between-pair (&amp;rest _ignored)
  (newline)
  (indent-according-to-mode)
  (forward-line -1)
  (indent-according-to-mode))

(sp-local-pair 'prog-mode &quot;{&quot; nil :post-handlers '((indent-between-pair &quot;RET&quot;)))
(sp-local-pair 'prog-mode &quot;[&quot; nil :post-handlers '((indent-between-pair &quot;RET&quot;)))
(sp-local-pair 'prog-mode &quot;(&quot; nil :post-handlers '((indent-between-pair &quot;RET&quot;)))
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-smartparens-auto-indent/indent_bracket_after.gif" alt=""></p>
<p>comments on <a href="https://twitter.com/xenodium/status/1241104117264781312">twitter</a></p>
]]></description>
    <pubDate>Fri, 20 Mar 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Solarpunk bookmarks</title>
<link>https://xenodium.com/solarpunk-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/solarpunk-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://medium.com/solarpunks/solarpunk-a-reference-guide-8bcf18871965#060e">SOLARPUNK : A REFERENCE GUIDE - Solarpunks - Medium</a>.</li>
<li><a href="https://hieroglyph.asu.edu/2014/09/solarpunk-notes-toward-a-manifesto/">Solarpunk: Notes toward a manifesto (Project Hieroglyph)</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 20 Mar 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>sqlite bookmarks</title>
<link>https://xenodium.com/sqlite-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sqlite-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=23287278">DuckDB: SQLite for Analytics | Hacker News</a>.</li>
<li><a href="https://github.com/ZetloStudio/ZeQLplus">GitHub - ZetloStudio/ZeQLplus: Open Source Terminal SQLite Database Browser</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27944065">Inserting 130M SQLite rows per minute from a scripting language | Hacker News</a>.</li>
<li><a href="https://avi.im/blag/2021/fast-sqlite-inserts/">Inserting One Billion Rows in SQLite Under A Minute - blag</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18831470">LiteCLI – A user-friendly command-line client for SQLite database (Hacker News)</a>.</li>
<li><a href="https://www.sqlite.org/appfileformat.html">SQLite As An Application File Format</a>.</li>
<li><a href="http://ericsink.com/entries/rss_cat_3.html">Zumero: Efficient sync by using multiple SQLite files</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 10 Mar 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>covid-19 bookmarks</title>
<link>https://xenodium.com/covid-19-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/covid-19-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.linkedin.com/pulse/data-centric-approach-plan-appropriate-covid-19-response-tee">A Data-Centric Approach to Plan Appropriate COVID-19 Response in the United States</a>.</li>
<li><a href="https://www.gov.uk/government/publications/coronavirus-action-plan/coronavirus-action-plan-a-guide-to-what-you-can-expect-across-the-uk">Coronavirus action plan: a guide to what you can expect across the UK - GOV.UK</a>.</li>
<li><a href="https://gisanddata.maps.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6">Coronavirus COVID-19 Global Cases by Johns Hopkins CSSE</a>.</li>
<li><a href="https://www.reddit.com/r/COVID19">COVID-19 (r/COVID19)</a>.</li>
<li><a href="https://www.reddit.com/r/China_Flu/">COVID-19 Discussion (r/China_Flu/)</a>.</li>
<li><a href="https://covid-search.doctorevidence.com">Covid-19 DocSearch free access</a>.</li>
<li><a href="https://www.reddit.com/r/COVID19/comments/f9dbeq/covid19_what_do_we_have_to_fear_from_a_pandemic/">COVID19 - AMA with r/COVID19 mod u/Jennifer Cole at 10.00pm GMT 25 Feb</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22624091">Handbook of Covid-19 Prevention and Treatment from Hospital with 0% fatality (HN)</a>.</li>
<li><a href="https://www.microcovid.org">microCOVID Project (calculate risk)</a>.</li>
<li><a href="https://www.runnersworld.com/uk/news/a32094750/coronavirus-runner-slipstream/">New research suggests runners should be further than 2m apart</a>.</li>
<li><a href="https://www.reddit.com/r/Coronavirus/">Novel Coronavirus (2019-nCoV) (r/coronavirus)</a>.</li>
<li><a href="https://ocw.mit.edu/resources/res-10-s95-physics-of-covid-19-transmission-fall-2020/">Physics of COVID-19 Transmission | MIT OpenCourseWare</a>.</li>
<li><a href="https://docs.google.com/document/u/1/d/1DioVg-8nu25up0JMdd-w3AsJPy1tl0MsobfG6TzGOws/mobilebasic">Self-care Tips if you become sick with COVID-19 from an activist nurse</a>.</li>
<li><a href="https://www.who.int/emergencies/diseases/novel-coronavirus-2019/advice-for-public/when-and-how-to-use-masks">WHO: When and how to use masks</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 26 Feb 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Security bookmarks</title>
<link>https://xenodium.com/security-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/security-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=22980003">A Graduate Course in Applied Cryptography | Hacker News</a>.</li>
<li><a href="https://sneak.berlin/20191011/stupid-unix-tricks/">Jeffrey Paul: Stupid Unix Tricks (ssh)</a>.</li>
<li><a href="https://sneak.berlin/20191011/stupid-unix-tricks/">Jeffrey Paul: Stupid Unix Tricks (yubikey setup)</a>.</li>
<li><a href="https://lchsk.com/stay-paranoid-and-trust-no-one-overview-of-common-security-vulnerabilities-in-web-applications.html">Stay paranoid and trust no one. Overview of common security vulnerabilities in web applications</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 15 Feb 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Nix bookmarks</title>
<link>https://xenodium.com/nix-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/nix-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/bergey/dotfiles/blob/4807ef9de187018a9cf7e1d571fc530e3ce07bfb/emacs/emacs.nix">Daniel Bergey's dotfiles/emacs.nix</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22295102">I Was Wrong about Nix | Hacker News</a>.</li>
<li><a href="https://christine.website/blog/i-was-wrong-about-nix-2020-02-10">I was wrong about Nix</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 15 Feb 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plants bookmarks</title>
<link>https://xenodium.com/plants-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/plants-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.houseofplants.co.uk/plants/aechmea-blue-rain_blue-rain-bromeliad_63988.html">Aechmea 'Blue Rain' Blue rain Bromeliad | House of Plants</a>.</li>
<li><a href="https://en-gb.bakker.com/collections/air-purifying-plants">Air-purifying Plants – Bakker.com</a>.</li>
<li><a href="https://twitter.com/Hydeez411/status/1409883023772901379">Citronella Mosquito Plant</a>.</li>
<li><a href="https://www.elmshop.co.uk/plants">Elm plants</a>.</li>
<li><a href="https://farmhack.org/tools">Farm Hack</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21859303">Guerilla Gardening (2015) | Hacker News</a>.</li>
<li><a href="https://www.thegardeningclub.co.uk/">The Gardening Club® - Crews Hill, Enfield</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 10 Jan 2020 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fixing Honeywell CM927's dead screen</title>
<link>https://xenodium.com/fixing-honeywell-cm927-dead-screens</link>
<guid isPermaLink="false">https://xenodium.com/fixing-honeywell-cm927-dead-screens</guid>
    <description><![CDATA[<p>My Honeywell CM927 thermostat's screen had been getting progressively worse over the last year. As of late, the screen was of little use.</p>
<p><img src="https://xenodium.github.io/images/fixing-honeywell-cm927-dead-screens/before.png" alt=""></p>
<p>A random search yielded the <a href="https://www.homeownershub.com/uk-diy/honeywell-cm927-lcd-screen-fail-common-1058940-.htm">Honeywell CM927 LCD screen fail - common?</a> thread, with a promising comment by Phil:</p>
<blockquote>
<p>&quot;Strip the unit and remove the circuit board (just a few plastic clips, no screws). Remove the LCD assembly from the circuit board (more plastic clips and an eight pin push connection). Removed the LCD unit from the clear plastic housing (more plastic clips). Finally heat up the plastic ribbon where it is stuck to the circuit board (hair dryer will do trick) and then firmly press it onto the circuit board… probably worth doing this several times; in effect you are remating the ribbon to the circuit board by softening the adhesive. Put it all back together and it should be working again.&quot;</p>
</blockquote>
<p>Phil's instructions were great. There's also a super handy <a href="https://www.youtube.com/watch?v=W4LxHn5Y_l4">video</a> by <a href="https://www.youtube.com/channel/UC3Dbv6X-_7fCfa4AvsxK_zw">El Tucan</a>, also <a href="https://www.homeownershub.com/uk-diy/honeywell-cm927-lcd-screen-fail-common-1058940-3.htm">linked by Stevie</a>.</p>
<h2>Success ø/</h2>
<p>Heating up the plastic ribbon and pressing it onto the circuit board did the trick for me. Took a few tries for all segments to appear, but the screen is looking great again.</p>
<p>Thank you Internet strangers! :)</p>
<p><img src="https://xenodium.github.io/images/fixing-honeywell-cm927-dead-screens/after.png" alt=""></p>
]]></description>
    <pubDate>Sun, 29 Dec 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>SwiftUI bookmarks</title>
<link>https://xenodium.com/swiftui-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/swiftui-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/clarko/status/1284940951031439361"> SwiftUI live-blur materials that you can use like a background color</a>.</li>
<li><a href="https://www.hackingwithswift.com/articles/224/common-swiftui-mistakes-and-how-to-fix-them">8 Common SwiftUI Mistakes - and how to fix them – Hacking with Swift</a>.</li>
<li><a href="https://emacsist.github.io/2020/01/07/swiftui-for-absolute-beginners%E8%AF%BB%E4%B9%A6/">&lt;SwiftUI for Absolute Beginners&gt;读书 - emacsist</a>.</li>
<li><a href="https://developer.apple.com/documentation/swiftui/environmentvalues">@Environment values</a>.</li>
<li><a href="https://twitter.com/natpanferova/status/1275903292946567168">`@State` `onChange`</a>.</li>
<li><a href="https://github.com/Jinxiansen/SwiftUI">`SwiftUI` Framework Learning and Usage Guide</a>.</li>
<li><a href="https://swiftui-lab.com/companion/">A Companion for SwiftUI - The SwiftUI Lab</a>.</li>
<li><a href="https://swiftbysundell.com/articles/deep-dive-into-swift-function-builders/">A deep dive into Swift’s function builders | Swift by Sundell</a>.</li>
<li><a href="https://www.objc.io/blog/2020/08/18/fuzzy-search/">A Fast Fuzzy Search Implementation · objc.io</a>.</li>
<li><a href="https://swiftbysundell.com/articles/swiftui-state-management-guide/">A guide to SwiftUI’s state management system | Swift by Sundell</a>.</li>
<li><a href="https://swiftbysundell.com/articles/swiftui-layout-system-guide-part-1/">A guide to the SwiftUI layout system - Part 1 | Swift by Sundell</a>.</li>
<li><a href="https://github.com/jordansinger/SwiftUI-Kit">A SwiftUI iOS system components and interactions demo app based on iOS 14</a>.</li>
<li><a href="https://github.com/AndreaMiotto/ActionOver">ActionOver: A custom SwiftUI modifier to present an Action Sheet on iPhone and a Popover on iPad and Mac</a>.</li>
<li><a href="https://swiftui-lab.com/swiftui-animations-part1/">Advanced SwiftUI Animations - Part 1: Paths - The SwiftUI Lab</a>.</li>
<li><a href="https://swiftui-lab.com/advanced-transitions/">Advanced SwiftUI Transitions - The SwiftUI Lab</a>.</li>
<li><a href="https://github.com/krzysztofzablocki/AutomaticSettings">AutomaticSettings: Data driven settings UI</a>.</li>
<li><a href="https://www.morningswiftui.com/blog/build-mapview-app-with-swiftui">Building a MapView app with SwiftUI — Morning SwiftUI</a>.</li>
<li><a href="https://schwiftyui.com/swiftui/building-a-widget-for-ios-with-swiftui-and-widgetkit/">Building a Widget for iOS with SwiftUI and WidgetKit - SchwiftyUI</a>.</li>
<li><a href="https://swiftwithmajid.com/2019/12/25/building-pager-view-in-swiftui/">Building Pager view in SwiftUI | Majid’s blog about Swift development</a>.</li>
<li><a href="https://swiftwithmajid.com/2020/02/05/building-viewmodels-with-combine-framework/">Building ViewModels with Combine framework</a>.</li>
<li><a href="https://www.donnywals.com/category/combine/">Category: Combine – Donny Wals</a>.</li>
<li><a href="https://store.raywenderlich.com/products/combine-asynchronous-programming-with-swift">Combine: Asynchronous Programming with Swift</a>.</li>
<li><a href="https://swiftwithmajid.com/2019/08/28/composable-styling-in-swiftui/">Composable styling in SwiftUI | Swift with Majid</a>.</li>
<li><a href="https://www.oliverbinns.co.uk/2020/07/23/constructing-data-with-swift-function-builders/">Constructing Data with Swift Function Builders – Oliver Binns</a>.</li>
<li><a href="https://medium.com/flawless-app-stories/context-menu-alert-and-actionsheet-in-swiftui-b6ff0d1f8493">Context Menu, Alert and ActionSheet in SwiftUI</a>.</li>
<li><a href="https://danielsaidi.com/blog/2020/01/05/create-an-spm-package-for-swiftui">Create an SPM Package for SwiftUI | Daniel Saidi</a>.</li>
<li><a href="https://github.com/mattgallagher/CwlFitting">CwlFitting: A small SwiftUI package to aid with &quot;shrink-to-fit&quot; + &quot;fill-aligned&quot; VStack and HStack arrangements</a>.</li>
<li><a href="https://twitter.com/twostraws/status/1280996740053827584">debugPrint() SwiftUI modifier</a>.</li>
<li><a href="https://theswiftdev.com/2018/01/25/deep-dive-into-swift-frameworks/">Deep dive into Swift frameworks - The.Swift.Dev.</a>.</li>
<li><a href="https://dev.to/maeganwilson_/default-a-view-in-navigationview-with-swiftui-183p">Default a View in NavigationView with SwiftUI - DEV Community</a>.</li>
<li><a href="https://designcode.io/swiftui?promo=learnswiftui">designcode's SwiftUI course</a>.</li>
<li><a href="https://medium.com/over-engineering/monitoring-a-folder-for-changes-in-ios-dc3f8614f902">Detecting changes to a folder in iOS using Swift</a>.</li>
<li><a href="https://swiftui-lab.com/modal-dismiss-gesture/">Dismiss Gesture for SwiftUI Modals - The SwiftUI Lab</a>.</li>
<li><a href="https://medium.com/@karaiskc/first-learnings-from-adopting-swiftui-be2ee4289007">First learnings from adopting SwiftUI - Christos Karaiskos - Medium (card example)</a>.</li>
<li><a href="https://www.vadimbulavin.com/swift-function-builders-swiftui-view-builder/">Function Builders in Swift and SwiftUI</a>.</li>
<li><a href="https://swiftui-lab.com/geometryreader-to-the-rescue/">GeometryReader to the Rescue - The SwiftUI Lab</a>.</li>
<li><a href="https://medium.com/better-programming/gestures-in-swiftui-e94b784ecc7">Gestures in SwiftUI - Better Programming - Medium</a>.</li>
<li><a href="https://github.com/AppPear/ChartView">GitHub - AppPear/ChartView: ChartView made in SwiftUI</a>.</li>
<li><a href="https://github.com/dasautoooo/Parma">GitHub - dasautoooo/Parma: A SwiftUI view for displaying Markdown with custom.</a>.</li>
<li><a href="https://github.com/Dimillian/MovieSwiftUI">GitHub - Dimillian/MovieSwiftUI: SwiftUI &amp; Combine app using MovieDB API.</a>.</li>
<li><a href="https://github.com/Jinxiansen/SwiftUI">GitHub - Jinxiansen/SwiftUI: `SwiftUI` Framework Learning and Usage Guide.</a>.</li>
<li><a href="https://github.com/mecid/SwiftUICharts">GitHub - mecid/SwiftUICharts: A simple line and bar charting library written for SwiftUI</a>.</li>
<li><a href="https://github.com/nalexn/EnvironmentOverrides">GitHub - nalexn/EnvironmentOverrides: QA assistant for a SwiftUI app</a>.</li>
<li><a href="https://github.com/nerdsupremacist/FancyScrollView">GitHub - nerdsupremacist/FancyScrollView (list with growing/snapping header)</a>.</li>
<li><a href="https://github.com/paololeonardi/WaterfallGrid">GitHub - paololeonardi/WaterfallGrid: A waterfall grid layout view for SwiftUI.</a>.</li>
<li><a href="https://github.com/SimpleBoilerplates/SwiftUI-Cheat-Sheet">GitHub - SimpleBoilerplates/SwiftUI-Cheat-Sheet: SwiftUI Cheat Sheet</a>.</li>
<li><a href="https://github.com/siteline/SwiftUI-Introspect">GitHub - siteline/SwiftUI-Introspect: Introspect underlying UIKit components</a>.</li>
<li><a href="https://github.com/SwiftUIX/SwiftUIX">GitHub - SwiftUIX/SwiftUIX: An extension to the standard SwiftUI library.</a>.</li>
<li><a href="https://swiftwithmajid.com/2019/11/13/gradient-in-swiftui/">Gradient in SwiftUI | Majid’s blog about Swift development</a>.</li>
<li><a href="https://www.hackingwithswift.com/example-code/uikit/how-to-add-a-toolbar-above-the-keyboard-using-inputaccessoryview">How to add a toolbar above the keyboard using inputAccessoryView</a>.</li>
<li><a href="https://twitter.com/myridiphis/status/1339840448689549312">How to animate along zIndex in SwiftUI</a>.</li>
<li><a href="https://blckbirds.com/post/side-menu-hamburger-menu-in-swiftui/">How to create a side menu (hamburger menu) in SwiftUI | BLCKBIRDS</a>.</li>
<li><a href="https://www.raywenderlich.com/4503153-how-to-create-a-splash-screen-with-swiftui">How to Create a Splash Screen With SwiftUI | raywenderlich.com</a>.</li>
<li><a href="https://stackoverflow.com/questions/56490963/how-to-display-a-search-bar-with-swiftui">how to display a search bar with SwiftUI - Stack Overflow</a>.</li>
<li><a href="https://www.hackingwithswift.com/articles/210/how-to-fix-slow-list-updates-in-swiftui">How to fix slow List updates in SwiftUI – Hacking with Swift</a>.</li>
<li><a href="https://medium.com/better-programming/scheduling-notifications-and-badges-in-swiftui-9edf8574b893">How to Schedule Notifications and Add Badges in SwiftUI</a>.</li>
<li><a href="https://twitter.com/icanzilb/status/1324685822063497217">Image resizing techniques in Swift (smooth scroll)</a>.</li>
<li><a href="https://medium.com/better-programming/implement-searchbar-in-swiftui-556a204e1970">Implement a Search Bar in SwiftUI - Better Programming - Medium</a>.</li>
<li>Implementing Context Menus in iOS 13 Using SwiftUI or UIKit.</li>
<li><a href="https://twitter.com/chriseidhof/status/1280138752409636864">In the new SwiftUI, is there any reason you would still use ObservedObject instead of StateObject?</a>.</li>
<li><a href="https://swiftui-lab.com/communicating-with-the-view-tree-part-1/">Inspecting the View Tree with PreferenceKey - Part 1 - The SwiftUI Lab</a>.</li>
<li><a href="https://twitter.com/misaellandero/status/1285318302013837312">Integrate SwiftUI on UIKIT project its actually pretty easy</a>.</li>
<li><a href="https://stackoverflow.com/questions/56505043/how-to-make-view-the-size-of-another-view-in-swiftui">ios - How to make view the size of another view in SwiftUI - Stack Overflow</a>.</li>
<li><a href="https://elliehuxtable.com/lessons-learned-with-swift-ios-development/">Lessons learned with Swift + iOS development</a>.</li>
<li><a href="https://swiftui.diegolavalle.com/posts/linewrapping-stacks/">Line-Wrapping Stacks - Swift You and I</a>.</li>
<li><a href="https://twitter.com/dmartincy/status/1275913911506780161">LLDB &quot;_regexp-break &lt;file&gt;:&lt;line&gt;:&lt;column&gt;&quot;, breakpoint at a particular source code line and column</a>.</li>
<li><a href="https://swiftwithmajid.com/2020/07/08/mastering-grids-in-swiftui/">Mastering grids in SwiftUI | Swift with Majid</a>.</li>
<li><a href="https://swiftwithmajid.com/2020/09/24/mastering-scrollview-in-swiftui/">Mastering ScrollView in SwiftUI | Swift with Majid</a>.</li>
<li><a href="https://github.com/jordansinger/messages-multiplatform-swiftui-sample">Multiplatform Messages app for macOS, iOS, iPadOS in SwiftUI</a>.</li>
<li><a href="https://swiftwithmajid.com/2019/12/04/must-have-swiftui-extensions/">Must-have SwiftUI extensions | Majid’s blog about Swift development</a>.</li>
<li><a href="https://swiftwithmajid.com/2020/06/29/new-property-wrappers-in-swiftui/">New property wrappers in SwiftUI (@ScaledMetric, @SceneStorage, @AppStorage, @StateObject)</a>.</li>
<li><a href="https://twitter.com/natpanferova/status/1296725502305034240">On iOS 14, the keyboard is added to safe area</a>.</li>
<li><a href="https://www.objc.io/blog/2020/03/17/thinking-in-swiftui/">Our New Book: Thinking in SwiftUI · objc.io</a>.</li>
<li><a href="https://nalexn.github.io/anyview-vs-group/">Performance Battle: AnyView vs Group - Alexey Naumov</a>.</li>
<li><a href="https://gumroad.com/l/practical-combine/wwdc2020">Practical Combine: An introduction to Combine with real examples</a>.</li>
<li><a href="https://nalexn.github.io/swiftui-deep-linking/">Programmatic navigation in SwiftUI project - Alexey Naumov</a>.</li>
<li><a href="https://medium.com/get-chip/propert-wrappers-in-swift-5-1-14f610530710">Property Wrappers in Swift 5.1. An introduction to one of Swift 5.1’s</a>.</li>
<li><a href="https://swiftwithmajid.com/2021/07/14/pull-to-refresh-in-swiftui/">Pull-to-Refresh in SwiftUI | Swift with Majid</a>.</li>
<li><a href="https://twitter.com/navdeep_ua/status/1296591355485945856">Recreate iOS style Welcome Screen to any app in 3 minutes</a>.</li>
<li><a href="https://twitter.com/jsngr/status/1276700160643551232">Recreate this Control Center widget in SwiftUI</a>.</li>
<li><a href="https://dev.to/gualtierofr/remote-images-in-swiftui-49jp">Remote images in SwiftUI - DEV Community</a>.</li>
<li><a href="https://medium.com/ymedialabs-innovation/resizing-techniques-and-image-quality-that-every-ios-developer-should-know-e061f33f7aba">Resizing Techniques and Image Quality That Every iOS Developer Should Know (Swift)</a>.</li>
<li><a href="https://medium.com/flawless-app-stories/reusable-image-cache-in-swift-9b90eb338e8d">Reusable Image Cache in Swift - Flawless iOS - Medium</a>.</li>
<li><a href="https://ordinarycoding.com/articles/search-view-in-swiftui/">Search View in SwiftUI | Ordinary Coding</a>.</li>
<li><a href="https://www.hackingwithswift.com/books/ios-swiftui/selecting-dates-and-times-with-datepicker">Selecting dates and times with DatePicker</a>.</li>
<li><a href="https://twitter.com/icanzilb/status/1235884754576322560">Short video showing you how to debug, learn, or teach Combine operators with Timelane - the approach is always the same, add lanes - analyze the data</a>.</li>
<li><a href="https://swiftwithmajid.com/2020/07/21/sidebar-navigation-in-swiftui/">Sidebar navigation in SwiftUI | Swift with Majid</a>.</li>
<li><a href="https://github.com/alfianlosari/SwiftUIStaggeredNote">StaggeredList Sample App: A Staggered Pinterest Like Layout using SwiftUI</a>.</li>
<li><a href="https://developer.apple.com/documentation/swiftui/state_and_data_flow">State and Data Flow | Apple Developer Documentation</a>.</li>
<li><a href="https://twitter.com/twostraws/status/1279487425581133831">Stretchable header</a>.</li>
<li><a href="https://stackoverflow.com/questions/56578072/hstack-with-sf-symbols-image-not-aligned-centered">swift - HStack with SF Symbols Image not aligned centered - Stack Overflow</a>.</li>
<li><a href="https://stackoverflow.com/questions/59227158/imagepicker-in-swiftui">swift - ImagePicker in SwiftUI - Stack Overflow</a>.</li>
<li><a href="https://nshipster.com/propertywrapper/">Swift Property Wrappers - NSHipster</a>.</li>
<li><a href="https://swiftuipropertywrappers.com/">Swift UI Property Wrappers (@State, @StateObject, @EnvironmentObject, @ObservedObject, @Binding)</a>.</li>
<li><a href="https://stackoverflow.com/questions/62840571/not-receiving-scenephase-changes">swiftui - Not Receiving scenePhase Changes (foreground/background)</a>.</li>
<li><a href="https://medium.com/better-programming/swiftui-and-redux-clean-code-and-small-independent-components-6f46a5eb46b3">SwiftUI and Redux — Clean Code and Small, Independent Components</a>.</li>
<li><a href="https://sarunw.com/posts/swiftui-animation/">SwiftUI Animation (buttons, current-rotations, etc) | Sarun</a>.</li>
<li><a href="https://sarunw.com/posts/swiftui-animation/">SwiftUI Animation | Sarun</a>.</li>
<li><a href="https://medium.com/swlh/learn-master-%EF%B8%8F-swiftui-basic-components-in-10-minutes-dc327e71d245">SwiftUI basic components (form example)</a>.</li>
<li><a href="https://www.hackingwithswift.com/books/ios-swiftui/buttons-and-images">SwiftUI Buttons and images (using systemName)</a>.</li>
<li><a href="https://designcode.io/courses">SwiftUI courses</a>.</li>
<li><a href="https://swiftui-lab.com/custom-styling/">SwiftUI Custom Styling - The SwiftUI Lab (scaleEffect and opacity on isPressed)</a>.</li>
<li><a href="https://www.swiftcompiled.com/swiftui-datepicker/">SwiftUI DatePicker</a>.</li>
<li><a href="https://github.com/Leon12345679/QuickActionCard">SwiftUI displaying customizable quick action card</a>.</li>
<li><a href="https://troz.net/post/2024/swiftui-mac-2024/">SwiftUI for Mac 2024 :: TrozWare — Mac books &amp; articles</a>.</li>
<li><a href="https://troz.net/post/2020/swiftui_mac_big_sur/">SwiftUI for Mac on Big Sur :: TrozWare</a>.</li>
<li><a href="https://twitter.com/jsngr/status/1276931917628219398">SwiftUI gives you .isPlaceholder in WidgetKit generate a placeholders</a></li>
<li><a href="https://blog.rizwan.dev/blog/swiftui-import-export-files">SwiftUI Import/Export files | Rizwan's Blog 👨‍💻</a>.</li>
<li><a href="https://kean.github.io/post/swiftui-layout-system">SwiftUI Layout System | Alexander Grebenyuk</a>.</li>
<li><a href="https://www.simpleswiftguide.com/swiftui-navigationview-tutorial-with-examples/">SwiftUI NavigationView tutorial with examples - Simple Swift Guide</a>.</li>
<li><a href="https://www.tomasznazarenko.com/frameworks/SwiftUI-notes/">SwiftUI notes - Tomasz Nazarenko Blog</a>.</li>
<li><a href="https://twitter.com/jamesthomson/status/1293506487063584770">SwiftUI picker gotchas</a>.</li>
<li><a href="https://twitter.com/Geri_Borbas/status/1262390699611369477">SwiftUI Search Bar in the Navigation Bar</a>.</li>
<li><a href="https://zonneveld.dev/">SwiftUI snippets by Jeroen Zonneveld</a>.</li>
<li><a href="https://www.appcoda.com/swiftui-form-ui/">SwiftUI Tutorial: How to Build a Form UI for iOS Apps</a>.</li>
<li><a href="https://swiftuihub.com/">SwiftUI Tutorials on SwiftUI Hub</a>.</li>
<li><a href="https://swiftui.gallery/">swiftui.gallery | A gallery of SwiftUI code example snippets</a>.</li>
<li><a href="https://swiftui.gallery/uploads/code/SignUpForm">swiftui.gallery: sign up form sample</a>.</li>
<li><a href="https://github.com/ygit/swiftui">swiftui: A collaborative list of awesome SwiftUI resources</a>.</li>
<li><a href="https://finestructure.co/blog/2020/1/20/swiftui-equal-widths-view-constraints">SwiftUI: Equal widths view constraints — finestructure</a>.</li>
<li><a href="https://www.objc.io/blog/2019/10/01/swiftui-shake-animation/">SwiftUI: Shake Animation · objc.io</a>.</li>
<li><a href="https://github.com/alfianlosari/SwiftUIStaggeredList">SwiftUIStaggeredList: Staggered Layout List Using SwiftUI</a>.</li>
<li><a href="https://medium.com/better-programming/swiftuis-new-app-lifecycle-and-replacements-for-appdelegate-and-scenedelegate-in-ios-14-c9cf4a2367a9">SwiftUI’s New App Lifecycle and Replacements for AppDelegate</a>.</li>
<li><a href="https://danielsaidi.com/blog/2020/01/05/create-an-spm-package-for-swiftui">Swipe gesture SwiftUI | Daniel Saidi</a>.</li>
<li><a href="https://www.reddit.com/r/swift/comments/elhakp/so_i_guess_my_journey_begins_now/">SwuiftUI books</a>.</li>
<li><a href="https://sarunw.com/tags/swiftui/">Tagged “SwiftUI” | Sarun</a>.</li>
<li><a href="https://swiftwithmajid.com/2020/02/26/textfield-in-swiftui/">TextField in SwiftUI | Majid’s blog about Swift development</a>.</li>
<li><a href="https://medium.com/better-programming/the-complete-swiftui-documentation-youve-been-waiting-for-fdfe7241add9">The Complete SwiftUI Documentation You’ve Been Waiting For</a>.</li>
<li><a href="https://swiftwithmajid.com/2020/07/02/the-difference-between-stateobject-environmentobject-and-observedobject-in-swiftui/">The difference between @StateObject, @EnvironmentObject, and @ObservedObject</a>.</li>
<li><a href="https://swiftui-lab.com/a-powerful-combo/">The Power of the Hosting+Representable Combo (scroll SwiftUI list)</a>.</li>
<li><a href="https://betterprogramming.pub/the-swiftui-toolbar-in-ios-14-b4a0fe6a3034">The SwiftUI Toolbar in iOS 14</a>.</li>
<li><a href="https://theswiftdev.com/2019/10/31/the-ultimate-combine-framework-tutorial-in-swift/">The ultimate Combine framework tutorial in Swift - The.Swift.Dev.</a>.</li>
<li><a href="https://trailingclosure.com/">Trailing Closure (SwiftUI tutotials)</a>.</li>
<li><a href="https://twitter.com/dbuchanandev/status/1236411023340511233">Tweet on improving List SwiftUI performace (searching)</a>.</li>
<li><a href="https://www.raywenderlich.com/4829472-uicollectionview-custom-layout-tutorial-pinterest">UICollectionView Custom Layout Tutorial: Pinterest | raywenderlich.com</a>.</li>
<li><a href="https://medium.com/@dmytro.anokhin/url-image-view-in-swiftui-f08f85d942d8">URL Image view in SwiftUI</a>.</li>
<li><a href="https://www.avanderlee.com/swift/urlsession-common-pitfalls-with-background-download-upload-tasks/">URLSession: Common pitfalls with background download &amp; upload tasks</a>.</li>
<li><a href="https://heckj.github.io/swiftui-notes/">Using Combine (extensive online book)</a>.</li>
<li><a href="https://medium.com/better-programming/using-ios-14s-menu-as-a-picker-in-swiftui-b036c772037">Using iOS 14's Menu as a Picker in SwiftUI</a>.</li>
<li><a href="https://swiftwithmajid.com/2019/10/30/view-composition-in-swiftui/">View composition in SwiftUI | Majid’s blog about Swift development</a>.</li>
<li><a href="https://netsplit.com/swiftui/views-choose-their-own-sizes/">Views Choose Their Own Sizes – Netsplit.com</a>.</li>
<li><a href="https://medium.com/flawless-app-stories/visualize-combine-magic-with-swiftui-part-1-3a56e2a461b3">Visualize Combine Magic with SwiftUI Part 1 - Flawless iOS - Medium</a>.</li>
<li><a href="https://www.donnywals.com/whats-the-difference-between-stateobject-and-observedobject/">What’s the difference between @StateObject and @ObservedObject? – Donny Wals</a>.</li>
<li><a href="https://nalexn.github.io/swiftui-observableobject">Why I quit using the ObservableObject - Alexey Naumov</a>.</li>
<li><a href="https://swiftui-lab.com/working-with-focus-on-swiftui-views/">Working with Focus on SwiftUI Views - The SwiftUI Lab</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 29 Dec 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Studying for Life in the UK test</title>
<link>https://xenodium.com/studying-for-life-in-the-uk-test</link>
<guid isPermaLink="false">https://xenodium.com/studying-for-life-in-the-uk-test</guid>
    <description><![CDATA[<p>Today, I passed the <a href="https://www.gov.uk/life-in-the-uk-test">Life in the UK test</a>. Wasn't quite sure how to study for it. During my commutes, I listened to the <a href="https://www.audible.co.uk/pd/Life-in-the-UK-2019-Test-Contains-the-Official-Course-300-Practice-Questions-Audiobook/B07VD9SR3L">Life in the UK 2019 Test audio book</a>.</p>
<p>A friend recommended <a href="https://lifeintheuktestweb.co.uk">lifeintheuktestweb.co.uk</a>. Overall, I found their practice tests very useful. Taking a bunch tests helped me internalize the material.</p>
<p>Took some notes along the way (mostly data with years attached) and dumped it into an <a href="https://orgmode.org/manual/Built_002din-Table-Editor.html#Built_002din-Table-Editor">org table</a>. This helped me form a mental timeline.</p>
<p><strong>NOTE:</strong> <em>These tables alone are <strong>not</strong> comprehensive enough to prepare for the exam. You'll need to know additional information without dates attached.</em></p>
<h2>Events</h2>
<p>Year             Event</p>
<hr>
<p>2012             Diamond Jubilee
1999             Scottish Parliament formed
1973             UK joins the EU ø/
1972             Mary Peters wins Gold medal (pentathlon)
1957             Treaty of Rome signed (March 25)
1950             UK signs European Convention of Human Rights
1949             Ireland become a republic
1947             Granted independence India, Pakistan and Ceylon (Sri Lanka)
1945             Clement Attlee elected
1945             Alexander Fleming discovers penicillin
1945             WWII ends
1944             Butler Act (free secondary education England/Wales)
1940             Battle of Britain
1939             Germany invades Poland
1930s            Turing Machine
1936             BBC first regular television service
1932             First television broadcast
1930             British Film Studios Fluorish
1928             Women/men with same voting age
1918             WWI ends (November 11, 11am)
1903             Emmeline Pankhurst Women’s Social and Political Union (suffragettes)
1902             Motor-car racing in UK
1896             First film shown publicly
1899-1902        The Boer War (South Africa)
1870-1914        120000 Russian and Polish Jews fled to Britain to escape prosecution
1853-1856        Crimean War
1851             Great Exhibition (showcased Crystal Palance)
1837             Queen Victoria becomes queen (at 18)
1833             Emancipation Act (abolished slavery throughout British Emprire)
1832             The Reform Act (increase number of people with voting rights)
1776             North American colonies want out (don't tax us without representation)
1745             Bonnie Prince Charlie gets support by clansmen from Scottish highlands
1714             Queen Ann dies, George I becomes King
1689             Bill of rights (limit rights of kings)
1688             William of Orange invades England (proclaims king)
1680-1720        Huguenots refugees came to England (from France)
1695             Free press (newspapers) established
1679             Habeas Corpus Act (right to trial)
1649-1660        Cromwell rules republic for 11 years (Charles I executed)
1642             English Civil war (Cavaliers vs Roundheads)
1606             Union flag created
1588             English beat Spanish Armada
1348             Black death (third population die)
1314             Battle of Bannockburn: Robert the Bruce (Scottish King) beats English invasion
1284             Statute of Rhuddlan (Wales joins Crown, by King Edward I)
1215             Magna Carta created
1066             Norman Conquest (Saxon King Harold killed by William I)
300-400 AD       Christians appear in Britain
789 AD           Vikings first visit Britain and raid coastal towns
6000 years ago   Farmers come to Britain</p>
<h2>Population</h2>
<p>Year   Population</p>
<hr>
<p>2010   &gt; 62 million
2005   &lt; 60 million
1998   57 million
1951   50 million
1901   40 million
1851   20 million
1700   5 million
1600   &gt; 4 million</p>
]]></description>
    <pubDate>Tue, 17 Dec 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Georgia travel bookmarks</title>
<link>https://xenodium.com/georgia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/georgia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.abandonedamerica.us/abandoned-georgia">Abandoned Georgia</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 01 Dec 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Wizard zines comics in Emacs eshell</title>
<link>https://xenodium.com/wizard-zines-comics-eshell-util</link>
<guid isPermaLink="false">https://xenodium.com/wizard-zines-comics-eshell-util</guid>
    <description><![CDATA[<p>Over at <a href="http://wizardzines.com">wizardzines.com</a>, <a href="https://jvns.ca">Julia Evans</a> authors wonderful zines on topics like git, networking, linux, command-line utilities, and others. Some zines are paid. Some are free. No affiliation here, just a fan.</p>
<p>A little while ago, Julia <a href="https://twitter.com/b0rk/status/1192304892435738624">tweeted</a> about a utility she's building to view her original comics on similar topics. I instantly thought it'd be a fun tool to implement for Emacs <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a>.</p>
<p>Since then, I subscribed to <a href="https://wizardzines.com/saturday-comics/">wizardzines.com/saturday-comics</a> and received a few comics (awk, tar, and bash tricks). I saved them locally (using topic name and dropping file extensions).</p>
<pre><code class="language-{.bash">ls -1 ~/Downloads/wizardzines-comics/
</code></pre>
<hr>
<h2>awk
bash
tar</h2>
<p>By no means battle-tested, but here's an elisp snippet defining the <em>ecomic</em> command. It displays inlined comics in the handy eshell.</p>
<pre><code class="language-{.commonlisp">(require 'eshell)
(require 'iimage)

(defvar wizardzines-comics-path &quot;~/Downloads/wizardzines-comics&quot;)

(defun eshell/ecomic (&amp;rest args)
  &quot;Display command comic in ARGS.
Note: ensure comic images live in `wizardzines-comics-path', named with
command name and no extension.&quot;
  (eshell-eval-using-options
   &quot;ecomic&quot; args
   '((?h &quot;help&quot; nil nil &quot;show this usage screen&quot;)
     :external &quot;ecomic&quot;
     :show-usage
     :usage &quot;COMMAND

Show COMMAND comic from Julia Evans' https://wizardzines.com/saturday-comics&quot;)
   (let* ((command (nth 0 (eshell-stringify-list (eshell-flatten-list args))))
          (image-fpath (concat (file-name-as-directory
                                (expand-file-name wizardzines-comics-path))
                               command)))
     (unless (file-exists-p image-fpath)
       (error &quot;comic: \&quot;%s\&quot; not found :-(&quot; command))
     (eshell-buffered-print &quot;\n&quot;)
     (add-text-properties 0 (length image-fpath)
                          `(display ,(create-image image-fpath)
                                    modification-hooks
                                    (iimage-modification-hook))
                          image-fpath)
     (eshell-buffered-print image-fpath)
     (eshell-flush))))
</code></pre>
<p><img src="https://xenodium.github.io/images/wizard-zines-comics-eshell-util/ecomic.gif" alt=""></p>
<p>comments on <a href="https://twitter.com/xenodium/status/1198542659704504321">twitter</a></p>
<h2>Updates</h2>
<ul>
<li>Tweaked title.</li>
</ul>
]]></description>
    <pubDate>Sun, 24 Nov 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs counsel default search switches</title>
<link>https://xenodium.com/emacs-counsel-default-search-switches</link>
<guid isPermaLink="false">https://xenodium.com/emacs-counsel-default-search-switches</guid>
    <description><![CDATA[<p>Following up from <a href="http://xenodium.com/enhanced-emacs-searching-with-counsel-switches">Enhanced Emacs searching with counsel switches</a>, rather than remembering <a href="https://github.com/ggreer/the_silver_searcher">silver searcher</a> and <a href="https://github.com/BurntSushi/ripgrep">ripgrep</a> switches, we can use <a href="https://github.com/abo-abo/swiper">counsel's</a> <em>ivy-initial-inputs-alist</em> to set these up as default visible switches.</p>
<pre><code class="language-{.commonlisp">(push '(counsel-ag . &quot;--file-search-regex '' -- &quot;) ivy-initial-inputs-alist)
(push '(counsel-rg . &quot;--glob '**' -- &quot;) ivy-initial-inputs-alist)
</code></pre>
<p>The default switches stay out of the way in typical searches, but can be easily modified to include (or exclude) results matching specific file <em>names</em>.</p>
<p><img src="https://xenodium.github.io/images/emacs-counsel-default-search-switches/default-switches.gif" alt=""></p>
<p>comments on <a href="https://twitter.com/xenodium/status/1197673205688864768?s=20">twitter</a></p>
]]></description>
    <pubDate>Thu, 21 Nov 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Enhanced Emacs searching with counsel switches</title>
<link>https://xenodium.com/enhanced-emacs-searching-with-counsel-switches</link>
<guid isPermaLink="false">https://xenodium.com/enhanced-emacs-searching-with-counsel-switches</guid>
    <description><![CDATA[<p>The <a href="https://github.com/abo-abo/swiper">counsel</a> family of Emacs search commands are great for searching the filesystem. More specifically, <em>counsel-rg</em>, <em>counsel-ag</em>, and <em>counsel-pt</em>, which use the popular <a href="https://github.com/BurntSushi/ripgrep">ripgrep</a>, <a href="https://github.com/ggreer/the_silver_searcher">silver searcher</a>, and <a href="https://github.com/monochromegane/the_platinum_searcher">platinum searcher</a> utilities.</p>
<p>counsel-rg is my default searcher. It returns results quickly, with live updates as I tweak the search query.</p>
<p>Up until recently, my queries typically matched text in files only. This works great, but every so often I wished I could amend the query to include (or exclude) results matching specific file <em>names</em>. Turns out, you can prepend the search query with additional switches using the &quot;–&quot; separator.</p>
<p>The switches are usually utility-specific, but if we wanted to keep results from file names matching a glob, we can prepend the ripgrep query with something like <em>&quot;–glob Make* –&quot;</em> or the shorter version <em>&quot;-g Make* –&quot;</em>.</p>
<p>rg: -g Make* – install</p>
<p><img src="https://xenodium.github.io/images/enhanced-emacs-searching-with-counsel-switches/counsel-rg-switch.gif" alt=""></p>
]]></description>
    <pubDate>Sun, 10 Nov 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs org block company completion</title>
<link>https://xenodium.com/emacs-org-block-company-completion</link>
<guid isPermaLink="false">https://xenodium.com/emacs-org-block-company-completion</guid>
    <description><![CDATA[<p>UPDATE: This is now available <a href="https://melpa.org/#/company-org-block">on melpa</a>.</p>
<p>Back in 2015, I bound the &quot;&lt;&quot; key to a hydra for quickly inserting org blocks. The idea came from Oleg's post on <a href="https://oremacs.com/2015/03/07/hydra-org-templates/">org-mode block templates in Hydra</a>. The suggested binding settled in my muscle memory without much effort.</p>
<p>Fast forward to Febrary 2019. I replaced the hydra with <em><a href="https://orgmode.org/manual/Easy-templates.html">org-insert-structure-template</a></em> when <em>org-try-structure-completion</em> was removed from org mode. No biggie, as I kept the same binding to &quot;&lt;&quot; and hardly noticed the change.</p>
<p>Since my primary use-case for easy templates is inserting <a href="https://orgmode.org/manual/Working-with-source-code.html">source blocks</a>, I was keen to expedite choosing the source language as well as inserting the source block itself.</p>
<p>Writing a small <a href="https://company-mode.github.io/">company mode</a> completion backend fits my primary use-case pretty well.</p>
<p><img src="https://xenodium.github.io/images/emacs-org-block-company-completion/company-org-block.gif" alt=""></p>
<p>The company backend looks as follow (<strong>Warning:</strong> <a href="https://twitter.com/tpanum/status/1197772426072997888">Snippet needs Org v9.2</a>).</p>
<p>Note: This code is not up to date. Install via <a href="https://melpa.org/#/company-org-block">melpa</a> or see <a href="https://github.com/xenodium/company-org-block">its repository</a>.</p>
<pre><code class="language-{.commonlisp">(require 'map)
(require 'org)
(require 'seq)

(defvar company-org-block-bol-p t &quot;If t, detect completion when at
begining of line, otherwise detect completion anywhere.&quot;)

(defvar company-org--regexp &quot;&lt;\\([^ ]*\\)&quot;)

(defun company-org-block (command &amp;optional arg &amp;rest ignored)
  &quot;Complete org babel languages into source blocks.&quot;
  (interactive (list 'interactive))
  (cl-case command
    (interactive (company-begin-backend 'company-org-block))
    (prefix (when (derived-mode-p 'org-mode)
              (company-org-block--grab-symbol-cons)))
    (candidates (company-org-block--candidates arg))
    (post-completion
     (company-org-block--expand arg))))

(defun company-org-block--candidates (prefix)
  &quot;Return a list of org babel languages matching PREFIX.&quot;
  (seq-filter (lambda (language)
                (string-prefix-p prefix language))
              ;; Flatten `org-babel-load-languages' and
              ;; `org-structure-template-alist', join, and sort.
              (seq-sort
               #'string-lessp
               (append
                (mapcar #'prin1-to-string
                        (map-keys org-babel-load-languages))
                (map-values org-structure-template-alist)))))

(defun company-org-block--template-p (template)
  (seq-contains (map-values org-structure-template-alist)
                template))

(defun company-org-block--expand (insertion)
  &quot;Replace INSERTION with actual source block.&quot;
  (delete-region (point) (- (point) (1+ ;; Include &quot;&lt;&quot; in length.
                                     (length insertion))))
  (if (company-org-block--template-p insertion)
      (company-org-block--wrap-point insertion
                                     ;; May be multiple words.
                                     ;; Take the first one.
                                     (nth 0 (split-string insertion)))
    (company-org-block--wrap-point (format &quot;src %s&quot; insertion)
                                   &quot;src&quot;)))

(defun company-org-block--wrap-point (begin end)
  &quot;Wrap point with block using BEGIN and END.  For example:
#+begin_BEGIN
  |
#+end_END&quot;
  (insert (format &quot;#+begin_%s\n&quot; begin))
  (insert (make-string org-edit-src-content-indentation ?\s))
  ;; Saving excursion restores point to location inside code block.
  (save-excursion
    (insert (format &quot;\n#+end_%s&quot; end))))

(defun company-org-block--grab-symbol-cons ()
  &quot;Return cons with symbol and t whenever prefix of &lt; is found.
For example: \&quot;&lt;e\&quot; -&gt; (\&quot;e\&quot; . t)&quot;
  (when (looking-back (if company-org-block-bol-p
                          (concat &quot;^&quot; company-org--regexp)
                        company-org--regexp)
                      (line-beginning-position))
    (cons (match-string-no-properties 1) t)))
</code></pre>
<p>To use, add the backend enable <em>company-mode</em> in <em>org-mode</em>:</p>
<pre><code class="language-{.commonlisp">(add-to-list 'company-backends 'company-org-block)
(company-mode +1)
</code></pre>
<h2>Updates</h2>
<ul>
<li>Removed language-specific header logic (use <em><a href="https://www.orgmode.org/worg/org-contrib/babel/header-args.html">org-babel-default-header-args</a></em> instead).</li>
<li>Also completes non-source block templates from <a href="https://orgmode.org/manual/Easy-templates.html">org-structure-template-alist</a>.</li>
<li>Source in my <a href="https://github.com/xenodium/dotsies/blob/master/emacs/ar/company-org-block.el">dot files</a>.</li>
<li>Removed unnecessary binding. Just add company backend as usual.</li>
<li>Thanks to <a href="https://twitter.com/takaxp">Takaaki Ishikawa</a> for <a href="https://twitter.com/takaxp/status/1195884481535561729?s=20">suggesting `org-edit-src-content-indentation'</a>.</li>
<li>Thanks to <a href="https://twitter.com/tpanum">Thomas Kobber</a> for <a href="https://twitter.com/xenodium/status/1194224168709083137">highlighting incompatibility</a> with older org versions.</li>
</ul>
]]></description>
    <pubDate>Sun, 10 Nov 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>IRC bookmarks</title>
<link>https://xenodium.com/irc-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/irc-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/davisonio/awesome-irc">Awesome IRC</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 08 Nov 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>A more reusable Emacs shell-command history</title>
<link>https://xenodium.com/more-reusable-emacs-shell-command-history</link>
<guid isPermaLink="false">https://xenodium.com/more-reusable-emacs-shell-command-history</guid>
    <description><![CDATA[<p><a href="https://twitter.com/camdez">Cameron Desautel</a> has a great post on <a href="https://engineering.collbox.co/post/working-faster-in-emacs-by-reading-the-future/">Working Faster in Emacs by Reading the &quot;Future&quot;</a>, highlighting <em>M-n</em>'s usefulness for inserting minibuffer default values.</p>
<p>Invoking <em>M-n</em> in <em>shell-command</em>'s prompt is handy for quickly getting the current buffer's file name. This works great for one-off shell commands like <em>&quot;chmod +x script.sh&quot;</em> or <em>&quot;tidy -xml -i -m data.xml&quot;</em>. Unfortunately, these commands aren't easily reusable from <em>shell-command</em>'s minibuffer history, since it'll keep hardcoded file names.</p>
<p>There's likely existing built-in functionality or a more elaborate package for this, but advising <em>read-shell-command</em> enables us to write more reusable commands like <em>&quot;chmod +x $f&quot;</em> or <em>&quot;tidy -xml -i -m $f&quot;.</em> We merely replace <em>$f</em> with <em>(buffer-file-name)</em>, and let everything else continue as usual.</p>
<p><img src="https://xenodium.github.io/images/more-reusable-emacs-shell-command-history/expanded-shell-command.png" alt=""></p>
<pre><code class="language-{.commonlisp">(defun ar/adviced-read-shell-command (orig-fun &amp;rest r)
  &quot;Advice around `read-shell-command' to replace $f with buffer file name.&quot;
  (let ((command (apply orig-fun r)))
    (if (string-match-p &quot;\\$f&quot; command)
        (replace-regexp-in-string &quot;\\$f&quot;
                                  (or (buffer-file-name)
                                      (user-error &quot;No file file visited to replace $f&quot;))
                                  command)
      command)))

(advice-add 'read-shell-command
            :around
            'ar/adviced-read-shell-command)
</code></pre>
<p>It's worth mentioning that searching minibuffer history is pretty simple when leveraging <a href="https://github.com/abo-abo/swiper">counsel</a> to fuzzy search (via <em>counsel-minibuffer-history</em>, bound to <em>C-r</em> by default).</p>
<p><img src="https://xenodium.github.io/images/more-reusable-emacs-shell-command-history/richer-shell-command-history.gif" alt=""></p>
<p>On a final note, searching minibuffer history for cache hits is way more useful with richer history content. Be sure to save minibuffer history across Emacs sessions and increase <em>shell-command-history</em> using the built-in <a href="https://www.emacswiki.org/emacs/SaveHist">savehist-mode</a>.</p>
<pre><code class="language-{.commonlisp">(use-package savehist
  :custom
  (savehist-file &quot;~/.emacs.d/savehist&quot;)
  (savehist-save-minibuffer-history t)
  (history-length 10000)
  (savehist-additional-variables
   '(shell-command-history))
  :config
  (savehist-mode +1))
</code></pre>
]]></description>
    <pubDate>Sun, 03 Nov 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Taiwan travel bookmarks</title>
<link>https://xenodium.com/taiwan-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/taiwan-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.nickkembel.com/sun-moon-lake-tea/">Sun Moon Lake Tea: Why is it so good? (Spiritual Travels)</a>.</li>
<li><a href="https://blog.calebjay.com/posts/taipei-in-2019/">Taipei, 2019</a>.</li>
<li><a href="https://blog.calebjay.com/posts/why-taiwan/">Why You Should Remote Work in Taiwan</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 20 Oct 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs swiper and multiple cursors</title>
<link>https://xenodium.com/emacs-swiper-and-multiple-cursors</link>
<guid isPermaLink="false">https://xenodium.com/emacs-swiper-and-multiple-cursors</guid>
    <description><![CDATA[<p>Emacs <a href="https://github.com/abo-abo/swiper">swiper</a> is awesome. I bound <em>swiper-isearch</em> to <em>C-s</em>. Also a big fan of <a href="https://github.com/magnars/multiple-cursors.el">multiple cursors</a>. I use it regularly (it's fun).</p>
<p>I had totally missed Ole's post back in 2015: <a href="https://oremacs.com/2015/10/14/swiper-mc/">A simple multiple-cursors extension to swiper</a>. Turns out, swiper has multiple cursors support out of the box (bound to <em>C-7</em> by default). Yay!</p>
<p>UPDATE: Thanks to <a href="https://irreal.org/blog/?p=8370">irreal's post</a>, please remember to add <em>swiper-mc</em> to <em>mc/cmds-to-run-once</em> list (or things won't work as expected). This typically happens interactively when you invoke C-7 the first time around. Make sure you answer &quot;n&quot; when you see a prompt like:</p>
<p><img src="https://xenodium.github.io/images/emacs-swiper-and-multiple-cursors/swiper-mc-no.png" alt=""></p>
<p>If you happen to choose &quot;y&quot; by mistake, take a look at <strong>~/.emacs.d/.mc-lists.el</strong> to correct it. Remove <em>swiper-mc</em> from <em>mc/cmds-to-run-for-all</em> and add it to <em>mc/cmds-to-run-once</em>. Invoke <em>m-x eval-buffer</em> to reset the values and you're good to go.</p>
<p><img src="https://xenodium.github.io/images/emacs-swiper-and-multiple-cursors/swipermc.gif" alt=""></p>
]]></description>
    <pubDate>Thu, 10 Oct 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Speeding up gifs with gifsycle</title>
<link>https://xenodium.com/speeding-up-gifs-with-gifsycle</link>
<guid isPermaLink="false">https://xenodium.com/speeding-up-gifs-with-gifsycle</guid>
    <description><![CDATA[<p>Drop frames and speed gif up with <a href="https://www.lcdf.org/gifsicle/">gifsycle</a> (via <a href="https://graphicdesign.stackexchange.com/a/20937">How to remove every second frame from an animated gif?</a>):</p>
<pre><code class="language-bash">gifsicle -U in.gif `seq -f &quot;#%g&quot; 0 3 398` -O2 -o out.gif
</code></pre>
<p>ps. 398 is the total number of frames, which you can get with:</p>
<pre><code class="language-bash">identify in.gif
</code></pre>
]]></description>
    <pubDate>Tue, 08 Oct 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Spam blacklisting with Emacs org babel</title>
<link>https://xenodium.com/spam-blacklisting-with-emacs-org-babel</link>
<guid isPermaLink="false">https://xenodium.com/spam-blacklisting-with-emacs-org-babel</guid>
    <description><![CDATA[<p>Some email provider accept regular expressions to blacklist additional spam. My blacklist is long and tedious to update, but hey… Emacs org babel can simplify things here.</p>
<p>It's way easier to maintain a blacklist (with no regex) using an org table.</p>
<h2>Blacklist</h2>
<pre><code class="language-org">#+name: spam-entries
| .spammy                |
| dodgyfella@hotmail.com |
| henryzeespammer.com    |
| yumspam.com            |
</code></pre>
<p>and subsequently use org babel (elisp snippet) to generate the regex.</p>
<h2>Regex gen</h2>
<pre><code class="language-org">#+begin_src emacs-lisp :var rows=spam-entries
  (require 'dash)
  (require 's)

  (concat &quot;^&quot;
          (s-join &quot;|&quot;
                  (mapcar (lambda (entry)
                            (setq entry (regexp-quote
                                         (s-trim entry)))
                            (assert (s-present? entry))
                            (cond
                             ;; Blacklist email address: joe@spammer.spammy
                             ((s-contains-p &quot;@&quot; entry)
                              (format &quot;(%s)&quot; entry))
                             ;; Blacklist top-level domain: .spammy
                             ((s-starts-with-p &quot;\\.&quot; entry)
                              (format &quot;([^.]*%s)&quot; entry))
                             ;; Blacklist domain: @spammer.spammy
                             (t
                              (format &quot;(.*@%s)&quot; entry))))
                          (-sort
                           'string&lt;
                           (-map (lambda (row)
                                   (nth 0 row))
                                 rows))))
          &quot;$&quot;)

#+end_src

#+RESULTS:
: ^([^.]*\.spammy)|(dodgyfella@hotmail\.com)|(.*@henryzeespammer\.com)|(.*@yumspam\.com)$
</code></pre>
<p>UPDATE: Tweaked elisp and regex (but not animation) also found John Bokma's post: <a href="http://johnbokma.com/blog/2019/05/13/blacklisting-domains-with-postfix.html">Blacklisting domains with Postfix</a>.</p>
<p><img src="https://xenodium.github.io/images/spam-blacklisting-with-emacs-org-babel/blacklist.png" alt=""></p>
]]></description>
    <pubDate>Tue, 08 Oct 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Rewriting dates with Emacs multiple cursors</title>
<link>https://xenodium.com/rewriting-dates-with-emacs-multiple-cursors</link>
<guid isPermaLink="false">https://xenodium.com/rewriting-dates-with-emacs-multiple-cursors</guid>
    <description><![CDATA[<p>Needed to rewrite the date format in a couple of csv columns. Emacs multiple cursors helps here, but needed a function to parse and reformat the dates themselves.</p>
<p>I can likely reformat dates using the built-in <em>parse-time-string</em> and <em>format-time-string</em> functions, but hey why not give the <a href="https://github.com/alphapapa/ts.el">ts.el</a> library a try…</p>
<pre><code class="language-{.commonlisp">(defun ar/region-to-timestamp ()
  &quot;Convert date like \&quot;29 Apr 2019\&quot; to \&quot;2019-04-29\&quot;.&quot;
  (interactive)
  (let ((date (ts-parse (buffer-substring
                         (region-beginning)
                         (region-end)))))
    (delete-region (region-beginning)
                   (region-end))
    (insert (ts-format &quot;%Y-%m-%d&quot; date))))
</code></pre>
<p>Bound the new function to a temporary keybinding, so I can invoke from multiple cursors:</p>
<pre><code class="language-{.commonlisp">(bind-key &quot;M-q&quot; #'ar/region-to-timestamp)
</code></pre>
<p>and voilà!</p>
<p><img src="https://xenodium.github.io/images/rewriting-dates-with-emacs-multiple-cursors/ts.gif" alt=""></p>
]]></description>
    <pubDate>Sun, 06 Oct 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Show/hide Emacs dired details in style</title>
<link>https://xenodium.com/showhide-emacs-dired-details-in-style</link>
<guid isPermaLink="false">https://xenodium.com/showhide-emacs-dired-details-in-style</guid>
    <description><![CDATA[<p>Emacs <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html">dired</a> is a powerful directory browser/editor. By default, it shows lots of handy file and directory details.</p>
<p><img src="https://xenodium.github.io/images/showhide-emacs-dired-details-in-style/dired.png" alt=""></p>
<p>I typically prefer hiding file and directory details until I need them. The built-in <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Misc-Dired-Features.html">dired-hide-details-mode</a> makes this easy with the &quot;(&quot; key toggle. Coupled with <a href="https://twitter.com/sanityinc">Steve Purcell</a>'s <a href="https://github.com/purcell/diredfl">diredfl</a> (for coloring), it strikes a great user experience.</p>
<p><img src="https://xenodium.github.io/images/showhide-emacs-dired-details-in-style/diredfl.gif" alt=""></p>
<p>With a short snippet, you can also show/hide dired details in style:</p>
<pre><code class="language-{.commonlisp">(use-package dired
  :hook (dired-mode . dired-hide-details-mode)
  :config
  ;; Colourful columns.
  (use-package diredfl
    :ensure t
    :config
    (diredfl-global-mode 1)))
</code></pre>
<p><strong>UPDATE:</strong> Thanks to <a href="https://twitter.com/dmartincy">Daniel Martín</a>, who <a href="https://twitter.com/dmartincy/status/1180512330288975872">pointed me</a> to <a href="https://github.com/clemera/dired-git-info">dired-git-info</a>. This package adds git logs to dired file and directory details.</p>
<p><img src="https://xenodium.github.io/images/showhide-emacs-dired-details-in-style/dired-git-info.gif" alt=""></p>
<p>Binding <em>dired-git-info-mode</em> to &quot;)&quot; is a nice complement to <em>dired-hide-details-mode</em>'s &quot;(&quot; binding.</p>
<pre><code class="language-{.commonlisp">(use-package dired-git-info
    :ensure t
    :bind (:map dired-mode-map
                (&quot;)&quot; . dired-git-info-mode)))
</code></pre>
]]></description>
    <pubDate>Sat, 05 Oct 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bulk buying bookmarks</title>
<link>https://xenodium.com/bulk-buying-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bulk-buying-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.realfoods.co.uk">Real foods</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 29 Sep 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Speeding up Emacs tramp via ControlMaster</title>
<link>https://xenodium.com/speeding-up-emacs-tramp-via-controlmaster</link>
<guid isPermaLink="false">https://xenodium.com/speeding-up-emacs-tramp-via-controlmaster</guid>
    <description><![CDATA[<p>Via <a href="https://gist.github.com/ralt/a36288cd748ce185b26237e6b85b27bb">Florian Margaine's Eshell config</a>, I discovered ssh's <a href="https://man.openbsd.org/ssh_config#ControlMaster">ControlMaster</a>. It enables sharing multiple sessions over a single network connection. This has the benefit of speeding up Emacs TRAMP.</p>
<p>In your ~/.ssh/config add:</p>
<pre><code class="language-fundamental">Host *
    ControlPath ~/.ssh/master-%h:%p
    ControlMaster auto
    ControlPersist 10m
</code></pre>
]]></description>
    <pubDate>Sun, 01 Sep 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>csv bookmarks</title>
<link>https://xenodium.com/csv-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/csv-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://til.secretgeek.net/banking/convert_ofx_to_csv.html">convert ofx to csv . Today I Learned (secretGeek)</a>.</li>
<li><a href="https://www.johndcook.com/blog/2019/12/30/excel-to-csv/">Exporting Excel files to CSV with in2csv from csvkit</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=20848581">TSV Utilities: Command line tools for large, tabular data files (Hacker News)</a>.</li>
<li><a href="https://haveagooddata.net/posts/why-you-dont-want-to-use-csv-files/">Why You Don't Want to Use CSV Files (Have a good data)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 01 Sep 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Slovakia travel bookmarks</title>
<link>https://xenodium.com/slovakia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/slovakia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/High_Tatras">High Tatras mountains (wonderful hikes)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 10 Aug 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Thumbnailing pdf page</title>
<link>https://xenodium.com/thumbnailing-pdf-page</link>
<guid isPermaLink="false">https://xenodium.com/thumbnailing-pdf-page</guid>
    <description><![CDATA[<p>If you ever need to thumbnail a pdf page, imagemagick has got you covered. For example, to thumbnail page 3, you can use:</p>
<pre><code class="language-{.bash">convert path/to/input.pdf[2] path/to/output.png
</code></pre>
<pre><code class="language-example">convert -resize 10000x10000 path/to/input.pdf[2] path/to/output.png
convert: FailedToExecuteCommand `'gs' -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 '-sDEVICE=pngalpha' -dTextAlphaBits=4 -dGraphicsAlphaBits=4 '-r72x72' -dFirstPage=3 -dLastPage=3 '-sOutputFile=/var/folders/2y/nj_s07ms7l5gfsffh89_79zm0000gn/T/magick-30950xzlPsgqGUwtA%d' '-f/var/folders/2y/nj_s07ms7l5gfsffh89_79zm0000gn/T/magick-30950jpGyui82uGOQ' '-f/var/folders/2y/nj_s07ms7l5gfsffh89_79zm0000gn/T/magick-30950cuDVTNjArshs'' (1) @ error/pdf.c/InvokePDFDelegate/292.
</code></pre>
<p>However, I had the error above (missing gs), resolved by installing ghostscript.</p>
<pre><code class="language-{.bash">brew install ghostscript
</code></pre>
]]></description>
    <pubDate>Sun, 14 Jul 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Outdoor bookmarks</title>
<link>https://xenodium.com/outdoor-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/outdoor-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://lnt.org/why/7-principles/">The Seven Principles of Leave No Trace</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 12 Jul 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>gnuplot bookmarks</title>
<link>https://xenodium.com/gnuplot-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/gnuplot-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://raymii.org/s/tutorials/GNUplot_tips_for_nice_looking_charts_from_a_CSV_file.html">GNUplot tips for nice looking charts from a CSV file</a>.</li>
<li><a href="https://lwn.net/SubscriberLink/828761/6d8c7ddc142a67a0/">Voxel plotting with gnuplot 5.4 {LWN.net}</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 07 Jul 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>gnu global, ctags, and Emacs setup</title>
<link>https://xenodium.com/gnu-global-ctags-and-emacs-setup</link>
<guid isPermaLink="false">https://xenodium.com/gnu-global-ctags-and-emacs-setup</guid>
    <description><![CDATA[<h2>Universal ctags (newer)</h2>
<p>I'm now using universal <a href="https://ctags.io/">ctags</a>, as recommended by <a href="https://github.com/redguardtoo/counsel-etags">counsel-etags</a>.</p>
<p>From universal ctag's <a href="https://docs.ctags.io/en/latest/osx.html">Building on Mac OS</a>:</p>
<pre><code class="language-{.bash">brew tap universal-ctags/universal-ctags
brew install --HEAD universal-ctags
</code></pre>
<p>.ctags</p>
<pre><code class="language-fundamental">--langdef=swift
--langmap=swift:+.swift

--kinddef-swift=v,variable,variables
--kinddef-swift=f,function,functions
--kinddef-swift=s,struct,structs
--kinddef-swift=c,class,classes
--kinddef-swift=p,protocol,protocols
--kinddef-swift=e,enum,enums
--kinddef-swift=t,typealias,typealiases

--regex-swift=/(var|let)[ \t]+([^:=]+).*$/\2/v/
--regex-swift=/func[ \t]+([^\(\)]+)\([^\(\)]*\)/\1/f/
--regex-swift=/struct[ \t]+([^:\{]+).*$/\1/s/
--regex-swift=/class[ \t]+([^:\{]+).*$/\1/c/
--regex-swift=/protocol[ \t]+([^:\{]+).*$/\1/p/
--regex-swift=/enum[ \t]+([^:\{]+).*$/\1/e/
--regex-swift=/(typealias)[ \t]+([^:=]+).*$/\2/v/
</code></pre>
<h2>Exuberant ctags (older/buggy?)</h2>
<p>Install gnu global (ensure homebrew uses –with-exuberant-ctags flag).</p>
<pre><code class="language-{.bash">brew install global
brew install ctags
pip install pygments
</code></pre>
<p>.ctags</p>
<pre><code class="language-fundamental">--langdef=swift
--langmap=swift:.swift
--regex-swift=/[[:&lt;:]]class[[:&gt;:]][[:space:]]+([[:alnum:]_]+)/\1/c,class/
--regex-swift=/[[:&lt;:]]enum[[:&gt;:]][[:space:]]+([[:alnum:]_]+)/\1/e,enum/
--regex-swift=/[[:&lt;:]]func[[:&gt;:]][[:space:]]+([[:alnum:]_]+)/\1/f,function/
--regex-swift=/[[:&lt;:]]protocol[[:&gt;:]][[:space:]]+([[:alnum:]_]+)/\1/P,protocol/
--regex-swift=/[[:&lt;:]]struct[[:&gt;:]][[:space:]]+([[:alnum:]_]+)/\1/s,struct/
--regex-swift=/[[:&lt;:]]typealias[[:&gt;:]][[:space:]]+([[:alnum:]_]+)/\1/t,typealias/
</code></pre>
<p>.globalrc</p>
<pre><code class="language-fundamental">default:\
    :tc=pygments:

ctags:\
    :tc=exuberant-ctags:

exuberant-ctags|plugin-example|setting to use Exuberant Ctags plug-in parser:\
    :tc=common:\
    :ctagscom=ctags:\
    :ctagslib=$libdir/gtags/exuberant-ctags.la:\
    :langmap=Swift\:.swift:\
    :gtags_parser=Swift\:$ctagslib:

pygments:\
    :tc=pygments-parser:

pygments-parser|Pygments plug-in parser:\
    :langmap=Swift\:.swift:\
    :gtags_parser=Swift\:$pygmentslib:\
    :langmap=Common-Lisp\:.cl.lisp.el:\
    :gtags_parser=Common-Lisp\:$pygmentslib:\
    :langmap=Python\:.py.pyw.sc.tac.sage:\
    :gtags_parser=Python\:$pygmentslib:\
    :langmap=Ruby\:.rb.rbw.rake.gemspec.rbx.duby:\
    :gtags_parser=Ruby\:$pygmentslib:\
    :langmap=Objective-C++\:.mm.hh:\
    :gtags_parser=Objective-C++\:$pygmentslib:\
    :langmap=Objective-C\:.m.h:\
    :gtags_parser=Objective-C\:$pygmentslib:\
    :ctagscom=ctags:\
    :pygmentslib=$libdir/gtags/pygments-parser.la:\
    :tc=common:

common:\
    :skip=build/,HTML/,HTML.pub/,tags,TAGS,ID,y.tab.c,y.tab.h,gtags.files,cscope.files,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,*.orig,*.rej,*.bak,*~,#*#,*.swp,*.tmp,*_flymake.*,*_flymake,*.o,*.a,*.so,*.lo,*.zip,*.gz,*.bz2,*.xz,*.lzh,*.Z,*.tgz,*.min.js,*min.css:
</code></pre>
<pre><code class="language-{.commonlisp">(use-package counsel-gtags
  :ensure t
  :commands counsel-gtags-mode
  :bind (:map
         counsel-gtags-mode-map
         (&quot;M-.&quot; . counsel-gtags-dwim)
         (&quot;M-,&quot; . counsel-gtags-go-backward))
  :hook ((swift-mode . counsel-gtags-mode)
         (swift-mode . ggtags-mode)))

;; Needs .ctags and .globalrc in $HOME.
(use-package ggtags
  :ensure t
  :commands ggtags-mode)
</code></pre>
<p>Helpful references</p>
<p><a href="https://github.com/osdakira/dotfiles/blob/395640726d669674496a8035458840f0742e54a5/gtags.conf">https://github.com/osdakira/dotfiles/blob/395640726d669674496a8035458840f0742e54a5/gtags.conf</a> <a href="https://github.com/NicholasTD07/dotfiles/blob/e66eb05b408fbcb0d47994fc8a0a79bf438b9e03/.globalrc">https://github.com/NicholasTD07/dotfiles/blob/e66eb05b408fbcb0d47994fc8a0a79bf438b9e03/.globalrc</a> <a href="https://github.com/NicholasTD07/dotfiles/blob/master/.ctags">https://github.com/NicholasTD07/dotfiles/blob/master/.ctags</a> <a href="https://github.com/sg2002/gtags.conf-tutorial/blob/master/gtags.conf">https://github.com/sg2002/gtags.conf-tutorial/blob/master/gtags.conf</a> <a href="https://aozsky.com/swift/swift_ide">https://aozsky.com/swift/swift_ide</a></p>
]]></description>
    <pubDate>Tue, 04 Jun 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>mu4e as macOS mail composer</title>
<link>https://xenodium.com/mu4e-as-macos-mail-composer</link>
<guid isPermaLink="false">https://xenodium.com/mu4e-as-macos-mail-composer</guid>
    <description><![CDATA[<p>Via <a href="https://www.reddit.com/r/emacs/comments/6lh2pp/using_emacs_as_default_mailer_on_macos">Using Emacs as Default Mailer on macOS</a>, a tiny script to handle mailto: links.</p>
<p>From //Script Editor/, save following script as Application (MailOnEmacs.app). From Mail.app, <em>Preferences -&gt; Default email reader</em> and chosse MailOnEmacs.app.</p>
<pre><code>on open location myurl
        tell application &quot;Emacs&quot; to activate
        set text item delimiters to {&quot;:&quot;}
        do shell script &quot;/path/to/emacsclient --eval '(browse-url-mail \&quot;&quot; &amp; myurl &amp; &quot;\&quot;)'&quot;
end open location
</code></pre>
]]></description>
    <pubDate>Wed, 29 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>New sudo user snippet</title>
<link>https://xenodium.com/new-sudo-user-snippet</link>
<guid isPermaLink="false">https://xenodium.com/new-sudo-user-snippet</guid>
    <description><![CDATA[<p>I don't add linux sudoers frequently enough. Always looking it up. Keeping snippet.</p>
<pre><code class="language-{.bash">adduser -m -d /home/&lt;username&gt; &lt;username&gt;
passwd &lt;username&gt;
usermod -aG sudo &lt;username&gt;
</code></pre>
]]></description>
    <pubDate>Sun, 26 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plotting ledger reports in org</title>
<link>https://xenodium.com/plotting-ledger-reports-in-org</link>
<guid isPermaLink="false">https://xenodium.com/plotting-ledger-reports-in-org</guid>
    <description><![CDATA[<h2>My ledger file</h2>
<p>Save path to <a href="plotting-ledger-reports-in-org/my.ledger">my.ledger</a> in <em>ledger-file</em> block.</p>
<pre><code class="language-org">#+name: ledger-file
#+begin_src emacs-lisp
&quot;my.ledger&quot;
#+end_src
</code></pre>
<h2>gnuplot terminal (png or qt)</h2>
<p>Select gnuplot terminal. Using png to output images, but qt is handy too for interactive chart inspection.</p>
<pre><code class="language-org">Use png for inline or qt for interactive
#+name: gnuplot-term
#+begin_src emacs-lisp
&quot;png&quot;
#+end_src
</code></pre>
<h2>Monthly Income and Expenses</h2>
<p>Generate income report.</p>
<pre><code class="language-org">#+name: income-data
#+begin_src bash :results table :noweb yes
  ledger -f &lt;&lt;&lt;ledger-file&gt;&gt;&gt; -j reg ^Income -M --collapse --plot-amount-format=&quot;%(format_date(date, \&quot;%Y-%m-%d\&quot;)) %(abs(quantity(scrub(display_amount))))\n&quot;
#+end_src
</code></pre>
<p>Generate expenses report.</p>
<pre><code class="language-org">#+name: expenses-data
#+begin_src sh :results table :noweb yes
  ledger -f &lt;&lt;&lt;ledger-file&gt;&gt;&gt; -j reg ^Expenses -M --collapse
#+end_src
</code></pre>
<p>Plot income vs expenses.</p>
<pre><code class="language-{.gnuplot">set terminal myterm size 3500,1500
set style data histogram
set style histogram clustered gap 1
set style fill transparent solid 0.4 noborder
set xtics nomirror scale 0 center
set ytics add ('' 0) scale 0
set border 1
set grid ytics
set title &quot;Monthly Income and Expenses&quot;
set ylabel &quot;Amount&quot;
plot income using 2:xticlabels(strftime('%b', strptime('%Y-%m-%d', strcol(1)))) title &quot;Income&quot; linecolor rgb &quot;light-salmon&quot;, '' using 0:2:2 with labels left font &quot;Courier,8&quot; rotate by 15 offset -4,0.5 textcolor linestyle 0 notitle, expenses using 2 title &quot;Expenses&quot; linecolor rgb &quot;light-green&quot;, '' using 0:2:2 with labels left font &quot;Courier,8&quot; rotate by 15 offset 0,0.5 textcolor linestyle 0 notitle
</code></pre>
]]></description>
    <pubDate>Fri, 24 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Changing MAC address in org</title>
<link>https://xenodium.com/changing-mac-address-from-org-mode</link>
<guid isPermaLink="false">https://xenodium.com/changing-mac-address-from-org-mode</guid>
    <description><![CDATA[<p>Via Minko Gechev's <a href="https://twitter.com/mgechev/status/1130441471105093632?s=12">tweet</a>. Saving in an org block, just because…</p>
<pre><code class="language-{.bash">changeMAC() {
    local mac=$(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//')
    ifconfig en0 ether $mac
    ifconfig en0 down
    ifconfig en0 up
    echo &quot;Your new physical address is $mac&quot;
}

changeMAC
</code></pre>
<pre><code class="language-{=org}">#+RESULTS:
</code></pre>
<pre><code class="language-example">Your new physical address is b4:b2:f8:77:bb:87
</code></pre>
<p>ps. Also see <a href="http://xenodium.com/execute-org-blocks-as-root/">Execute org blocks as root</a>.</p>
]]></description>
    <pubDate>Tue, 21 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Charting bookmarks</title>
<link>https://xenodium.com/charting-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/charting-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/kroitor/asciichart">asciichart: Nice-looking lightweight console ASCII line charts ╭┈╯ for NodeJS and browsers with no dependencies</a>.</li>
<li><a href="https://github.com/guptarohit/asciigraph">asciigraph: Go package to make lightweight ASCII line graph</a>.</li>
<li><a href="https://github.com/mkaz/termgraph">Termgraph: a python command-line tool which draws basic graphs in the terminal</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 17 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Building swift-format</title>
<link>https://xenodium.com/building-swift-format</link>
<guid isPermaLink="false">https://xenodium.com/building-swift-format</guid>
    <description><![CDATA[<p>Trying out <a href="https://github.com/google/swift">Google's swift-format</a>. Build with:</p>
<pre><code class="language-{.bash">git clone -b swift-5.2-branch https://github.com/apple/swift-format.git
cd swift-format
swift build
</code></pre>
<pre><code class="language-{.bash">.build/x86_64-apple-macosx/debug/swift-format --help
</code></pre>
<pre><code class="language-example">OVERVIEW: Format or lint Swift source code.

USAGE: swift-format [options] &lt;filename or path&gt; ...

OPTIONS:
  --configuration         The path to a JSON file containing the configuration of the linter/formatter.
  --in-place, -i          Overwrite the current file when formatting ('format' mode only).
  --mode, -m              The mode to run swift-format in. Either 'format', 'lint', or 'dump-configuration'.
  --recursive, -r         Recursively run on '.swift' files in any provided directories.
  --version, -v           Prints the version and exists
  --help                  Display available options

POSITIONAL ARGUMENTS:
  filenames or paths      One or more input filenames
</code></pre>
<p>UPDATE: Now uses swift-5.2-branch (for Xcode 11.4), according to <a href="https://github.com/apple/swift-format#matching-swift-format-to-your-swift-version">Matching swift-format to Your Swift Version</a>.</p>
]]></description>
    <pubDate>Sat, 11 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ledger query snippets</title>
<link>https://xenodium.com/ledger-query-snippets</link>
<guid isPermaLink="false">https://xenodium.com/ledger-query-snippets</guid>
    <description><![CDATA[<h2>Expenses paid in cash between two dates</h2>
<pre><code class="language-{.bash">ledger -f my.ledger reg &quot;^Expenses&quot; and expr 'any(account=~/Assets:Cash:Wallet/)' -b 02/19 -e 04/09
</code></pre>
<h2>Bank account income between two dates</h2>
<pre><code class="language-{.bash">ledger -f my.ledger reg &quot;^Assets:Bank:Acme&quot; and expr &quot;amount &gt; 0&quot; -b 02/19 -e 04/09
</code></pre>
<h2>Formatting reg output</h2>
<pre><code class="language-{.bash">ledger -f my.ledger reg &quot;^Assets:Bank:Acme&quot; --format=&quot;%(payee) %(amount)\n&quot;
</code></pre>
]]></description>
    <pubDate>Mon, 06 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Batch file renaming with counsel, find-dired, and wdired</title>
<link>https://xenodium.com/batch-renaming-with-counsel-find-dired-and-wdired</link>
<guid isPermaLink="false">https://xenodium.com/batch-renaming-with-counsel-find-dired-and-wdired</guid>
    <description><![CDATA[<p>The first time I saw <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Wdired.html">wdired</a> in action, it blew my mind. wdired makes <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html#Dired">dired</a> (directory editor) buffers writeable, so you can edit them like any other Emacs buffer. You can subsequently use all your favorite file-editing tricks to rename files (amongst other things). You can see it in action at the end of <a href="http://emacsrocks.com/e16.html">Emacs Rocks episode 16</a>.</p>
<p>When combining <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired-and-Find.html">find-dired</a> with wdired, one can easily find matching files and quickly batch rename them using something like <a href="https://github.com/magnars/multiple-cursors.el">multiple cursors</a> or <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html">keyboard macros</a>. I've been a fan of the <em>find-dired</em> -&gt; <em>dired-toggle-read-only</em> -&gt; <em>mc/mark-all-like-this</em> workflow for quite some time, but I always wished I could adjust <em>find-dired</em> queries a little quicker by getting immediate feedback.</p>
<p>Completion frontends like <a href="https://github.com/abo-abo/swiper">ivy</a> and <a href="https://github.com/emacs-helm/helm">helm</a> are perfect for getting this kind of immediate feedback. Peeking into ivy's <a href="https://github.com/abo-abo/swiper/blob/master/counsel.el">counsel source</a>, I borrowed some ideas to glue counsel-style narrowing on a find command, which I can easily translate to a writeable dired buffer for all that joyful-mutiple-cursor-editing experience.</p>
<p><img src="https://xenodium.github.io/images/batch-renaming-with-counsel-find-dired-and-wdired/counsel-find.gif" alt=""></p>
<p>The code for <em>ar/counsel-find</em> is a little rough but can be found at <a href="https://github.com/xenodium/dotsies/blob/master/emacs/ar/ar-counsel-find.el">here</a>.</p>
]]></description>
    <pubDate>Sat, 04 May 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>VPS bookmarks</title>
<link>https://xenodium.com/vps-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/vps-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.scaleway.com">Scaleway: Scalable Cloud Platform Designed for Developers</a>.</li>
<li><a href="https://www.vultr.com">Vultr</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 26 Apr 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Svelte bookmarks</title>
<link>https://xenodium.com/svelte-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/svelte-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://svelte.dev/blog/svelte-3-rethinking-reactivity">Svelte 3: Rethinking reactivity</a>.</li>
<li><a href="https://svelte.dev/blog/write-less-code">Write less code (metric you're not paying attention to)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 22 Apr 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mark region, indent, restore location</title>
<link>https://xenodium.com/mark-region-indent-restore-location</link>
<guid isPermaLink="false">https://xenodium.com/mark-region-indent-restore-location</guid>
    <description><![CDATA[<p>When I'm not using an automatic code formatter (ie. clang-format, gofmt, etc.), I often find myself using Emacs region marking commands like <em>mark-defun</em>, <em>er/expand-region</em>, and <em>mark-whole-buffer</em> prior to pressing &lt;tab&gt;, which is bound to <em>indent-for-tab-command</em>.</p>
<p>This is all working as expected: the selection gets indented and the point is left in the current location.</p>
<p>Say we have the following snippet we'd like to indent.</p>
<p><img src="https://xenodium.github.io/images/mark-region-indent-restore-location/before.png" alt=""></p>
<p>Mark region with C-M-h (mark-defun)</p>
<p><img src="https://xenodium.github.io/images/mark-region-indent-restore-location/selection.png" alt=""></p>
<p>Indent with &lt;tab&gt; (indent-for-tab-command)</p>
<p><img src="https://xenodium.github.io/images/mark-region-indent-restore-location/basic-indent.png" alt=""></p>
<p>We're done. The selected function is now indented as expected.</p>
<p>But… I always wished the point returned to the location prior to initiating the region-marking command, in this case <em>mark-defun</em>.</p>
<p>In short, I wish the point had ended in the following location.</p>
<p><img src="https://xenodium.github.io/images/mark-region-indent-restore-location/smart-indent.png" alt=""></p>
<p>I'm not aware of an existing package that helps with this, so here's a tiny minor mode (divert-mode) to help with restoring point location after indenting a region. The <em>diverted-events</em> variable can be used to track specific region selecting commands and associate breadcrumb functions to replace the point location as needed.</p>
<pre><code class="language-{.commonlisp">;;; diverted.el --- Identify temporary diversions and automatically
;;; move point back to original location.

;;; Commentary:
;; Automatically come back to a original location prior to diversion.


;;; Code:

(require 'cl)
(require 'seq)

(defstruct diverted-event
  from ;; Initial function (eg. 'mark-defun)
  to ;; Follow-up function (eg. 'indent-for-tab-command)
  breadcrumb)

(defvar diverted-events
  (list
   (make-diverted-event :from 'mark-defun
                        :to 'indent-for-tab-command
                        :breadcrumb (lambda ()
                                      (diverted--pop-to-mark-command 2)))
   (make-diverted-event :from 'er/expand-region
                        :to 'indent-for-tab-command
                        :breadcrumb (lambda ()
                                      (diverted--pop-to-mark-command 2)))
   (make-diverted-event :from 'mark-whole-buffer
                        :to 'indent-for-tab-command
                        :breadcrumb (lambda ()
                                      (diverted--pop-to-mark-command 2))))
  &quot;Diversion events to look for.&quot;)

(defun diverted--resolve (symbol)
  &quot;Resolve SYMBOL to event.&quot;
  (seq-find (lambda (event)
              (equal symbol
                     (diverted-event-from event)))
            diverted-events))

(defun diverted--pop-to-mark-command (n)
  &quot;Invoke `pop-to-mark-command' N number of times.&quot;
  (dotimes (_ n)
    (pop-to-mark-command)))

(defun diverted--advice-fun (orig-fun &amp;rest r)
  &quot;Get back to location prior to diversion using advice around `diverted-events' (ORIG-FUN and R).&quot;
  (let ((recognized-event (diverted--resolve last-command)))
    (when recognized-event
      (funcall (diverted-event-breadcrumb recognized-event))
      (message &quot;Breadcrumbed prior to `%s'&quot;
               (diverted-event-from recognized-event)))))

(defun diverted-mode-enable ()
  &quot;Enable diverted-mode.&quot;
  (interactive)
  (diverted-mode-disable)
  (mapc (lambda (event)
          (advice-add (diverted-event-to event)
                      :after
                      'diverted--advice-fun)
          (message &quot;Looking for `%s' after `%s' diversions.&quot;
                   (diverted-event-to event)
                   (diverted-event-from event)))
        diverted-events)
  (message &quot;diverted-mode enabled&quot;))

(defun diverted-mode-disable ()
  &quot;Disable diverted-mode.&quot;
  (interactive)
  (mapc (lambda (event)
          (advice-remove (diverted-event-to event)
                         'diverted--advice-fun)
          (message &quot;Ignoring `%s' after `%s' diversions.&quot;
                   (diverted-event-to event)
                   (diverted-event-from event)))
        diverted-events)
  (message &quot;diverted-mode disabled&quot;))

(define-minor-mode diverted-mode
  &quot;Detect temporary diversions and restore point location.&quot;
  :init-value nil
  :lighter &quot; diverted&quot;
  :global t
  (if diverted-mode
      (diverted-mode-enable)
    (diverted-mode-disable)))

(provide 'diverted)

;;; diverted.el ends here
</code></pre>
<p>UPDATE(2019-04-20): Source <a href="https://github.com/xenodium/dotsies/blob/master/emacs/ar/diverted.el">on github</a>.</p>
]]></description>
    <pubDate>Tue, 16 Apr 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Wider web bookmarks</title>
<link>https://xenodium.com/wider-web-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/wider-web-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://attic.city/">Attic: Search Hundreds of Small and Local Stores and Boutiques</a>.</li>
<li><a href="https://awesomelists.top/">Awesome Search</a>.</li>
<li><a href="https://indieseek.xyz/links/">Indieseek.xyz Directory</a>.</li>
<li><a href="https://millionshort.com/">Million Short - What haven't you found?</a>.</li>
<li><a href="https://pinboard.in/search/">Pinboard: social bookmarking for introverts</a>.</li>
<li><a href="https://lite.qwant.com/">Qwant Lite</a>.</li>
<li><a href="https://www.startpage.com">Startpage (claims most private seatch engine)</a>.</li>
<li><a href="http://ubu.com/">UbuWeb</a>.</li>
<li><a href="https://wiby.me/">wiby.me - the search engine for classic websites</a>.</li>
<li><a href="https://www.wikiart.org/">WikiArt.org - Visual Art Encyclopedia</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 14 Apr 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Compound interest calculations</title>
<link>https://xenodium.com/compound-interest-calculations</link>
<guid isPermaLink="false">https://xenodium.com/compound-interest-calculations</guid>
    <description><![CDATA[<p>Saving <a href="https://twitter.com/tonytechwriter">Tony Bedford's</a> python snippets for <a href="https://coffeeandcode.neocities.org/financial-calculations-1.html">calculating compound interest</a>. Really just an excuse to fire up Emacs and play with org babel.</p>
<pre><code class="language-{.python">t = 20 # years
r = 0.07 # rate
pv = 200000.00 # present value
fv = pv * (1+r)**t # future value
print(&quot;Pension of %.2f at %d%% will be worth %.2f in %d years&quot; % (pv, 100 * r, fv, t))
</code></pre>
<pre><code class="language-{=org}">#+RESULTS:
</code></pre>
<pre><code class="language-example">Pension of 200000.00 at 7% will be worth 773936.89 in 20 years
</code></pre>
<pre><code class="language-{.python">t = 20 # years
r = 0.07 # rate
pv = 200000.00 # present value
n = 1
fv = pv * (1 + r/n)**(n*t) # future value
print (&quot;First formula calculates final value to: %.2f&quot; % fv)

fv = pv * (1 + r/n)**(n*1) # year 1 only
print(&quot;Year %d: %.2f&quot; % (1, fv))
for i in range (2, t+1):
    fv = fv * (1 + r/n)**(n*1) # Calculate one year at a time
    print(&quot;Year %d: %.2f&quot; % (i, fv))
</code></pre>
<pre><code class="language-example">First formula calculates final value to: 773936.89
Year 1: 214000.00
Year 2: 228980.00
Year 3: 245008.60
Year 4: 262159.20
Year 5: 280510.35
Year 6: 300146.07
Year 7: 321156.30
Year 8: 343637.24
Year 9: 367691.84
Year 10: 393430.27
Year 11: 420970.39
Year 12: 450438.32
Year 13: 481969.00
Year 14: 515706.83
Year 15: 551806.31
Year 16: 590432.75
Year 17: 631763.04
Year 18: 675986.46
Year 19: 723305.51
Year 20: 773936.89
</code></pre>
]]></description>
    <pubDate>Sun, 14 Apr 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Building mu/mu4e on macOS</title>
<link>https://xenodium.com/building-mumu4e-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/building-mumu4e-on-macos</guid>
    <description><![CDATA[<p>I've now built Emacs's <a href="http://www.djcbsoftware.nl/code/mu/">mu/mu4e</a> releases a handful of times on macOS. These are the steps, so I don't forget.</p>
<h2>1.4</h2>
<p>Updated steps for building <a href="http://www.djcbsoftware.nl/code/mu/">mu/mu4e</a> 1.4:</p>
<pre><code class="language-{.bash">brew install gmime
export CPPFLAGS=&quot;-I$(brew --prefix)/Cellar/gmime/3.2.3/include -I$(brew --prefix)/include&quot;
export LDFLAGS=-L$(brew --prefix)/Cellar/gmime/3.2.3/lib
export PKG_CONFIG_PATH=$(brew --prefix)/Cellar/gmime/3.2.3/lib/pkgconfig:$(brew --prefix)/opt/libffi/lib/pkgconfig
export EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
./configure --prefix=$(~/local)
make install
</code></pre>
<h2>1.2</h2>
<p>Recently built Emacs's <a href="http://www.djcbsoftware.nl/code/mu/">mu/mu4e</a> 1.2.0 from source on macOS. Steps:</p>
<pre><code class="language-{.bash">brew install gmime
export CPPFLAGS=-I$(brew --prefix)/Cellar/gmime/3.2.3/include
export LDFLAGS=-L$(brew --prefix)/Cellar/gmime/3.2.3/lib
export PKG_CONFIG_PATH=$(brew --prefix)/Cellar/gmime/3.2.3/lib/pkgconfig:$(brew --prefix)/opt/libffi/lib/pkgconfig
./configure --prefix=$(~/local) --disable-dependency-tracking
make install
</code></pre>
<p>UPDATE(2019-04-16): Another approach at Irreal's <a href="https://irreal.org/blog/?p=7976">Mu/mu4e 1.2 Available</a>.</p>
]]></description>
    <pubDate>Thu, 11 Apr 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Reading spreadsheets with python/pandas</title>
<link>https://xenodium.com/reading-spreadsheets-with-pythonpandas</link>
<guid isPermaLink="false">https://xenodium.com/reading-spreadsheets-with-pythonpandas</guid>
    <description><![CDATA[<p>Via <a href="https://twitter.com/python_tip/status/1111349676106833920">Daily python tip</a>, a snippet to read xls files in python. This will come in handy. Saving for future.</p>
<p>Get set up with:</p>
<pre><code class="language-{.bash">pip install pandas
pip install xlrd
</code></pre>
<p>Read with:</p>
<pre><code class="language-{.python">import pandas
xlf = pandas.ExcelFile(&quot;sheet.xlsx&quot;)
print xlf.sheet_names
</code></pre>
<pre><code class="language-example">[u'my sheet']
</code></pre>
]]></description>
    <pubDate>Sat, 30 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Inserting numbers with Emacs multiple cursors</title>
<link>https://xenodium.com/inserting-numbers-with-emacs-multiple-cursors</link>
<guid isPermaLink="false">https://xenodium.com/inserting-numbers-with-emacs-multiple-cursors</guid>
    <description><![CDATA[<p>TIL that multiple cursor's <em>mc/insert-numbers</em> enables you to quickly enter increasing numbers for each cursor. I have <em>mc/insert-numbers</em> bound to # in <em>region-bindings-mode-map.</em> By default, sequence starts at 0, but invoking <em>mc/insert-numbers</em> with prefix enables you to quickly change that.</p>
<p>Came in handy when numbering an org table:</p>
<p><img src="https://xenodium.github.io/images/inserting-numbers-with-emacs-multiple-cursors/mc-number.gif" alt=""></p>
]]></description>
    <pubDate>Sun, 17 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Brazil travel bookmarks</title>
<link>https://xenodium.com/brazil-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/brazil-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.uxua.com/">UXUA Casa Hotel and Spa in Trancoso, Brazil</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 17 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bath travel bookmarks</title>
<link>https://xenodium.com/bath-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bath-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.yelp.com/biz/beas-vintage-tea-rooms-bath">Beas Vintage Tea Rooms (Yelp)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 17 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Half marathon training</title>
<link>https://xenodium.com/half-marathon-training</link>
<guid isPermaLink="false">https://xenodium.com/half-marathon-training</guid>
    <description><![CDATA[<p>From <a href="https://assets.bupa.co.uk/~/media/images/healthmanagement/pdfs/half-marathon-beginner.pdf">https://assets.bupa.co.uk/~/media/images/healthmanagement/pdfs/half-marathon-beginner.pdf</a></p>
<p>Starting from week 4:</p>
<p>Week   Monday     Tuesday            Wednesday           Thursday   Friday                   Saturday   Sunday</p>
<hr>
<p>4      <strong>Rest</strong>   <strong>40 mins easy</strong>   <strong>30 mins tempo</strong>   <strong>Rest</strong>   <strong>40 mins cross</strong>        <strong>Rest</strong>   <strong>(03/24) 60 mins</strong>
6.7 km             5.1 Km                         -                                  -
41:51 m            30:00 m
61.3 Kg            60.8 Kg
5      <strong>Rest</strong>   <strong>40 mins easy</strong>   <strong>30 mins tempo</strong>   <strong>Rest</strong>   <strong>40 mins interval</strong>     <strong>Rest</strong>   <strong>(03/31) 11 Km</strong>
11.9 Km            -                             5.99 Km                             11.0 Km
80:00 m                                           40 m                                60:08 m
6      Rest       40 mins easy       30 mins tempo       Rest       40 mins interval/cross   Rest       (04/07) 13 Km
7      Rest       40 mins easy       30 mins tempo       Rest       40 mins interval         Rest       (04/14) 60 mins
8      Rest       40 mins easy       30 mins tempo       Rest       50 mins interval/cross   Rest       (04/21) 16 Km
9      Rest       40 mins easy       30 mins tempo       Rest       50 mins interval         Rest       (04/28) 8 Km
10     Rest       40 mins easy       30 mins tempo       Rest       40 mins interval/cross   Rest       (05/05) 19 Km
11     Rest       40 mins easy       30 mins tempo       Rest       40 mins interval         Rest       (05/12) 10 Km
12     Rest       40 mins easy       30 mins tempo       Rest       50 mins easy             Rest       (05/19) Race</p>
]]></description>
    <pubDate>Sun, 17 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>No Emacs frame refocus on macOS</title>
<link>https://xenodium.com/no-emacs-frame-refocus-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/no-emacs-frame-refocus-on-macos</guid>
    <description><![CDATA[<p>This one's been bugging me for a while. On macOS, Emacs automatically focuses (raises) other frames when one is closed.</p>
<p><img src="https://xenodium.github.io/images/no-emacs-frame-refocus-on-macos/before.gif" alt=""></p>
<p>This has the unfortunate side-effect that I could be moved from one macOS desktop/space to another when closing an Emacs frame.</p>
<p>Finally managed do something about it. Since I install Emacs on macOS via homebrew, a <s><a href="https://github.com/xenodium/homebrew-emacs-plus/commit/79a8e98b222fa262746f6db620ddd1fdb151ece9">small patch on emacs-plus recipe</a></s> <a href="https://github.com/d12frosted/homebrew-emacs-plus/pull/122/commits/71bf246930bfedb337bcc0e21587ccbbb917e5bf">small patch on emacs-plus recipe</a> did the job.</p>
<p><img src="https://xenodium.github.io/images/no-emacs-frame-refocus-on-macos/after.gif" alt=""></p>
<p>UPDATE: Pull request <a href="https://github.com/d12frosted/homebrew-emacs-plus/pull/122">merged</a> in d12frosted/emacs-plus.</p>
<p>The <s><a href="https://github.com/xenodium/homebrew-emacs-plus/commit/79a8e98b222fa262746f6db620ddd1fdb151ece9">patch</a></s> <a href="https://github.com/d12frosted/homebrew-emacs-plus/pull/122/commits/71bf246930bfedb337bcc0e21587ccbbb917e5bf">patch</a> has been merged into <a href="https://github.com/d12frosted/homebrew-emacs-plus">d12frosted/homebrew-emacs-plus</a>. To use:</p>
<pre><code class="language-{.bash">brew tap d12frosted/emacs-plus
brew install emacs-plus --without-spacemacs-icon --with-no-frame-refocus
</code></pre>
<p>Balance restored.</p>
]]></description>
    <pubDate>Sat, 16 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Checksums on linux/macOS</title>
<link>https://xenodium.com/checksums-on-linuxmacos</link>
<guid isPermaLink="false">https://xenodium.com/checksums-on-linuxmacos</guid>
    <description><![CDATA[<h2>MD5</h2>
<pre><code class="language-{.bash">md5 file
</code></pre>
<h2>SHA-1</h2>
<pre><code class="language-{.bash">shasum -a 1 file
</code></pre>
<h2>SHA-256</h2>
<pre><code class="language-{.bash">shasum -a 256 file
</code></pre>
]]></description>
    <pubDate>Sat, 16 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Language server protocol (LSP) bookmarks</title>
<link>https://xenodium.com/language-server-protocol-lsp-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/language-server-protocol-lsp-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/eclipse/eclipse.jdt.ls">Eclipse JDT Language Server</a>.</li>
<li><a href="https://github.com/emacs-lsp/lsp-java">Emacs Java IDE using Eclipse JDT Language Server</a>.</li>
<li><a href="https://github.com/vscode-langservers/vscode-html-languageserver-bin">vscode-html-languageserver extracted from VSCode</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 12 Mar 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Copy from desktop to mobile via QR code</title>
<link>https://xenodium.com/copy-from-desktop-to-mobile-via-qr-code</link>
<guid isPermaLink="false">https://xenodium.com/copy-from-desktop-to-mobile-via-qr-code</guid>
    <description><![CDATA[<p><a href="https://twitter.com/marcin_mbork">Marcin Borkowski</a> has a nice <a href="http://mbork.pl/2019-02-24_Transferring_strings_to_a_phone_via_QR_codes">tip</a> to quickly copy text or URLs between desktop and mobile using QR codes.</p>
<p>Wrote a little elisp to do a similar thing using the clipboard via Emacs:</p>
<pre><code class="language-{.commonlisp">(defun ar/misc-clipboard-to-qr ()
  &quot;Convert text in clipboard to qrcode and display within Emacs.&quot;
  (interactive)
  (let ((temp-file (concat (temporary-file-directory) &quot;qr-code&quot;)))
    (if (eq 0 (shell-command (format &quot;qrencode -s10 -o %s %s&quot;
                                     temp-file
                                     (shell-quote-argument (current-kill 0)))
                             &quot;*qrencode*&quot;))
        (switch-to-buffer (find-file-noselect temp-file t))
      (error &quot;Error: Could not create qrcode, check *qrencode* buffer&quot;))))
</code></pre>
<p><img src="https://xenodium.github.io/images/copy-from-desktop-to-mobile-via-qr-code/qrencode.gif" alt=""></p>
<p>ps. <a href="https://feeding.cloud.geek.nz/posts/encoding-wifi-access-point-passwords-qr-code/">Encoding your WiFi access point password into a QR code</a> shows how to encode WiFi access point passwords:</p>
<pre><code class="language-{.bash">qrencode -o wifi.png &quot;WIFI:T:WPA;S:&lt;SSID&gt;;P:&lt;PASSWORD&gt;;;&quot;
</code></pre>
<p>More comprehensively:</p>
<pre><code class="language-{.bash">SSID=SSID_GOES_HERE
pwgen -s 63 &gt; 00wifi.txt
qrencode -o 00wifi.png &quot;WIFI:T:WPA;S:${SSID};P:$(cat 00wifi.txt);;&quot;
</code></pre>
]]></description>
    <pubDate>Sun, 24 Feb 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Parsing dates in Go</title>
<link>https://xenodium.com/parsing-dates-in-go</link>
<guid isPermaLink="false">https://xenodium.com/parsing-dates-in-go</guid>
    <description><![CDATA[<p>Ensure the reference time (&quot;Mon Jan 2 15:04:05 -0700 MST 2006&quot;) is used in layout string.</p>
<p>For example:</p>
<pre><code class="language-{.go">package main

import (
        &quot;fmt&quot;
        &quot;time&quot;
)

func main() {
        goodLayout := &quot;January 2 2006&quot;
        if t, err := time.Parse(goodLayout, &quot;March 10 2019&quot;); err != nil {
                    fmt.Printf(&quot;%s\n&quot;, err)
        } else {
                    fmt.Printf(&quot;%v\n&quot;, t)
        }

        badLayout := &quot;January 2 2009&quot;
        if t, err := time.Parse(badLayout, &quot;March 10 2019&quot;); err != nil {
                    fmt.Printf(&quot;%s\n&quot;, err)
        } else {
                    fmt.Printf(&quot;%v\n&quot;, t)
        }
}
</code></pre>
<pre><code class="language-{=org}">#+RESULTS:
</code></pre>
<pre><code class="language-example">2019-03-10 00:00:00 +0000 UTC
parsing time &quot;March 10 2019&quot; as &quot;January 2 2009&quot;: cannot parse &quot;19&quot; as &quot;009&quot;
</code></pre>
]]></description>
    <pubDate>Tue, 19 Feb 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Life in the UK bookmarks</title>
<link>https://xenodium.com/life-in-the-uk-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/life-in-the-uk-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://textuploader.com/5yfk0">'LitUK': notes by a Redditor (TextUploader.com)</a>.</li>
<li><a href="https://lifeintheuktestweb.co.uk/">Life In The UK Test, Practice Tests 2017</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 13 Feb 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>C language bookmarks</title>
<link>https://xenodium.com/c-language-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/c-language-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://littlevgl.com/">LittlevGL - Open-source Embedded GUI Library</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 10 Feb 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Video editing bookmarks</title>
<link>https://xenodium.com/video-editing-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/video-editing-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://bernd.dev/2020/04/adding-subtitles/">Adding subtitles to your videos the easy way - Bernd Verst</a>.</li>
<li><a href="https://lars.ingebrigtsen.no/2019/02/14/adventures-in-netflix/">Adventures in Netflix (screenshotting HDMI)</a>.</li>
<li><a href="https://blog.gregzaal.com/2014/05/30/camera-stabilisation-with-ffmpeg/">Camera Stabilisation with FFmpeg - Adaptive Samples</a>.</li>
<li><a href="https://www.blackmagicdesign.com/products/davinciresolve/">DaVinci Resolve 17 | Blackmagic Design</a>.</li>
<li><a href="https://www.digikam.org/news/2020-07-19-7.0.0_release_announcement/">digiKam</a>.</li>
<li><a href="https://dragonquest64.blogspot.com/2019/11/non-rectangular-video-cropping.html">Dragon Quest 64: Non-Rectangular Video Cropping</a>.</li>
<li><a href="https://superuser.com/questions/1270950/ffmpeg-how-to-achieve-a-circular-video-overlay">FFmpeg - How to achieve a circular video overlay..?</a>.</li>
<li><a href="https://github.com/mifi/lossless-cut">GitHub - mifi/lossless-cut: The swiss army knife of lossless video/audio editing</a>.</li>
<li><a href="https://github.com/moxuse/kusabi">GitHub - moxuse/Kusabi: Coding environment 3D graphics with PureScript.</a>.</li>
<li><a href="https://github.com/whyboris/Video-Hub-App">GitHub - whyboris/Video-Hub-App: Official repository for Video Hub App 2</a>.</li>
<li><a href="https://www.youtube.com/watch?v=tYytVzbPky8">HOW TO DATAMOSH: PART 1 - YouTube</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22775502">How to trim video clips instantly without reencoding | Hacker News</a>.</li>
<li><a href="http://www.linux-magazine.com/Issues/2018/206/Tutorials-FFmpeg">Inserting a Watermark with FFmpeg (Linux Magazine)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=16192813">Learn FFmpeg the hard way (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21897293">Non-Rectangular Video Cropping with FFMpeg | Hacker News</a>.</li>
<li><a href="https://bernd.dev/2020/04/trim-videos-instantly/">Trim Videos Instantly - Bernd Verst</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 10 Feb 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Icons bookmarks</title>
<link>https://xenodium.com/icons-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/icons-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=21039739">Absurd Design – Free Surrealist Illustrations and Vector Art (Hacker News)</a>.</li>
<li><a href="http://compute.vision/nouns/index.html">Find Similar Icons (using Noun Project)</a>.</li>
<li><a href="https://thenounproject.com/">Noun Project - Icons for Everything</a>.</li>
<li><a href="https://t.co/ttqvpky3Te">shape.so icons</a>.</li>
<li><a href="https://streamlineicons.com/">Streamline 3.0 – The World's Largest Icon Library</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 10 Feb 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Salt beef recipe</title>
<link>https://xenodium.com/salt-beef-recipe</link>
<guid isPermaLink="false">https://xenodium.com/salt-beef-recipe</guid>
    <description><![CDATA[<p><a href="https://www.theguardian.com/lifeandstyle/gallery/2010/nov/03/how-to-make-salt-beef">How to make salt beef</a> (use 1.8kg brisket instead) and <a href="https://www.theguardian.com/lifeandstyle/gallery/2010/nov/03/how-to-brine-a-brisket">brining a brisket</a> (celery and peppercorns) both from The Guardian were recommended by a friend.</p>
]]></description>
    <pubDate>Sun, 27 Jan 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Geneva travel bookmarks</title>
<link>https://xenodium.com/geneva-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/geneva-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.timeout.com/switzerland/restaurants-and-cafes/la-buvette-des-bains">La Buvette des Bains, Restaurants in Pâquis</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 27 Jan 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Swapping Emacs ivy collections/sources</title>
<link>https://xenodium.com/swapping-emacs-ivy-collectionssources</link>
<guid isPermaLink="false">https://xenodium.com/swapping-emacs-ivy-collectionssources</guid>
    <description><![CDATA[<p><a href="https://github.com/abo-abo/swiper">Ivy</a> is great. I've been meaning to figure out a way to swap sources while running ivy. This would enable me to cycle through different sources using the existing search parameters.</p>
<p>At first look, <em>'ivy-set-sources</em> seemed like the right choice, but it's used during setup to agregate sources. Subsequent <em>'ivy-set-sources</em> calls are ignored during an <em>'ivy-read</em> session.</p>
<p>There's an ivy <a href="https://github.com/abo-abo/swiper/issues/606">feature request</a> over at github with a similar goal in mind. Although the feature is not yet supported, there's a handy suggestion to use <em>'ivy-quit-and-run</em> to quit the current command and run a different one.</p>
<p>With <em>'ivy-quit-and-run</em> in mind, we can write our <em>'ar/ivy-read</em> function to take a list of sources and add a little logic to cycle through them using a keybiding, in my case &lt;left&gt; and &lt;right&gt;.</p>
<pre><code class="language-{.commonlisp">;;; -*- lexical-binding: t; -*-

(require 'cl)

(cl-defstruct
    ar/ivy-source
  prompt
  collection
  action)

(cl-defun ar/ivy-read (sources &amp;key index initial-input)
  (let ((kmap (make-sparse-keymap))
        (source))
    (cl-assert (&gt; (length sources) 0))
    (when (null index) (setq index 0))
    (setq source (nth index sources))
    (define-key kmap (kbd &quot;&lt;right&gt;&quot;) (lambda ()
                                       (interactive)
                                       (ivy-quit-and-run (ar/ivy-read sources
                                                                      :index (if (&gt;= (1+ index)
                                                                                     (length sources))
                                                                                 0
                                                                               (1+ index))
                                                                      :initial-input ivy-text))))
    (define-key kmap (kbd &quot;&lt;left&gt;&quot;) (lambda ()
                                      (interactive)
                                      (ivy-quit-and-run (ar/ivy-read sources
                                                                     :index (if (&lt; (1- index)
                                                                                   0)
                                                                                (1- (length sources))
                                                                              (1- index))
                                                                     :initial-input ivy-text))))
    (ivy-read (ar/ivy-source-prompt source)
              (ar/ivy-source-collection source)
              :action (ar/ivy-source-action source)
              :initial-input initial-input
              :keymap kmap)))

(defun ar/ivy-food-menu ()
  (interactive)
  (ar/ivy-read (list
                (make-ar/ivy-source :prompt &quot;Pizza: &quot;
                                    :action (lambda (selection)
                                              (message &quot;Selected pizza: %s&quot; selection))
                                    :collection (lambda (str pred v)
                                                  (list &quot;Bianca Neve - Mozzarella, Ricotta, Sausage, Extra Virgin Olive Oil, Basil&quot;
                                                        &quot;Boscaiola - Mozzarella, Tomato Sauce, Sausage, Mushrooms, Extra Virgin Olive Oil, Basil&quot;
                                                        &quot;Calzone - Ricotta, Ham, Mushrooms, Artichokes. Topped with Tomato Sauce and Extra Virgin Olive Oil.&quot;
                                                        &quot;Capricciosa - Mozzarella,Tomato Sauce, Prosciutto Cotto Ham, Mushrooms, Artichokes, Extra Virgin Olive Oil.&quot;
                                                        &quot;Carciofi - Mozzarella, Tomato Sauce, Artichokes, Extra Virgin Olive Oil, Basil.&quot;
                                                        &quot;Diavola - Mozzarella, Tomato Sauce, Spicy Salami, Extra Virgin Olive Oil, Basil.&quot;
                                                        &quot;Funghi - Mozzarella, Tomato Sauce, Mushrooms, Extra Virgin Olive Oil, Basil.&quot;)))
                (make-ar/ivy-source :prompt &quot;Tacos: &quot;
                                    :action (lambda (selection)
                                              (message &quot;Selected taco: %s&quot; selection))
                                    :collection (lambda (str pred v)
                                                  (list &quot;Pork pibil - Slow cooked in citrus &amp; spices, with pink pickled onions.&quot;
                                                        &quot;Grilled chicken &amp; avocado - Ancho rub, guacamole &amp; green tomatillo salsa.&quot;
                                                        &quot;Plantain - Sweet &amp; spicy chipotle &amp; crumbled feta.&quot;
                                                        &quot;Poblano pepper - Caramelised onions, corn &amp; cashew nut mole.&quot;
                                                        &quot;Buttermilk chicken - Served crispy fried with habanero &amp; white onion relish &amp; spiced mayo.&quot;
                                                        &quot;Sustainable battered cod - mSC certified cod with shredded slaw, chipotle mayo &amp; pickled cucumber.&quot;
                                                        &quot;Chargrilled steak - Avocado &amp; chipotle salsas.&quot;)))
                (make-ar/ivy-source :prompt &quot;Burgers: &quot;
                                    :action (lambda (selection)
                                              (message &quot;Selected burger: %s&quot; selection))
                                    :collection (lambda (str pred v)
                                                  (list &quot;The cheese - Aged beef patty with american cheese, gherkins, ketchup &amp; mustard.&quot;
                                                        &quot;The yeah! - Aged beef patty with american cheese, gherkins, yeah! sauce &amp; salad.&quot;
                                                        &quot;The yfc or hot yfc - Crispy chicken with lime or chipotle crema, lettuce, pickled onion &amp; slaw.&quot;
                                                        &quot;The rancher - Grilled chicken with ranch dressing, bacon &amp; salad.&quot;
                                                        &quot;The bubbah - Aged beef patty with smokey aubergine, pickled red cabbage, lettuce, roast toms, onions &amp; cheddar.&quot;
                                                        &quot;The bulgogi - Sesame-spiced beef patty with miso mayo, pickled radish, onion, cucumber &amp; spring onion.&quot;
                                                        &quot;The summer - Aged beef patty with sriracha mayo, lettuce, onion, toms, avo, cheddar &amp; bacon.&quot;))))))
</code></pre>
<p><img src="https://xenodium.github.io/images/swapping-emacs-ivy-collectionssources/ivy-cycle-sources.gif" alt=""></p>
<p>ps. Menu data from <a href="https://starofkings.co.uk/food-and-drink/">Star of Kings</a>, <a href="https://www.wahaca.co.uk/menu/food/">Wahaca</a>, and <a href="https://pizzarino.us/menu">Pizzarino</a>.</p>
]]></description>
    <pubDate>Sun, 13 Jan 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Podcast bookmarks</title>
<link>https://xenodium.com/podcast-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/podcast-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://destinationlinux.org/">Destination Linux. A conversational podcast by people who love running Linux.</a>.</li>
<li><a href="https://emacscast.org/">EmacsCast</a>.</li>
<li><a href="http://faif.us/">Free as in Freedom</a>.</li>
<li><a href="http://gnuworldorder.info/">Gnu World Order</a>.</li>
<li><a href="https://latenightlinux.com/">Late Night Linux</a>.</li>
<li><a href="https://librelounge.org/">Libre Lounge</a>.</li>
<li><a href="https://linuxlads.com/">Linux Lads Podcast</a>.</li>
<li><a href="https://www.thebinarytimes.net/">The Binary Times Podcast (Linux/free software/hardware/culture)</a>.</li>
<li><a href="http://ubuntupodcast.org/">Ubuntu Podcast</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 12 Jan 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs on macOS Mojave</title>
<link>https://xenodium.com/emacs-on-macos-mojave</link>
<guid isPermaLink="false">https://xenodium.com/emacs-on-macos-mojave</guid>
    <description><![CDATA[<p>Had issues running Emacs on macOS Mojave (blank unresponsive screen). Bleeding edge emacs-plus did the job:</p>
<pre><code class="language-{.bash">brew tap d12frosted/emacs-plus
brew install emacs-plus --without-spacemacs-icon --HEAD
</code></pre>
<pre><code class="language-{.bash">brew info emacs-plus
</code></pre>
<pre><code class="language-example">d12frosted/emacs-plus/emacs-plus: stable 26.1, devel 26.1-rc1, HEAD
GNU Emacs text editor
https://www.gnu.org/software/emacs/
/Users/some-user/homebrew/Cellar/emacs-plus/HEAD-8fe21b0 (3,985 files, 123.0MB) *
  Built from source on 2019-01-12 at 09:26:09 with: --without-spacemacs-icon
From: https://github.com/d12frosted/homebrew-emacs-plus/blob/master/Formula/emacs-plus.rb
==&gt; Dependencies
Build: pkg-config
Recommended: little-cms2, gnutls, librsvg, imagemagick@6
Optional: dbus, mailutils
==&gt; Requirements
Optional: x11
==&gt; Options
--with-ctags
    Don't remove the ctags executable that Emacs provides
--with-dbus
    Build with dbus support
--with-emacs-icons-project-EmacsIcon1
    Using Emacs icon project EmacsIcon1
--with-emacs-icons-project-EmacsIcon2
    Using Emacs icon project EmacsIcon2
--with-emacs-icons-project-EmacsIcon3
    Using Emacs icon project EmacsIcon3
--with-emacs-icons-project-EmacsIcon4
    Using Emacs icon project EmacsIcon4
--with-emacs-icons-project-EmacsIcon5
    Using Emacs icon project EmacsIcon5
--with-emacs-icons-project-EmacsIcon6
    Using Emacs icon project EmacsIcon6
--with-emacs-icons-project-EmacsIcon7
    Using Emacs icon project EmacsIcon7
--with-emacs-icons-project-EmacsIcon8
    Using Emacs icon project EmacsIcon8
--with-emacs-icons-project-EmacsIcon9
    Using Emacs icon project EmacsIcon9
--with-emacs-icons-project-emacs-card-blue-deep
    Using Emacs icon project emacs-card-blue-deep
--with-emacs-icons-project-emacs-card-british-racing-green
    Using Emacs icon project emacs-card-british-racing-green
--with-emacs-icons-project-emacs-card-carmine
    Using Emacs icon project emacs-card-carmine
--with-emacs-icons-project-emacs-card-green
    Using Emacs icon project emacs-card-green
--with-mailutils
    Build with mailutils support
--with-modern-icon
    Using a modern style Emacs icon by @tpanum
--with-no-titlebar
    Experimental: build without titlebar
--with-pdumper
    Experimental: build from pdumper branch and with
         increasedremembered_data size (--HEAD only)
--with-x11
    Experimental: build with x11 support
--with-xwidgets
    Experimental: build with xwidgets support (--HEAD only)
--without-cocoa
    Build a non-Cocoa version of Emacs
--without-gnutls
    Build without gnutls support
--without-imagemagick@6
    Build without imagemagick@6 support
--without-librsvg
    Build without librsvg support
--without-libxml2
    Build without libxml2 support
--without-little-cms2
    Build without little-cms2 support
--without-modules
    Build without dynamic modules support
--without-multicolor-fonts
    Build without a patch that enables multicolor font support
--without-spacemacs-icon
    Build without Spacemacs icon by Nasser Alshammari
--devel
    Install development version 26.1-rc1
--HEAD
    Install HEAD version
==&gt; Caveats
Emacs.app was installed to:
  /Users/some-user/homebrew/Cellar/emacs-plus/26.1

To link the application to default Homebrew App location:
  brew linkapps
or:
  ln -s /Users/some-user/homebrew/Cellar/emacs-plus/26.1/Emacs.app /Applications

--natural-title-bar option was removed from this formula, in order to
  duplicate its effect add following line to your init.el file
  (add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
  (add-to-list 'default-frame-alist '(ns-appearance . dark))
or:
  (add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
  (add-to-list 'default-frame-alist '(ns-appearance . light))

If you are using macOS Mojave, please note that most of the experimental
options are forbidden on Mojave. This is temporary decision.


To have launchd start d12frosted/emacs-plus/emacs-plus now and restart at login:
  brew services start d12frosted/emacs-plus/emacs-plus
Or, if you don't want/need a background service you can just run:
  emacs
</code></pre>
]]></description>
    <pubDate>Sat, 12 Jan 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trying out Emacs pdf tools</title>
<link>https://xenodium.com/trying-out-emacs-pdf-tools</link>
<guid isPermaLink="false">https://xenodium.com/trying-out-emacs-pdf-tools</guid>
    <description><![CDATA[<p>Late to the party, giving <a href="https://github.com/politza/pdf-tools">pdf-tools</a> a try.</p>
<p>The <a href="https://github.com/politza/pdf-tools#compiling-on-os-x">macOS install instructions</a> have a prerequisite:</p>
<pre><code class="language-{.bash">brew install poppler automake
</code></pre>
<p>Installed with:</p>
<pre><code class="language-{.commonlisp">(use-package pdf-tools
  :ensure t
  :mode (&quot;\\.pdf\\'&quot; . pdf-view-mode)
  :config
  (pdf-tools-install)
  (setq-default pdf-view-display-size 'fit-page)
  (setq pdf-annot-activate-created-annotations t))
</code></pre>
<p><img src="https://xenodium.github.io/images/trying-out-emacs-pdf-tools/pdf-tools.png" alt=""></p>
<p>ps. (pdf-tools-install) may not find libffi on macOS. Try:</p>
<pre><code class="language-{.commonlisp">(setenv &quot;PKG_CONFIG_PATH&quot;
        (f-join
         (file-name-as-directory
          (nth 0
               (split-string
                (shell-command-to-string &quot;brew --prefix&quot;))))
         &quot;Cellar&quot; &quot;libffi&quot; &quot;3.2.1&quot; &quot;lib&quot; &quot;pkgconfig&quot;))
</code></pre>
]]></description>
    <pubDate>Sun, 06 Jan 2019 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>ASCII art generator bookmarks</title>
<link>https://xenodium.com/ascii-art-generator-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ascii-art-generator-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://antglove.com/erger/">𝓔𝓻𝓰𝓮𝓻𝓪𝓽𝓸𝓻/Ergerator (ascii generator)</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 27 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Osaka travel bookmarks</title>
<link>https://xenodium.com/osaka-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/osaka-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.tripadvisor.com/Attraction_Review-g298566-d1195795-Reviews-Tsutenkaku-Osaka_Osaka_Prefecture_Kinki.html">Tsutenkaku (Osaka) - 2018 All You Need to Know BEFORE You Go (with Photos) - TripAdvisor</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 26 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Using OCR to create searchable pdfs from images</title>
<link>https://xenodium.com/using-ocr-to-create-searchable-pdfs-from-images</link>
<guid isPermaLink="false">https://xenodium.com/using-ocr-to-create-searchable-pdfs-from-images</guid>
    <description><![CDATA[<p>Used my phone to take a handful of photos of an article from a magazine. Wanted to convert the images to a searchable pdf on macOS.</p>
<p>This was straightforward, having <a href="http://xenodium.com/trying-out-tesseract">already installed tesseract</a>.</p>
<pre><code class="language-{.bash">for i in IMG_3*.jpg; do echo $i; tesseract $i $(basename $i .tif) pdf; done
</code></pre>
<p>Should now have a handful of OCR'd pdfs:</p>
<pre><code class="language-{.bash">ls *.jpg.pdf
</code></pre>
<pre><code class="language-example">IMG_3104.jpg.pdf
IMG_3105.jpg.pdf
IMG_3106.jpg.pdf
IMG_3107.jpg.pdf
</code></pre>
<p>Finally, join all pdfs into one. Turns out macOS has a handy python script already installed. We can use it as:</p>
<pre><code class="language-{.bash">/usr/bin/python &quot;/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py&quot; -o joined.pdf IMG_*pdf
</code></pre>
<p>ps. <a href="https://pdfgrep.org">pdfgrep</a> is great for searching pdfs.</p>
<h2>Useful references</h2>
<ul>
<li><a href="https://ryanfb.github.io/etc/2014/11/13/command_line_ocr_on_mac_os_x.html">Ryan Baumann's: Command-Line OCR with Tesseract on Mac OS X</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 25 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Audiobook providers bookmarks</title>
<link>https://xenodium.com/audiobook-providers-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/audiobook-providers-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.openculture.com/freeaudiobooks">1,000 Free Audio Books: Download Great Books for Free | Open Culture</a>.</li>
<li><a href="http://bbcsfx.acropolis.org.uk/">BBC Sound Effects Archive Resource • Research &amp; Education Space</a>.</li>
<li><a href="https://libro.fm/">Libro.fm (Libro.fm, Your Independent Bookstore for Digital Audiobooks)</a>.</li>
<li><a href="https://www.thegreatcourses.co.uk/">Online Courses &amp; Lectures for Home Study and Lifelong Learning</a>.</li>
<li><a href="http://www.openculture.com/">The best free cultural and educational media on the web (Open Culture)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 25 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cookbook bookmarks</title>
<link>https://xenodium.com/cookbook-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cookbook-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.nancysingletonhachisu.com/the-attic-loft/">Japan: The Cookbook (Nancy Singleton Hachisu)</a>.</li>
<li><a href="https://www.nancysingletonhachisu.com/the-woodhouse/">Japanese Farm Food (Nancy Singleton Hachisu)</a>.</li>
<li><a href="https://www.nancysingletonhachisu.com/the-country-annex/">Preserving the Japanese Way (Nancy Singleton Hachisu)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 25 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emailing pdfs to kindle from mu4e</title>
<link>https://xenodium.com/emailing-pdfs-to-kindle-from-mu4e</link>
<guid isPermaLink="false">https://xenodium.com/emailing-pdfs-to-kindle-from-mu4e</guid>
    <description><![CDATA[<p>Wanted to send a pdf to my kindle for some holiday reading. You can easily do this by emailing the pdf to your kindle-bound email address.</p>
<p>Now, I typically attach files when composing mu4e emails by using <em>mml-attach-file</em>, which attaches the file using <em>&lt;#part&gt;…&lt;#/part&gt;</em>. However, the Amazon service did not find the attached pdf, so no pdf was added to my Kindle.</p>
<p>Fortunately, I found a handy <a href="https://www.reddit.com/r/emacs/comments/97abs7/anyone_uses_mu4e_to_send_mobi_files_to_kindle">Reddit thread, leding me to a working solution</a>. Wrapping the part using <em>&lt;#multipart type=mixed&gt;…&lt;#/multipart&gt;</em> did the job, using <em>mml-insert-multipart</em>, followed by <em>mml-attach-file</em>.</p>
<p>Resulting attachment should look something like:</p>
<pre><code class="language-example">&lt;#multipart type=mixed&gt;
&lt;#part type=&quot;application/pdf&quot; filename=&quot;/path/to/file.pdf&quot; disposition=attachment&gt;
&lt;#/part&gt;
&lt;#/multipart&gt;
</code></pre>
<p>I should add a convenience elisp function for this, but that's for another time…</p>
]]></description>
    <pubDate>Tue, 25 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>org tip: convert csv to table</title>
<link>https://xenodium.com/org-tip-convert-csv-to-table</link>
<guid isPermaLink="false">https://xenodium.com/org-tip-convert-csv-to-table</guid>
    <description><![CDATA[<p>Needed to import some csv data to an org table. Turns out org's got you covered out of the box with <em>M-x org-table-create-or-convert-from-region</em> bound to <em>C-c |</em>.</p>
<p><img src="https://xenodium.github.io/images/org-tip-convert-csv-to-table/csv-to-org-table.gif" alt=""></p>
]]></description>
    <pubDate>Fri, 21 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sponsoring platform bookmarks</title>
<link>https://xenodium.com/sponsoring-platform-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sponsoring-platform-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.patreon.com/">Best way for artists and creators to get sustainable income and connect with fans (Patreon)</a>.</li>
<li><a href="https://www.buymeacoffee.com/">Buy Me A Coffee — A free, fast and beautiful way for creators to monetise their content</a>.</li>
<li><a href="https://tallyco.in/">Tallycoin is a Bitcoin fundraising platform and a Patreon alternative.</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 20 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Artistic/creative bookmarks</title>
<link>https://xenodium.com/artisticcreative-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/artisticcreative-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.deviantart.com/boxtail/gallery/">BoxTail fractals (DeviantArt Gallery)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Fermat%27s_spiral">Fermat's spiral - Wikipedia</a>.</li>
<li><a href="https://lostartpress.com/">Lost Art Press (woodworking books)</a>.</li>
<li><a href="https://www.tomsachs.org">Tom Sachs (knolling exhibits)</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 20 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Marketing bookmarks</title>
<link>https://xenodium.com/marketing-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/marketing-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=23289185">Product Marketing for Engineers | Hacker News</a>.</li>
<li><a href="https://www.launchaco.com/">Startup Website Builder - Launchaco</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 20 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bluetooth low energy (BLE) bookmarks</title>
<link>https://xenodium.com/bluetooth-low-energy-ble-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bluetooth-low-energy-ble-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.frederikseiffert.de/blueutil/">blueutil » Command-Line Control of Bluetooth on the Mac</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18704182">The Practical Guide to Hacking Bluetooth Low Energy (Hacker News)</a>.</li>
<li><a href="https://blog.attify.com/the-practical-guide-to-hacking-bluetooth-low-energy/">The Practical Guide to Hacking Bluetooth Low Energy</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 19 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fun project bookmarks</title>
<link>https://xenodium.com/fun-project-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/fun-project-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.designboom.com/art/echo-yang-programs-everyday-obsolete-machines-to-create-autonomous-art-02-28-2014/?mc_cid=31214c131d&amp;mc_eid=add1859a90">echo yang programs everyday obsolete machines to create autonomous art (designboom)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 18 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Snowboarding bookmarks</title>
<link>https://xenodium.com/snowboarding-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/snowboarding-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=18680617">Snowboarding for Geeks (Hacker News)</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 14 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Scam bookmarks</title>
<link>https://xenodium.com/scam-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/scam-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.419eater.com/">419 Eater - The largest scambaiting community on the planet!</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18577734">The little black book of scams (2016) (Hacker News)</a>.</li>
<li><a href="https://www.accc.gov.au/publications/the-little-black-book-of-scams">The little black book of scams (ACCC)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 11 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Passive income bookmarks</title>
<link>https://xenodium.com/passive-income-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/passive-income-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.redbubble.com">Awesome products designed by independent artists (Redbubble)</a>.</li>
<li><a href="https://kit.com/pjrvs/gear-for-recording-videos-and-doing-interviews">Kit (Paul Jarvi's recording gear)</a>.</li>
<li><a href="https://www.reddit.com/r/AmazonMerch/">Merch By Amazon Discussion (Reddit)</a>.</li>
<li><a href="https://teespring.com/">Teespring</a>.</li>
<li><a href="https://thesavingninja.com/what-is-merch-by-amazon/">What is Merch By Amazon?</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 11 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>DWIM ivy quit</title>
<link>https://xenodium.com/dwim-ivy-quit</link>
<guid isPermaLink="false">https://xenodium.com/dwim-ivy-quit</guid>
    <description><![CDATA[<p>&quot;Do-what-I-mean&quot; (DWIM) functions enable us to introduce new Emacs powers to existing workflows without incurring the typical cost of remembering multiple related functions or introducing yet another key binding. DWIM functions invoke other functions, based on current context.</p>
<p>I wanted a small tweak in Ivy's <em>`minibuffer-keyboard-quit'</em> invocation, commonly invoked via <em>C-g</em> key binding:</p>
<ol>
<li>If we have text selected in minibuffer, deselect it.</li>
<li>If we have any text in minibuffer, clear it.</li>
<li>If no text in minibuffer, quit.</li>
</ol>
<p>Added <em>`ar/ivy-keyboard-quit-dwim'</em> for this purpose. Binding it to C-g in <em>ivy-minibuffer-map</em>:</p>
<pre><code class="language-{.commonlisp">(use-package ivy
  :ensure t
  :bind (:map ivy-minibuffer-map
              (&quot;C-g&quot; . ar/ivy-keyboard-quit-dwim))
  :config
  (defun ar/ivy-keyboard-quit-dwim ()
    &quot;If region active, deactivate. If there's content, clear the minibuffer. Otherwise quit.&quot;
    (interactive)
    (cond ((and delete-selection-mode (region-active-p))
           (setq deactivate-mark t))
          ((&gt; (length ivy-text) 0)
           (delete-minibuffer-contents))
          (t
           (minibuffer-keyboard-quit)))))
</code></pre>
<p><img src="https://xenodium.github.io/images/dwim-ivy-quit/ivy-keybqoard-quit-dwim.gif" alt=""></p>
]]></description>
    <pubDate>Sat, 08 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Diffing directories content size</title>
<link>https://xenodium.com/diffing-directories-content-size</link>
<guid isPermaLink="false">https://xenodium.com/diffing-directories-content-size</guid>
    <description><![CDATA[<p>Needed to diff two directories, but only interested in file size changes. diff, find, sort, and stat seem to do the job:</p>
<pre><code class="language-{.bash">diff &lt;(find dir1 -type f -exec stat -f '%N %z' '{}' \; | sort) &lt;(find dir2 -type f -exec stat -f '%N %z' '{}' \; | sort)
</code></pre>
<pre><code class="language-example">1,3c1,2
&lt; dir1/one.txt 14
&lt; dir1/subdir/file.txt 5
&lt; dir1/three.txt 7
---
&gt; dir2/one.txt 19
&gt; dir2/two.txt 0
</code></pre>
<p><em>Note: Using diff, find, sort, and stat on macOS.</em></p>
<h2>Update 1</h2>
<p>I've since learned about mtree (thanks <a href="https://twitter.com/romanzolotarev/status/1070249301815771137">Roman</a>!). A nice utility to add to the toolbox.</p>
<pre><code class="language-{.bash">mtree -p emacs-25.1 -c -k size -d
</code></pre>
<pre><code class="language-example">#    user: me
# machine: my-machine
#    tree: /path/to/emacs-25.1
#    date: Wed Dec  5 22:21:07 2018
# .
/set type=dir
.               size=1152
# ./admin
admin           size=960
# ./admin/charsets
charsets        size=544
# ./admin/charsets/glibc
glibc           size=3392
# ./admin/charsets/glibc
..
# ./admin/charsets/mapfiles
mapfiles        size=640
# ./admin/charsets/mapfiles
..
</code></pre>
<h2>Update 2</h2>
<p>I've added Emacs ediff to the mix:</p>
<pre><code class="language-{.commonlisp">(require 'f)

(defun ar/ediff-dir-content-size ()
    &quot;Diff all subdirectories (sizes only) in two directories.&quot;
    (interactive)
    (let* ((dir1-path (read-directory-name &quot;Dir 1: &quot;))
           (dir2-path (read-directory-name &quot;Dir 2: &quot;))
           (buf1 (get-buffer-create (format &quot;*Dir 1 (%s)*&quot; (f-base dir1-path))))
           (buf2 (get-buffer-create (format &quot;*Dir 2 (%s)*&quot; (f-base dir2-path)))))
      (with-current-buffer buf1
        (erase-buffer))
      (with-current-buffer buf2
        (erase-buffer))
      (shell-command (format &quot;cd %s; find . -type d | sort | du -h&quot; dir1-path) buf1)
      (shell-command (format &quot;cd %s; find . -type d | sort | du -h&quot; dir2-path) buf2)
      (ediff-buffers buf1 buf2)))
</code></pre>
<p><img src="https://xenodium.github.io/images/diffing-directories-content-size/ediff-dir-content-size.png" alt=""></p>
]]></description>
    <pubDate>Wed, 05 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Swift nil-coalescing operator</title>
<link>https://xenodium.com/swift-nil-coalescing-operator</link>
<guid isPermaLink="false">https://xenodium.com/swift-nil-coalescing-operator</guid>
    <description><![CDATA[<p><a href="https://twitter.com/twostraws">Paul Hudson</a>, over at <a href="https://www.hackingwithswift.com/">Hacking with Swift</a>, has written <a href="https://www.hackingwithswift.com/articles/136/the-complete-guide-to-optionals-in-swift">The Complete Guide to Optionals in Swift</a>. One of the many highlights is the <a href="https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html#ID72">nil-coalescing operator</a>. If you're a fan of the <a href="https://en.wikipedia.org/wiki/Ternary_operation">C-like syntax in ternary operations</a>, you'd enjoy chaining with Swift's nil-coalescing operator:</p>
<pre><code class="language-swift">let players = [ &quot;goose&quot;: &quot;run!&quot; ]
let move = players[&quot;duck1&quot;] ?? players[&quot;duck2&quot;] ?? players[&quot;duck3&quot;] ?? players[&quot;goose&quot;]
print(&quot;\(String(describing: move))&quot;)
</code></pre>
<p>ps. Swift snippet run on Emacs <a href="https://orgmode.org/worg/org-contrib/babel/intro.html">org babel's</a> <a href="https://github.com/zweifisch/ob-swift">ob-swift</a>. See <a href="#multiline-swift-strings">Multiline Swift strings</a> for details.</p>
]]></description>
    <pubDate>Sun, 02 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ocado vs Asda (org table)</title>
<link>https://xenodium.com/ocado-vs-asda-org-table</link>
<guid isPermaLink="false">https://xenodium.com/ocado-vs-asda-org-table</guid>
    <description><![CDATA[<p>Someone handed me an <a href="https://www.ocado.com">Ocado</a> shopping voucher for 30% off. Sounded promising, even for a one-off.</p>
<p>With my <a href="https://www.amazon.co.uk/Transforming-Relationship-Achieving-Financial-Independence/dp/0143115766/">Money or Your Life</a> hat on, I took a closer look for potential savings. Results were disappointing, when compared to alternatives like Asda.</p>
<p>Here's a table comparing Ocado (30% off) and Asda (no discount):</p>
<pre><code>                                                                                                                                                                     Ocado    Asda
</code></pre>
<hr>
<p><a href="https://www.ocado.com/webshop/product/Coconut-Merchant-Organic-Raw-Extra-Virgin-Coconut-Oil/372144011">Coconut Merchant Organic Raw Extra Virgin Coconut Oil 500ml</a>   6.74
<a href="https://groceries.asda.com/product/oils/ktc-coconut-hair-oil/910000033621">KTC 100% pure coconut oil</a>                                                                          2.00
<a href="https://www.ocado.com/webshop/product/Waitrose-Love-Life-Popcorn-Maize/25130011">Waitrose Love Life Popcorn Maize 510g</a>                                               1.50
<a href="https://groceries.asda.com/promotion/2-for-pound-1.50/ls89129">Cypressa Popping Corn 2x500g = 1000g</a>                                                                           1.50
<a href="https://www.ocado.com/webshop/product/Whitworths-Ground-Almonds/275684011">Whitworths Ground Almonds</a>                                                                 2.00
<a href="https://groceries.asda.com/product/baking-nuts-seeds-fruit/whitworths-ground-almonds/910000797981">Whitworths Ground Almonds</a>                                                  1.60
Total                                                                                                                                                                           £ 5.10
-30%                                                                                                                                                                   £ 7.17</p>
<pre><code class="language-{=org}">#+TBLFM: @8$3=vsum(@2$3..@7$3);£ %.2f::@9$2=vsum(@2$2..@7$2) * 0.7;£ %.2f
</code></pre>
<p>On the upside, Ocado has plenty of items I cannot find at Asda. May be a good opportunity to get these items at a discount.</p>
<h2>Emacs org tables</h2>
<p>Small tables are the perfect use-case for Emacs <a href="https://orgmode.org/manual/Tables.html">org-mode tables</a>. Been a while since I used one, so great timing for a little refresh.</p>
<p>Here's the org source for the table above (prior to exporting to HTML):</p>
<pre><code class="language-org">|-------------------------------------------------------------+--------+--------|
|                                                             |  Ocado |   Asda |
|-------------------------------------------------------------+--------+--------|
| [[https://www.ocado.com/webshop/product/Coconut-Merchant-Organic-Raw-Extra-Virgin-Coconut-Oil/372144011][Coconut Merchant Organic Raw Extra Virgin Coconut Oil 500ml]] |   6.74 |        |
| [[https://groceries.asda.com/product/oils/ktc-coconut-hair-oil/910000033621][KTC 100% pure coconut oil]]                                   |        |   2.00 |
| [[https://www.ocado.com/webshop/product/Waitrose-Love-Life-Popcorn-Maize/25130011][Waitrose Love Life Popcorn Maize 510g]]                       |   1.50 |        |
| [[https://groceries.asda.com/promotion/2-for-pound-1.50/ls89129][Cypressa Popping Corn 2x500g = 1000g]]                        |        |   1.50 |
| [[https://www.ocado.com/webshop/product/Whitworths-Ground-Almonds/275684011][Whitworths Ground Almonds]]                                   |   2.00 |        |
| [[https://groceries.asda.com/product/baking-nuts-seeds-fruit/whitworths-ground-almonds/910000797981][Whitworths Ground Almonds]]                                   |        |   1.60 |
|-------------------------------------------------------------+--------+--------|
| Total                                                       |        | £ 5.10 |
|-------------------------------------------------------------+--------+--------|
| -30%                                                        | £ 7.17 |        |
|-------------------------------------------------------------+--------+--------|
#+TBLFM: @8$3=vsum(@2$3..@7$3);£ %.2f::@9$2=vsum(@2$2..@7$2) * 0.7;£ %.2f
</code></pre>
]]></description>
    <pubDate>Sat, 01 Dec 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Execute org blocks as root</title>
<link>https://xenodium.com/execute-org-blocks-as-root</link>
<guid isPermaLink="false">https://xenodium.com/execute-org-blocks-as-root</guid>
    <description><![CDATA[<p>Been saving admin code snippets in my own <a href="https://orgmode.org/manual/Working-with-source-code.html">org source blocks</a>, some requiring root access. Handy for keeping tiny self-documented scripts to easily bootstrap other machines. TIL org source block's <em>:dir</em> argument can be used to run block as root by using tramp syntax: /:dir <em>sudo::</em></p>
<pre><code class="language-org">
As user:

#+BEGIN_SRC sh
  whoami
#+END_SRC

#+RESULTS:
: user

As root:

#+BEGIN_SRC sh :dir /sudo::
  whoami
#+END_SRC

#+RESULTS:
: root

</code></pre>
]]></description>
    <pubDate>Sat, 24 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Inline Swift computed properties</title>
<link>https://xenodium.com/inline-swift-computed-properties</link>
<guid isPermaLink="false">https://xenodium.com/inline-swift-computed-properties</guid>
    <description><![CDATA[<p>Via <a href="https://twitter.com/objcio">objc.io</a> and <a href="https://twitter.com/mxcl">Max Howell's</a> <a href="https://twitter.com/mxcl/status/1065802821700857856">retweet</a>, TIL about Swift's inline computed properties. Another one to try on Org <a href="https://orgmode.org/worg/org-contrib/babel/intro.html">Babel</a>. ‏</p>
<pre><code class="language-swift">func greetWorld() {
 var message = &quot;hello&quot;
 var betterMessage: String {
   return &quot;\(message) world&quot;
 }
 print(betterMessage)
}

greetWorld()
</code></pre>
]]></description>
    <pubDate>Fri, 23 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Multiline Swift strings</title>
<link>https://xenodium.com/multiline-swift-strings</link>
<guid isPermaLink="false">https://xenodium.com/multiline-swift-strings</guid>
    <description><![CDATA[<p><a href="https://twitter.com/twostraws">Paul Hudson's</a> <a href="https://twitter.com/twostraws">tweet</a> introduced me to Swift's multiline string indentation control using closing quotes. Neat!</p>
<p>Being an org-mode fan, I thought I'd give Swift multiline strings a try using Org <a href="https://orgmode.org/worg/org-contrib/babel/intro.html">Babel's</a> <a href="https://github.com/zweifisch/ob-swift">ob-swift</a>. I get to verify it and document at the same time. Win.</p>
<p>Swift org mode source blocks (ie. BEGIN_SRC/END_SRC) can be added as follows:</p>
<pre><code class="language-org">#+BEGIN_SRC swift :exports both
  print(&quot;&quot;&quot;
       Hello World
  &quot;&quot;&quot;)

  print(&quot;&quot;&quot;
       Hello World
       &quot;&quot;&quot;)
#+END_SRC

#+RESULTS:
:      Hello World
: Hello World
</code></pre>
<p>By pressing <em>C-c C-c</em> anywhere in the code block, the snippet is executed and its output captured in the <em>RESULT</em> block. Super handy for quickly trying out snippets and keeping as future reference.</p>
<p>As a bonus, the above blocks can be exported to HTML (<a href="https://orgmode.org/manual/Exporting.html">amongst other formats</a>). With some <a href="https://github.com/xenodium/dotsies/search?q=org-html-head-extra&amp;unscoped_q=org-html-head-extra">styling</a>, it looks as follows:</p>
<pre><code class="language-{.swift">print(&quot;&quot;&quot;
     Hello World
&quot;&quot;&quot;)

print(&quot;&quot;&quot;
     Hello World
     &quot;&quot;&quot;)
</code></pre>
<pre><code class="language-example">     Hello World
Hello World
</code></pre>
]]></description>
    <pubDate>Fri, 23 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Quickly swapping elfeed filters</title>
<link>https://xenodium.com/quickly-swapping-elfeed-filters</link>
<guid isPermaLink="false">https://xenodium.com/quickly-swapping-elfeed-filters</guid>
    <description><![CDATA[<p>I seem to be more efficient in getting through rss feeds by individually browsing through related content. That is, I can get through all Emacs entries a lot faster if I look at Emacs content exclusively, instead of mixing with say BBC news. <a href="https://github.com/skeeto/elfeed">Elfeed</a> filters are great for filtering related content.</p>
<p>I wanted a way to easily switch through my typical categories of related content by quickly changing elfeed filters using a completion framework.</p>
<p>Emacs's <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Minibuffer-Completion.html">completing-read</a> plays nicely with your favorite completing framework (mine is <a href="https://github.com/abo-abo/swiper">ivy</a>). With a couple of functions, we can get Emacs to ask us for the filtering category using human-readable options and quickly presenting related content. Binding the new functionality to &lt;tab&gt; is working well for me.</p>
<pre><code class="language-{.commonlisp">(use-package elfeed :ensure t
  :commands elfeed
  :bind (:map elfeed-search-mode-map
              (&quot;&lt;tab&gt;&quot; . ar/elfeed-completing-filter))
  :config
  (defun ar/elfeed-filter-results-count (search-filter)
    &quot;Count results for SEARCH-FILTER.&quot;
    (let* ((filter (elfeed-search-parse-filter search-filter))
           (head (list nil))
           (tail head)
           (count 0))
      (let ((lexical-binding t)
            (func (byte-compile (elfeed-search-compile-filter filter))))
        (with-elfeed-db-visit (entry feed)
          (when (funcall func entry feed count)
            (setf (cdr tail) (list entry)
                  tail (cdr tail)
                  count (1+ count)))))
      count))

  (defun ar/elfeed-completing-filter ()
    &quot;Completing filter.&quot;
    (interactive)
    (let ((categories (-filter
                       (lambda (item)
                         (&gt; (ar/elfeed-filter-results-count (cdr item))
                            0))
                       '((&quot;All&quot; . &quot;@6-months-ago +unread&quot;)
                         (&quot;BBC&quot; . &quot;@6-months-ago +unread +bbc&quot;)
                         (&quot;Dev&quot; . &quot;@6-months-ago +unread +dev&quot;)
                         (&quot;Emacs&quot; . &quot;@6-months-ago +unread +emacs&quot;)
                         (&quot;Health&quot; . &quot;@6-months-ago +unread +health&quot;)
                         (&quot;Hacker News&quot; . &quot;@6-months-ago +unread +hackernews&quot;)
                         (&quot;iOS&quot; . &quot;@6-months-ago +unread +ios&quot;)
                         (&quot;Money&quot; . &quot;@6-months-ago +unread +money&quot;)))))
      (if (&gt; (length categories) 0)
          (progn
            (ar/elfeed-view-filtered (cdr (assoc (completing-read &quot;Categories: &quot; categories)
                                                 categories)))
            (goto-char (window-start)))
        (message &quot;All caught up \\o/&quot;)))))
</code></pre>
<p><img src="https://xenodium.github.io/images/quickly-swapping-elfeed-filters/completing-elfeed.gif" alt=""></p>
<p>We don't actually need two functions, but <em>ar/elfeed-filter-results-count</em> enables us to list only those feeds that actually have new content. The list will shrink as we get through our content. When no content is left, we get a little celebratory message.</p>
<p><img src="https://xenodium.github.io/images/quickly-swapping-elfeed-filters/no-left.png" alt=""></p>
]]></description>
    <pubDate>Sat, 17 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Converting docx to pdf on macOS</title>
<link>https://xenodium.com/converting-docx-to-pdf-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/converting-docx-to-pdf-on-macos</guid>
    <description><![CDATA[<p>Wanted to convert a docx document to pdf on macOS. Pandoc to the rescue, but first needed pdflatex installed:</p>
<pre><code class="language-{.bash">pandoc -t latex some.docx -o some.pdf
</code></pre>
<pre><code class="language-example">pdflatex not found. Please select a different --pdf-engine or install pdflatex
</code></pre>
<p>Installed pdflatex on macOS with:</p>
<pre><code class="language-{.bash">brew install mactex
</code></pre>
<p>Can also use HTML5. Install wkhtmltopdf with:</p>
<pre><code class="language-{.bash">brew install Caskroom/cask/wkhtmltopdf
</code></pre>
<p>Convert with:</p>
<pre><code class="language-{.bash">pandoc -t html5 some.docx -o some.pdf
</code></pre>
]]></description>
    <pubDate>Wed, 14 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Faster elfeed browsing with paging</title>
<link>https://xenodium.com/faster-elfeed-browsing-with-paging</link>
<guid isPermaLink="false">https://xenodium.com/faster-elfeed-browsing-with-paging</guid>
    <description><![CDATA[<p>Following up from <a href="http://xenodium.com/#faster-junk-mail-deletion-with-mu4e">faster junk mail deletion with mu4e</a>, elfeed is another candidate for enabling actions on pages. In this case, marking rss entries as read, page by Page.</p>
<p>If on <a href="https://github.com/jwiegley/use-package">use-package</a>, the function can defined and bound to the &quot;v&quot; key using:</p>
<pre><code class="language-{.commonlisp">(use-package elfeed
  :ensure t
  :bind (:map elfeed-search-mode-map
              (&quot;v&quot; . ar/elfeed-mark-visible-as-read))
  :config
  (defun ar/elfeed-mark-visible-as-read ()
    (interactive)
    (require 'window-end-visible)
    (set-mark (window-start))
    (goto-char (window-end-visible))
    (activate-mark)
    (elfeed-search-untag-all-unread)
    (elfeed-search-update--force)
    (deactivate-mark)
    (goto-char (window-start))))
</code></pre>
<p><img src="https://xenodium.github.io/images/faster-elfeed-browsing-with-paging/elfeed-read-by-page.gif" alt=""></p>
]]></description>
    <pubDate>Tue, 13 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Faster junk mail deletion with mu4e</title>
<link>https://xenodium.com/faster-junk-mail-deletion-with-mu4e</link>
<guid isPermaLink="false">https://xenodium.com/faster-junk-mail-deletion-with-mu4e</guid>
    <description><![CDATA[<p>It's been roughly 5 months since <a href="http://xenodium.com/#trying-out-mu4e-and-offlineimap">my mu4e email migration</a>. Happy with my choice. <a href="http://www.djcbsoftware.nl/code/mu/mu4e.html">Mu4e</a> is awesome.</p>
<p>I now have 4 email accounts managed by mu4e, and unfortunately receiving lots of junk mail.</p>
<p>I regularly peek at junk folders for false positives and delete junk email permanently. I've been wanting a quick way to glance at junk mail and easily delete page by page.</p>
<p>Deleting emails page by page is not supported in mu4e by default. <em>Fortunately, this is Emacs and we can change that™.</em></p>
<p>There's a handy package by Roland Walker called <a href="http://github.com/rolandwalker/window-end-visible">window-end-visible</a>. We can use it to select mu4e emails by page and subsequently glue it all together to enable deleting emails by page.</p>
<pre><code class="language-{.commonlisp">(require 'mu4e)
(require 'window-end-visible)

(defun ar/mu4e-delete-page ()
  (interactive)
  (set-mark (window-start))
  (goto-char (window-end-visible))
  (activate-mark)
  (mu4e-headers-mark-for-trash)
  (mu4e-mark-execute-all t)
  (deactivate-mark)
  (goto-char (window-start)))
</code></pre>
<p>I'm a <a href="https://github.com/jwiegley/use-package">use-package</a> fan, so I use it to bind the &quot;v&quot; key to delete <em>visible emails (by page</em>).</p>
<pre><code class="language-{.commonlisp">(use-package mu4e
  :bind (:map mu4e-headers-mode-map
         (&quot;v&quot; . ar/mu4e-delete-page))
</code></pre>
<p><img src="https://xenodium.github.io/images/faster-junk-mail-deletion-with-mu4e/delete-junk.gif" alt=""></p>
]]></description>
    <pubDate>Sat, 10 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Working with vultr's ipv6-only instances</title>
<link>https://xenodium.com/working-with-vultrs-ipv6-only-instances</link>
<guid isPermaLink="false">https://xenodium.com/working-with-vultrs-ipv6-only-instances</guid>
    <description><![CDATA[<p>Having recently read <a href="https://www.amazon.co.uk/Transforming-Relationship-Achieving-Financial-Independence/dp/0143115766/">Your Money or Your Life</a>, I've been cutting down on personal expenses wherever possible. Specially recurring expenses which include monthly charges from VPS hosting. Let's reduce those charges…</p>
<p>My VPS needs are fairly small (mostly hobby and tinkering). <a href="https://www.vultr.com/?ref=7579034">Vultr</a>† has a plan for $2.50/month (not seen anything cheaper). The caveat for the price, you get ipv6 access only (ie. 0000:1111:2222:3333:4444:5555:6666:7777:8888).</p>
<p>So far so good, but my ISP doesn't yet support ipv6:</p>
<pre><code class="language-{.bash">$ ping6 0000:1111:2222:3333:4444:5555:6666:7777:8888
$ ping6: UDP connect: No route to host
</code></pre>
<p>Fortunately, we can still work with ipv6 by using a tunnel (TIL about <a href="https://tunnelbroker.net">Hurricane Electric's tunnel broker</a>). After signing up and creating a tunnel, they conveniently show you &quot;Example Configurations&quot; from the &quot;Tunnel Details&quot; menu. In my case, macOS:</p>
<pre><code class="language-{.bash">ifconfig gif0 create
ifconfig gif0 tunnel &lt;ipv4 client broker IP or DCHP internal IP&gt; &lt;ipv4 server IP&gt;
ifconfig gif0 inet6 &lt;ipv6 client broker IP&gt; &lt;ipv6 server IP&gt; prefixlen 128
route -n add -inet6 default &lt;ipv6 server IP&gt;
</code></pre>
<p>Note: If behind router, use the DHCP internal IP.</p>
<p>After configuring with ifconfig, all is good. Yay!</p>
<pre><code class="language-{.bash">$ ping6 0000:1111:2222:3333:4444:5555:6666:7777:8888
PING6(56=40+8+8 bytes) 2001:111:22:aaa::2 --&gt; 0000:1111:2222:3333:4444:5555:6666:7777:8888
16 bytes from 0000:1111:2222:3333:4444:5555:6666:7777:8888, icmp_seq=0 hlim=52 time=270.019 ms
16 bytes from 0000:1111:2222:3333:4444:5555:6666:7777:8888, icmp_seq=1 hlim=52 time=290.834 ms
16 bytes from 0000:1111:2222:3333:4444:5555:6666:7777:8888, icmp_seq=2 hlim=52 time=311.960 ms
16 bytes from 0000:1111:2222:3333:4444:5555:6666:7777:8888, icmp_seq=3 hlim=52 time=330.902 ms
</code></pre>
<p>I'm an ipv6 noob. I mostly need ssh access. My typical usages need small tweaks.</p>
<p>For ssh:</p>
<pre><code class="language-{.bash">ssh -6 username@0000:1111:2222:3333:4444:5555:6666:7777:8888
</code></pre>
<p>For scp:</p>
<pre><code class="language-{.bash">scp -6 file.txt username@\[0000:1111:2222:3333:4444:5555:6666:7777:8888\]:/remote/dir/
</code></pre>
<p>† I get $10 credit if you use this affiliate link. Thank you.</p>
]]></description>
    <pubDate>Tue, 06 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Shaving bookmarks</title>
<link>https://xenodium.com/shaving-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/shaving-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.independent.co.uk/extras/indybest/fashion-beauty/mens-grooming/best-safety-razors-for-beginners-sensitive-skin-10111508.html">8 best safety razors (The Independent)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 04 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Buy it for life bookmarks</title>
<link>https://xenodium.com/buy-it-for-life-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/buy-it-for-life-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.fjallraven.com">Fjällräven jackets</a>.</li>
<li><a href="https://www.etsy.com/uk/market/gillette_slim">Gillette slim (Etsy)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 04 Nov 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Rust bookmarks</title>
<link>https://xenodium.com/rust-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/rust-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://robert.kra.hn/posts/2021-02-07_rust-with-emacs/">Configuring Emacs for Rust development | Robert Krahn</a>.</li>
<li><a href="https://www.snoyman.com/blog/2018/10/introducing-rust-crash-course">Introducing the Rust crash course</a>.</li>
<li><a href="https://news.ycombinator.com/item">Rust Language Cheat Sheet (cheats.rs) </a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 29 Oct 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fonts bookmarks</title>
<link>https://xenodium.com/fonts-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/fonts-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.getthefont.com/">Get the Font</a>.</li>
<li><a href="https://github.com/rsms/inter">GitHub - rsms/inter: The Inter UI font family</a>.</li>
<li><a href="https://input.fontbureau.com/">Input: Fonts for Code</a>.</li>
<li><a href="https://x.com/Markbuschn/status/1866263306333229288">Need an industrial typeface like this, anyone?</a>.</li>
<li><a href="https://app.programmingfonts.org/">Programming Fonts - Test Drive</a>.</li>
<li><a href="https://www.kutilek.de/sudo-font/">Sudo Coding Font | Jens Kutílek</a>.</li>
<li><a href="https://github.com/IBM/plex">The package of IBM’s typeface, IBM Plex (font)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 28 Oct 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>imenu on Emacs eshell</title>
<link>https://xenodium.com/imenu-on-emacs-eshell</link>
<guid isPermaLink="false">https://xenodium.com/imenu-on-emacs-eshell</guid>
    <description><![CDATA[<p><a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Imenu.html">imenu</a> navigation is one of those Emacs gems I didn't discover until much later on. It does what you'd expect in all types of modes. In rare instances, I've found specific modes missing imenu support. Fortunately, this is Emacs and you can fix that.</p>
<p><a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">Eshell</a> has a handy feature to jump back and forth over previous prompts using <em>M-x eshell-previous-prompt (C-c C-p)</em> and <em>M-x eshell-next-prompt (C-c C-n)</em>. Upon learning about these two functions, my immediate reaction was to try imenu. Surprisingly, it didn't &quot;just work&quot;, but a tiny bit of elisp brought balance back to the Emacs universe.</p>
<p>In an eshell mode hook function, one can set the <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Imenu.html#index-imenu_002dgeneric_002dexpression-2058">imenu-generic-expression</a> to help it find your favorite prompt:</p>
<pre><code class="language-{.commonlisp">(setq-local imenu-generic-expression
                  '((&quot;Prompt&quot; &quot; $ \\(.*\\)&quot; 1)))
</code></pre>
<p>Ah it's the little things…</p>
<p><img src="https://xenodium.github.io/images/imenu-on-emacs-eshell/eshell-imenu.gif" alt=""></p>
<p>ps. If wondering why my imenu experience looks a little different, that's because I'm using Abo Abo's wonderful <a href="https://github.com/abo-abo/swiper">counsel</a> and <em>M-x counsel-semantic-or-imenu</em>.</p>
]]></description>
    <pubDate>Wed, 17 Oct 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Encrypted disk image on macOS</title>
<link>https://xenodium.com/encrypted-disk-image-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/encrypted-disk-image-on-macos</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/encrypted-image-on-macos/1.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/encrypted-image-on-macos/2.png" alt=""></p>
]]></description>
    <pubDate>Sun, 14 Oct 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sheffield travel bookmarks</title>
<link>https://xenodium.com/sheffield-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sheffield-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://streetfoodchef.co.uk/">Street Food Chef</a>.</li>
<li><a href="http://www.sakushi.co.uk/">Sakushi -Sushi, noodle and Japanese food restaurant in Sheffield</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 13 Oct 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Headsphones bookmarks</title>
<link>https://xenodium.com/headsphones-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/headsphones-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.steventammen.com/posts/bose-qc35ii-headphones/">Bose QuietComfort 35 II Headphones (StevenTammen.com)</a>.
<ul>
<li><a href="https://www.rtings.com/headphones/tests/isolation/noise-isolation-cancellation-passive-active">Noise Isolation/Cancellation of Headphones (RTINGS.com)</a>.</li>
</ul>
</li>
<li><a href="https://www.rtings.com/headphones/reviews/sony/wh-1000xm3">Sony WH-1000XM3 Review - RTINGS.com</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 13 Oct 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>macOS app bookmarks</title>
<link>https://xenodium.com/macos-app-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/macos-app-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://apps.louplummer.lol/post/applite-an-app-store-for-homebrew">Applite - An App Store for Homebrew | App Addict</a>.</li>
<li><a href="https://eclecticlight.co/cirrus-bailiff/">Cirrus &amp; Bailiff (iCloud debugging tools)</a>.</li>
<li><a href="https://corkmac.app/">Cork: The Homebrew GUI for macOS</a>.</li>
<li><a href="http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html">Customizing the Cocoa Text System</a>.</li>
<li><a href="https://darkreader.org/">Dark Reader</a>.</li>
<li><a href="https://dmgbuild.readthedocs.io/en/latest/">dmgbuild - A command line tool to build .dmg files</a>.</li>
<li><a href="https://github.com/GetStream/Winds/blob/master/README.md">GetStream/Winds: macOS rss reader</a>.</li>
<li><a href="https://github.com/herrbischoff/awesome-macos-command-line#itunes">GitHub - herrbischoff/awesome-macos-command-line</a>.</li>
<li><a href="https://github.com/koekeishiya/yabai">GitHub - koekeishiya/yabai: A tiling window manager for macOS based on binary</a>.</li>
<li><a href="https://github.com/TermiT/Flycut">GitHub - TermiT/Flycut: Clean and simple clipboard manager for developers</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21794858">Hidden Bar: macOS utility to hide unused menu bar icons, written in Swift</a>.</li>
<li><a href="https://www.obdev.at/products/launchbar/index.html">LaunchBar 6 (can I implement flows in Emacs)?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21179713">List of open source applications for macOS (Hacker News)</a>.</li>
<li><a href="https://macopenweb.com/">Mac Open Web, by Brian Warren</a>.</li>
<li><a href="https://eclecticlight.co/mac-troubleshooting-summary/">Mac Troubleshooting Summary – The Eclectic Light Company</a>.</li>
<li><a href="https://github.com/kam800/MachObfuscator/blob/master/README.md">MachObfuscator/README.md at master · kam800/MachObfuscator · GitHub</a>.</li>
<li><a href="https://papers.put.as/macosx/macosx/">macOS · Papers, Slides and Thesis Archive</a>.</li>
<li><a href="https://maverickmac.github.io/2024-06-24/maverick-mac">Maverick Mac | A curated list of awesome mac applications and utilities</a>.</li>
<li><a href="https://www.gonsie.com/blorg/ipad-setup.html">My iPad Setup</a>.</li>
<li><a href="https://github.com/nikitavoloboev/my-mac-os">My wonderful world of macOS</a>.</li>
<li><a href="https://github.com/nikitavoloboev/my-mac-os">my-mac-os: My wonderful world of macOS</a>.</li>
<li><a href="https://thesweetsetup.com/netnewswire-5-0-relaunches-as-an-open-source-rss-reader-for-the-mac/">NetNewsWire 5.0 Relaunches as an Open-Source RSS Reader for the Mac – The Sweet Setup</a>.</li>
<li><a href="https://github.com/jacklandrin/OnlySwitch">OnlySwitch: Toggle all sorts of things from menu bar</a>.</li>
<li><a href="https://smilesoftware.com/pdfpen/?">PDF Editor - PDFpen - Edit PDF Files (Smile Software)</a>.</li>
<li><a href="http://solutions.weblite.ca/pdfocrx/">PDF OCR X - Mac &amp; Windows OCR Software to convert PDFs and Images to Text</a>.</li>
<li><a href="https://apps.apple.com/us/app/rested-simple-http-requests/id421879749">‎RESTed - Simple HTTP Requests on the Mac App Store</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 05 Oct 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Gaming bookmarks</title>
<link>https://xenodium.com/gaming-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/gaming-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://openemu.org/">OpenEmu - Multiple Video Game System for owned ROMs</a>.</li>
<li><a href="https://twitter.com/SethAbramson/status/1412177674596986881">The Top 100 Android Video Games</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 30 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Lua bookmarks</title>
<link>https://xenodium.com/lua-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/lua-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/sumneko/lua-language-server/wiki/Build-and-Run-(Standalone)">Build and Run (Standalone) · sumneko/lua-language-server Wiki · GitHub</a>.</li>
<li><a href="https://sepisoad.com/blog/how%20to%20lua%20and%20c%20-%20a%20short%20novel.html">how to lua and c - a short novel</a>.</li>
<li><a href="https://luadigest.immortalin.com/">Lua Digest</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17969795">Lua tables (Hacker News)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 29 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Skin product bookmarks</title>
<link>https://xenodium.com/skin-product-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/skin-product-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.rebootedmom.com/diy-deodorant-bars/">DIY Deodorant Bars - Rebooted Mom</a>.</li>
<li><a href="https://blog.freepeople.com/2015/03/allnatural-deodorant-bars/">How to Make Your Own All-Natural Deodorant Bars</a>.</li>
<li><a href="http://sarahfrascamakeup.blogspot.com/2011/04/good-bad-and-ugly-lush-cosmetics.html">Sarah Frasca Makeup: The good, the bad and the ugly: Lush Cosmetics</a>.</li>
<li><a href="https://www.ewg.org/skindeep/">Skin Deep® Cosmetics Database (EWG)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 29 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sustainability bookmarks</title>
<link>https://xenodium.com/sustainability-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sustainability-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://factory45.co/">Source Fabric. Find a Manufacturer. Raise Money to Fund Production. (Factory45)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 29 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Investment platform bookmarks</title>
<link>https://xenodium.com/investment-platform-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/investment-platform-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.portfoliovisualizer.com/backtest-portfolio">Backtest Portfolio Asset Allocation</a>.</li>
<li><a href="https://bravos.co/">Bravos</a>.</li>
<li><a href="http://www.cmlviz.com/">CMLviz.com - BETA</a>.</li>
<li><a href="https://www.degiro.eu/">DEGIRO - Online Stock Trading - Stockbroking (cheaper?)</a>.</li>
<li><a href="https://iextrading.com/developer/">Free Stock API for Realtime and Historical Data (IEX)</a>.</li>
<li><a href="https://freetrade.io/">Freetrade - Free Stock Investing</a>.</li>
<li><a href="https://www.halifax.co.uk/sharedealing/">Halifax UK | Buying and selling (Sharedealing)</a>.</li>
<li><a href="https://www.hl.co.uk/">Hargreaves Lansdown (ISAs, pensions, funds and shares)</a>.</li>
<li><a href="https://twitter.com/kanhaic/status/1411302254884261893">How I have automated my #algotrading and spend less than ₹10</a>.</li>
<li><a href="https://www.iweb-sharedealing.co.uk/share-dealing-home.asp">IWeb Share Dealing (cheaper?)</a>.</li>
<li><a href="https://www.fundingcircle.com/uk/investors/">Lend to UK Businesses | Investment (Funding Circle)</a>.</li>
<li><a href="https://www.ratesetter.com/">RateSetter Peer To Peer Lender (P2P Investing and Borrowing)</a>.</li>
<li><a href="https://www.stockportfolioorganizer.com/">Stock Portfolio Management Software (Stock Portfolio Organizer)</a>.</li>
<li><a href="https://stockdaddy.io/">StockDaddy - Free, real-time, easy to use stock portfolio tracker</a>.</li>
<li><a href="https://stocklight.com/">StockLight - Australia's premier investing app</a>.</li>
<li><a href="https://wallmine.com/stocks-and-cryptocurrency-portfolio-tracker">Stocks and cryptocurrency portfolio tracker (wallmine)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 29 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Minimalist bookmarks</title>
<link>https://xenodium.com/minimalist-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/minimalist-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://mnmll.ist">mnmll.ist: listing all things minimalist</a>.</li>
<li><a href="https://www.raisingsimple.com">Raising Simple | Streamline your home. Simplify family life (minimalism)</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 28 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Recover from Time Machine's "backup already in use"</title>
<link>https://xenodium.com/recover-from-time-machines-backup-already-in-use</link>
<guid isPermaLink="false">https://xenodium.com/recover-from-time-machines-backup-already-in-use</guid>
    <description><![CDATA[<p>Started seeing &quot;backup already in use&quot; error from my daily Time Machine backups, against my Synology. Disabling and re-enabling AFP did the job (via Synology -&gt; Control Panel -&gt; Files Services -&gt; Enable AFP service).</p>
<p><img src="https://xenodium.github.io/images/recover-from-time-machines-backup-already-in-use/re-enable_afp_service.png" alt=""></p>
]]></description>
    <pubDate>Sun, 23 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>CMake bookmarks</title>
<link>https://xenodium.com/cmake-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cmake-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=17897685">An Introduction to Modern CMake (Hacker News)</a>.</li>
<li><a href="https://cliutils.gitlab.io/modern-cmake/">An Introduction to Modern CMake</a>.</li>
<li><a href="https://steveire.wordpress.com/2017/11/05/embracing-modern-cmake/">Embracing Modern CMake (Steveire's Blog)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 03 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>GTD/Get things done bookmarks</title>
<link>https://xenodium.com/gtdget-things-done-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/gtdget-things-done-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://jamesstuber.com/plan-your-day/">Daily Time Management with Todoist and Google Calendar | JamesStuber.com</a>.</li>
<li><a href="https://klinger.io/post/71640845938/dont-drown-in-email-how-to-use-gmail-more">Don’t drown in email! How to use Gmail more efficiently. - Startup Lessons Learned</a>.</li>
<li><a href="https://praxis.fortelabs.co/gtd-x-pkm-8ff720ef6939/">Getting Things Done + Personal Knowledge Management - Praxis</a>.</li>
<li><a href="https://emacs.cafe/emacs/orgmode/gtd/2017/06/30/orgmode-gtd.html">Orgmode for GTD/Get things done</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 28 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Pandoc bookmarks</title>
<link>https://xenodium.com/pandoc-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/pandoc-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.gabrielgambetta.com/tgl_open_source.html">How I wrote and published my novel using only open source tools</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17855104">Pandoc (Hacker News)</a>.</li>
<li><a href="https://pandoc.org/demos.html">Pandoc - Demos</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 28 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mauritius travel bookmarks</title>
<link>https://xenodium.com/mauritius-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/mauritius-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.nomadasaurus.com/things-to-do-in-mauritius/">20 Amazing Things to Do in Mauritius (2020 Guide)</a>.</li>
<li><a href="https://1886corsontea.com">Corson vanilla tea</a>.</li>
<li><a href="https://www.tripadvisor.co.uk/Attraction_Review-g293816-d477276-Reviews-Ile_aux_Cerfs-Mauritius.html#photos;aggregationId=101&amp;albumid=101&amp;filter=7&amp;ff=447514694">Ile aux Cerfs (Mauritius) - Jonathan/Vanessa excursions</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Le_Morne_Brabant">Le Morne Brabant (Wikipedia)</a>.</li>
<li><a href="https://mauritiusattractions.com/mauritius-beaches-i-80.html">Mauritius Beaches - the Best Beaches in Mauritius - Mauritius Attractions</a>.</li>
<li><a href="https://www.bugbog.com/beaches/beach_pictures_mauritius/">Mauritius beaches: pictures, information, resorts, sights</a>.</li>
<li><a href="https://www.bugbog.com/beaches/beach_pictures_mauritius/mauritius_sights/#ganga">Mauritius sights, large pictures, best things to see and do</a>.</li>
<li><a href="https://www.maurinet.com/tourist_information/public_beaches">Public Beaches :: Mauritius Island Online</a>.</li>
<li><a href="https://mel365.com/best-beaches-in-mauritius/">The 12 best beaches in Mauritius 2020 {with map and photos}</a>.</li>
<li><a href="https://theculturetrip.com/africa/mauritius/articles/the-best-markets-in-mauritius/">The Best Markets in Mauritius</a>.</li>
<li><a href="https://theculturetrip.com/africa/mauritius/articles/the-best-spots-to-eat-roti-in-port-louis-mauritius/">The Best Spots to Eat Roti in Port Louis, Mauritius</a>.</li>
<li><a href="https://theculturetrip.com/africa/mauritius/articles/the-essential-guide-to-port-louis-central-market-in-mauritius/">The Essential Guide to Port Louis' Central Market in Mauritius</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 27 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Scala bookmarks</title>
<link>https://xenodium.com/scala-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/scala-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://leanpub.com/fpmortals/read">Functional Programming for Mortals (Leanpub)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 27 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Actionable URLs in Emacs buffers</title>
<link>https://xenodium.com/actionable-urls-in-emacs-buffers</link>
<guid isPermaLink="false">https://xenodium.com/actionable-urls-in-emacs-buffers</guid>
    <description><![CDATA[<p>Should have enabled actionable URLs in my Emacs buffers long ago. Can now click or press return to follow links. It's great on eshell, compilation buffers, async shell commands, code, etc.</p>
<pre><code class="language-{.commonlisp">(use-package goto-addr
  :hook ((compilation-mode . goto-address-mode)
         (prog-mode . goto-address-prog-mode)
         (eshell-mode . goto-address-mode)
         (shell-mode . goto-address-mode))
  :bind (:map goto-address-highlight-keymap
              (&quot;&lt;RET&gt;&quot; . goto-address-at-point)
              (&quot;M-&lt;RET&gt;&quot; . newline))
  :commands (goto-address-prog-mode
             goto-address-mode))
</code></pre>
<p><img src="https://xenodium.github.io/images/actionable-urls-in-emacs-buffers/goto-address.png" alt=""></p>
]]></description>
    <pubDate>Wed, 22 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bazel bookmarks</title>
<link>https://xenodium.com/bazel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bazel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/vincent-picaud/Bazel_with_GTest">Bazel_with_GTest: C++ project skeleton with Bazel &amp; GTest</a>.</li>
<li><a href="https://tulipemoutarde.be/posts/bazel-for-mobile-apps-part-2/">Build mobile apps with Bazel. Part 2: iOS</a>.</li>
<li><a href="https://github.com/bazelbuild/rules_docker">GitHub - bazelbuild/rules_docker: Rules for building and handling Docker images with Bazel</a>.</li>
<li><a href="https://github.com/jin/awesome-bazel">GitHub - jin/awesome-bazel: A curated list of Bazel rules, tooling and resources</a>.</li>
<li><a href="https://jakemccrary.com/blog/2020/06/28/using-bazel-to-help-fix-flaky-tests/">Using Bazel to help fix flaky tests - Jake McCrary</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 22 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Palestine travel bookmarks</title>
<link>https://xenodium.com/palestine-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/palestine-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.tripadvisor.co.uk/Restaurant_Review-g667136-d7360437-Reviews-Rukab_s_Ice_Cream-Ramallah_Binyamin_Region_West_Bank.html">Rukab's Ice Cream, Ramallah (Trip advisor)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 18 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Enabling Control-Meta(⌘)-D on macOS</title>
<link>https://xenodium.com/enabling-control-meta-d-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/enabling-control-meta-d-on-macos</guid>
    <description><![CDATA[<p>I use command (⌘) as my Emacs Meta key. Recently discovered C-M-d is not available to Emacs for binding keys on macOS. Stack Exchange had the <a href="https://apple.stackexchange.com/questions/22785/how-do-i-disable-the-command-control-d-word-definition-keyboard-shortcut-in-os-x">workaround</a>:</p>
<pre><code class="language-{.bash">defaults write com.apple.symbolichotkeys AppleSymbolicHotKeys -dict-add 70 '&lt;dict&gt;&lt;key&gt;enabled&lt;/key&gt;&lt;false/&gt;&lt;/dict&gt;'
</code></pre>
]]></description>
    <pubDate>Sat, 18 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Recycling bookmarks</title>
<link>https://xenodium.com/recycling-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/recycling-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://myplasticfreelife.com/">My Plastic-free Life</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 13 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Comoro islands travel bookmarks</title>
<link>https://xenodium.com/comoro-islands-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/comoro-islands-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.quora.com/What-are-some-of-the-exotic-tourist-destinations-which-are-not-commonly-known/answer/Patrick-Crosset">Visiting The Comoros Islands (Quota)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>France travel bookmarks</title>
<link>https://xenodium.com/france-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/france-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lonelyplanet.com/articles/france-top-food-experiences">France's 10 top food experiences - Lonely Planet</a>.</li>
<li><a href="https://thefrenchtouch.quora.com/GR-20-Best-Mountain-Hiking-in-France">GR 20 : Best Mountain Hiking in France - The French Touch - Quora</a>.</li>
<li><a href="https://twitter.com/malk_zameth/status/1278288570021826563">Hmmm I want to take some August vacation time in a city I can go by train from paris and is nice to visit calm and not too expensive </a>.</li>
<li><a href="https://www.reddit.com/r/UtterlyInteresting/comments/1gfq75j/inside_the_walls_of_mont_saintmichel_france">Inside the walls of Mont Saint-Michel, France.</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Corsica travel bookmarks</title>
<link>https://xenodium.com/corsica-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/corsica-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://thefrenchtouch.quora.com/National-Geographic-Corsica-is-The-Best-Place-in-the-World-to-go-in-2015">National Geographic : Corsica is The Best Place… - The French Touch - Quora</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mozambique travel bookmarks</title>
<link>https://xenodium.com/mozambique-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/mozambique-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://africa.quora.com/Mozambiques-beaches">Mozambique's beaches - Africa is Back - Quora</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>M-r history search in git-commit-mode</title>
<link>https://xenodium.com/m-r-history-search-in-git-commit-mode</link>
<guid isPermaLink="false">https://xenodium.com/m-r-history-search-in-git-commit-mode</guid>
    <description><![CDATA[<p>I've grown accustomed to M-r bindings to search Emacs history. Been wanting similar functionality to search commit message history. Turns out <em>log-edit-comment-ring</em> has some of my local commit message history. Feeding it to <em>completing-read</em> gives me an easily searchable history when using a completing framework like ivy or helm:</p>
<pre><code class="language-{.commonlisp">(defun ar/git-commit-search-message-history ()
  &quot;Search and insert commit message from history.&quot;
  (interactive)
  (insert (completing-read &quot;History: &quot;
                           ;; Remove unnecessary newlines from beginning and end.
                           (mapcar (lambda (text)
                                     (string-trim text))
                                   (ring-elements log-edit-comment-ring)))))
</code></pre>
<p>Now we bind it to <em>M-r</em> and we're good to go:</p>
<pre><code class="language-{.commonlisp">(bind-key &quot;M-r&quot; #'ar/git-commit-search-message-history git-commit-mode-map)
</code></pre>
<p>May also want to persist <em>log-edit-comment-ring</em> across Emacs sessions by adding <em>log-edit-comment-ring</em> to savehist variables. Also ensure <em>savehist-mode</em> is enabled:</p>
<pre><code class="language-{.commonlisp">(add-to-list 'savehist-additional-variables log-edit-comment-ring)
(savehist-mode +1)
</code></pre>
<p><img src="https://xenodium.github.io/images/m-r-history-search-in-git-commit-mode/m-r-commit-history.png" alt=""></p>
]]></description>
    <pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Morning smoothie</title>
<link>https://xenodium.com/morning-smoothie</link>
<guid isPermaLink="false">https://xenodium.com/morning-smoothie</guid>
    <description><![CDATA[<p>Big fan of my morning power smoothie. Best deals I've found so far:</p>
<ul>
<li>Almonds (BuyWholeFoodsOnline.co.uk, <a href="https://www.amazon.co.uk/gp/product/B004XJ72HI">£1.06/100g @ Amazon</a>).</li>
<li>Banana.</li>
<li>Blueberries.</li>
<li>Chia seeds (<a href="https://www.realfoodsource.com/product/whole-natural-dark-chia-seeds/">£4.99/Kg @ Real Food Source</a>).</li>
<li>Cocoa powder (Active foods, <a href="https://www.bulkpowders.co.uk/organic-cacao-powder.html">£ 1.7/100g @ Bulk Powders</a>).</li>
<li>Coconut water (Innocent, <a href="https://www.tesco.com/groceries/en-GB/products/288178112">£0.37/100ml @ Tesco</a>).</li>
<li>Crunchy peanut butter (<a href="https://www.realfoodsource.com/product/peanut-butter/">£ 4.99/Kg @ Real Food Source</a>).</li>
<li>Matcha powder (Active <a href="https://www.bulkpowders.co.uk/matcha-green-tea-powder.html">£6.8/100g @ Bulk Powders</a>).</li>
<li>Strawberries.</li>
</ul>
<p>ps. I have no affiliation to either retailer. Prices may change.</p>
]]></description>
    <pubDate>Thu, 09 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Installing ludget (ledger visualization</title>
<link>https://xenodium.com/installing-ludget-ledger-visualization</link>
<guid isPermaLink="false">https://xenodium.com/installing-ludget-ledger-visualization</guid>
    <description><![CDATA[<p>Needed python3:</p>
<pre><code class="language-{.bash">brew install python3
</code></pre>
<p>Use pip3 to install ludget:</p>
<pre><code class="language-{.bash">pip3 install ludget
</code></pre>
]]></description>
    <pubDate>Wed, 08 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ledger bookmarks</title>
<link>https://xenodium.com/ledger-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ledger-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/adept/full-fledged-hledger">&quot;Full-fledged Hledger&quot; Tutorial (interesting approach with great traceability and regeneration)</a>.</li>
<li><a href="https://github.com/adept/full-fledged-hledger/wiki">&quot;Full-fledged Hledger&quot; Tutorial</a>.</li>
<li><a href="https://www.khanacademy.org/economics-finance-domain/core-finance/accounting-and-financial-stateme">Accounting and financial statements (Khan Academy)</a>.</li>
<li><a href="https://cvillefoss.blog/2019/02/12/accounting-in-plain-text-part-1/">Accounting in Plain Text, Part 1 – cvilleFOSS</a>.</li>
<li><a href="http://matthiaskauer.com/2015/08/command-line-accounting-a-look-at-the-various-ledger-ports/">Command Line Accounting - A look at the various ledger ports (mkauer)</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/46hs9q/conquering_your_finances_with_emacs_and_ledger/">Conquering Your Finances with Emacs and Ledger : emacs</a>.</li>
<li><a href="https://github.com/awalker4/ledgerTalk2016">Conquering your finances with Emacs and Ledger</a>.</li>
<li><a href="https://github.com/ledger/ledger/wiki/CSV-Import">Convert a CSV file (comma separated values) from your bank into ledger format</a>.</li>
<li><a href="https://frdmtoplay.com/envelope-budgeting-with-ledger/">Envelope Budgeting with ledger</a>.</li>
<li><a href="https://github.com/simonmichael/hledger/tree/master/examples/csv">Examples of recent and older CSV rules files for ledger</a>.</li>
<li><a href="https://github.com/adept/full-fledged-hledger">full-fledged-hledger: Tutorial on Hledger setup</a>.</li>
<li><a href="https://github.com/barrucadu/finances">GitHub - barrucadu/finances: A small tool to visualise my hledger journal.</a>.</li>
<li><a href="https://github.com/Clever/csvlint">GitHub - Clever/csvlint: library and command line tool that validates a CSV file</a>.</li>
<li><a href="https://www.reddit.com/r/Bitcoin/comments/155gw5/heres_how_you_use_ledger_to_account_for_bitcoin/">Here's how you use ledger to account for Bitcoin transactions</a>.</li>
<li><a href="https://pauley.org.za/hledger-flow/">Hledger Flow: Step-By-Step</a>.</li>
<li><a href="https://www.reddit.com/r/plaintextaccounting/comments/8b10o0/importing_trans=actions_from_bank/">Importing transactions from bank. : plaintextaccounting (Reddit)</a>.</li>
<li><a href="https://patrickskiba.com/ledger-cli/2019/12/07/introduction-to-ledger-cli.html">Introduction to ledger and text-based accounting | Patrick Skiba</a>.</li>
<li><a href="https://sirodoht.com/blog/introduction-to-plain-text-accounting/">Introduction to plain text accounting (sirodoht blog)</a>.</li>
<li><a href="https://devhints.io/ledger">Ledger CLI cheatsheet</a>.</li>
<li><a href="https://devhints.io/ledger-csv">Ledger CSV format cheatsheet</a>.</li>
<li><a href="https://devhints.io/ledger-examples">Ledger examples cheatsheet</a>.</li>
<li><a href="https://devhints.io/ledger-periods">Ledger periods cheatsheet</a>.</li>
<li><a href="https://felixcrux.com/blog/ledger-practices">Ledger Practices - Felix Crux</a>.</li>
<li><a href="https://devhints.io/ledger-query">Ledger queries cheatsheet</a>.</li>
<li><a href="https://github.com/sheehamj13/ledger-reports">Ledger Report Scripts (tested on macOS Mojave)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=7707262">Ledger, a powerful CLI accounting tool (Hacker News)</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/6a3oxv/ledgerledgermode_tips_and_tricks/">ledger/ledger-mode tips and tricks? (Reddit)</a>.</li>
<li><a href="https://www.ledger-cli.org/3.0/doc/ledger3.html#The-convert-command">Ledger: Command-Line Accounting (convert csv command)</a>.</li>
<li><a href="https://www.ledger-cli.org/3.0/doc/ledger3.html">Ledger: Command-Line Accounting (documentation)</a>.</li>
<li><a href="https://gitlab.com/rjurga/ludget">ludget: ledger-cli data visualization</a>.</li>
<li><a href="https://memo.barrucadu.co.uk/personal-finance.html">Memo's personal Finance post on plain-text accounting</a>.</li>
<li><a href="https://plaintextaccounting.org/#comparisons">Plain Text Accounting, a guide to Ledger and friends - plaintextaccounting.org (comparisons)</a>.</li>
<li><a href="https://plaintextaccounting.org/#data-importconversion">Plain Text Accounting, a guide to Ledger and friends - plaintextaccounting.org (import)</a>.</li>
<li><a href="https://www.petekeen.net/keeping-finances-with-ledger">Program your Finances: Command-line Accounting (Pete Keen)</a>.</li>
<li><a href="https://www.sundialdreams.com/report-scripts-for-ledger-cli-with-gnuplot/">Report Scripts for Ledger CLI with Gnuplot (日光漫想)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17845565">Show HN: Ledger-analytics – Analytics for ledger-cli (Hacker News)</a>.</li>
<li><a href="https://github.com/rememberYou/.emacs.d/blob/a095e0e3e88cd64e6ef5e8062d3215d67ad9e285/config.org#ledger">Terencio's Ledger Emacs config</a>.</li>
<li><a href="https://plaintextproject.online">The Plain Text Project</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/8x4xtt/tip_how_i_use_ledger_to_track_my_money">TIP: How I use ledger to track my money : emacs</a>.</li>
<li><a href="http://rantsideasstuff.com/posts/2018/07/01-tracking-investments-in-lots-with-hledger/">Tracking Investments in Lots with Hledger</a>.</li>
<li><a href="https://www.reddit.com/r/plaintextaccounting/comments/bhxdew/unrealized_gains/">Unrealized gains : plaintextaccounting</a>.</li>
<li><a href="https://emacs.cafe/ledger/emacs/ynab/budgeting/2018/06/12/elbank-ynab.html">Using Ledger for YNAB-like envelope budgeting</a>.</li>
<li><a href="https://memo.barrucadu.co.uk/hledger-influxdb-grafana.html">Visualise your finances with hledger, InfluxDB, and Grafana</a>.</li>
<li><a href="https://www.mint.com/mint-categories">Ways to Categorize Your Spending (Mint)</a>.</li>
<li><a href="https://github.com/ledger/ledger/wiki/Who's-using-ledger%3F">Who's using ledger? · ledger/ledger Wiki</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 08 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Tip: Convert .texi to .info</title>
<link>https://xenodium.com/tip-convert-texi-to-info</link>
<guid isPermaLink="false">https://xenodium.com/tip-convert-texi-to-info</guid>
    <description><![CDATA[<p>Convert with:</p>
<pre><code class="language-{.bash">makeinfo doc.texi
</code></pre>
<p>View with:</p>
<p>Open in Emacs and render as info with:</p>
<pre><code class="language-{.commonlisp">(defun ar/format-info-mode ()
  (interactive)
  (let ((file-name (buffer-file-name)))
    (kill-buffer (current-buffer))
    (info file-name)))
</code></pre>
]]></description>
    <pubDate>Tue, 07 Aug 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Marking 20k emails as read</title>
<link>https://xenodium.com/marking-20k-emails-as-read</link>
<guid isPermaLink="false">https://xenodium.com/marking-20k-emails-as-read</guid>
    <description><![CDATA[<p><a href="http://isync.sourceforge.net/">Mbsync</a> and <a href="https://www.djcbsoftware.nl/code/mu/mu4e.html">mu4e</a> are great for syncing and handling IMAP email. I've now migrated 4 email addresses, including an old Yahoo account.</p>
<p>I wanted to mark all my Yahoo unread emails as read. Yahoo's webmail enables marking 500 emails at a time, making the process a little tedious.</p>
<p><a href="https://groups.google.com/forum/#!forum/mu-discuss">Mu-discuss</a> has a handy <a href="https://groups.google.com/d/msg/mu-discuss/zaA394sH1Ow/QSVPXS22BQAJ">thread</a>, highlighting that moving/renaming synced messages (in your local file system) would do the job. This worked well for me.</p>
<p>Let's do just that…</p>
<p><strong>WARNING:</strong> Copy a small sample of your mails to a separate directory and run some trials until you feel comfortable.</p>
<p>Find your mail directory.</p>
<pre><code class="language-{.bash">cd path/to/mail
</code></pre>
<p>Peek at the messages you'd like to mark unread:</p>
<pre><code class="language-{.bash">ls -1 new/
</code></pre>
<p>Rename message files by appending &quot;S&quot; to their filename and moving from new/ to cur/ directory.</p>
<pre><code class="language-{.bash">for FILE in new/*; do mv &quot;${FILE}&quot; cur/$(basename &quot;${FILE}&quot;)S; done;
</code></pre>
<p>We can verify the move.</p>
<pre><code class="language-{.bash">ls -1 cur/
</code></pre>
<p>Let's sync the local changes.</p>
<pre><code class="language-{.bash">mbsync -Va
</code></pre>
<p>…and we're done ;)</p>
]]></description>
    <pubDate>Wed, 25 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Show iOS simulator touches</title>
<link>https://xenodium.com/show-ios-simulator-touches</link>
<guid isPermaLink="false">https://xenodium.com/show-ios-simulator-touches</guid>
    <description><![CDATA[<p>TIL from <a href="https://twitter.com/liamnichols_/status/1018812142693253120?s=12">this tweet</a>, that you can enable showing touches on iOS simulator. This is handy for making nicer screencasts.</p>
<pre><code class="language-{.bash">defaults write http://com.apple .iphonesimulator ShowSingleTouches 1
</code></pre>
]]></description>
    <pubDate>Tue, 24 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Amsterdam travel bookmarks</title>
<link>https://xenodium.com/amsterdam-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/amsterdam-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://belowthesurface.amsterdam/en/">Below the Surface: The archaeological finds of the North / Southline in Amsterdam</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 15 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hardware bookmarks</title>
<link>https://xenodium.com/hardware-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/hardware-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.romanzolotarev.com/setup.html">Roman Zolotarev's OpenBSD on my fanless desktop computer (really sweet setup)</a>.</li>
<li><a href="https://michael.stapelberg.ch/posts/2020-05-23-desk-setup/">stapelberg uses this: my 2020 desk setup</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 14 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>fitbit API, org babel, and gnuplot</title>
<link>https://xenodium.com/fitbit-api-org-babel-and-gnuplot</link>
<guid isPermaLink="false">https://xenodium.com/fitbit-api-org-babel-and-gnuplot</guid>
    <description><![CDATA[<p>Retook running recently. Took the dust off my aria scale and used the opportunity to check out fitbit's API.</p>
<p>First register your app at <a href="https://dev.fitbit.com/apps/new">dev.fitbit.com/apps/new</a> and get a client_id=AABBCC.</p>
<p><img src="https://xenodium.github.io/images/fitbit-api-org-babel-and-gnuplot/fitbitapp.png" alt=""></p>
<p>You'll also need your USER_ID, from your Fitbitx user profile.</p>
<p><img src="https://xenodium.github.io/images/fitbit-api-org-babel-and-gnuplot/fitbituser.png" alt=""></p>
<p>We'll also need a token. I used the <a href="https://dev.fitbit.com/build/reference/web-api/oauth2/">implicit grant flow</a> URL in my browser and extracted access_token=TOKEN.</p>
<p>Now let's wire up two org source blocks to fetch the data and subsequently plot using gnuplot.</p>
<p>It's pretty neat. You can take the output from one source block and use it as input to another.</p>
<p>We use curl to fetch data from fitbit's API and pipe through <a href="https://stedolan.github.io/jq/">jq</a> and sed to massage the output format into two columns.</p>
<p><strong>Note:</strong> Before using gnuplot in org babel, you'll need to install the gnuplot package and add to babel languages.</p>
<pre><code class="language-{.commonlisp">(use-package gnuplot :ensure t)

(use-package ob
  :config
  (org-babel-do-load-languages
   'org-babel-load-languages
   '((gnuplot . t))))
</code></pre>
<pre><code class="language-{#weight-data">curl -s -H &quot;Authorization: Bearer TOKEN&quot; https://api.fitbit.com/1/user/USER_ID/body/weight/date/2018-06-09/2018-07-11.json | jq '.[][] | &quot;\(.dateTime) \(.value)&quot;' | sed 's/&quot;//g'
</code></pre>
<hr>
<p>2018-06-09   65.753
2018-06-10   65.762
2018-06-11   65.771
2018-06-12   65.78
2018-06-13   65.789
2018-06-14   65.798
2018-06-15   65.807
2018-06-16   65.816
2018-06-17   65.825
2018-06-18   65.85
2018-06-19   65.96
2018-06-20   64.1
2018-06-21   65.64
2018-06-22   65.47
2018-06-23   65.515
2018-06-24   65.56
2018-06-25   65.605
2018-06-26   65.65
2018-06-27   65.18
2018-06-28   64.49
2018-06-29   64.49
2018-06-30   64.41
2018-07-01   64.33
2018-07-02   64.25
2018-07-03   64.17
2018-07-04   64.55
2018-07-05   64.39
2018-07-06   64.33
2018-07-07   65.06
2018-07-08   63.28
2018-07-09   63.4
2018-07-10   64.22
2018-07-11   63.95</p>
<hr>
<p>Now feed the two column data to gnuplot.</p>
<pre><code class="language-{.gnuplot">reset
set title &quot;My recent weight&quot;
set xdata time
set timefmt '%Y-%m-%d'
set format x &quot;%d/%m/%y&quot;
set term png
set xrange ['2018-06-09':'2018-07-11']
plot data u 1:2 with linespoints title 'Weight in Kg'
</code></pre>
<p><img src="https://xenodium.github.io/images/fitbit-api-org-babel-and-gnuplot/weight.png" alt=""></p>
<p>Fetching data and plotting through org babel and gnuplot is pretty sweet. I've barely scratched the surface. There's more at <a href="https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-gnuplot.html">Org-babel-gnuplot</a> and <a href="https://orgmode.org/worg/org-tutorials/org-plot.html">Plotting tables in Org-Mode using org-plot</a>. Either way, this is another Emacs super power to keep in the toolbox.</p>
]]></description>
    <pubDate>Wed, 11 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>PIPESTATUS for all return codes</title>
<link>https://xenodium.com/pipestatus-for-all-return-codes</link>
<guid isPermaLink="false">https://xenodium.com/pipestatus-for-all-return-codes</guid>
    <description><![CDATA[<p>From <a href="https://twitter.com/saruspete">@saruspete</a>'s <a href="https://twitter.com/saruspete/status/1014801074794979335?s=12">tweet</a>, ${PIPESTATUS[@]} gives ya all piped commands' return codes:</p>
<pre><code class="language-{.bash">echo foo | grep bar | tr z a | cat
echo ${PIPESTATUS[@]}
</code></pre>
]]></description>
    <pubDate>Sun, 08 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs utilities for your OS</title>
<link>https://xenodium.com/emacs-utilities-for-your-os</link>
<guid isPermaLink="false">https://xenodium.com/emacs-utilities-for-your-os</guid>
    <description><![CDATA[<p>Narrowing utilities are a wonderful way of increasing productivity. I have a few workflows using Emacs's <a href="https://github.com/emacs-helm/helm">Helm</a> framework.</p>
<p>There are great productivity boosters like <a href="https://www.alfredapp.com/">Alfred</a> and <a href="https://qsapp.com/">Quicksilver</a> for macOS, with batteries included.</p>
<p>If you're a tinkerer, you'd enjoy the powerful <a href="http://hammerspoon.org/">Hammerspoon</a>. Like elisp gluing all things Emacs, Hammerspoon uses Lua to glue all things macOS. You can build your own narrowing utilities using <a href="http://www.hammerspoon.org/docs/hs.chooser.html">chooser</a> and a little Lua.</p>
<pre><code>local chooser = hs.chooser.new(function(choice)
      hs.alert.show(choice['text'])
end)

chooser:choices({
      {
         [&quot;text&quot;] = &quot;Alfred\n&quot;,
         [&quot;subText&quot;] = &quot;macOS only\n&quot;,
      },
      {
         [&quot;text&quot;] = &quot;Quicksilver\n&quot;,
         [&quot;subText&quot;] = &quot;macOS only\n&quot;,
      },
      {
         [&quot;text&quot;] = &quot;Hammerspoon\n&quot;,
         [&quot;subText&quot;] = &quot;macOS only\n&quot;,
      },
      {
         [&quot;text&quot;] = &quot;Emacs\n&quot;,
         [&quot;subText&quot;] = &quot;is everywhere :)\n&quot;,
      },
})
chooser:show()
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-utilities-for-your-os/chooser.png" alt=""></p>
<p>Howard Abrams's post on <a href="http://howardism.org/Technical/Emacs/capturing-content.html">Capturing Content for Emacs</a> inspired me to look at gluing Emacs and macOS to launch my own cross-platform narrowing utilities.</p>
<p>I've also taken this opportunity to look at Oleh Krehel's wonderful completion package: <a href="https://github.com/abo-abo/swiper">Ivy</a>. We can use it to build a macOS narrowing utility.</p>
<p>Ivy is remarkably easy to use. Turns out, <a href="http://oremacs.com/swiper/#api">ivy-read</a> is all you need. A simple Emacs completion can be accomplished with little elisp.</p>
<pre><code class="language-{.commonlisp">(ivy-read &quot;Hello ivy: &quot;
          '(&quot;One &quot;
            &quot;Two &quot;
            &quot;Three &quot;
            &quot;Four &quot;))
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-utilities-for-your-os/simple_ivy.png" alt=""></p>
<p>Pretty nifty. Let's make this completion more accessible from the rest of the OS. To do so, we create a separate Emacs frame and make it pretty. We also want it to interact with the OS. We'll use <em>ivy-read</em>'s <em>:action</em> to invoke a tiny bit of AppleScript.</p>
<p>Oh and we'll also use some funny quotes to tease ourselves about our beloved editor.</p>
<pre><code class="language-{.commonlisp">(with-current-buffer (get-buffer-create &quot;*modal-ivy*&quot;)
  (let ((frame (make-frame '((auto-raise . t)
                             (background-color . &quot;DeepSkyBlue3&quot;)
                             (cursor-color . &quot;MediumPurple1&quot;)
                             (font . &quot;Menlo 15&quot;)
                             (foreground-color . &quot;#eeeeec&quot;)
                             (height . 20)
                             (internal-border-width . 20)
                             (left . 0.33)
                             (left-fringe . 0)
                             (line-spacing . 3)
                             (menu-bar-lines . 0)
                             (minibuffer . only)
                             (right-fringe . 0)
                             (tool-bar-lines . 0)
                             (top . 48)
                             (undecorated . t)
                             (unsplittable . t)
                             (vertical-scroll-bars . nil)
                             (width . 110)))))
    (set-face-attribute 'ivy-minibuffer-match-face-1 frame
                        :background nil
                        :foreground nil)
    (set-face-attribute 'ivy-minibuffer-match-face-2 frame
                        :background nil
                        :foreground &quot;orange1&quot;)
    (set-face-attribute 'ivy-minibuffer-match-face-3 frame
                        :background nil
                        :foreground &quot;orange1&quot;)
    (set-face-attribute 'ivy-minibuffer-match-face-4 frame
                        :background nil
                        :foreground &quot;orange1&quot;)
    (set-face-attribute 'ivy-current-match frame
                        :background &quot;#ffc911&quot;
                        :foreground &quot;red&quot;)
    (set-face-attribute 'minibuffer-prompt frame
                        :foreground &quot;grey&quot;)
    (let ((ivy-height 20)
          (ivy-count-format &quot;&quot;))
      (ivy-read &quot;Emacs acronyms: &quot;
                '(&quot; Emacs: Escape-Meta-Alt-Control-Shift &quot;
                  &quot; Emacs: Eight Megabytes And Constantly Swapping &quot;
                  &quot; Emacs: Even a Master of Arts Comes Simpler &quot;
                  &quot; Emacs: Each Manual's Audience is Completely Stupified &quot;
                  &quot; Emacs: Eventually Munches All Computer Storage &quot;
                  &quot; Emacs: Eradication of Memory Accomplished with Complete Simplicity &quot;
                  &quot; Emacs: Easily Maintained with the Assistance of Chemical Solutions &quot;
                  &quot; Emacs: Extended Macros Are Considered Superfluous &quot;
                  &quot; Emacs: Every Mode Accelerates Creation of Software &quot;
                  &quot; Emacs: Elsewhere Maybe All Commands are Simple &quot;
                  &quot; Emacs: Emacs Makes All Computing Simple &quot;
                  &quot; Emacs: Emacs Masquerades As Comfortable Shell &quot;
                  &quot; Emacs: Emacs My Alternative Computer Story &quot;
                  &quot; Emacs: Emacs Made Almost Completely Screwed &quot;
                  &quot; Emacs: Each Mail A Continued Surprise &quot;
                  &quot; Emacs: Eating Memory And Cycle-Sucking &quot;
                  &quot; Emacs: Elvis Masterminds All Computer Software &quot;
                  &quot; Emacs: Emacs Makes A Computer Slow&quot; )
                :action (lambda (funny-quote)
                          (async-shell-command (format &quot;osascript -e 'tell app \&quot;System Events\&quot; to display dialog \&quot;%s\&quot; buttons {\&quot;OK\&quot;}'&quot; funny-quote)))
                :unwind (lambda ()
                          (shell-command &quot;/Applications/Hammerspoon.app/Contents/Resources/extensions/hs/ipc/bin/hs -c 'backFromEmacs()'&quot;)
                          (delete-frame)
                          (other-window 1))))))
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-utilities-for-your-os/ivy_frame.gif" alt=""></p>
<p>So where's all this going? I wrote a utility to extract all links from <a href="https://raw.githubusercontent.com/xenodium/xenodium.github.io/master/index.org">this page's org file</a> and make them easily searchable from anywhere on macOS by invoking <strong>⌥-W</strong>.</p>
<p>The keys are bound using Lua, Hammerspoon, and emacsclient. This works well on macOS, but there are alternatives for other operating systems.</p>
<pre><code>hs.execute(&quot;emacsclient -ne \&quot;&quot;..elisp..&quot;\&quot; -s /tmp/emacs*/server&quot;)
</code></pre>
<p>Here's the resulting utility in action:</p>
<p><img src="https://xenodium.github.io/images/emacs-utilities-for-your-os/ivy_links.gif" alt=""></p>
<p>These integrations look promising. They enable me to bring cross-platform Emacs utilities into areas I hadn't considered.</p>
]]></description>
    <pubDate>Sat, 07 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Web serving tools bookmarks</title>
<link>https://xenodium.com/web-serving-tools-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/web-serving-tools-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://certbot.eff.org/">Certbot: Automatically enable HTTPS on your website, deploying Let's Encrypt certificates</a>.</li>
<li><a href="https://www.timdoug.com/log/2018/08/04/#wireguard_macos">How to configure WireGuard to tunnel traffic from a macOS client through a Debian server with IPv4 and IPv6</a>.</li>
<li><a href="http://irreal.org/blog/?p=7306">HTTPS Is Easy (Irreal)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17689188">I made my own WireGuard VPN server (Hacker News)</a>.</li>
<li><a href="https://jsonapi.org/">JSON:API — A specification for building APIs in JSON</a>.</li>
<li><a href="https://mirage.io/">MirageOS: high-performance network applications across a variety of cloud computing and mobile platforms</a>.</li>
<li><a href="https://nginxconfig.io/">nginxconfig.io</a>.</li>
<li><a href="https://alex.dzyoba.com/blog/nginx-features-for-developers/">Nice nginx features for developers | There is no magic here</a>.</li>
<li><a href="https://idiallo.com/blog/handling-1-million-web-request">Poor man's way of handling 1.3 million web request</a>.</li>
<li><a href="https://www.getpostman.com/">Postman (API Development Environment)</a>.</li>
<li><a href="https://tools.suckless.org/quark/">quark: an extremely small and simple HTTP GET/HEAD-only web server for static content (suckless.org tools)</a>.</li>
<li><a href="https://github.com/pirate/wireguard-docs">The Missing Wireguard Documentation</a>.</li>
<li><a href="https://dev.to/ghardin137/web-authentication-for-actual-humans-part-two-ea6">Web Authentication for Actual Humans, Part Two - DEV Community</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 01 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>URL shortener bookmarks</title>
<link>https://xenodium.com/url-shortener-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/url-shortener-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/kellegous/go">go: Another Google-like Go short link service</a>.</li>
<li><a href="https://github.com/issmirnov/zap">zap: Blazing fast web shortcuts</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 24 Jun 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trying out mu4e with mbsync</title>
<link>https://xenodium.com/trying-out-mu4e-with-mbsync</link>
<guid isPermaLink="false">https://xenodium.com/trying-out-mu4e-with-mbsync</guid>
    <description><![CDATA[<p>The email fun in Emacs continues. After a few weeks since I <a href="#trying-out-mu4e-and-offlineimap">started using mu4e and offlineimap</a>, I'm sold. Both are awesome. <a href="http://isync.sourceforge.net/mbsync.html">Mbsync</a> is an <a href="http://www.offlineimap.org/">offlineimap</a> alternative. Despite resyncing all my mail, the transition was fairly smooth. Here's how…</p>
<h2>Install isync (for mbsync)</h2>
<pre><code class="language-{.bash">brew install isync
</code></pre>
<h2>Configure mbsync</h2>
<p>Mbsync uses <code>~/.mbsyncrc</code> for configuration. Migrating <a href="#trying-out-mu4e-and-offlineimap">~/.offlineimaprc</a> to <code>~/.mbsyncrc</code> looks like:</p>
<pre><code class="language-conf">IMAPAccount Personal
Host some.imap.host.com
User your_user_name
PassCmd &quot;gpg --quiet --batch -d ~/.offlineimap_accountname.gpg&quot;
Port 993
SSLType IMAPS
AuthMechs Login
CertificateFile  ~/.offlineimapcerts.pem
# My IMAP provider doesn't handle concurrent IMAP commands.
PipelineDepth 1

IMAPStore Personal-remote
Account Personal

MaildirStore Personal-local
Path ~/IMAP/Personal/
Inbox ~/IMAP/Personal/INBOX

Channel Personal
Master :Personal-remote:
Slave :Personal-local:
Patterns *
Create Slave
Sync All
Expunge Both
SyncState *
</code></pre>
<h2>No concurrent IMAP commands supported</h2>
<p>My IMAP provider doesn't handle concurrent IMAP commands. <a href="https://kdecherf.com/blog/2017/05/01/mbsync-and-office-365/">mbsync and Office 365</a> had the answer:</p>
<pre><code class="language-conf">PipelineDepth 1
</code></pre>
<h2>Initial sync</h2>
<p>Run initial from the command line sync:</p>
<pre><code class="language-{.bash">mbsync -Va
</code></pre>
<p>While syncing my largest inbox, it sometimes received an unexpected EOF error:</p>
<pre><code>IMAP error: unexpected EOF from some.imap.host.com (1.2.3.4:993)
</code></pre>
<p>First few times, I restarted the syncing manually, but then used a loop to automatically restart it.</p>
<p>Bash loops:</p>
<pre><code class="language-{.bash">while true; do mbsync -V Personal; sleep 5; done
</code></pre>
<pre><code class="language-{.bash">for i in {1..5}; do mbsync -V Personal; sleep 5; done
</code></pre>
<p>Eshell loop:</p>
<pre><code class="language-{.bash">for i in (number-sequence 1 10) {mbsync -V Personal; sleep 5}
</code></pre>
<h2>Create mu index</h2>
<p>Reindex using mu, but first remove existing index for offlineimap messages:</p>
<pre><code class="language-{.bash">rm -rf ~/.mu
</code></pre>
<p>Ok, do index now:</p>
<pre><code class="language-{.bash">mu index --maildir=~/IMAP
</code></pre>
<h2>Mu4e tweaks</h2>
<p>The <em>get mail</em> command should now point to mbsync.</p>
<pre><code class="language-{.commonlisp">(csetq mu4e-get-mail-command &quot;mbsync -Va&quot;)
</code></pre>
<p>I had issues with duplicate IDs after moving and deleting messages from mu4e. <a href="http://pragmaticemacs.com/emacs/migrating-from-offlineimap-to-mbsync-for-mu4e/">Migrating from offlineimap to mbsync for mu4e</a> had the answer:</p>
<pre><code class="language-{.commonlisp">(csetq mu4e-change-filenames-when-moving t)
</code></pre>
<h2>Helpful references</h2>
<ul>
<li><a href="https://webgefrickel.de/blog/a-modern-mutt-setup">A modern mutt setup with neomutt, mbsync, msmtp and mu — part one | webgefrickel</a>.</li>
<li><a href="http://pragmaticemacs.com/emacs/migrating-from-offlineimap-to-mbsync-for-mu4e/">Migrating from offlineimap to mbsync for mu4e | Pragmatic Emacs</a>.</li>
<li><a href="https://copyninja.info/blog/email_setup.html">My personal Email setup - Notmuch, mbsync, postfix and dovecot</a>.</li>
<li><a href="https://github.com/jeremy-compostella/org-msg/blob/master/README.org">org-msg: Compose and reply to emails in a Outlook HTML friendly style</a>.</li>
<li><a href="http://www.ict4g.net/adolfo/notes/2014/12/27/EmacsIMAP.html">Reading IMAP Mail in Emacs on OSX</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 17 Jun 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sticky function keys on touch bar</title>
<link>https://xenodium.com/sticky-function-keys-on-touch-bar</link>
<guid isPermaLink="false">https://xenodium.com/sticky-function-keys-on-touch-bar</guid>
    <description><![CDATA[<p>Visible (and sticky) function keys are not the touch bar default for Emacs. Let's change that:</p>
<p><img src="https://xenodium.github.io/images/sticky-function-keys-on-touch-bar/touchbar_function_keys.png" alt=""></p>
]]></description>
    <pubDate>Fri, 15 Jun 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>GNU find on macOS</title>
<link>https://xenodium.com/gnu-find-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/gnu-find-on-macos</guid>
    <description><![CDATA[<p>At times, you may need GNU versions of command line utilities on macOS. For example, GNU find.</p>
<p>As usual, Homebrew saves the day. Install with:</p>
<pre><code class="language-{.bash">brew install findutils
</code></pre>
<p>Unless you install with –with-default-names (I don't), GNU utilities will be prefixed with a &quot;g&quot;.</p>
<pre><code class="language-{.bash">gfind --version
</code></pre>
<p>If you need more, there are others:</p>
<pre><code class="language-{.bash">brew install binutils
brew install diffutils
brew install ed
brew install findutils
brew install gawk
brew install gnu-indent
brew install gnu-sed
brew install gnu-tar
brew install gnu-which
brew install gnutls
brew install grep
brew install gzip
brew install screen
brew install watch
brew install wdiff --with-gettext
brew install wget
</code></pre>
]]></description>
    <pubDate>Wed, 13 Jun 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>PlantUML bookmarks</title>
<link>https://xenodium.com/plantuml-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/plantuml-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://scripter.co/notes/plantuml">Collection of PlantUML snippets from Scripter.co</a>.</li>
<li><a href="https://real-world-plantuml.com/">Real World PlantUML</a>.</li>
<li><a href="https://crashedmind.github.io/PlantUMLHitchhikersGuide/">Welcome to The Hitchhiker’s Guide to PlantUML!</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 13 Jun 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Adding mu4e maildirs extension</title>
<link>https://xenodium.com/adding-mu4e-maildirs-extension</link>
<guid isPermaLink="false">https://xenodium.com/adding-mu4e-maildirs-extension</guid>
    <description><![CDATA[<p>Continuing the mu4e fun, added mu4e-maildirs-extension to display a mail dirs summary.</p>
<p><img src="https://xenodium.github.io/images/adding-mu4e-maildirs-extension/mu4e_maildirs_extension.png" alt=""></p>
]]></description>
    <pubDate>Tue, 29 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trying out mu4e and offlineimap</title>
<link>https://xenodium.com/trying-out-mu4e-and-offlineimap</link>
<guid isPermaLink="false">https://xenodium.com/trying-out-mu4e-and-offlineimap</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/trying-out-mu4e-and-offlineimap/mu4e.png" alt=""></p>
<p>Managing Email from Emacs. Surely that's crazy-talk, but hey… let's give it a try.</p>
<h2>Install offlineimap</h2>
<p>Need to sync via imap. Use offlineimap. I'm on macOS, so homebrew is king for installing:</p>
<pre><code class="language-{.bash">brew install offlineimap
</code></pre>
<p>Before can configure offlineimap, we'll need to handle a few things first.</p>
<h2>Get a cert fingerprint</h2>
<p>Use openssl for getting a certificate fingerprint. From offlineimap's <a href="http://www.offlineimap.org/doc/FAQ.html#view-the-fingerprint">FAQ:</a></p>
<pre><code class="language-{.bash">SSL_CERT_DIR=&quot;&quot; openssl s_client -connect imap.migadu.com:993 &lt; /dev/null 2&gt;/dev/null | openssl x509 -fingerprint -noout -text -in /dev/stdin
</code></pre>
<p>Should give you something like:</p>
<blockquote>
<p>SHA1 Fingerprint=AA:BB:CC:DD:EE:DD:FF:AA:00:AA:2A:AA:AA:AA:A8:20:80:AA:A2:AA</p>
</blockquote>
<h2>Encrypt password</h2>
<p>Offlineimap can read passwords in plain text in its .offlineimaprc config file, but that's yuckie. Let's encrypt the password and use gnupg for that. Install it:</p>
<pre><code class="language-{.bash">brew install gnupg
</code></pre>
<p>If you haven't already, generate a key</p>
<pre><code class="language-{.bash">gpg --full-gen-key
</code></pre>
<p>Generate an offlineimap account password file.</p>
<pre><code class="language-{.bash">echo &quot;YourPassword&quot; | gpg --encrypt --recipient &quot;Your Name&quot; -o ~/.offlineimap_accountname.gpg
</code></pre>
<h2>Python password wrapper</h2>
<p>Based on Fabian's <a href="https://f-koehler.github.io/posts/2015-03-17-offlineimap-msmtp-gnupg.html">Encrypt OfflineIMAP and msmtp password with GnuPG</a>, I created ~/.read_password.py with:</p>
<pre><code class="language-python">import os
import subprocess

def read_password(path):
  return subprocess.check_output([&quot;gpg\n&quot;, &quot;--quiet\n&quot;, &quot;--batch\n&quot;, &quot;-d\n&quot;, os.path.expanduser(path)]).strip()
</code></pre>
<p>ps. Alternatively, see <a href="http://stevelosh.com/blog/2012/10/the-homely-mutt/#retrieving-passwords">The homely Mutt</a>'s section to store password in macOS's keychain.</p>
<h2>Configure offlineimap</h2>
<p>Offlineimap uses ~/.offlineimaprc for configuration. We now have all we need to put the configuration together:</p>
<pre><code class="language-conf">[general]
accounts = Personal

# Load this python file.
pythonfile = ~/.read_password.py

[Account Personal]
localrepository = Personal-Local

remoterepository = Personal-Remote

# After syncing, let mu index it.
postsynchook = mu index --maildir ~/stuff/active/Mail

# Sync imap every 5 minutes.
autorefresh = 5

# Alternate between 10 quick syncs and full syncs.
quick = 10

[Repository Personal-Local]
type = Maildir
localfolders = ~/stuff/active/Mail/Personal

[Repository Personal-Remote]
type = IMAP
remotehost = some.imap.host.com
remoteuser = your_user_name

# Use function defined in .read_password.py to read the password.
remotepasseval = read_password(&quot;~/.offlineimap_personal_account_password.gpg&quot;)

# Use the SHA1 fingerprint retrieved with openssl.
cert_fingerprint = aabbccddeeddffaa00aa2aaaaaaaa82080aaa2aa
</code></pre>
<h3>Cert file</h3>
<p>You can use macOS's certificates from Keychain Access -&gt; System Roots -&gt; Certificates, select all, and ⌘-⇧-e (for export items). Save to ~/certs.pem and use offlineimap configutation:</p>
<blockquote>
<p>sslcacertfile = /path/to/certs.pem</p>
</blockquote>
<p>Another option is executing lib/mk-ca-bundle.pl from curl's tarball to generate ca-bundle.crt, using certdata.txt from Mozilla's source tree.</p>
<h2>Install mu4e</h2>
<p>Manually modified mu4e recipe to pick up my Emacs binary. TIL about homebrew's edit command:</p>
<pre><code class="language-{.bash">brew edit mu
</code></pre>
<p>Changed the one line:</p>
<blockquote>
<ul>
<li>ENV[&quot;EMACS&quot;] = &quot;no&quot; if build.without? &quot;emacs&quot;</li>
<li>ENV[&quot;EMACS&quot;] = &quot;/Users/alvaro/homebrew/Cellar/emacs-plus/26.1-rc1_2/bin/emacs&quot;</li>
</ul>
</blockquote>
<p>Finally installed mu4e:</p>
<pre><code class="language-{.bash">brew install mu
</code></pre>
<h2>Configure mu4e</h2>
<p>Lastly, configure mu4e:</p>
<pre><code class="language-{.commonlisp">(add-to-list 'load-path
             (expand-file-name &quot;~/homebrew/share/emacs/site-lisp/mu/mu4e&quot;))
(use-package mu4e
  :config
  ;; Update mail using 'U' in main view:
  (setq mu4e-get-mail-command &quot;offlineimap&quot;)
  (setq mu4e-view-show-addresses t)
  (setq mu4e-attachment-dir (expand-file-name &quot;~/Downloads/&quot;))
  (setq mu4e-maildir &quot;path/to/Mail&quot;)
  (setq mu4e-html2text-command &quot;w3m -T text/html&quot;) ;; alternatively &quot;textutil -stdin -format html -convert txt -stdout&quot;
  (setq mu4e-user-mail-address-list '(&quot;myself@domain1.com&quot;
                                      &quot;myself@domain2.com&quot;))
  (setq mu4e-context-policy 'pick-first)
  (setq mu4e-compose-context-policy 'always-ask)
  (setq mu4e-contexts
        (list
         (make-mu4e-context
          :name &quot;domain1&quot;
          :enter-func (lambda () (mu4e-message &quot;Entering context myself@domain1.com&quot;))
          :leave-func (lambda () (mu4e-message &quot;Leaving context myself@domain1.com&quot;))
          :match-func (lambda (msg)
                        (when msg
                          (mu4e-message-contact-field-matches
                           msg '(:from :to :cc :bcc) &quot;myself@domain1.com&quot;)))
          :vars '((user-mail-address . &quot;myself@domain1.com&quot;)
                  (user-full-name . &quot;My name&quot;)
                  (mu4e-sent-folder . &quot;/Domain1/Sent&quot;)
                  (mu4e-drafts-folder . &quot;/Domain1/Drafts&quot;)
                  (mu4e-trash-folder . &quot;/Domain1/Trash&quot;)
                  (mu4e-compose-signature . nil)
                  (mu4e-compose-format-flowed . nil)
                  (smtpmail-smtp-user . &quot;myself@domain1.com&quot;)
                  (smtpmail-smtp-server . &quot;smtp.domain1.com&quot;)
                  (smtpmail-smtp-service . 587)))
         (make-mu4e-context
          :name &quot;domain2&quot;
          :enter-func (lambda () (mu4e-message &quot;Entering context myself@domain2.com&quot;))
          :leave-func (lambda () (mu4e-message &quot;Leaving context myself@domain2.com&quot;))
          :match-func (lambda (msg)
                        (when msg
                          (mu4e-message-contact-field-matches
                           msg '(:from :to :cc :bcc) &quot;myself@domain2.com&quot;)))
          :vars '((user-mail-address . &quot;myself@domain2.com&quot;)
                  (user-full-name . &quot;My name&quot;)
                  (mu4e-sent-folder . &quot;/Domain2/Sent&quot;)
                  (mu4e-drafts-folder . &quot;/Domain2/Drafts&quot;)
                  (mu4e-trash-folder . &quot;/Domain2/Trash&quot;)
                  (mu4e-compose-signature . nil)
                  (mu4e-compose-format-flowed . nil)
                  (smtpmail-smtp-user . &quot;myself@domain2.com&quot;)
                  (smtpmail-smtp-server . &quot;smtp.domain2.com&quot;)
                  (smtpmail-smtp-service . 587))))))

(use-package smtpmail
  :config
  (setq smtpmail-stream-type 'starttls)
  (setq smtpmail-debug-info t)
  (setq smtpmail-warn-about-unknown-extensions t)
  (setq smtpmail-queue-mail t)
  (setq smtpmail-default-smtp-server nil)
  ;; Created with mu mkdir path/to/Mail/queue
  ;; Also avoid indexing.
  ;; touch path/to/Mail/queue/.noindex
  (setq smtpmail-queue-dir &quot;path/to/Mail/queue/cur&quot;))

(use-package message
  :config
  (setq message-send-mail-function 'smtpmail-send-it))
</code></pre>
<h2>Authinfo</h2>
<p>Create an ~/.authinfo file for sendmail authentication with:</p>
<pre><code>machine smtp.host1.com login account1@host1.com password somepassword1
machine smtp.host2.com login account2@host2.com password somepassword2
</code></pre>
<p>Encrypt ~/.authinfo with M-x epa-encrypt-file. Keep ~/.authinfo.gpg and delete ~/.authinfo.</p>
<h2>Mu4e helpful references</h2>
<ul>
<li><a href="http://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and-">A Complete Guide to Email in Emacs using Mu and Mu4e</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/5fkq7r/a_year_with_notmuch_mail_a_superfast_email_client/">A year with Notmuch mail - a super-fast email client available on Emacs</a>.</li>
<li><a href="https://dev.to/shrysr/archaic-text-based-email-clients-rock-3flm">Archaic: text based email clients rock - DEV Community (lots of great links)</a>.</li>
<li><a href="https://gist.github.com/areina/3879626">areina's Manage your email in emacs with mu4e</a>.</li>
<li><a href="https://notanumber.io/2016-10-03/better-email-with-mu4e/">Better Email with mu4e (NaN)</a>.</li>
<li><a href="https://vxlabs.com/2014/06/06/configuring-emacs-mu4e-with-nullmailer-offlineimap-and-multiple-identities/">Configuring Emacs mu4e with nullmailer, offlineimap and multiple identities</a>.</li>
<li><a href="http://www.macs.hw.ac.uk/~rs46/posts/2014-01-13-mu4e-email-client.html">Drowning in Email; mu4e to the Rescue</a>.</li>
<li><a href="https://ebzzry.io/en/emacs-mail/">Ebzzry: Setting up Mail in Emacs</a>.</li>
<li><a href="http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx">Emacs as email client with offlineimap and mu4e on OS X</a>.</li>
<li><a href="https://zmalltalker.com/linux/mu.html">Email done right (mu)</a>.</li>
<li><a href="https://f-koehler.github.io/posts/2015-03-17-offlineimap-msmtp-gnupg.html">Encrypt OfflineIMAP and msmtp password with GnuPG</a>.</li>
<li><a href="https://etienne.depar.is/emacs.d/mu4e.html">Etienne's Mu4e customization</a>.</li>
<li><a href="https://github.com/OfflineIMAP/imapfw">GitHub - OfflineIMAP/imapfw: imapfw (IMAP/mail framework)</a>.</li>
<li><a href="https://github.com/kensanata/ggg">Gmail Gnus GPG Guide (GGGG)</a>.</li>
<li><a href="https://martinralbrecht.wordpress.com/2016/05/30/handling-email-with-emacs/">Handling Email with Emacs</a> (helm included).</li>
<li><a href="https://www.reddit.com/r/emacs/comments/5hfcid/i_got_mu4e_working/">I got mu4e working! (Reddit)</a>.</li>
<li><a href="https://blog.danielgempesaw.com/post/43467552978/installing-mu-and-mu4e-with-homebrew-with-emacs">Installing mu and mu4e with homebrew with emacs</a>.</li>
<li><a href="https://github.com/iqbalansari/dotEmacs/blob/master/config/mail.org">Iqbal Ansari's mail config</a>.</li>
<li><a href="https://github.com/iqbalansari/dotEmacs/blob/master/config/mail.org">iqbalansari/dotEmacs: calendar integration</a>.</li>
<li><a href="https://jherrlin.github.io/posts/emacs-mu4e/">Mail in Emacs with mu4e and mbsync (jherrlin)</a>.</li>
<li><a href="http://pragmaticemacs.com/emacs/master-your-inbox-with-mu4e-and-org-mode/">Master your inbox with mu4e and org-mode</a>.</li>
<li><a href="https://github.com/djcb/mu">Mu's github mirror</a>.</li>
<li><a href="http://www.djcbsoftware.nl/code/mu">Mu's page</a>.</li>
<li><a href="http://wenshanren.org/?p=111">mu4e: an E-mail Client for Emacs</a>.</li>
<li><a href="https://github.com/danielfleischer/mu4easy">mu4easy: mu4e + mbsync configuration for multiple accounts.</a>.</li>
<li><a href="http://rudolfochrist.github.io/blog/2015/03/21/offlineimap-with-ssl-files-on-osx/">OfflineIMAP with SSL files on OSX - Sebastian Christ</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=14221501">OfflineIMAP: sync and backup tool for IMAP (Hacker News) and mbsync in comments</a>.</li>
<li><a href="https://github.com/redguardtoo/mastering-emacs-in-one-year-guide/blob/master/gnus-guide-en.org">Practical guide to use Gnus with Gmail</a>.</li>
<li><a href="http://pragmaticemacs.com/mu4e-tutorials/">Pragmatic Emacs's mu4e tutorials</a>.</li>
<li><a href="http://prodissues.com/2016/02/adding-mu4e-support-to-emacs.html">Prodissues: Adding mu4e Support To Emacs</a>.</li>
<li><a href="http://prodissues.com/2016/02/emacs-gpg-for-dummies.html">Prodissues: Emacs GPG For Dummies</a>.</li>
<li><a href="http://ict4g.net/adolfo/notes/2014/12/27/emacs-imap.html">Reading IMAP Mail in Emacs on OSX</a>.</li>
<li><a href="https://vxlabs.com/2019/07/03/send-queued-mails-in-background-with-mu4e/">Sending queued mails in the background with mu4e</a>.</li>
<li><a href="https://aliquote.org/post/setting-up-mu4e-1-0-c/">Setting Up Mu4e 1.0 C - aliquot</a>.</li>
<li><a href="https://dataswamp.org/~solene/2018-05-22-mu4esmtp.html">Solene's post: Sending mail with mu4e</a>.</li>
<li><a href="https://lars.ingebrigtsen.no/2014/12/01/the-emacs-network-security-manager">The Emacs Network Security Manager</a>.</li>
<li><a href="http://tech.memoryimprintstudio.com/the-ultimate-emailing-agent-with-mu4e-and-emacs">The Ultimate Emailing Agent with Mu4e and Emacs</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/8q84dl/tip_how_to_easily_manage_your_emails_with_mu4e/">TIP: How to easily manage your emails with mu4e (Reddit)</a>.</li>
<li><a href="https://etienne.depar.is/a-ecrit/post/2016/09/23/Two-custom-headers-for-mu4e">Two custom headers for mu4e - Étienne Deparis</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/73a3gp/using_emacs_to_read_gmail/">Using Emacs to read gmail (Emacs subreddit)</a>.</li>
<li><a href="http://www.brool.com/post/using-mu4e/">Using mu4e (Brool blog)</a>.</li>
<li><a href="https://github.com/zamansky/using-emacs/blob/master/mu4econfig-sample.el">Zamansky mu4e's sample config</a>.</li>
<li><a href="https://www.youtube.com/watch?v=newRHXKm4H4">Zamansky's video on mu4e</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 28 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Transparent Emacs titlebars on macOS</title>
<link>https://xenodium.com/transparent-emacs-titlebars-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/transparent-emacs-titlebars-on-macos</guid>
    <description><![CDATA[<p>Happy with <a href="https://github.com/d12frosted/homebrew-emacs-plus">Emacs Plus</a> builds on Mac. You get some eye-candy bonuses like transparent titlebars.</p>
<p>To install:</p>
<pre><code class="language-{.bash">brew tap d12frosted/emacs-plus
brew install emacs-plus --without-spacemacs-icon
</code></pre>
<p>Config:</p>
<pre><code class="language-{.commonlisp">(when (memq window-system '(mac ns))
  (add-to-list 'default-frame-alist '(ns-appearance . dark)) ; nil for dark text
  (add-to-list 'default-frame-alist '(ns-transparent-titlebar . t)))
</code></pre>
<p><img src="https://xenodium.github.io/images/transparent-emacs-titlebars-on-macos/transparent-emacs-titlebars-macos.png" alt=""></p>
]]></description>
    <pubDate>Thu, 24 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Lunette: Like Spectacle but for Hammerspoon</title>
<link>https://xenodium.com/lunette-like-spectacle-but-for-hammerspoon</link>
<guid isPermaLink="false">https://xenodium.com/lunette-like-spectacle-but-for-hammerspoon</guid>
    <description><![CDATA[<p>Came across <a href="https://github.com/scottwhudson/Lunette">Lunette</a>. Gives ya Spectacle Keybindings for Hammerspoon.</p>
]]></description>
    <pubDate>Thu, 24 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Train Emacs to open files externally</title>
<link>https://xenodium.com/train-emacs-to-open-files-externally</link>
<guid isPermaLink="false">https://xenodium.com/train-emacs-to-open-files-externally</guid>
    <description><![CDATA[<p>TIL about the <a href="https://bitbucket.org/jpkotta/openwith">openwith</a> package. It enables Emacs to defer to external programs for certain files. You choose which ones. Neat.</p>
<pre><code class="language-{.commonlisp">(use-package openwith :ensure t
  :config
  (csetq openwith-associations
         '((&quot;\\.\\(mp4\\|mp3\\|webm\\|avi\\|flv\\|mov\\)$&quot; &quot;open&quot; (file))))
  (openwith-mode 1))
</code></pre>
]]></description>
    <pubDate>Wed, 23 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Show hidden files in Finder</title>
<link>https://xenodium.com/show-hidden-files-in-finder</link>
<guid isPermaLink="false">https://xenodium.com/show-hidden-files-in-finder</guid>
    <description><![CDATA[<pre><code class="language-{.bash">defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder
</code></pre>
]]></description>
    <pubDate>Tue, 22 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ejecting USB drives on Synology</title>
<link>https://xenodium.com/ejecting-usb-drives-on-synology</link>
<guid isPermaLink="false">https://xenodium.com/ejecting-usb-drives-on-synology</guid>
    <description><![CDATA[<p>For posterity:</p>
<blockquote>
<p>Control panel &gt; External devices &gt; USB Disk 1 &gt; Eject</p>
</blockquote>
]]></description>
    <pubDate>Tue, 22 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Remounting Synology encrypted share</title>
<link>https://xenodium.com/remounting-synology-encrypted-share</link>
<guid isPermaLink="false">https://xenodium.com/remounting-synology-encrypted-share</guid>
    <description><![CDATA[<p>Had been a while since I did this… for posterity:</p>
<blockquote>
<p>Control panel &gt; Shared Folder &gt; Encryption &gt; Mount</p>
</blockquote>
]]></description>
    <pubDate>Mon, 21 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Synology user had no home</title>
<link>https://xenodium.com/synology-user-had-no-home</link>
<guid isPermaLink="false">https://xenodium.com/synology-user-had-no-home</guid>
    <description><![CDATA[<p>Upon ssh'ing to a Synology box, the user had no home.</p>
<blockquote>
<p>Could not chdir to home directory /var/services/homes/someone: No such file or directory</p>
</blockquote>
<p>Fixed via:</p>
<blockquote>
<p>Control Panel &gt; User &gt; Advanced &gt; User Home &gt; [x] Enable user home service</p>
</blockquote>
]]></description>
    <pubDate>Sun, 20 May 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Pre-commit hooks to save you from yourself</title>
<link>https://xenodium.com/pre-commit-hooks-to-save-you-from-yourself</link>
<guid isPermaLink="false">https://xenodium.com/pre-commit-hooks-to-save-you-from-yourself</guid>
    <description><![CDATA[<p>Wanted to try out some code, but needed to ensure never checked in. Git pre-commit hooks are handy in this space. Add the following script to search for either @COMMITFAIL or @NOCOMMIT in the staged files. If found, attempts to commit will fail.</p>
<p>Based on <a href="https://gist.github.com/rex/223b4be50285f6b8b3e06dea50d15887">https://gist.github.com/rex/223b4be50285f6b8b3e06dea50d15887</a>:</p>
<pre><code class="language-{.bash">#!/bin/bash

set -o nounset
set -o errexit

echo &quot;Arguments:&quot;
echo &quot;$@&quot;
echo &quot;---&quot;

readonly FILES_PATTERN='(\..+)?$'
readonly FORBIDDEN='(@?NOCOMMIT|@?COMMITFAIL)'

if ( git diff --cached --name-only | grep -E &quot;$FILES_PATTERN&quot; | xargs grep -E --with-filename -n &quot;$FORBIDDEN&quot; ); then
  echo &quot;ERROR: @COMMITFAIL or @NOCOMMIT found. Exiting to save you from yourself.&quot;
  exit 1
fi
</code></pre>
<p>Save to a file and create a symbolic link to your .git/hooks directory:</p>
<pre><code class="language-{.bash">ln -s ../../git/commit-fail-pre-hook.sh .git/hooks/pre-commit
</code></pre>
]]></description>
    <pubDate>Mon, 30 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Azores travel bookmarks</title>
<link>https://xenodium.com/azores-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/azores-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.fodors.com/go-list/2013/azores-islands/">Azores islands</a>.</li>
<li><a href="https://github.com/schilken/dot-hammerspoon">My configuration with init.lua and the require()ed modules</a>.</li>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/this-other-eden-the-azores-europes-secret-islands-of-adventure">This other Eden: the Azores, Europe's secret islands of adventure</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 19 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Debugging Emacs binary</title>
<link>https://xenodium.com/debugging-emacs-binary</link>
<guid isPermaLink="false">https://xenodium.com/debugging-emacs-binary</guid>
    <description><![CDATA[<p>From <a href="https://emacs.stackexchange.com/questions/14354/how-do-i-debug-an-emacs-crash">How do I debug an emacs crash? (Emacs Stack Exchange)</a>, disable optimizations when configuring and build:</p>
<pre><code class="language-{.bash">CFLAGS=&quot;-O0 -g3&quot; ./configure ...
make
</code></pre>
<p>And good 'ol gdb (lldb works too):</p>
<pre><code class="language-{.bash">gdb ../nextstep/Emacs.app/Contents/MacOS/Emacs
</code></pre>
<h2>Reference</h2>
<ul>
<li><a href="https://git.savannah.gnu.org/cgit/emacs.git/tree/etc/DEBUG">etc/DEBUG: Debugging GNU Emacs</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 19 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Paper less bookmarks</title>
<link>https://xenodium.com/paperless-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/paperless-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/danielquinn/paperless">danielquinn/paperless: Scan, index, and archive all of your paper documents</a>.</li>
<li><a href="http://www.karl-voit.at/2015/04/05/digitizing-paper/">Digitizing All Your Paper Stuff</a>.</li>
<li><a href="https://www.amazon.com/Fujitsu-ScanSnap-iX500-Duplex-Scanner/dp/B01G3JYVYM/ref=dp_ob_title_ce">Fujitsu ScanSnap iX500 Color Duplex Desk Scanner for Mac and PC</a>.</li>
<li><a href="http://www.jamierubin.net/2013/04/30/going-paperless-scanning-to-evernote-revisited/">Going Paperless: Scanning to Evernote, Revisited | Jamie Todd Rubin</a>.</li>
<li><a href="https://github.com/novoid/guess-filename.py">guess-filename.py: Derive a file name according to old file name cues and/or PDF file content</a>.</li>
<li><a href="http://www.noodlesoft.com/">Hazel for document/download management</a>.</li>
<li><a href="http://blog.matt-swain.com/post/26419042500/installing-tesseract-ocr-on-mac-os-x-lion">Installing Tesseract OCR on Mac OS X Lion</a>.</li>
<li><a href="http://irreal.org/blog/?p=5935">Paperless | Irreal</a>.</li>
<li><a href="http://solutions.weblite.ca/pdfocrx/">PDF OCR X - Mac &amp; Windows OCR Software to convert PDFs and Images to Text</a>.</li>
<li><a href="http://www.documentsnap.com/batch-ocr-mac-fujitsu-scansnap/">Video: Batch OCR With The Mac Fujitsu ScanSnap</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 19 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bologna travel bookmarks</title>
<link>https://xenodium.com/bologna-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bologna-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Il Cannone restaurant.</li>
</ul>
]]></description>
    <pubDate>Wed, 18 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Grep through pdfs</title>
<link>https://xenodium.com/grep-through-pdfs</link>
<guid isPermaLink="false">https://xenodium.com/grep-through-pdfs</guid>
    <description><![CDATA[<p>Late to the party, but investing in going paperless. Got a scanner with OCR, which generates searchable pdfs. If I could only grep through them…</p>
<pre><code class="language-{.bash">brew install pdfgrep
</code></pre>
<p>Balance restored.</p>
]]></description>
    <pubDate>Tue, 17 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hammerspoon bookmarks</title>
<link>https://xenodium.com/hammerspoon-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/hammerspoon-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/peterpme/dotfiles/blob/master/hammerspoon/grid.lua">dotfiles/grid.lua at master</a> for simple functions to resize windows.</li>
<li><a href="https://gist.github.com/justintanner/71d640be159c2a76e85d5196cf22e98a">Emacs keys everywhere Hammerspoon Script</a>.</li>
<li><a href="http://zzamboni.org/post/getting-started-with-hammerspoon/">Getting Started With Hammerspoon (by Diego Martín Zamboni)</a>.</li>
<li><a href="https://github.com/agzam/spacehammer">Hammerspoon config inspired by Spacemacs</a>.</li>
<li><a href="http://zzamboni.org/post/just-enough-lua-to-be-productive-in-hammerspoon-part-1/">Just Enough Lua to Be Productive in Hammerspoon, Part 1</a>.</li>
<li><a href="http://zzamboni.org/post/just-enough-lua-to-be-productive-in-hammerspoon-part-2/">Just Enough Lua to Be Productive in Hammerspoon, Part 2</a>.</li>
<li><a href="https://github.com/anandpiyer/.dotfiles/blob/fb7bdf5d6382515f36587f2ada83330d83983624/.hammerspoon/init.lua#L200">launchOrFocusByBundleID</a> for global key bindings (there are Emacs goodies there too).</li>
<li><a href="https://github.com/schilken/dot-hammerspoon">My configuration with init.lua and the require()ed modules</a>.</li>
<li><a href="http://www.hammerspoon.org/Spoons/Seal.html">Seal</a>. Helm-like for hammerspoon.</li>
<li><a href="https://blog.kalis.me/setup-hyper-key-hammerspoon-macos/">Set up a Hyper Key with Hammerspoon on macOS</a>.</li>
<li><a href="https://github.com/asmagill/hammerspoon-config/blob/07ec892ab1351d2a7659d802e4cbfa8e8a0d5702/_scratch/zerobrane.lua">ZeroBrane completion</a> and <a href="https://github.com/cmsj/hammerspoon-config/blob/master/init.lua">here</a> also.</li>
</ul>
]]></description>
    <pubDate>Sat, 14 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Options to reduce Go binary size</title>
<link>https://xenodium.com/options-to-reduce-go-binary-size</link>
<guid isPermaLink="false">https://xenodium.com/options-to-reduce-go-binary-size</guid>
    <description><![CDATA[<p>A Hacker News's thread <a href="https://news.ycombinator.com/item?id=16834181">Go gets preliminary WebAssembly support</a> has a couple of tips to reduce binaries compiled with Go.</p>
<pre><code class="language-{.bash">go build -ldflags=-s
</code></pre>
<p><a href="https://upx.github.io/">UPX</a> (Ultimate Packer for eXecutables) packs the binary further.</p>
<pre><code class="language-{.bash">upx --ultra-brute
</code></pre>
]]></description>
    <pubDate>Sat, 14 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trying out tesseract</title>
<link>https://xenodium.com/trying-out-tesseract</link>
<guid isPermaLink="false">https://xenodium.com/trying-out-tesseract</guid>
    <description><![CDATA[<p>As part of going paperless, looking into OCR. Trying out tesseract.</p>
<p>Install</p>
<pre><code class="language-{.bash">$ brew install gs
$ brew install imagemagick
$ brew install tesseract
</code></pre>
<pre><code class="language-{.bash">$ convert -density 300 -depth 8 receipt.pdf receipt.png
$ tesseract receipt.png receipt.png.txt
</code></pre>
]]></description>
    <pubDate>Mon, 09 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sapporo travel bookmarks</title>
<link>https://xenodium.com/sapporo-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sapporo-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://foodle.pro/restaurants/sapporo/175-0-deno-dandan-noodles">175 ° DENO Dandan Noodles, Sapporo</a>.</li>
<li><a href="https://www.vitra.com/en-gb/magazine/details/the-hill-of-the-buddha">The Hill of the Buddha</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Gif bookmarks</title>
<link>https://xenodium.com/gif-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/gif-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://takinginitiative.wordpress.com/2020/03/07/an-idiots-guide-to-animation-compression/">An idiot’s guide to animation compression | Taking Initiative</a>.</li>
<li><a href="https://github.com/nwtgck/gif-progress/blob/develop/README.md">gif-progress: Attach progress bar to animated GIF</a>.</li>
<li><a href="https://gif.ski/">gifski — highest-quality GIF converter</a>.</li>
<li><a href="https://github.com/keycastr/keycastr">keycastr: an open-source keystroke visualizer</a>.</li>
<li><a href="https://github.com/phw/peek">phw/peek: Simple animated GIF screen recorder for Linux</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trying out ShellCheck</title>
<link>https://xenodium.com/trying-out-shellcheck</link>
<guid isPermaLink="false">https://xenodium.com/trying-out-shellcheck</guid>
    <description><![CDATA[<p><a href="https://github.com/koalaman/shellcheck">ShellCheck</a> gives you automatic warnings/suggestions in bash/sh shell scripts.</p>
<pre><code class="language-{.bash">$ brew install shellcheck
</code></pre>
<p>Bonus: If using Emacs's <a href="https://github.com/flycheck/flycheck">flycheck</a>, you get ShellCheck support out of the box.</p>
]]></description>
    <pubDate>Sun, 08 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Image editing bookmarks</title>
<link>https://xenodium.com/image-editing-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/image-editing-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=17748266">Exif.tools – A multimedia file metadata tool (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=16668254">Fred's ImageMagick Scripts (Hacker News)</a>.</li>
<li><a href="https://linuxhint.com/howto_crop_gimp/">How to crop in GIMP (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/imagemagick_sharpen_image/">ImageMagick to Sharpen an Image – Linux Hint</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23789934">Jpeg2png: Silky smooth JPEG decoding – no more artifacts (2016) | Hacker News</a>.</li>
<li><a href="https://twitter.com/pidybi/status/1278590835194564608">Make your own meme image using Imagemagick</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=10222524">The Art of PNG Glitch (Hacker News)</a>.</li>
<li><a href="http://ucnv.github.io/pnglitch/">The Art of PNG Glitch</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Buying matcha powder online</title>
<link>https://xenodium.com/buying-matcha-powder-online</link>
<guid isPermaLink="false">https://xenodium.com/buying-matcha-powder-online</guid>
    <description><![CDATA[<p>From Reddit's <a href="https://www.reddit.com/r/tea/comments/6qbh4l/matcha/">thread</a>:</p>
<ul>
<li><a href="https://yunomi.life">https://yunomi.life</a></li>
<li><a href="https://shop.ippodo-tea.co.jp/kyoto/shopf/index.html">https://shop.ippodo-tea.co.jp/kyoto/shopf/index.html</a></li>
<li><a href="https://www.o-cha.com">https://www.o-cha.com</a></li>
<li><a href="http://hojotea.com/categ_e/viewe.htm">http://hojotea.com/categ_e/viewe.htm</a></li>
<li><a href="http://yuuki-cha.com">http://yuuki-cha.com</a></li>
<li><a href="http://www.hibiki-an.com/index.php">http://www.hibiki-an.com/index.php</a></li>
<li><a href="http://www.thes-du-japon.com/index.php?main_page=index">http://www.thes-du-japon.com/index.php?main_page=index</a></li>
<li><a href="https://www.chadoteahouse.com">https://www.chadoteahouse.com</a></li>
<li><a href="https://www.denstea.com">https://www.denstea.com</a></li>
<li><a href="https://www.sazentea.com/en">https://www.sazentea.com/en</a></li>
<li><a href="http://www.ujicha-kanbayashi.co.jp">http://www.ujicha-kanbayashi.co.jp</a></li>
<li><a href="http://www.marukyu-koyamaen.co.jp/products.html">http://www.marukyu-koyamaen.co.jp/products.html</a></li>
<li><a href="http://www.fukumotoen.co.jp/shop/">http://www.fukumotoen.co.jp/shop/</a></li>
<li><a href="http://www.myokoen.com/shop/index.html">http://www.myokoen.com/shop/index.html</a></li>
</ul>
]]></description>
    <pubDate>Thu, 05 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Getting macOS app bundle ID</title>
<link>https://xenodium.com/getting-macos-app-bundle-id</link>
<guid isPermaLink="false">https://xenodium.com/getting-macos-app-bundle-id</guid>
    <description><![CDATA[<p>From <a href="https://stackoverflow.com/questions/39464668/how-to-get-bundle-id-of-mac-application#39464824">stack overflow</a>:</p>
<p>Option 1</p>
<pre><code class="language-{.bash">osascript -e 'id of app &quot;Emacs&quot;'
</code></pre>
<p>Option 2</p>
<pre><code class="language-{.bash">mdls -name kMDItemCFBundleIdentifier -r SomeApp.app
</code></pre>
]]></description>
    <pubDate>Wed, 04 Apr 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Trying out chunkwm</title>
<link>https://xenodium.com/trying-out-chunkwm</link>
<guid isPermaLink="false">https://xenodium.com/trying-out-chunkwm</guid>
    <description><![CDATA[<p><img src="https://xenodium.github.io/images/trying-out-chunkwm/chunkwm.png" alt=""></p>
<h3>Installing <a href="https://github.com/koekeishiya/chunkwm">Chunkwm</a></h3>
<pre><code class="language-{.bash">$ brew tap crisidev/homebrew-chunkwm
$ brew install --HEAD --with-tmp-logging chunkwm
</code></pre>
<p>Add a configuration file. Started off from this <a href="https://gist.github.com/shihanng/65b73712df2e51d4d78cc27c218bac35#file-chunkwmrc">example</a>.</p>
<blockquote>
<p>~<em>.chunkwmrc chmod +x ~</em>.chunkwmrc</p>
</blockquote>
<p><strong>Note</strong>: Ensure core::plugin_dir matches homebrew's plugin directory. Typically something like: //path/to/homebrew/opt/chunkwm/share/chunkwm/plugins/</p>
<p>Start chunkwmrc service.</p>
<pre><code class="language-{.bash">$ brew services start crisidev/chunkwm/chunkwm
</code></pre>
<h3>Installing <a href="https://github.com/koekeishiya/skhd">skhd</a> (a hotkey daemon)</h3>
<pre><code class="language-{.bash">$ brew install --HEAD --with-logging  koekeishiya/formulae/skhd
</code></pre>
<p>Start skhd service.</p>
<pre><code class="language-{.bash">$ brew services start koekeishiya/formulae/skhd
</code></pre>
<p>Skhd logs location.</p>
<pre><code class="language-{.bash">/Users/you/homebrew/var/log/skhd/skhd.[out|err].log
</code></pre>
<p>Add a configuration file. Started off from this <a href="https://raw.githubusercontent.com/koekeishiya/chunkwm/master/src/plugins/tiling/examples/khdrc">example</a>.</p>
<pre><code class="language-{.bash">~/.skhdrc
chmod +x ~/.skhdrc
</code></pre>
<h3>Installing <a href="https://github.com/koekeishiya/skhd">khd</a> (easily invoke hotkeys from terminal)</h3>
<pre><code class="language-{.bash">$ brew install khd
</code></pre>
<p>Some additional Mission Control and keyboard shortcut preferences:</p>
<p><img src="https://xenodium.github.io/images/trying-out-chunkwm/mission_control.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/trying-out-chunkwm/keyboard_shortcuts.png" alt=""></p>
]]></description>
    <pubDate>Sat, 31 Mar 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Building bazel on macOS</title>
<link>https://xenodium.com/building-bazel-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/building-bazel-on-macos</guid>
    <description><![CDATA[<h2>Bootstrap</h2>
<pre><code class="language-{.bash">brew tap bazelbuild/tap
brew install bazelbuild/tap/bazel
</code></pre>
<h2>Build</h2>
<pre><code class="language-{.bash">git clone https://github.com/bazelbuild/bazel.git
cd bazel
bazel build //src:bazel
</code></pre>
<h2>Get your bazel binary</h2>
<pre><code>Self-contained binary in bazel-bin/src/bazel
</code></pre>
<h2>Known revisions</h2>
<ul>
<li><a href="https://github.com/bazelbuild/bazel.git">https://github.com/bazelbuild/bazel.git</a> @ d81a46cebe07f73d3ea38206262cf7a1a9513b42</li>
<li><a href="https://github.com/bazelbuild/rules_apple.git">https://github.com/bazelbuild/rules_apple.git</a> @ e921a9f727e039c8b5087d4f98c5d09f189658cd</li>
</ul>
]]></description>
    <pubDate>Tue, 06 Feb 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Extracting files from pkg</title>
<link>https://xenodium.com/extracting-files-from-pkg</link>
<guid isPermaLink="false">https://xenodium.com/extracting-files-from-pkg</guid>
    <description><![CDATA[<pre><code class="language-{.bash">mkdir tmp
cd tmp
xar -xf ../Some.pkg
cat Payload | gunzip -dc |cpio -i
</code></pre>
]]></description>
    <pubDate>Sun, 07 Jan 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Installing Inkscape with homebrew</title>
<link>https://xenodium.com/installing-inkscape-with-homebrew</link>
<guid isPermaLink="false">https://xenodium.com/installing-inkscape-with-homebrew</guid>
    <description><![CDATA[<pre><code class="language-{.bash">brew tap caskroom/cask
brew install caskformula/caskformula/inkscape
</code></pre>
]]></description>
    <pubDate>Sun, 07 Jan 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Magit amend commit author</title>
<link>https://xenodium.com/magit-amend-commit-author</link>
<guid isPermaLink="false">https://xenodium.com/magit-amend-commit-author</guid>
    <description><![CDATA[<p>Rarely use it, but handy. Use Magit to amend git commit author.</p>
<ul>
<li>Rebase interactively (r, i).</li>
<li>Move point to commit to ammend.</li>
<li>Execute command (x).</li>
</ul>
<pre><code class="language-{.bash">git commit --amend --author=&quot;name &lt;email&gt;&quot;
</code></pre>
<ul>
<li>Commit (c, c).</li>
</ul>
<p><img src="https://xenodium.github.io/images/amend-git-commit-author-on-magit/amending.gif" alt=""></p>
]]></description>
    <pubDate>Sat, 16 Dec 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Homebrew install from cache</title>
<link>https://xenodium.com/homebrew-install-from-cache</link>
<guid isPermaLink="false">https://xenodium.com/homebrew-install-from-cache</guid>
    <description><![CDATA[<p>Came across a 404 while installing graphviz-2.40.1.tar.gz via homebrew. If you can find the package elsewhere, copy over to homebrew's cache directory.</p>
<pre><code class="language-{.bash">brew --cache
</code></pre>
]]></description>
    <pubDate>Wed, 13 Dec 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>org-babel Objective-C support</title>
<link>https://xenodium.com/org-babel-objective-c-support</link>
<guid isPermaLink="false">https://xenodium.com/org-babel-objective-c-support</guid>
    <description><![CDATA[<p>Wanted to quickly execute an Objective-C snippet. org-babel didn't support it out of the box, but adding it was straightforward (looked at ob-C.el and ob-java.el):</p>
<pre><code class="language-{.commonlisp">(require 'ob)

(defcustom org-babel-objc-compile-command &quot;clang -x objective-c -framework Foundation&quot;
  &quot;For example: \&quot;clang -x objective-c -framework Foundation\&quot;.&quot;
  :group 'org-babel
  :version &quot;24.3&quot;
  :type 'string)

(defun org-babel-execute:objc (body params)
  &quot;Compile Objective-C BODY with org PARAMS and execute binary.&quot;
  (let* ((src-file (org-babel-temp-file &quot;org-babel-objc-block-&quot; &quot;.m&quot;))
         (cmpflag (or (cdr (assq :cmpflag params)) &quot;&quot;))
         (full-body (org-babel-expand-body:generic body params))
         (bin-file
          (org-babel-process-file-name
           (org-babel-temp-file &quot;org-babel-objc-block&quot; org-babel-exeext))))
    (with-temp-file src-file (insert full-body))
    (org-babel-eval
     (concat org-babel-objc-compile-command &quot; &quot; cmpflag &quot; &quot; src-file &quot; &quot; &quot;-o&quot; &quot; &quot; bin-file) &quot;&quot;)

    ;; Using 2&gt;&amp;1 since org babel does not include stderr in output from NSLog.
    (let ((results (org-babel-eval (concat (org-babel-process-file-name bin-file) &quot; 2&gt;&amp;1&quot;)  &quot;&quot;)))
      (org-babel-reassemble-table
       (org-babel-result-cond (cdr (assq :result-params params))
         (org-babel-read results)
         (let ((tmp-file (org-babel-temp-file &quot;c-&quot;)))
           (with-temp-file tmp-file (insert results))
           (org-babel-import-elisp-from-file tmp-file)))
       (org-babel-pick-name
        (cdr (assq :colname-names params)) (cdr (assq :colnames params)))
       (org-babel-pick-name
        (cdr (assq :rowname-names params)) (cdr (assq :rownames params)))))))

(provide 'ob-objc)
</code></pre>
<p>Add <em>objc</em> to <em>org-babel-load-languages</em>, and you can subsequently compile and run Objective-C blocks like:</p>
<pre><code class="language-{.objc">#import &lt;Foundation/Foundation.h&gt;

int main() {
  NSLog(@&quot;Hello World&quot;);
  return 0;
}
</code></pre>
]]></description>
    <pubDate>Thu, 16 Nov 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>iOS dev command-line goodies</title>
<link>https://xenodium.com/ios-dev-command-line-goodies</link>
<guid isPermaLink="false">https://xenodium.com/ios-dev-command-line-goodies</guid>
    <description><![CDATA[<h2>Install ipa on device</h2>
<p>Get utility with:</p>
<pre><code class="language-{.bash">npm install -g ipa-deploy
npm install -g ios-deploy
</code></pre>
<p>Install ipa on connected iPhone:</p>
<pre><code class="language-{.bash">ipa-deploy path/to/your/App.ipa
</code></pre>
<h2>Install app on booted simulator</h2>
<p>Install ipa on connected iPhone:</p>
<pre><code class="language-{.bash">xcrun simctl install booted path/to/your/App.app
</code></pre>
<h2>Install ipa on booted simulator</h2>
<pre><code class="language-{.bash">#!/bin/bash

# Unzip ipa, install app, and run on booted simulator.

set -o nounset
set -o errexit

readonly IPA_PATH=$1
readonly TEMP_DIR_PATH=$(mktemp -d)
readonly BASENAME=$(basename ${IPA_PATH})
readonly NAME=${BASENAME%.*}
readonly APP_DIR_PATH=&quot;${TEMP_DIR_PATH}/Payload/${NAME}.app&quot;
readonly PLIST_FILE_PATH=&quot;${APP_DIR_PATH}/Info.plist&quot;

trap &quot;rm -rf ${TEMP_DIR_PATH}&quot; EXIT

unzip -o &quot;${IPA_PATH=}&quot; -d &quot;${TEMP_DIR_PATH}&quot;

readonly BUNDLE_ID=$(/usr/libexec/PlistBuddy -c &quot;Print CFBundleIdentifier&quot; ${PLIST_FILE_PATH})

xcrun simctl install booted &quot;${APP_DIR_PATH}&quot;
xcrun simctl launch booted &quot;${BUNDLE_ID}&quot;
</code></pre>
]]></description>
    <pubDate>Sun, 12 Nov 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Eshell pcomplete company completion</title>
<link>https://xenodium.com/eshell-pcomplete-company-completion</link>
<guid isPermaLink="false">https://xenodium.com/eshell-pcomplete-company-completion</guid>
    <description><![CDATA[<p>Howard Abrams's <a href="https://www.youtube.com/watch?v=RhYNu6i_uY4">Introduction to eshell video</a> prompted me to poke at eshell some more. This time, I got eshell context aware completion by glueing the excellent <a href="https://company-mode.github.io">company</a> and <a href="https://masteringemacs.org/article/pcomplete-context-sensitive-completion-emacs">pcomplete</a> packages.</p>
<p><img src="https://xenodium.github.io/images/eshell-pcomplete-company-completion/company-pcomplete.png" alt=""></p>
<pre><code class="language-{.commonlisp">(require 'cl-lib)
(require 'company)
(require 'dash)
(require 'pcomplete)
(require 's)

(defun company-pcomplete--overlap-tail (a b)
  &quot;When A is \&quot;SomeDev\&quot; and B is \&quot;Developer\&quot;, return \&quot;eloper\&quot;.&quot;
  (let ((prefix a)
        (remaining nil))
    (while (and (not remaining) (&gt; (length prefix) 0))
      (when (s-starts-with? prefix b)
        (setq remaining (substring b (length prefix))))
      (setq prefix (substring prefix 1)))
    remaining))

(defun company-pcomplete--candidates (prefix)
  &quot;Get candidates for PREFIX company completion using `pcomplete'.&quot;
  ;; When prefix is: &quot;~/Down&quot; and completion is &quot;Downloads&quot;, need
  ;; to find common string and join into &quot;~/Downloads/&quot;.
  (-map (lambda (item)
          (if (s-starts-with? prefix item)
              item
            (concat prefix (company-pcomplete--overlap-tail prefix item))))
        (all-completions prefix (pcomplete-completions))))

(defun company-pcomplete (command &amp;optional arg &amp;rest ignored)
  &quot;Complete using pcomplete. See `company''s COMMAND ARG and IGNORED for details.&quot;
  (interactive (list 'interactive))
  (case command
    (interactive (company-begin-backend 'company-pcomplete))
    (prefix (company-grab-symbol))
    (candidates
     (company-pcomplete--candidates arg))))
</code></pre>
<p>Don't forget to add <em>company-pcomplete</em> to <em>company-backends,</em> and if you want an explicit binding, use something like:</p>
<pre><code class="language-{.commonlisp">(bind-key &quot;&lt;backtab&gt;&quot; #'company-complete eshell-mode-map)
</code></pre>
]]></description>
    <pubDate>Wed, 01 Nov 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Basic imenu in helpful-mode</title>
<link>https://xenodium.com/basic-imenu-in-helpful-mode</link>
<guid isPermaLink="false">https://xenodium.com/basic-imenu-in-helpful-mode</guid>
    <description><![CDATA[<p>I'm finding Wilfred Hughes's <a href="https://github.com/Wilfred/helpful">helpful-mode</a>, well… rather helpful. However, I'm missing imenu support. Here's a hacky way to get basic imenu.</p>
<p><img src="https://xenodium.github.io/images/basic-imenu-for-helpful-mode/helpful-imenu.png" alt=""></p>
<pre><code class="language-{.commonlisp">(defun helpful--create-imenu-index ()
  &quot;Create an `imenu' index for helpful.&quot;
  (beginning-of-buffer)
  (let ((imenu-items '()))
    (while (progn
             (beginning-of-line)
             ;; Not great, but determine if looking at heading:
             ;; 1. if it has bold face.
             ;; 2. if it is capitalized.
             (when (and (eq 'bold (face-at-point))
                        (string-match-p
                         &quot;[A-Z]&quot;
                         (buffer-substring (line-beginning-position)
                                           (line-end-position))))
               (add-to-list 'imenu-items
                            (cons (buffer-substring (line-beginning-position)
                                                    (line-end-position))
                                  (line-beginning-position))))
             (= 0 (forward-line 1))))
    imenu-items))

(defun helpful-mode-hook-function ()
  &quot;A hook function for `helpful-mode'.&quot;
  (setq imenu-create-index-function #'helpful--create-imenu-index))

(add-hook 'helpful-mode-hook
          #'helpful-mode-hook-function)
</code></pre>
]]></description>
    <pubDate>Sun, 10 Sep 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Projectile shell dir company completion</title>
<link>https://xenodium.com/projectile-shell-dir-company-completion</link>
<guid isPermaLink="false">https://xenodium.com/projectile-shell-dir-company-completion</guid>
    <description><![CDATA[<p><a href="https://github.com/bbatsov/projectile">Projectile</a> and <a href="https://company-mode.github.io">company</a> are just amazing Emacs packages. Projectile gives random access to files, while company completes well… anything. For shells, Emacs has a handful of options.</p>
<p>Standing on the shoulders of package giants (<a href="https://github.com/magnars/dash.el">dash</a> and <a href="https://github.com/rejeep/f.el">f</a> included) and some elisp, we can bring random access to project directories from the shell.</p>
<p><img src="https://xenodium.github.io/images/projectile-shell-dir-company-completion/company-projectile-cd.png" alt=""></p>
<pre><code class="language-{.commonlisp">(require 'cl-lib)
(require 'company)
(require 'dash)
(require 'f)
(require 'projectile)

(defvar-local company-projectile-cd-prefix &quot;cd &quot;)

(defun company-projectile-cd (command &amp;optional arg &amp;rest ignored)
  &quot;Company shell completion for any projectile path.&quot;
  (interactive (list 'interactive))
  (case command
    (interactive (company-begin-backend 'company-projectile-cd))
    (prefix
     (company-grab-symbol-cons company-projectile-cd-prefix
                               (length company-projectile-cd-prefix)))
    (candidates
     (company-projectile-cd--candidates
      (company-grab-symbol-cons company-projectile-cd-prefix
                                (length company-projectile-cd-prefix))))
    (post-completion
     (company-projectile-cd--expand-inserted-path arg))))

(defun company-projectile-cd--candidates (input)
  &quot;Return candidates for given INPUT.&quot;
  (company-projectile-cd--reset-root)
  (when (consp input)
    (let ((search-term (substring-no-properties
                        (car input) 0 (length (car input))))
          (prefix-found (cdr input)))
      (when prefix-found
        (if (projectile-project-p)
            (company-projectile-cd--projectile search-term)
          (company-projectile-cd--find-fallback search-term))))))

(defun company-projectile-cd--projectile (search-term)
  (-filter (lambda (path)
             (string-match-p (regexp-quote
                              search-term)
                             path))
           (-snoc
            (projectile-current-project-dirs)
            ;; Throw project root in there also.
            (projectile-project-root))))

(defun company-projectile-cd--find-fallback (search-term)
  (ignore-errors
    (-map (lambda (path)
            (string-remove-prefix &quot;./&quot; path))
          (apply #'process-lines
                 (list &quot;find&quot; &quot;.&quot; &quot;-type&quot; &quot;d&quot;  &quot;-maxdepth&quot; &quot;2&quot; &quot;-iname&quot;
                       (format &quot;\*%s\*&quot; search-term))))))

(defun company-projectile-cd--expand-inserted-path (path)
  &quot;Replace relative PATH insertion with its absolute equivalent if needed.&quot;
  (unless (f-exists-p path)
    (delete-region (point) (- (point) (length path)))
    (insert (concat (projectile-project-root) path))))

(defun company-projectile-cd--reset-root ()
  &quot;Reset project root. Useful when cd'ing in and out of projects.&quot;
  (projectile-reset-cached-project-root)
  (when (projectile-project-p)
    (projectile-project-root)))
</code></pre>
]]></description>
    <pubDate>Sat, 19 Aug 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Creating icns icons</title>
<link>https://xenodium.com/creating-icns-icons</link>
<guid isPermaLink="false">https://xenodium.com/creating-icns-icons</guid>
    <description><![CDATA[<p>Stack overflow yields <a href="https://stackoverflow.com/questions/12437433/where-can-i-find-icon-composer-on-mac">Where can i find Icon Composer on Mac?</a> when I did a quick search to convert a png to icns. For future reference:</p>
<pre><code class="language-{.bash">#!/bin/bash -e

set -e
set -o pipefail

if [ &quot;$#&quot; -ne 1 ]; then
 echo &quot;\nusage: to_icns.sh path/to/image.png\n&quot;
 exit 1
fi

readonly IMAGE_FPATH=$1
readonly BASENAME=$(basename ${IMAGE_FPATH%.*})

mkdir ${BASENAME}.iconset

sips -z 16 16   $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_16x16.png&quot;
sips -z 32 32   $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_16x16@2x.png&quot;
sips -z 32 32   $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_32x32.png&quot;
sips -z 64 64   $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_32x32@2x.png&quot;
sips -z 128 128 $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_128x128.png&quot;
sips -z 256 256 $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_128x128@2x.png&quot;
sips -z 256 256 $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_256x256.png&quot;
sips -z 512 512 $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_256x256@2x.png&quot;
sips -z 512 512 $IMAGE_FPATH --out &quot;${BASENAME}.iconset/icon_512x512.png&quot;

cp $IMAGE_FPATH &quot;${BASENAME}.iconset/icon_512x512@2x.png&quot;

iconutil -c icns ${BASENAME}.iconset

rm -R ${BASENAME}.iconset

echo Wrote ${BASENAME}.icns
</code></pre>
]]></description>
    <pubDate>Wed, 09 Aug 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Forcing aptX on MacOS bluetooth audio</title>
<link>https://xenodium.com/forcing-aptx-on-macos-bluetooth-audio</link>
<guid isPermaLink="false">https://xenodium.com/forcing-aptx-on-macos-bluetooth-audio</guid>
    <description><![CDATA[<p>Bought a pair of QuietComfort 35. Audio quality on MacOS was lagging compared to iOS. Googling led to different posts suggesting the use of Bluetooth Explorer to force aptX usage. Did the trick for me.</p>
<p><strong>Bluetooth Explorer</strong> can be downloaded from <a href="https://developer.apple.com/download/more">https://developer.apple.com/download/more</a>. Search for Hardware IO tools:</p>
<p><img src="https://xenodium.github.io/images/forcing-aptx-on-macos-bluetooth-audio/download-bluetooth-explorer.png" alt=""></p>
<p>Open <strong>Hardware_IO_Tools_for_Xcode_7.3.dmg</strong> and launch <strong>Bluetooth Explorer</strong>:</p>
<p><img src="https://xenodium.github.io/images/forcing-aptx-on-macos-bluetooth-audio/tools-image.png" alt=""></p>
<p>Select <strong>Audio Options</strong>:</p>
<p><img src="https://xenodium.github.io/images/forcing-aptx-on-macos-bluetooth-audio/audio-options.png" alt=""></p>
<p>Check <strong>Force use of aptX</strong>:</p>
<p><img src="https://xenodium.github.io/images/forcing-aptx-on-macos-bluetooth-audio/force-aptx.png" alt=""></p>
<p>Don't forget to disconnect and reconnect your Bluetooth device.</p>
]]></description>
    <pubDate>Sun, 06 Aug 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hungary travel bookmarks</title>
<link>https://xenodium.com/hungary-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/hungary-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lonelyplanet.com/hungary/budapest/travel-tips-and-articles/my-city-budapest/40625c8c-8a11-5710-a052-1479d276913c?">My city: Budapest - Lonely Planet</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 10 Jul 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Faster cursor movement on macOS</title>
<link>https://xenodium.com/faster-cursor-movement-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/faster-cursor-movement-on-macos</guid>
    <description><![CDATA[<p>Faster cursor movement on macOS by increasing your keyboard's initial key repeat subsequent key repeat.</p>
<pre><code class="language-{.bash">defaults write -g KeyRepeat -int 1
defaults write -g InitialKeyRepeat -int 10
</code></pre>
]]></description>
    <pubDate>Sat, 08 Jul 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Search/insert one-liners with Emacs helm-ag</title>
<link>https://xenodium.com/search-insert-one-liners-with-emacs-helm-ag</link>
<guid isPermaLink="false">https://xenodium.com/search-insert-one-liners-with-emacs-helm-ag</guid>
    <description><![CDATA[<p>Emacs <a href="https://github.com/emacs-helm/helm">helm</a> is awesome. <a href="https://github.com/syohex/emacs-helm-ag">helm-ag</a> is double awesome. Searching for one-liners in your codebase, narrowing down with helm, and easily inserting is triple awesome.</p>
<p><img src="https://xenodium.github.io/images/search-and-insert-one-liners-with-helm-ag/helm-ag-insert.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(defun ar/helm-ag (arg)
  &quot;Helm-ag search remembering last location.  With ARG, forget the last location.&quot;
  (interactive &quot;P&quot;)
  (defvar ar/helm-ag--default-locaction nil)
  (setq ar/helm-ag--default-locaction
                 (read-directory-name &quot;search in: &quot; (if arg
                                                        default-directory
                                                      ar/helm-ag--default-locaction) nil t))
  (helm-do-ag ar/helm-ag--default-locaction))

(defun ar/helm-ag-insert (arg)
  ;; Helm-ag and insert match.
  (interactive &quot;P&quot;)
  (let* ((actions (helm-make-actions
                   &quot;Insert&quot;
                   (lambda (candidate)
                     ;; Drop file:line:column. For example:
                     ;; arc_hostlink.c:13:2:#include &lt;linux/fs.h&gt;
                     ;; =&gt; #include &lt;linux/fs.h&gt;
                     (insert (replace-regexp-in-string &quot;^[^ ]*:&quot; &quot;&quot; candidate)))))
         (helm-source-do-ag (helm-build-async-source &quot;The Silver Searcher&quot;
                              :init 'helm-ag--do-ag-set-command
                              :candidates-process 'helm-ag--do-ag-candidate-process
                              :persistent-action  'helm-ag--persistent-action
                              :action actions
                              :nohighlight t
                              :requires-pattern 3
                              :candidate-number-limit 9999
                              :keymap helm-do-ag-map
                              :follow (and helm-follow-mode-persistent 1))))
    (call-interactively #'ar/helm-ag)))
</code></pre>
]]></description>
    <pubDate>Fri, 07 Jul 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sleep bookmarks</title>
<link>https://xenodium.com/sleep-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sleep-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=15997016">Algorithmic Solution to My Insomnia (Hacker News)</a>.</li>
<li><a href="https://www.gwern.net/Melatonin">Melatonin - Gwern.net</a>.</li>
<li><a href="https://slatestarcodex.com/2018/07/10/melatonin-much-more-than-you-wanted-to-know">Melatonin: Much More Than You Wanted To Know | Slate Star Codex</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 29 May 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Tea bookmarks</title>
<link>https://xenodium.com/tea-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/tea-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.notesontea.com">Georgia's notes on tea</a>.</li>
<li><a href="https://www.drweil.com/videos-features/videos/9-green-teas-to-try/">Nine Green Teas To Try | Video (Andrew Weil, M.D.)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 28 May 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Math bookmarks</title>
<link>https://xenodium.com/math-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/math-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.3blue1brown.com/#lessons">3Blue1Brown</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=14161876">Calculus Made Easy (1914) (Hacker News)</a>.</li>
<li><a href="https://math.stackexchange.com/questions/733754/visually-stunning-math-concepts-which-are-easy-to-explain">Visually stunning math concepts which are easy to explain</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 23 Apr 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>GnuPG and macOS</title>
<link>https://xenodium.com/gnupg-and-macos</link>
<guid isPermaLink="false">https://xenodium.com/gnupg-and-macos</guid>
    <description><![CDATA[<p>Had problems installing and using GnuPG on macOS, primarily for Emacs use:</p>
<pre><code class="language-example">gpg: problem with the agent: Inappropriate ioctl for device
gpg: error creating passphrase: Operation cancelled
gpg: symmetric encryption of '[stdin]' failed: Operation cancelled
</code></pre>
<p>Basic installation required:</p>
<pre><code class="language-{.bash">brew install gnupg
</code></pre>
<p>But worked around the error above by using pinentry-mac (UI), instead of Emacs prompts.</p>
<pre><code class="language-{.bash">brew install pinentry-mac
</code></pre>
<p>Edited ~/.gnupg/gpg-agent.conf with:</p>
<pre><code class="language-example">pinentry-program path/to/homebrew/bin/pinentry-mac
</code></pre>
<p>May need to kill gpg-agent to reload config.</p>
<pre><code class="language-{.bash">gpgconf --kill gpg-agent
</code></pre>
]]></description>
    <pubDate>Sun, 23 Apr 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Installing gnuplot on macOS</title>
<link>https://xenodium.com/installing-gnuplot-on-macos</link>
<guid isPermaLink="false">https://xenodium.com/installing-gnuplot-on-macos</guid>
    <description><![CDATA[<p>UPDATE(2019-05-19 Sun): Plan A and B use options no longer available since the recent changes to <a href="https://github.com/Homebrew/homebrew-core/issues/31510">remove all options from Homebrew/homebrew-core formulae</a>. See Plan C.</p>
<h2><s>Plan A</s></h2>
<h3><s>Install gnuplot Qt</s></h3>
<p><s>If you have the resources, you can try the Qt flavor. You need at least 15GB to download and a long build. Ran out of space on my Macbook Air. Aborted.</s></p>
<pre><code class="language-{.bash">brew install gnuplot --with-qt
</code></pre>
<h2><s>Plan B</s></h2>
<h3><s>Install xquartz</s></h3>
<pre><code class="language-{.bash">brew install Caskroom/cask/xquartz
</code></pre>
<h3><s>Install gnuplot x11</s></h3>
<pre><code class="language-{.bash">brew install gnuplot --with-x11
</code></pre>
<h2>Install feedgnuplot</h2>
<p>Feedgnuplot is handy for plotting data streams realtime.</p>
<pre><code class="language-{.bash">brew install feedgnuplot
</code></pre>
<h2>Plan C</h2>
<h3>Install with no options</h3>
<pre><code class="language-{.bash">brew install gnuplot
</code></pre>
<p>So far so good, but default gnuplot formula uses Qt and the Cocoa plugin could not be loaded:</p>
<blockquote>
<p>qt.qpa.plugin: Could not find the Qt platform plugin &quot;cocoa&quot; in &quot;&quot;</p>
</blockquote>
<h3>Debugging</h3>
<ol>
<li>
<p>QT_DEBUG_PLUGINS</p>
<p>Turns out you can get plugin logs using the QT_DEBUG_PLUGINS environment variable:</p>
<pre><code class="language-{.bash">export QT_DEBUG_PLUGINS=1
</code></pre>
<blockquote>
<p>QFactoryLoader::QFactoryLoader() checking directory path &quot;/Users/myuser/homebrew/Cellar/gnuplot/5.2.6_1/libexec/gnuplot/5.2/platforms&quot; …</p>
</blockquote>
<p>This led me to find out about the <em>gnuplot/5.2/gnuplot_qt</em> binary.</p>
</li>
<li>
<p>qt_prfxpath</p>
<p>Getting the Qt prefix can be done by inspecting QtCore's strings:</p>
<pre><code class="language-{.bash">strings /Users/myuser/homebrew/Cellar/qt/5.12.3/Frameworks/QtCore.framework/QtCore | grep qt_prfxpath
</code></pre>
<pre><code class="language-example">qt_prfxpath=/usr/local/Cellar/qt/5.12.3
</code></pre>
<p>Ok so qt_prfxpath is pointing to <em><em>usr/local/Cellar/qt</em>, while my installation's is at //Users/myuser/homebrew/Cellar/qt</em>. This is problematic and indeed my fault for installing homebrew in <em><em>Users/myuser/homebrew</em> instead of the recommended //usr/local</em>.</p>
<p>Symlinking did the job:</p>
<pre><code class="language-{.bash">sudo mkdir -p /usr/local/Cellar
sudo ln -s ~/homebrew/Cellar/qt /usr/local/Cellar/qt
</code></pre>
<pre><code class="language-{.bash">/Users/myuser/homebrew/Cellar/gnuplot/5.2.6_1/libexec/gnuplot/5.2/gnuplot_qt
</code></pre>
<p>Success.</p>
</li>
</ol>
]]></description>
    <pubDate>Mon, 13 Mar 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Tel Aviv travel bookmarks</title>
<link>https://xenodium.com/tel-aviv-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/tel-aviv-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Breakfast club (dancing).</li>
<li>Claro/Sarona Market.</li>
<li><a href="https://en.wikipedia.org/wiki/Dizengoff_Square">Dizengoff Square - Wikipedia</a>.</li>
<li>Drink Cafe hafuch at Rothschild 12.</li>
<li>Jaffa's Flea market.</li>
<li>Nightlife: Kuli Alma's hipster haven. Imperial craft cocktail bar (drink Gold fashioned).</li>
<li>Park HaYarkon.</li>
<li>Tel Aviv museum of art.</li>
</ul>
]]></description>
    <pubDate>Sun, 22 Jan 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Jerusalem travel bookmarks</title>
<link>https://xenodium.com/jerusalem-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/jerusalem-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Jerusalem: Rooftop Mamilla restarurant.</li>
</ul>
]]></description>
    <pubDate>Sun, 22 Jan 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Nepal travel bookmarks</title>
<link>https://xenodium.com/nepal-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/nepal-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.erikastravelventures.com/annapurna-circuit-itinerary/">Annapurna Circuit Itinerary - Erika's Travelventures</a>.</li>
<li><a href="https://www.planetware.com/pictures/nepal-nep.htm">Nepal in Pictures: 19 Beautiful Places to Photograph</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Patan_Durbar_Square">Patan Durbar square</a>.</li>
<li><a href="https://vargiskhan.com/log/truth-behind-mysterious-magnetic-hill-of-ladakh/">The Truth Behind the Mysterious Magnetic Hill of Ladakh - Vargis Khan</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 22 Jan 2017 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Singapore notes</title>
<link>https://xenodium.com/singapore-notes</link>
<guid isPermaLink="false">https://xenodium.com/singapore-notes</guid>
    <description><![CDATA[<ul>
<li>Hotel Mono, 18 Mosque street #01-04.</li>
<li>Buddha tooth relic museum.</li>
<li><a href="http://www.telegraph.co.uk/travel/picturegalleries/8308524/Singapores-best-hawker-centres.html">Best Hawker centers</a>.</li>
<li>Kong Meng San Phor Kark See Monastery.</li>
<li><a href="http://gothere.sg">Go there (figure out fastest MRT route)</a>.</li>
<li><a href="http://2bearbear.com/what-to-eat-at-abc-market-hawker-centre-abc-brickworks-food-centre/">What to eat at ABC Market (Hawker Centre) aka ABC Brickworks Food Centre?</a>.</li>
<li>Curry puffs (see <a href="http://www.hungrygowhere.com/gallery/taste-test-crisp-curry-puffs-*gid-39443101/">Taste test: Crisp curry puffs</a>).</li>
<li><a href="http://thepeakmagazine.com.sg/2016/07/its-official-here-are-singapores-17-michelin-rated-hawker-stalls-in-2016/">Singapore’s 17 Michelin-rated Hawker Stalls in 2016</a>.</li>
<li>Temples
<ul>
<li><a href="http://burmesebuddhisttemple.org.sg/index.htm">Sasanaramsi Burmese temple (14, Tai Gin Road, Singapore 327873)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Thian_Hock_Keng">Thian Hock Keng temple</a>.</li>
<li><a href="http://sultanmosque.sg">Sultan Mosque</a>.</li>
</ul>
</li>
<li>Hawkers
<ul>
<li>Mr and Mrs Mohgan's Super Crispy Roti Prata (<a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/16560200">source</a>) on Crane Road. Dhal/fish/mutton curry side.</li>
<li>Roast Paradise (maybe) Address: #01-122 Old Airport Road Food Centre. Hours: Tues-Sun: 11am to 4pm or till sold out, Wed and Sun: 11am to 2pm, Closed on Mondays.</li>
<li>Fatty Cheong, 肥仔详, (#01-120, ABC Brickworks Food Centre, 6 Jalan Bukit Merah Singapore 150006): char siew and xio bak rice and char siew noodles.</li>
<li>Hoo Kee Bak Chang (Amoy Street Food Centre): bak zhang (glutinous rice dumpling). Try Choose from three kinds: chestnut ($2.80); chestnut with salted egg yolk ($3.60); and chestnut with mushroom ($3.60).</li>
<li>Lim Kee (Orchard) Banana Fritters (Maxwell food centre, <a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/0e560200">source</a>).</li>
<li>Mr Avocado Exotic Juice (Alexandra village food centre, <a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/19560200">source</a>).</li>
<li>Tanglin Crispy Curry Puff (Hong Lim Food Centre or Maxwell, <a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/65560200">source</a>) (东陵酥皮咖喱角). Try sardine curry puff?</li>
<li>Chuan Kee Satay (<a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/63560200">source</a>). Long queue for pork satay.</li>
<li>Selera Rasa Nasi Lemak (<a href="http://www.hungrygowhere.com/gallery/hgw-s-best-hawker-food-for-2015-*gid-75813101/6b560200">source</a>).</li>
<li>Fu Shun Jin Ji Shao La Mian Jia (Maxwell food centre, <a href="http://www.hungrygowhere.com/dining-guide/hawker/food-guide-maxwell-food-centre-*aid-10733101/">source</a>): Char siu + noodles.</li>
<li>Shanghai La Mian Xiao Long Bao (Alexandra Village food centre, <a href="http://www.hungrygowhere.com/gallery/food-guide-alexandra-village-food-centre-*gid-087b3101/584c0200">source</a>): xiao long bao or soup dumplings ($4.50 for 7 pieces).</li>
</ul>
</li>
<li>Timbre+ (hipster hawker centre? <a href="http://www.straitstimes.com/lifestyle/food/10-dishes-to-try-at-hipster-hawker-centre-timbre">source</a>).</li>
<li>Supertree Grove (go at dusk, see lights turn on).</li>
<li>Singapore Botanic garden.
<ul>
<li>Ginger Garden.</li>
<li>Palms valley.</li>
<li>Orchid garden.</li>
</ul>
</li>
<li>Sri Mariamman Temple.</li>
<li>Kusu Island?</li>
<li>Chilly crab (“Jumbo” Chilli Crab Restaurant in Clarke Quay or Harvest Seafood Restaurant)?</li>
<li>Afternoon tea?
<ul>
<li>www.tea-chapter.com.sg</li>
</ul>
</li>
<li>Bumboats (£2.50 return) leave Changi Point between 6am and 9.30pm for the 10-minute crossing to Palau Ubin. Hire a bicycle in the village where the boats dock.</li>
<li>Haji Lane (colorful road).</li>
<li>Tiong Bahru 1930s public housing estate (**)
<ul>
<li>Chong Yu Wanton Mee (Tiong Bahru Market And Food Centre #02-30, 30 Seng Poh Road, <a href="http://www.timeout.com/singapore/restaurants-and-cafes/chong-yu-wanton-mee#tab_panel_2">source</a>).</li>
<li>old-fashioned treats at Tiong Bahru Galicier (55 Tiong Bahru Rd).</li>
</ul>
</li>
<li>Chinatown
<ul>
<li>Pek Sin Choon Tea: Oldest team merchants.</li>
<li>Ang Mo Kio: Sri Mariamman Hindu temple.</li>
<li>Strangelets: quirky stuff from around the world.</li>
<li>40 Hands: Allegedly one of most popular coffee joints.</li>
<li>BooksActually: Coolest book shop.</li>
</ul>
</li>
<li>Keong Saik (next to Chinatown)
<ul>
<li>1939 Hotel.</li>
<li>The Library (49 Keong Saik Rd): night drinks, ask for key/password next door (the-study.sg) (**)</li>
<li><a href="http://marikos.com.sg">Mariko's (Now Phat Cat laundry): Maybe food or drink at night?</a> (**)</li>
<li>Rose Citron (23 Keong Said Rd): French and Asian articles.</li>
</ul>
</li>
<li>Everton park (old housing estate), new meets old
<ul>
<li>Coffee
<ul>
<li>Nylon coffee roasters (<a href="http://nyloncoffee.sg">http://nyloncoffee.sg</a>).</li>
<li>Just Want Coffee (justwant.com.sg).</li>
<li>Cozy corner coffee.</li>
</ul>
</li>
<li>Sweets
<ul>
<li>Grin Affair (grinaffair.com): natural ingredients into glass jar creations.</li>
<li>Batterworks (batter-works.com): pastries.</li>
<li><a href="http://cozycornercoffee.com">http://cozycornercoffee.com</a>.</li>
<li>Seriously ice scream (facebook.com/seriouslyicecream).</li>
<li>Ji Xiang Confectionery (jixiangconfectionery.com): Traditional glutinous sweets. (**)</li>
</ul>
</li>
<li>Food
<ul>
<li>The Provision Shop (Blk 3 Everton Park): for a classic and affordable meal.</li>
<li>Chew the Fat (Blk 6 Everton Park): comfort food.</li>
<li>Eden's Kitchen (<a href="http://edenskitchen.sg">http://edenskitchen.sg</a>): healthy, green tea, coconut oil, etc.</li>
</ul>
</li>
</ul>
</li>
<li>Jalan Besar
<ul>
<li>Char: unconventional char siu (<a href="http://www.nytimes.com/2015/01/25/travel/restaurant-report-char-in-singapore.html">source</a>).</li>
<li>The Banana Leaf Apollo (Little India).</li>
<li>Beach Road Scissors-Cut (220 Jln Besar): Curry Rice. (**)</li>
<li>Fu Zhou Poh Hwa Oyster Cake (166 Jln Besar): UFO-shaped snacks. (**)</li>
<li><a href="http://www.sweechoon.com">Swee Choon Tim Sum Restaurant: a dim sum institution!</a>. (**)</li>
<li><a href="http://papapalheta.com">Papa Palheta coffee: best coffee in town?</a>.</li>
<li><a href="http://thegeneralco.sg">General Company: awesome design and workshops</a>. (**)</li>
<li><a href="http://eat.thebravery.sg">The Bravery: brunch, aka awesome pancakes</a>. (**)</li>
<li><a href="http://aeiou.sg">AEIOU: Retro shopping</a>.</li>
</ul>
</li>
<li>Geylang (preserved shophouses and rich in Malay history)
<ul>
<li>Hajjah Mona Nasi Padang (Geylang Serai food centre): Order nasi padang (try dry one).</li>
<li>Biryani Express (Geylang Serai food centre)</li>
<li>Red light district. Still?</li>
<li><a href="http://brawnandbrains.sg/">Brawn &amp; Brains (Coffee)</a>.</li>
<li><a href="http://oldgeylang.com.sg">Old Geylang (crocodile, turtle soup, other oddities)</a>.</li>
<li>Hi-Thrift (1 Geylang Rd): Second hand treasures? (**).</li>
</ul>
</li>
</ul>
]]></description>
    <pubDate>Fri, 02 Dec 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Email provider bookmarks</title>
<link>https://xenodium.com/email-provider-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/email-provider-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.robinwhittleton.com/2018/02/18/dropping-g-suite/">Dropping G Suite - Robin Whittleton</a>.</li>
<li><a href="https://heluna.com/">Heluna - Cloud-based antispam</a>.</li>
<li><a href="https://mailinabox.email/">Mail-in-a-Box</a>.</li>
<li><a href="https://mailbox.org/">mailbox.org – Ihr sicherer E-Mail-Anbieter</a>.</li>
<li><a href="https://mailbox.org/">Mailbox.org</a>.</li>
<li><a href="http://migadu.com">Migadu</a>.</li>
<li><a href="http://Posteo.de">Posteo</a>.</li>
<li><a href="https://protonmail.com/">ProtonMail</a>.</li>
<li><a href="https://soverin.net/">Soverin - Home - Soverin</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=40708476">Understanding SPF, DKIM, and DMARC: A Simple Guide | Hacker News</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 02 Dec 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Go snippets</title>
<link>https://xenodium.com/go-snippets</link>
<guid isPermaLink="false">https://xenodium.com/go-snippets</guid>
    <description><![CDATA[<h2>Command-line flags</h2>
<pre><code class="language-go">import (
      &quot;flag&quot;
)

type args struct {
      flag1  string
      flag2  string
        arg    string
}

func parseArgs() args {
      args := args{}

      flag.StringVar(&amp;args.flag1, &quot;flag1\n&quot;, &quot;\n&quot;, &quot;some flag 1 with sample `value`&quot;)
      flag.StringVar(&amp;args.flag2, &quot;flag2\n&quot;, &quot;\n&quot;, &quot;some flag 2 with sample `value`&quot;)

      flag.CommandLine.Usage = func() {
          fmt.Fprintf(os.Stderr, &quot;Usage of %s:\n\n&quot;, os.Args[0])
          fmt.Fprintf(os.Stderr, &quot;\n  myarg\n\n&quot;)
          flag.PrintDefaults()
      }

      flag.Parse()

      args.arg = flag.Arg(0)

      if args.flag1 == &quot;&quot; || args.flag2 == &quot;&quot; || args.arg == &quot;&quot; {
          flag.CommandLine.Usage()
          os.Exit(1)
      }
      return args
}

func main() {
        args := parseArgs()
        fmt.Printf(&quot;Args: %#v\n&quot;, args)
}

</code></pre>
<pre><code class="language-{.bash">go run main.go -flag1 val1 -flag2 val2 arg
</code></pre>
]]></description>
    <pubDate>Thu, 01 Dec 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Javascript snippets</title>
<link>https://xenodium.com/javascript-snippets</link>
<guid isPermaLink="false">https://xenodium.com/javascript-snippets</guid>
    <description><![CDATA[]]></description>
    <pubDate>Thu, 01 Dec 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sydney travel bookmarks</title>
<link>https://xenodium.com/sydney-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sydney-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.buzzfeed.com/mikeynicholson/thats-not-a-pool-this-is-a-pool">17 Stunning Sydney Pools That Will Make You Want To Jump Back In The Water</a>.</li>
<li><a href="http://apassionandapassport.com/2015/01/48-hours-sydney-australia/">48 Hours in Sydney</a>.</li>
<li><a href="http://bourkestreetbakery.com.au/">Bourke Street Bakery</a>.</li>
<li>Collector Store (Surrey Hills).</li>
<li><a href="http://merivale.com.au/coogeepavilion">Coogee Pavilion</a>.</li>
<li><a href="http://fouratefive.com/">Four ate five</a>.</li>
<li><a href="http://www.harryscafedewheels.com.au/">Harry's Cafe de Wheels: Famous for Pies and Peas, Meat Pies, Hot Dogs</a>.</li>
<li><a href="https://www.hurricanesgrillandbar.com.au/bondi-beach/">Hurricane’s grill &amp; bar Bondi beach</a>.</li>
<li><a href="http://loxstockandbarrel.com.au/">Lox Stock &amp; Barrel</a>.</li>
<li><a href="http://marigold.com.au">Marigold citymark (dim sum)</a>.</li>
<li><a href="http://www.reubenhills.com.au/about">Reuben Hills</a>.</li>
<li><a href="https://seanspanaroma.co/">Seans</a>.</li>
<li><a href="http://thetrustedtraveller.com/sydneys-best-markets/">Sydney's Best Markets - The Trusted Traveller</a>.</li>
<li><a href="http://theeightrestaurant.com.au">The eight (dim sum)</a>.</li>
<li><a href="http://theglenmore.com.au/">The Glenmore</a>.</li>
<li><a href="http://www.threeblueducks.com/">Three Blue Ducks</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 27 Nov 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Laos travel bookmark</title>
<link>https://xenodium.com/laos-travel-bookmark</link>
<guid isPermaLink="false">https://xenodium.com/laos-travel-bookmark</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.youtube.com/watch?v=uImN-P4xh1U">Best Way to Enjoy Luang Prabang</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 16 Oct 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Singapore travel bookmarks</title>
<link>https://xenodium.com/singapore-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/singapore-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.reddit.com/r/singapore/comments/4s5y70/any_place_to_go_thrift_shopping_in_singapore/">Any place to go thrift shopping in Singapore? (Reddit)</a>.</li>
<li>East coast lagoon.</li>
<li><a href="https://twitter.com/visakanv/status/1129373195901915136">Food post on SG</a>.</li>
<li><a href="http://ieatishootipost.sg/tai-hua-bak-chor-mee-everybody-queue-up">Hillstreet Tai Hwa Pork Noodles: Everybody Queue up!</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Little_India,_Singapore">Little India</a>.</li>
<li><a href="https://twitter.com/visakanv/status/1171034065354379264">More SG spots</a>.</li>
<li><a href="http://thehoneycombers.com/singapore/second-hand-shopping-in-singapoe-best-places-for-thrift-shopping-for-pre-loved-clothes-used-furniture-and-vintage-accessories/">Second hand shopping in Singapore</a>.</li>
<li><a href="https://twitter.com/visakanv/status/1171037799673262083">SG spots</a>.</li>
<li><a href="http://www.telegraph.co.uk/travel/picturegalleries/8308524/Singapores-best-hawker-centres.html">Singapore's best hawker centres - Telegraph</a>.</li>
<li><a href="http://sg.asia-city.com/">The Insider's Guide to Singapore (SG Magazine Online)</a>.</li>
<li><a href="http://www.mariefranceasia.com/fashion/serial-shopper/shopping-guide/treasure-hunt-5-places-thrift-singapore-107735.html">Treasure Hunt: 5 Places to thrift in Singapore</a>.</li>
<li><a href="https://twitter.com/visakanv/status/1204136302230130688">Visakan Veerasamy on Twitter: &quot;what do you know about Singapore?&quot;</a>.</li>
<li><a href="https://www.reddit.com/r/singapore/comments/5gf0y5/what_is_the_best_hawker_center_in_singapore/">What is the best hawker center in singapore? (Reddit)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 08 Oct 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cambodia travel bookmarks</title>
<link>https://xenodium.com/cambodia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cambodia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Pub Street (Siem Reap, Cambodia).</li>
</ul>
]]></description>
    <pubDate>Sat, 01 Oct 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>New York travel bookmarks</title>
<link>https://xenodium.com/new-york-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/new-york-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lonelyplanet.com/usa/new-york-city/travel-tips-and-articles/best-taco-joints-in-new-york-city">Best taco joints in New York City - Lonely Planet</a>.</li>
<li><a href="https://twitter.com/EricaJoy/status/1079505326922174464">Nice and/or fancy restaurant to eat at in brooklyn (Erica Joy's tweet)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 01 Oct 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>API design bookmarks</title>
<link>https://xenodium.com/api-design-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/api-design-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://blog.madewithlove.be/post/birdseye-view-on-api/">A bird's eye view on API development</a>.</li>
<li><a href="https://msdn.microsoft.com/en-us/library/dd203052.aspx">A Guide to Designing and Building RESTful Web Services with WCF 3.5 (Microsoft)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24383180">Ask HN: Suggestions for books about API design? | Hacker News</a>.</li>
<li><a href="http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api">Best Practices for Designing a Pragmatic RESTful API</a>.</li>
<li><a href="https://apisyouwonthate.com/">Build APIs You Won't Hate</a>.</li>
<li><a href="https://mollyrocket.com/casey/stream_0028.html">Designing and Evaluating Reusable Components</a>.</li>
<li><a href="http://harrymoreno.com/2016/03/31/API-design-link-roundup.html">Harry Moreno | API Design Link Roundup</a>.</li>
<li><a href="https://ozlabs.org/~rusty/index.cgi/tech/2008-03-30.html">How Do I Make This Hard to Misuse?</a>.</li>
<li><a href="http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/32713.pdf">How to Design a Good API and Why it Matters (Google)</a>.</li>
<li><a href="https://www.youtube.com/watch?v=aAb7hSCtvGw">How To Design A Good API and Why it Matters - YouTube</a>.</li>
<li><a href="http://sheredom.wordpress.com/2014/08/10/how-to-design-api-function-that-creates-something/">How to design API function creating objects</a>: By Neil Henning.</li>
<li><a href="https://geemus.gitbooks.io/http-api-design/content/en/index.html">HTTP API Design Guide</a>.</li>
<li><a href="http://jsonapi.org/">JSON API — A specification for building APIs in JSON</a>.</li>
<li><a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md">Microsoft REST API Guidelines</a>.</li>
<li><a href="http://wooptoo.com/blog/notes-on-restful-apis/">Notes on RESTful APIs (Updated)</a>.</li>
<li><a href="https://bocoup.com/weblog/documenting-your-api">REST API Documentation Best Practices</a>.</li>
<li><a href="http://www.restapitutorial.com/">REST API Tutorial</a>.</li>
<li><a href="https://www.youtube.com/watch?v=hdSrT4yjS1g">REST+JSON API Design - Best Practices for Developers - YouTube</a>.</li>
<li><a href="https://drive.google.com/a/xenodium.com/file/d/0B8qU9uFznmLsUEZ3TEFMbDZQcUE/view">RESTful Service Design - UC Berkeley</a>.</li>
<li><a href="http://sweng.the-davies.net/Home/rustys-api-design-manifesto">Rusty's API Design Manifesto</a>.</li>
<li><a href="http://www.aristeia.com/Papers/IEEE_Software_JulAug_2004_revised.htm">Scott Meyers: The Most Important Design Guideline?</a>.</li>
<li><a href="https://swift.org/documentation/api-design-guidelines/">Swift.org - API Design Guidelines</a>.</li>
<li><a href="http://www.slideshare.net/landlessness/teach-a-dog-to-rest">Teach a Dog to REST</a>.</li>
<li><a href="https://bradfults.com/the-best-api-documentation-b9e46400379a#.a7k8edhyc">The Best API Documentation</a>.</li>
<li><a href="http://www4.in.tum.de/~blanchet/api-design.pdf">The Little Manual of API Design (Jasmin Blanchette, Trolltech)</a>.</li>
<li><a href="https://drive.google.com/a/xenodium.com/file/d/0B8qU9uFznmLsdFBHS1I2c1ZLRkE/view">Web API Design - Crafting interfaces that developers love</a>.</li>
<li><a href="http://programmingisterrible.com/post/139222674273/write-code-that-is-easy-to-delete-not-easy-to">Write code that is easy to delete, not easy to extend</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 18 Sep 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Handy pdf utilities</title>
<link>https://xenodium.com/handy-pdf-utilities</link>
<guid isPermaLink="false">https://xenodium.com/handy-pdf-utilities</guid>
    <description><![CDATA[<p>Straight out of <a href="http://jvns.ca/blog/2016/08/29/how-i-made-a-zine">How (and why) I made a zine</a>, some handy utilities for generating pdfs…</p>
<h2>Convert pngs to pdfs</h2>
<pre><code class="language-{.bash"># start with a bunch of PNG images of your zine pages
# convert them all to PDF
for i in *.png
   do
      # imagemagick is the best thing in the world
      convert $i $i.pdf
   done
</code></pre>
<h2>Combine pdfs</h2>
<p>Combine pdfs using pdftk:</p>
<pre><code class="language-{.bash">pdftk *.pdf cat output zine.pdf
</code></pre>
<p>Combine pdfs using poppler:</p>
<pre><code class="language-{.bash">pdf unite PDF1.pdf PDF2.pdf PDF3.pdf
</code></pre>
<h2>Reorder pdf pages</h2>
<pre><code class="language-{.bash"># pdfmod is a GUI that lets you reorder pages
pdfmod zine.pdf
</code></pre>
<h2>Add margins to pdf</h2>
<pre><code class="language-{.bash"># pdfcrop lets you add margins to the pdf. this is good because otherwise the
# printer will cut off stuff at the edges
pdfcrop --margin '29 29 29 29' zine.pdf zine-intermediate.pdf
</code></pre>
<h2>Turn pdf into booklet</h2>
<pre><code class="language-{.bash"># pdfjam is this wizard tool that lets you take a normal ordered pdf and turn
# it into something you can print as a booklet on a regular printer.
# no more worrying about photocopying machines
pdfjam --booklet true --landscape --suffix book --letterpaper --signature 12 --booklet true --landscape zine-intermediate.pdf -o zine-booklet.pdf
</code></pre>
]]></description>
    <pubDate>Sun, 18 Sep 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fuzzy search Emacs compile history</title>
<link>https://xenodium.com/fuzzy-search-emacs-compile-history</link>
<guid isPermaLink="false">https://xenodium.com/fuzzy-search-emacs-compile-history</guid>
    <description><![CDATA[<p>I wrote about <a href="#search-bash-history-with-emacs-helm">searching bash history with Emacs Helm</a> some time ago. Since then, I've learned about <em>completing-read</em> to generically handle simple Emacs completions (very handy for supporting Helm, Ivy, and Ido completions).</p>
<p>Here's a simple way to combine <em>completing-read</em> and the <em>compile</em> command to enable fuzzy searching your compile history:</p>
<p><img src="https://xenodium.github.io/images/fuzzy-search-emacs-compile-history/fuzzy_compile.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(defun ar/compile-completing ()
  &quot;Compile with completing options.&quot;
  (interactive)
  (let ((compile-command (completing-read &quot;Compile command: &quot; compile-history)))
    (compile compile-command)
    (add-to-list 'compile-history compile-command)))
</code></pre>
]]></description>
    <pubDate>Thu, 15 Sep 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Jumping on the Emacs 25 bandwagon</title>
<link>https://xenodium.com/jumping-on-emacs-25-bandwagon</link>
<guid isPermaLink="false">https://xenodium.com/jumping-on-emacs-25-bandwagon</guid>
    <description><![CDATA[<p>Can't miss out on all the new fun. Emacs 25 RC2 is out and lots of people already using it. Since I'm mostly on MacOS these days, installing via homebrew with –devel, gets you RC2:</p>
<pre><code class="language-{.bash">brew install emacs --devel --with-cocoa --with-gnutls --with-librsvg --with-imagemagick
</code></pre>
<p><img src="https://xenodium.github.io/images/jumping-on-emacs-25-bandwagon/emacs25.png" alt=""></p>
<p>The only hiccup so far's been org mode failing to export, which was fixed by re-installing it (follow <a href="https://lists.gnu.org/archive/html/emacs-orgmode/2015-08/msg00320.html">this thread</a>).</p>
]]></description>
    <pubDate>Mon, 05 Sep 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>San Francisco's Mission District travel bookmarks</title>
<link>https://xenodium.com/san-franciscos-mission-district-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/san-franciscos-mission-district-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Atlas Cafe.</li>
<li>Blue Bottle Coffee.</li>
<li>Cafe la Boheme.</li>
<li><a href="https://en.wikipedia.org/wiki/Clarion_Alley">Clarion Alley</a>.</li>
<li>Coffee Bar.</li>
<li>Dynamo donut &amp; coffee.</li>
<li>Four Barrel Coffee.</li>
<li>Grand Coffee.</li>
<li>Haus Coffee.</li>
<li>Kafe 99.</li>
<li>Linea cafe.</li>
<li>Mission skateboards.</li>
<li>pNakamoto's Bitcoin shop.</li>
<li>Philz Coffee.</li>
<li>Ritual Coffee roasters.</li>
<li>Rodger's coffee &amp; tea.</li>
<li>Sightglass Coffee.</li>
<li>Stable Cafe.</li>
<li>Sugar lump coffee lounge.</li>
</ul>
]]></description>
    <pubDate>Sun, 31 Jul 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Moscow travel bookmarks</title>
<link>https://xenodium.com/moscow-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/moscow-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.drzhivago.ru/en/">Drюzhivago (restaurant)</a>.</li>
<li><a href="http://park-gorkogo.com/">Gorky park</a>.</li>
<li><a href="https://twitter.com/archpng/status/1180991886674321408">Hotel Peking</a>.</li>
<li><a href="http://www.kremlin-izmailovo.com/o-kremle/kreml-segodnja">Izmailovo</a>.</li>
<li><a href="http://mgomz.com/">Kolomenskoe (park)</a>.</li>
<li><a href="http://www.kreml.ru/en-Us/museums-moscow-kremlin">Kremlin</a>.</li>
<li><a href="http://kuskovo.ru/en">Kuskovo (park)</a>.</li>
<li><a href="https://www.mariinsky.ru/en/">Mariinsky (see ballet or opera)</a>.</li>
<li><a href="https://themoscowtimes.com/">Moskow times (check for events)</a>.</li>
<li><a href="http://strelka.com/en/bar">Strelka (lectures, cocktails and dances)</a>.</li>
<li><a href="https://www.tarasbulba.ru/main-menu.html">Tarasbulba (food)</a>.</li>
<li><a href="http://www.tsaritsyno-museum.ru/index.php?lang=en">Tsaritsyno park</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 Jul 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Vietnam travel bookmarks</title>
<link>https://xenodium.com/vietnam-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/vietnam-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Can Ba Quan
<ul>
<li>Nikki Tren.</li>
<li>Vietnamese Cajun.</li>
</ul>
</li>
<li><a href="https://www.lonelyplanet.com/vietnam/con-son/travel-tips-and-articles/exploring-vietnams-remote-con-dao-islands">Exploring Vietnam's remote Con Dao Islands</a>.</li>
<li><a href="https://www.vietnamonline.com/destination/hoi-an.html">Hoi An, Vietnam- Travel guide</a>.</li>
<li><a href="http://www.weloveeattravel.com/list-locations-somebody-feed-phil-saigon-vietnam/">List of Locations: Somebody Feed Phil - Ho Chi Minh City, Vietnam</a>.</li>
<li>Pho Bo Phu Gia
<ul>
<li>DC: 146K LY Chinh Thang.</li>
<li>0908 208 866.</li>
</ul>
</li>
<li>Simon Standly and Vin Dao (food journalists)</li>
<li><a href="http://www.weloveeattravel.com/list-locations-somebody-feed-phil-saigon-vietnam/">Somebody Feed Phil, List of Locations: Ho Chi Minh City</a>.</li>
<li>Thuc Pham Duc Viet
<ul>
<li>Bahn Mi</li>
<li>Pate Bu Cha</li>
<li>Nhan Dat Bi Cha</li>
</ul>
</li>
<li><a href="https://saigonboy.me/another-favorite-bookstore-bookworm-hanoi">Another favorite bookstore - Bookworm Hanoi | The Saigon boy</a></li>
</ul>
]]></description>
    <pubDate>Sun, 24 Jul 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Pokémon Go bookmarks</title>
<link>https://xenodium.com/pokemon-go-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/pokemon-go-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.reddit.com/r/pokemon/comments/4ruand/pok%25C3%25A9mon_go_lengthy_introduction_guide">Pokémon GO Lengthy Introduction Guide (Reddit)</a>.</li>
<li><a href="https://rankedboost.com/pokemon-go/catching-locations/">Pokémon locations</a>.</li>
<li><a href="https://www.reddit.com/r/pokemongo/comments/4rlnmc/some_tips_from_my_last_days_playing">Some tips from my last days playing (Reddit)</a>.</li>
<li><a href="https://www.reddit.com/r/pokemongo/comments/4srsiu/yet_another_tips_and_tricks_from_a_level_20">Yet another &quot;Tips and Tricks&quot; from a level 20+ (Reddit)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 19 Jul 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Coffee bookmarks</title>
<link>https://xenodium.com/coffee-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/coffee-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.idosi.org/wasj/wasj2(5)/17.pdf">Changes properties of coffee brew during roasting</a>.</li>
<li><a href="http://www.coffeegeek.com/guides/aeropresscoldbrew">Aeropress Iced Coffee</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 03 Jul 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Machine learning bookmarks</title>
<link>https://xenodium.com/machine-learning-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/machine-learning-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=12083124">A Course in Machine Learning (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11985709">How to start learning deep learning (Hacker News)</a>.</li>
<li><a href="http://ofir.io/How-to-Start-Learning-Deep-Learning">How to start learning deep learning</a>.</li>
<li><a href="https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471#.tg3yzvbep">Machine Learning is Fun! The world’s easiest introduction to Machine Learning</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19000027">Practical Deep Learning for Coders 2019 (Hacker News)</a>.</li>
<li><a href="https://www.quora.com/What-are-the-best-ways-to-pick-up-Deep-Learning-skills-as-an-engineer/answer/Greg-Brockman?srid=cgo&amp;share=d1ac0da2">What are the best ways to pick up Deep Learning skills as an engineer? (Quora)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 03 Jul 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs and emotional vocab</title>
<link>https://xenodium.com/emacs-and-emotional-vocab</link>
<guid isPermaLink="false">https://xenodium.com/emacs-and-emotional-vocab</guid>
    <description><![CDATA[<p>Having read <a href="http://www.nytimes.com/2016/06/05/opinion/sunday/are-you-in-despair-thats-good.html">Are You in Despair? That’s Good</a>, I was encouraged to expand my emotional vocabulary. As a <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/play/zone.el">zone.el</a> fan (checkout <a href="https://github.com/wasamasa/zone-nyan">nyan</a>, <a href="https://github.com/kawabata/zone-sl">sl</a>, and <a href="https://github.com/kawabata/zone-rainbow">rainbow</a>), I looked into writing a zone <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/play/zone.el#L52">program</a>. When <em>zone-when-idle</em> is set, zone acts as a screensaver of sorts. We can use this to display random emotional vocab whenever Emacs is idle for a period of time. Let's get to it…</p>
<p>Zone keeps a list of programs to choose from when kicked off. Below is a basic <em>zone-hello</em> program, along with an interactive command for previewing. Not much to these. The tiny program prepares the screen for zoning and inserts text while no input is pending.</p>
<pre><code class="language-{.commonlisp">(defun zone-hello ()
  (delete-other-windows)
  (setq mode-line-format nil)
  (zone-fill-out-screen (window-width) (window-height))
  (delete-region (point-min) (point-max))
  (goto-char (point-min))
  (while (not (input-pending-p))
    (insert &quot;hello zone\n&quot;)
    (zone-park/sit-for (point-min) 0.2)))

(defun zone-hello-preview ()
  (interactive)
  (let ((zone-programs [zone-hello]))
    (zone)))
</code></pre>
<p>Here's what <em>zone-hello</em> looks like:</p>
<p><img src="https://xenodium.github.io/images/emacs-and-emotional-vocab/minimal-zone.gif" alt=""></p>
<p>Back to improving our emotional vocabulary, we'll need a dictionary for our goal. A quick search yields a potential list of <a href="http://www.psychpage.com/learning/library/assess/feelings.html">words</a>. We can use <a href="http://wordnet.princeton.edu/">WordNet</a> to define them while offline. These two sources will do for now. We tie it all together in <a href="https://github.com/xenodium/dotfiles/blob/master/emacs/ar/zone-words.el">zone-words.el</a> and the resulting zone program looks as follow:</p>
<p><img src="https://xenodium.github.io/images/emacs-and-emotional-vocab/emotions.gif" alt=""></p>
<p>UPDATE: Just came across <a href="http://blog.josephwilk.net/art/emacs-animation.html">Animations With Emacs</a>. A post with awesome zone examples.</p>
]]></description>
    <pubDate>Fri, 17 Jun 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs: Find number of days between dates</title>
<link>https://xenodium.com/emacs-find-number-of-days-between-dates</link>
<guid isPermaLink="false">https://xenodium.com/emacs-find-number-of-days-between-dates</guid>
    <description><![CDATA[<p>Needed to find the number of days between two dates. Emacs calendar must know this…</p>
<ul>
<li>Fire up the manual (M-x info-emacs-manual or C-h r).</li>
<li>Info-goto-node (or g).</li>
<li>Type &quot;counting days&quot; and voilá:</li>
</ul>
<blockquote>
<p>To determine the number of days in a range, set the mark on one date using `C-&lt;SPC&gt;', move point to another date, and type `M-=' (`calendar-count-days-region'). The numbers of days shown is [inclusive]{.underline}; that is, it includes the days specified by mark and point.</p>
</blockquote>
<p><img src="https://xenodium.github.io/images/emacs-find-number-of-days-between-dates/emacs-days-between-dates.gif" alt=""></p>
<p><em>Note: you can use the mouse to jump to another date, or &quot;g d&quot; (calendar-goto-date).</em></p>
]]></description>
    <pubDate>Tue, 10 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>RoutingHTTPServer snippet</title>
<link>https://xenodium.com/routinghttpserver-snippet</link>
<guid isPermaLink="false">https://xenodium.com/routinghttpserver-snippet</guid>
    <description><![CDATA[<p><a href="https://github.com/mattstevens/RoutingHTTPServer">RoutingHTTPServer</a> snippet:</p>
<pre><code class="language-objc">RoutingHTTPServer *routingHTTPServer = [[RoutingHTTPServer alloc] init];
[routingHTTPServer setPort:8000];
[routingHTTPServer setDefaultHeader:@&quot;Server&quot; value:@&quot;YourAwesomeApp/1.0&quot;];
[routingHTTPServer handleMethod:@&quot;GET&quot;
                       withPath:@&quot;/hello&quot;
                          block:^(RouteRequest *request, RouteResponse *response) {
    [response setHeader:@&quot;Content-Type&quot; value:@&quot;text/plain&quot;];
    [response respondWithString:@&quot;Hello!&quot;];
  }];
NSError *error = nil;
if (![routingHTTPServer start:&amp;error]) {
  NSLog(@&quot;Error starting HTTP Server: %@\n&quot;, error);
 }
</code></pre>
]]></description>
    <pubDate>Sun, 08 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Alaska travel bookmarks</title>
<link>https://xenodium.com/alaska-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/alaska-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Anchorage.</li>
<li>Denali NP.</li>
<li>Exit Glacier / Kenai Fjord NP.</li>
<li>Ice Falls Hike.</li>
<li>Iditarod race husky camp.</li>
<li>Seward: Kenai Fjord Wildlife cruise (Major Marine cruises).</li>
<li>Talkeetna fishing.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>UIViewController bookmarks</title>
<link>https://xenodium.com/uiviewcontroller-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/uiviewcontroller-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/twostraws/status/1035193619307618304">What's your number one tip for avoiding massive view controllers?</a>.</li>
<li><a href="http://khanlou.com/2014/09/8-patterns-to-help-you-destroy-massive-view-controller/">8 Patterns to Help You Destroy Massive View Controller</a>.</li>
<li><a href="https://realm.io/news/tryswift-daniel-steinberg-blending-cultures/">Blending Cultures: The Best of Functional, Protocol-Oriented, and Object-Oriented Programming</a>.</li>
<li><a href="https://www.youtube.com/watch?v=xsSnOQynTHs&amp;feature=youtu.be">Dan Abramov - Live React: Hot Reloading with Time Travel</a>.</li>
<li><a href="http://inessential.com/2016/04/08/comparing_reactive_and_traditional">Comparing Reactive and Traditional</a>.</li>
<li><a href="http://reswift.github.io/ReSwift/master/getting-started-guide.html">ReSwift: Getting Started</a>.</li>
<li><a href="https://github.com/sahandnayebaziz/StateView/blob/master/readme.md">StateView is a UIView substitute that automatically updates itself when data changes</a>.</li>
<li><a href="http://inessential.com/2016/04/11/the_objective-c_version">The Objective-C version to &quot;Comparing Reactive and Traditional&quot;</a>.</li>
<li><a href="https://realm.io/news/andy-matuschak-refactor-mega-controller">Let's Play: Refactor the Mega Controller!</a>.</li>
<li><a href="https://github.com/jlyman/RN-NavigationExperimental-Redux-Example">How to use Redux to manage navigation state in a React Native</a>.</li>
<li><a href="https://github.com/sahandnayebaziz/StateView">StateView: UIView substitute automatically updating itself when data changes.</a></li>
<li><a href="https://developer.apple.com/videos/play/wwdc2015/219/">Mysteries of Auto Layout, Part 2</a>.</li>
<li><a href="https://www.youtube.com/watch?v=COviCoUtwx4">Netflix JavaScript Talks - RxJS Version 5</a>.</li>
<li><a href="http://www.reactive-streams.org">Reactive Streams</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>When OOO impulse kicks in…</title>
<link>https://xenodium.com/when-ooo-impulse-kicks-in</link>
<guid isPermaLink="false">https://xenodium.com/when-ooo-impulse-kicks-in</guid>
    <description><![CDATA[<ul>
<li>You start moving trivial bits of code into classes, with the anticipation that you might use it one day. Stop.</li>
<li>On naming, semantic clarity trumps brevity. Yup, the verbosity may be worth it.</li>
</ul>
]]></description>
    <pubDate>Tue, 03 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Pakistan travel bookmarks</title>
<link>https://xenodium.com/pakistan-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/pakistan-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.phillymag.com/news/2023/04/08/philly-cheesesteaks-lahore-pakistan/">How Philly Cheesesteaks Became a Big Deal in Lahore, Pakistan</a>.</li>
<li>Karachi.</li>
<li>Lahore.</li>
<li>Rabelpindi.</li>
<li>Shinwari BBQ.</li>
</ul>
]]></description>
    <pubDate>Mon, 02 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Money bookmarks</title>
<link>https://xenodium.com/money-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/money-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.thestreet.com/slideshow/13552416/1/10-countries-where-that-social-security-check-will-let-you-retire-in-style.html">10 Countries Where That Social Security Check Will Let You Retire in Style (TheStreet)</a>.</li>
<li><a href="https://www.lovemoney.com/guides/75277/tax-relief-return-cut-your-income-tax-capital-gains-tax-inheritance-tax">20 items to consider for taxes: Income Tax, Council Tax, and Inheritance Tax (lovemoney.com)</a>.</li>
<li><a href="https://www.benetworthy.com/worst-financial-advice/">25 Bloggers Share The Worst Financial Advice They've Ever Received - Be Net Worthy</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/7o3o06/25_yo_potentially=_2m_bit_overwhelmed/">25 y/o. Potentially £2m. Bit overwhelmed. : UKPersonalFinance</a>.</li>
<li><a href="https://financialpanther.com/9-best-personal-finance-podcasts/">9 Best New Personal Finance Podcasts - Financial Panther</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/cdjdui/a_guide_to_index_funds/">A guide to index funds : UKPersonalFinance</a>.</li>
<li><a href="http://monevator.com/category/investing/passive-investing-investing/">A guide to passive investing in the UK</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/aq5ss6/a_simple_example_of_contributing_half_your_age_as/">A Simple Example of Contributing Half Your Age as a Percentage of Salary to a Pension : UKPersonalFinance</a>.</li>
<li><a href="https://adviserbook.co.uk/">AdviserBook | Find a regulated financial adviser near you</a>.</li>
<li><a href="https://www.amazon.com/How-Interview-Financial-Advisor-Piaw-ebook/dp/B00GXDT9LY">Amazon.com: How to Interview a Financial Advisor eBook: Piaw Na: Kindle Store</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/9edd3m/any_critique_against_the_vanguard_ftse_global_all/">Any critique against the Vanguard FTSE global all cap index? : UKPersonalFinance</a>.</li>
<li><a href="https://www.fca.org.uk/firms/authorised-recognised-funds">Authorised and recognised funds (FCA)</a>.</li>
<li><a href="https://www.bankaccountsavings.co.uk/calculator">Bank Account Savings: Open up multiple accounts to maximise your savings</a>.</li>
<li><a href="https://benefits-calculator.turn2us.org.uk/AboutYou">Benefit Calculator - About You - Turn2us</a>.</li>
<li><a href="https://www.vanguard.com/pdf/icrpr.pdf">Best practices for portfolio rebalancing (Vanguard research July 2010)</a>.</li>
<li><a href="https://www.vanguard.com/pdf/ISGPORE.pdf">Best practices for portfolio rebalancing (Vanguard)</a>.</li>
<li><a href="https://www.bogleheads.org/wiki/Bogleheads%C2%AE_investment_philosophy">Bogleheads® investment philosophy - Bogleheads</a>.</li>
<li><a href="https://transferwise.com/us/borderless/pricing">Borderless account pricing: What are the fees? - TransferWise</a>.</li>
<li><a href="https://www.totallymoney.com/buy-to-let-yield-map/">Buy-to-Let Rental Yield Map 2019 - TotallyMoney</a>.</li>
<li><a href="https://www.financial-hacker.com/bye-yahoo-and-thank-you-for-the-fish/">Bye Yahoo, and thanks for all the fish (The Financial Hacker) - See comments for alternatives</a>.</li>
<li><a href="https://canadiancouchpotato.com/2015/07/13/calculating-your-portfolios-rate-of-return/">Calculating Your Portfolio’s Rate of Return</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/9exrhv/can_i_open_a_lisa_and_a_private_pension_vanguard/">Can I open a LISA and a Private Pension (Vanguard LifeStrategy)?</a>.</li>
<li><a href="https://www.expertsforexpats.com/expat-tax/capital-gains-tax-for-british-expats">Capital Gains Tax for Expats - Experts for Expats</a>.</li>
<li><a href="https://cfiresim.com/">cFIREsim</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/gsvt3r/cheapest_way_to_pay_for_a_yearly_usd_subscription/">Cheapest way to pay for a yearly USD subscription in the UK : UKPersonalFinance</a>.</li>
<li><a href="https://www.gov.uk/check-if-you-need-tax-return">Check if you need to send a Self Assessment tax return - GOV.UK</a>.</li>
<li><a href="https://www.gov.uk/guidance/check-the-recognised-overseas-pension-schemes-notification-list">Check the recognised overseas pension schemes notification list - GOV.UK</a>.</li>
<li><a href="https://www.choosefi.com">ChooseFI (Join the Financial Independence Movement)</a>.</li>
<li><a href="https://www.citizensadvice.org.uk/">Citizens Advice</a>.</li>
<li><a href="https://www.codementor.io/">Codementor (Get live 1:1 coding help, hire a developer, &amp; more)</a>.</li>
<li><a href="https://www.coursera.org/learn/financial-markets-global/reviews">Coursera (Online Courses From Top Universities. Join for Free)</a>.</li>
<li><a href="http://www.cfiresim.com/">Crowdsourced Financial Independence and Early Retirement Simulator/Calculator</a>.</li>
<li><a href="https://qr.ae/TUK1OD">Crystal's Quora answer to becoming a millionaire (full sensible/conservative advice) </a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17930318">Don't Steal Money from Day Traders Before They Lose It (Hacker News)</a>.</li>
<li><a href="https://twitter.com/ericajoy/status/1057774364181987328?s=12">EricaJoy on Twitter: what is the process for finding a financial advisor/accountant/etc</a>.</li>
<li><a href="https://www.justetf.com/de-en/">ETF portfolios made simple (justETF)</a>.</li>
<li><a href="https://www.bogleheads.org/wiki/EU_investing">EU investing - Bogleheads</a>.</li>
<li><a href="https://www.ft.com/content/c6183f2f-f58a-3569-a6ac-9d2b44adfe28">European active managers beaten by passives, 10-year study finds (Financial Times)</a>.</li>
<li><a href="https://app.fin-dee.com/">Fin-dee (FIRE calculator)</a>.</li>
<li><a href="https://www.khanacademy.org/economics-finance-domain/core-finance">Finance and capital markets | Economics and finance | Khan Academy</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/9viifz/financial_education_book_for_teenagers_by_martin/">Financial education book for teenagers by Martin Lewis : UKPersonalFinance</a>.</li>
<li><a href="https://www.madfientist.com/podcast">Financial Independence Podcast</a>.</li>
<li><a href="https://www.reddit.com/r/FIREUK/">Financial Independence Retiring Early UK (r/fireuk)</a>.</li>
<li><a href="https://www.reddit.com/r/EuropeFIRE">Financial independence/retire early in Europe (reddit)</a>.</li>
<li><a href="https://www.financialsamurai.com/wp-content/uploads/2018/08/reasons-to-sell.jpg">Financial Samurai png (typical reasons to sell assets in short term = bad idea long term)</a>.</li>
<li><a href="https://www.thepfs.org/yourmoney/find-an-adviser/">Find an Adviser</a>.</li>
<li><a href="https://www.vouchedfor.co.uk/">Find Top-Rated Financial Advisers, Mortgage Advisers, Solicitors and Accountants</a>.</li>
<li><a href="https://firecalc.com/">FIRECalc: A different kind of retirement calculator</a>.</li>
<li><a href="https://www.moneymarketing.co.uk/fund-charting-2/">Fund Charting – top-performing funds</a>.</li>
<li><a href="https://www.economist.com/finance-and-economics/2017/06/24/fund-managers-rarely-outperform-the-market-for-long">Fund managers rarely outperform the market for long - Buttonwood #passive-over-active</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/9n0636/investing_global_=all_cap_vs_small_cap_first_time/">Global All Cap VS Small Cap - first time 24 Male : UKPersonalFinance</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/wiki/globaltracker">globaltracker - UKPersonalFinance</a>.</li>
<li><a href="https://www.reddit.com/r/Bogleheads/comments/gvxawv/how_do_i_take_a_wage_from_my_vanguard/">How do I take a wage from my vanguard lifestrategy fund</a>.</li>
<li><a href="https://www.quora.com/How-does-AQR-Capital-compare-with-Two-Sigma">How does AQR Capital compare with Two Sigma? - Quora</a>.</li>
<li><a href="https://smartersquirrel.com/how-i-built-a-six-figure-passive-income-by-age-47">How I built a six figure passive income by age 47</a>.</li>
<li><a href="https://urbanplanned.wordpress.com/2018/08/05/how-i-paid-off-5000-of-consumer-debt-in-5-months/">How I paid off £5000 of consumer debt in 5 months – URBANPLANNED</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/elr5qp/how_much_more_expensive_do_kids_get_as_they_get/">How much more expensive do kids get as they get older? : UKPersonalFinance</a>.</li>
<li><a href="https://adamfayed.com/2018/06/26/howtobecomerichbyinvesting/">How to become rich by investing: rational Investing Based on Evidence vs Speculation</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/cvfkr3/how_to_buy_your_first_house_for_dummies/">How to buy your first house for dummies : UKPersonalFinance</a>.</li>
<li><a href="https://moneytothemasses.com/tax/income-tax-2/reader-question-whats-the-easiest-way-to-work-out-how-much-my-bonus-will-be-taxed">How to work out what the tax will be on my bonus?</a>.</li>
<li><a href="https://ukpersonal.finance/windfall/">I have £x, what should I do with with it? - UKPersonalFinance Wiki</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/aickhc/iama_24yo_selling_my_company_for_500000_need/">IAMA 24yo selling my company for £500,000 - need serious advice. : UKPersonalFinance</a>.</li>
<li><a href="https://www.moneysavingexpert.com/tax-calculator/">Income tax calculator: Find out your take-home pay</a>.</li>
<li><a href="https://ukpersonal.finance/index-funds/">Index Funds - UKPersonalFinance Wiki</a>.</li>
<li><a href="https://www.fool.co.uk/investing-basics/isas-and-investment-funds/index-trackers-vs-managed-funds/">Index Trackers vs. Managed Funds | The Motley Fool UK #passive-over-active</a>.</li>
<li><a href="https://cashflowcop.com/invaluable-books/">Invaluable Books - Cashflow Cop</a>.</li>
<li><a href="https://ukpersonal.finance/investing-101/">Investing 101 - UKPersonalFinance Wiki</a>.</li>
<li><a href="https://www.youtube.com/watch">Investing in gold</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/investment-beginners/">Investment for beginners</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/f377un/investment_jargon_putting_me_off/">Investment Jargon Putting Me Off : UKPersonalFinance</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/9oz32t/is_btl_still_worth_it/">Is BTL still worth it? : UKPersonalFinance</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/ISA-guide-savings-without-tax/">ISA allowance: ISA limits &amp; rules - MoneySavingExpert</a>.</li>
<li><a href="https://jlcollinsnh.com/">jlcollinsnh</a>.</li>
<li><a href="https://www.youtube.com/watch?v=WsWLPhVvPaQ">Killik Explains: A short guide to personal pensions (SIPPs) - YouTube</a>.</li>
<li><a href="https://www.youtube.com/watch?v=uUtSdTaiLCE">Killik Explains: Retirement Saving - Lifetime ISAs vs Pensions - YouTube</a>.</li>
<li><a href="https://frugalfoxes.home.blog/2019/01/15/lifestrategy-100-vs-ftse-global-all-cap-index-fund-what-are-the-differences">LifeStrategy® 100 vs FTSE Global All Cap Index Fund – What are the differences?</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/lifetime-ISAs/">Lifetime ISAs: free 1000 towards your first home or retirement</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/lifetime-ISAs/">Lifetime ISAs: free £33,000 towards your first home or retirement</a>.</li>
<li><a href="http://monevator.com/low-cost-index-trackers/">Low cost index trackers that will save you money (Monevator)</a>.</li>
<li><a href="https://www.madfientist.com/podcast">Mad Fientist: Financial Independence Podcast</a>.</li>
<li><a href="https://www.bogleheads.org/wiki/Managing_a_windfall">Managing a windfall - Bogleheads</a>.</li>
<li><a href="http://thefirestarter.co.uk/meet-the-firestarter/">Meet The FIREstarter! - theFIREstarter</a>.</li>
<li><a href="https://millennialmoney.com/">Millennial Money (Next Generation Personal Finance)</a>.</li>
<li><a href="https://www.workforcemillionaire.com/moms-rules-of-finance/">Mom's Rules of Finance (Workforce Millionaire - Investing in Your Future)</a>.</li>
<li><a href="http://monevator.com/">Monevator — Make more money, invest profitably, retire early</a>.</li>
<li><a href="http://monevator.com/compare-uk-cheapest-online-brokers/">Monevator: Compare the UK’s cheapest online brokers</a>.</li>
<li><a href="https://www.monito.com/">Money transfer: compare ways to send money online with Monito</a>.</li>
<li><a href="https://www.monolune.com/">Monolune (trading tools, articles)</a>.</li>
<li><a href="https://dstockhammer.github.io/monthly-savings-juggler/">Monthly Savings Juggler</a>.</li>
<li><a href="http://tools.morningstar.co.uk/uk/xray/editholdings.aspx?LanguageId=en-GB">Morningstar® Integrated Web Tools™ - Instant X-Ray</a>.</li>
<li><a href="https://ukpersonal.finance/mortgages/">Mortgages - UKPersonalFinance Wiki</a>.</li>
<li><a href="http://www.mrmoneymustache.com/">Mr. Money Mustache — Early Retirement through Badassity</a>.</li>
<li><a href="https://www.nsandi.com">National Savings and Investments NS&amp;I</a>.</li>
<li><a href="https://www.nasdaq.com/symbol/">NDAQ Stock Quote - Nasdaq, Inc. Common Stock Price - Nasdaq</a>.</li>
<li><a href="https://www.telegraph.co.uk/money/transferwise/overseas-mortgages/">Overseas mortgages: everything you need to know</a>.</li>
<li><a href="https://www.moneysavingexpert.com/reclaim/parking-ticket-appeals/">Parking Ticket Appeals: Fight unfair fines - Money Saving Expert</a>.</li>
<li><a href="https://www.reddit.com/r/FIREUK/comments/1d0w438/paying_missing_uk_national_insurance/">Paying missing UK national insurance contributions - good for FIRE?</a>.</li>
<li><a href="https://marcusmichaels.github.io/personal-finance-flowchart">Personal Finance Flowchart (github)</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/personal-savings-allowance/">Personal Savings Allowance 2018/19 - up to £1,000 interest tax-free</a>.</li>
<li><a href="https://imgur.com/ZBaOGJj">Plotted my income and outgoings</a>.</li>
<li><a href="https://www.portfolio-performance.info/portfolio/">Portfolio Performance (crossplatform app)</a>.</li>
<li><a href="http://engaging-data.com/will-money-last-retire-early/">Post-Retirement Calculator: Will My Money Survive Early Retirement? Visualizing Longevity Risk - Engaging Data</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/premium-bonds-calculator/">Premium Bond Probability Calculator</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/premium-bonds/">Premium Bonds: are they worth it? - MoneySavingExpert</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/aopvqe/purchasing_a_new_property_with_a_baby_on_the_way/">Purchasing a new property with a baby on the way..? : UKPersonalFinance</a>.</li>
<li><a href="https://reboapp.co.uk/">rebo - Portfolio management software for UK private investors</a>.</li>
<li><a href="https://marcusmichaels.github.io/personal-finance-flowchart/">Reddit Personal Finance Flowchart (interactive)</a>.</li>
<li><a href="https://moneytothemasses.com/owning-a-home/mortgages/should-you-fix-your-mortgage-now">Remortgaging in 2019 - is now the right time to fix &amp; for how long? - Money To The Masses</a>.</li>
<li><a href="https://rockstarfinance.com/">Rockstar Finance (Curating the best of money and personal finance)</a>.</li>
<li><a href="https://directory.rockstarfinance.com/personal-finance-blogs">Rockstar Finance's Directory of Bloggers</a>.</li>
<li><a href="http://media.morningstar.com/uk/MEDIA/Comprehensive_update_on_the_Safe_Withdrawal_Rate.pdf">Safe withdrawal rate (morningstar)</a>.</li>
<li><a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/">Salary Negotiation: Make More Money, Be More Valued | Kalzumeus Software</a>.</li>
<li><a href="http://sankeymatic.com/build/">SankeyMATIC (BETA): Build a diagram (redditor expenses/wages)</a>.</li>
<li><a href="https://thesavingninja.com/sipp-and-isa-fee-comparison/">Saving Ninja: What Platform to Use Now? (iWeb vs Charles Stanley vs Halifax share dealing vs Aviva vs Vanguard Investor)</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/savings-accounts-best-interest/">Savings accounts: 1.5% easy access or up to 2.7% fixed</a>.</li>
<li><a href="https://www.reddit.com/r/financialindependence/comments/9bhg0j/so_you_want_to_be_a_landlord/">So, you want to be a landlord?? : financialindependence</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/eki7yt/started_my_dream_job_and_now_i_am_pregnant/">Started my dream job and now I am pregnant : UKPersonalFinance</a>.</li>
<li><a href="https://www.choosefi.com/starting-late-but-retiring-rich/">Starting Late But Retiring Rich: The Story Of Stephen And Becky ChooseFI</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/stocks-shares-isas/">Stocks &amp; shares ISAs: find the best platform - MSE</a>.</li>
<li><a href="https://jlcollinsnh.com/2014/01/27/stocks-part-xxi-investing-with-vanguard-for-europeans/">Stocks — Part XXI: Investing with Vanguard for Europeans</a>.</li>
<li><a href="https://www.moneysavingexpert.com/banking/tax-rates/#rate">Tax rates 2018/19: tax bands explained - MoneySavingExpert</a>.</li>
<li><a href="https://www.moneysavingexpert.com/banking/tax-rates/">Tax rates 2018/19: tax bands explained - MoneySavingExpert</a>.</li>
<li><a href="https://www.choosefi.com/10-pillars-of-fi/">The 10 Pillars Of FI ChooseFI</a>.</li>
<li><a href="https://theescapeartist.me">The Escape Artist (You can escape to financial freedom)</a>.</li>
<li><a href="https://www.financial-hacker.com/">The Financial Hacker – A new view on algorithmic trading</a>.</li>
<li><a href="https://www.lemonfool.co.uk/">The Lemon Fool (Discussion forums for UK shares, Personal Finance and Investment)</a>.</li>
<li><a href="https://www.financialsamurai.com/the-rise-of-stealth-wealth-guide-to-staying-invisible-from-society-rage/">The Rise Of Stealth Wealth</a>.</li>
<li><a href="https://i.imgur.com/Qi3rF3S.png">The world according to fleet-float equity market capitilization</a>.</li>
<li><a href="https://www.youtube.com/watch?v=s75GcslrfOE">Tim Bennett Explains: Which is best - an ISA or a SIPP? - YouTube</a>.</li>
<li><a href="https://www.moneysavingexpert.com/savings/best-cash-isa/">Top Cash ISAs: 1.35% easy access, 2.3% fixed - MSE</a>.</li>
<li><a href="https://www.cisi.org/cisiweb2/cisi-website/about-us/press-release/2018/09/05/uk-consumers-offered-free-personal-financial-planning-sessions-worth-up-to-500-in-cisi-financial-planning-week-3--10-october-makedreamshappen">UK Financial Planning Week</a>.</li>
<li><a href="https://ukpersonal.finance/uk-funds-faq/">UK Funds FAQ</a>.</li>
<li>UKPersonalFinance redditor quote: &quot;Deprogrammed myself from the zeitgeist of brands/labels. I either buy cheap or I buy quality dependent on application, but in either event I ignore the label.&quot;</li>
<li><a href="https://www.gov.uk/employee-tax-codes/numbers">Understanding your employees' tax codes: What the numbers mean - GOV.UK</a>.</li>
<li><a href="https://firehub.eu/blogs/country/united-kingdom">United Kingdom | Countries (FIREhub.eu)</a>.</li>
<li><a href="http://www.avios.com/gb/en_gb/spend/zone-map?from=flightSearch">Use the Avios Rewards Flight Calculator to plan flights</a>.</li>
<li><a href="https://www.trustnet.com/factsheets/o/ngly/vanguard-ftse-global-all-cap-index">Vanguard FTSE Global All Cap Index A Acc GBP (trustnet)</a>.</li>
<li><a href="http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F00000XXVV&amp;tab=13">Vanguard FTSE Global All Cap Index Fund Investor A GBP Accumulation (Morningstar)</a>.</li>
<li><a href="https://markets.ft.com/data/funds/tearsheet/summary?s=GB00BD3RZ582:GBP">Vanguard FTSE Global All Cap Index Fund Investor A GBP Accumulation, GB00BD3RZ582:GBP summary - FT.com</a>.</li>
<li><a href="https://www.trustnet.com/factsheets/o/acdv/vanguard-lifestrategy-100-equity">Vanguard LifeStrategy 100% Equity A Acc (Trustnet)</a>.</li>
<li><a href="https://www.trustnet.com/factsheets/o/acdt/vanguard-lifestrategy-80-equity">Vanguard LifeStrategy 80% Equity A (Trustnet)</a>.</li>
<li><a href="https://www.vanguardinvestor.co.uk/investing-explained/what-are-lifestrategy-funds">Vanguard LifeStrategy® Funds</a>.</li>
<li><a href="https://www.vanguardinvestor.co.uk/need-help/answer/whats-a-bed-and-isa-and-how-do-i-do-it">Vanguard: Helping you reach your investing goals | Vanguard</a>.</li>
<li><a href="https://www.vanguardinvestor.co.uk/investments/vanguard-lifestrategy-40-equity-fund-accumulation-shares/portfolio-data">Vanguard: LifeStrategy® 40% Equity Fund - Accumulation</a>.</li>
<li><a href="https://www.vanguardinvestor.co.uk/what-we-offer/personal-pension/pension-calculator">Vanguard’s simple Pension Calculator</a>.</li>
<li><a href="https://www.financialsamurai.com/the-way-of-the-financial-samurai-core-principles-for-achieving-financial-independence-and-living-your-best-life/">Way Of The Financial Samurai: Core Principles For Financial Independence</a>.</li>
<li><a href="https://www.reddit.com/r/FIREUK/comments/99ys2d/what_are_some_good_net_worth_tracking_tools_for/">What are some good net worth tracking tools? (for the UK) : FIREUK</a>.</li>
<li><a href="https://www.co-oplegalservices.co.uk/media-centre/articles-may-aug-2017/what-does-a-declaration-of-trust-do/">What Does a Declaration of Trust / Deed of Trust Do?</a>.</li>
<li><a href="https://awealthofcommonsense.com/2014/02/worlds-worst-market-timer/">What if You Only Invested at Market Peaks?</a>.</li>
<li><a href="https://www.quora.com/What-is-the-smartest-financial-habit-that-you-have">What is the smartest financial habit that you have? - Quora</a>.</li>
<li><a href="https://oec.world/en/visualize/tree_map/hs92/export/gbr/show/all/2018/">Where does export to? (2018) | OEC - The Observatory of Economic Complexity</a>.</li>
<li><a href="http://monevator.com/why-a-total-world-equity-index-tracker-is-the-only-index-fund-you-need">Why a world equity index tracker?</a>.</li>
<li><a href="https://www.quora.com/Why-are-most-people-broke">Why are most people broke? - Quora</a>.</li>
<li><a href="https://www.thebalance.com/why-do-bond-prices-and-yields-move-in-opposite-directions-417082">Why Bond Prices and Yields Move in Opposite Directions</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/dschqz/why_do_we_believe_that_the_price_of_stocks_will/">Why do we believe that the price of stocks will grow over the long term</a>.</li>
<li><a href="https://www.youtube.com/watch?v=zrCo0m5gSfc">Why Jack Bogle Doesn't Like ETFs (Forbes - YouTube)</a>.</li>
<li><a href="http://www.stonebanks.co.uk/">www.stonebanks.co.uk (capital gains calculator)</a>.</li>
<li><a href="http://www.x-o.co.uk/">X-O.co.uk - Execution Only Share Dealing (broker)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 02 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Scotland travel bookmarks</title>
<link>https://xenodium.com/scotland-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/scotland-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.airbnb.co.uk/rooms/7908227">The Open Book (AirBnB + a bookshop)</a>.</li>
<li><a href="https://twitter.com/tehbus/status/884464692030308352">Where to eat in Edinburgh? (Twitter)</a></li>
</ul>
]]></description>
    <pubDate>Mon, 02 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>St. Petersburg travel bookmarks</title>
<link>https://xenodium.com/st-petersburg-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/st-petersburg-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://fabergemuseum.ru/">Faberge Muse</a>.</li>
<li><a href="https://duckduckgo.com/">Find a place to eat Koryushka (fried fish)</a>.</li>
<li><a href="https://vovanovaque.com/russia/saintpetersburg/pyshechnaya.html">Get &quot;Pyshka&quot; at Pyshechnaya in Saint Petersburg: local donut shop with 60 years of history</a>.</li>
<li><a href="http://www.hermitagemuseum.org/wps/portal/hermitage/?lng=en">Hermitage Museum</a>.</li>
<li><a href="http://eng.cathedral.ru/spasa_na_krovi/">Savior on the Spilled Blood Church</a>.</li>
<li><a href="http://www.stolle.ru/en/menu/saint-petersburg">Stolle (pie shop)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 02 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>8 week half-marathon training</title>
<link>https://xenodium.com/8-week-half-marathon-training</link>
<guid isPermaLink="false">https://xenodium.com/8-week-half-marathon-training</guid>
    <description><![CDATA[<p>An 8-week training schedule:</p>
<p>WEEK   MON    TUE               WED        THU         FRI    SAT        SUN</p>
<hr>
<p>1      Rest   5 Km              5 Km       <s>Cycle</s>   Rest   5 Km       <s>8 Km</s> 9 Km
29:56             29:54                         29:45      1:00:55
2      Rest   7 Km              5 Km       <s>Cycle</s>   Rest   5 Km       10 Km
41:36             27:52                         28:23      59:17
3      Rest   <s>8 Km</s> 8.1 Km   5 Km       <s>Cycle</s>   Rest   5 Km       12 Km
49:29             29:33                         27:50      1:06
4      Rest   8 Km              Rest       8 Km        Rest   5 Km       14 Km
46:39                        49:28              29:40
5      Rest   8 Km              Rest       <s>8 Km</s>    Rest   <s>6 Km</s>   <s>16 Km</s> 10 Km
48:50                                                      53:38
6      Rest   <s>8 Km</s>          <s>8 Km</s>   8 Km        Rest   8 Km       19 Km
51:39              37:09      2:02
7      Rest   8 Km              Rest       12 Km       Rest   8 Km       16 Km
52:55
8      Rest   8 Km              Rest       5 Km        5 K    Rest       Race</p>
]]></description>
    <pubDate>Mon, 02 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Haskell bookmarks</title>
<link>https://xenodium.com/haskell-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/haskell-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/argumatronic/status/1006583364265152513?s=12">A gentle introduction to profunctors talk</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11606290">A Haskell Reading List (Hacker News)</a>.</li>
<li><a href="http://www.stephendiehl.com/posts/essential_haskell.html">A Haskell Reading List</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17818295">Advice for Haskell beginners (2017) (Hacker News)</a>.</li>
<li><a href="https://lexi-lambda.github.io/blog/2018/02/10/an-opinionated-guide-to-haskell-in-2018/">An opinionated guide to Haskell in 2018</a>.</li>
<li><a href="https://www.goodreads.com/book/show/25587599-haskell-programming">Haskell Programming: From First Principles</a>.</li>
<li><a href="https://diogocastro.com/blog/2018/10/17/haskells-kind-system-a-primer/">Haskell's kind system - a primer</a>.</li>
<li><a href="http://learnyouahaskell.com/higher-order-functions">Higher order functions</a>.</li>
<li><a href="https://github.com/commercialhaskell/intero">Intero: Complete interactive development program for Haskell</a>.</li>
<li><a href="http://people.cs.aau.dk/~normark/prog3-03/html/notes/higher-order-fu_themes-intr-section.html">Introduction to higher-order functions</a>.</li>
<li><a href="https://begriffs.com/posts/2016-05-14-pragmatic-haskell-1.html">Pragmatic Haskell for Beginners, Lecture 1</a>.</li>
<li><a href="https://hackage.haskell.org/user/RenzoCarbonara">Renzo Carbonara (Hackage)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 02 May 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Haskell notes</title>
<link>https://xenodium.com/haskell-notes</link>
<guid isPermaLink="false">https://xenodium.com/haskell-notes</guid>
    <description><![CDATA[<h2>Referential transparency</h2>
<p>An expression consistently evaluating to the same result, regardless of context.</p>
<h2>References</h2>
<ul>
<li><a href="http://learnyouahaskell.com/">learnyouahaskell.com</a>.</li>
<li><a href="https://wiki.haskell.org">wiki.haskell.org</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 17 Apr 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs Objective-C tagging with RTags</title>
<link>https://xenodium.com/emacs-objective-c-tagging-with-rtags</link>
<guid isPermaLink="false">https://xenodium.com/emacs-objective-c-tagging-with-rtags</guid>
    <description><![CDATA[<h2>Install libclang on Mac</h2>
<pre><code class="language-{.bash">brew install llvm --with-clang
</code></pre>
<h2>Install RTags</h2>
<pre><code class="language-{.bash">git clone --recursive https://github.com/Andersbakken/rtags.git
cd rtags
cmake -DCMAKE_PREFIX_PATH=/Users/your-user-name/homebrew/opt/llvm -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .
make
</code></pre>
<h2>Start RTags daemon</h2>
<pre><code class="language-{.bash">path/to/rtags/bin/rdm 2&gt; /tmp/rdm.log
</code></pre>
<h2>Compilation database</h2>
<h3>Install xctool</h3>
<pre><code class="language-{.bash">brew install xctool
</code></pre>
<h3>Generate a compilation database</h3>
<pre><code class="language-{.bash">cd path/to/your/objc-project
xctool -sdk iphonesimulator -arch x86_64 -scheme SomeScheme -reporter pretty -reporter json-compilation-database:compile_commands.json clean build
</code></pre>
<h2>Load compilation database</h2>
<pre><code class="language-{.bash">path/to/rtags/bin/rc -J path/to/your/objc-project/compile_commands.json
</code></pre>
<h2>Install RTags Emacs package</h2>
<pre><code class="language-{.commonlisp">(use-package rtags :ensure t
  :config
  (setq rtags-use-helm t) ;; Optional. Enable if helm fan (I am!).
  (setq rtags-path &quot;path/to/rtags/bin/&quot;))
</code></pre>
<h2>Ready to go</h2>
<p>Use any of the rtags interactive commands. For example:</p>
<pre><code class="language-example">M-x rtags-find-symbol
</code></pre>
<h2>References</h2>
<ul>
<li><a href="https://github.com/Andersbakken/rtags#tldr-quickstart">RTags TLDR Quickstart</a>.</li>
<li><a href="http://syamajala.github.io/c-ide.html">Emacs as C++ IDE</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 28 Mar 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Database bookmarks</title>
<link>https://xenodium.com/database-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/database-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://grimoire.ca/mysql/choose-something-else">Considering MySQL? Use something else</a>.</li>
<li><a href="http://www.columbia.edu/~fdc/postal/">Frank's compulsive guide to postal addresses</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 10 Mar 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Python tips backlog</title>
<link>https://xenodium.com/python-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/python-tips-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=11210370">A Better Pip Workflow (Hacker News)</a>.</p>
]]></description>
    <pubDate>Sun, 06 Mar 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bruges travel bookmarks</title>
<link>https://xenodium.com/bruges-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bruges-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.assietteblanche.be/">assietteblanche.be</a>.</li>
<li>Beer flavored meals at Den Dyver.</li>
<li><a href="http://bistrozwarthuis.be">bistrozwarthuis.be</a>.</li>
<li>Eat fries in front of the belfry and climb it.</li>
<li><a href="http://www.kok-au-vin.be">kok-au-vin.be</a>.</li>
<li><a href="http://www.kurtspan.be/">kurtspan.be</a>.</li>
<li>Minnewater and the old Beguinage.</li>
<li>Old Saint john's Hospital.</li>
<li>Relic of the Holy Blood and City hall.</li>
<li><a href="http://www.restomojo.tk">restomojo.tk</a>.</li>
<li><a href="http://www.thechocolateline.be/en">The Chocolate Line</a>.</li>
<li>The Garre, near the Burg and drink their house Tripel.</li>
<li><a href="http://www.tomsdiner.be">tomsdiner.be</a>.</li>
<li>Try out Straffe Hendrik beer at brewery terrace.</li>
<li>Walk behind Gruuthuse over the little Saint Bonifaas bridge.</li>
</ul>
]]></description>
    <pubDate>Sat, 05 Mar 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs lisp snippets</title>
<link>https://xenodium.com/emacs-lisp-snippets</link>
<guid isPermaLink="false">https://xenodium.com/emacs-lisp-snippets</guid>
    <description><![CDATA[<h2>cl-loop for in</h2>
<pre><code class="language-{.commonlisp">(cl-loop for day in '(&quot;mon&quot; &quot;tue&quot; &quot;wed&quot; &quot;thu&quot; &quot;fri&quot; &quot;sat&quot; &quot;sun&quot;)
         do (print day))
</code></pre>
<h2>cl-loop for from to</h2>
<pre><code class="language-{.commonlisp">(cl-loop for x from 1 to 5
         do (print x))
</code></pre>
<h2>pcase literal matching</h2>
<pre><code class="language-{.commonlisp">(pcase &quot;word&quot;
  ('word (message &quot;Matched 'word symbol&quot;))
  (&quot;word&quot; (message &quot;Matched \&quot;word\&quot; string&quot;)))
</code></pre>
<h2>Avoid nesting with the help of thread-first and thread-last.</h2>
<pre><code class="language-{.commonlisp">(thread-last &quot;12.....34&quot;
  (string-remove-prefix &quot;1&quot;)
  (string-remove-suffix &quot;4&quot;))
</code></pre>
<h2>Find file upwards, up parents, up hierarchy</h2>
<pre><code class="language-{.commonlisp">(locate-dominating-file FILE NAME)
</code></pre>
<h2>Find executable in PATH</h2>
<pre><code class="language-{.commonlisp">(executable-find COMMAND)
</code></pre>
<h2>Read string with completion (helm/ido/ivy friendly)</h2>
<pre><code class="language-{.commonlisp">(completing-read PROMPT COLLECTION &amp;optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)
</code></pre>
<h2>Execute command/process and return list (similar to shell-command-to-string)</h2>
<pre><code class="language-{.commonlisp">(process-lines PROGRAM &amp;rest ARGS)
</code></pre>
<h2>Iterating org buffer</h2>
<pre><code class="language-{.commonlisp">(org-element-map (org-element-parse-buffer) '(headline link)
  (lambda (element)
    (cond
     ((and (eq (org-element-type element) 'headline)
           (= (org-element-property :level element) 1))
      (print &quot;headline&quot;))
     ((eq (org-element-type element) 'link)
      (print &quot;link&quot;)))
    nil))
</code></pre>
]]></description>
    <pubDate>Wed, 02 Mar 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Some modern Objective-C idioms</title>
<link>https://xenodium.com/some-modern-objective-c-idioms</link>
<guid isPermaLink="false">https://xenodium.com/some-modern-objective-c-idioms</guid>
    <description><![CDATA[<h2>NSNumber literals</h2>
<pre><code class="language-objc">NSNumber *number1 = @1024;
NSNumber *number2 = @1024.123f;
NSNumber *number3 = @'A';
NSNumber *number4 = @YES;
NSNumber *number5 = @24ul; // Unsigned long.
NSNumber *number6 = @123456ll; // Long Long.
NSNumber *number7 = @5050.50; // Float.
NSNumber *number8 = @1543; // Integer
NSNumber *number9 = @111.456; // Double
</code></pre>
<h2>Array literals</h2>
<pre><code class="language-objc">NSArray *names = @[@&quot;John\n&quot;, @&quot;Peter\n&quot;, @&quot;Jaye\n&quot;, @&quot;George\n&quot;, @&quot;Max&quot;];
NSArray *mutableNames = [@[@&quot;John\n&quot;, @&quot;Peter\n&quot;, @&quot;Jaye\n&quot;, @&quot;George\n&quot;, @&quot;Max&quot;] mutableCopy];
</code></pre>
]]></description>
    <pubDate>Thu, 18 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cross-platform development bookmarks</title>
<link>https://xenodium.com/cross-platform-development-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cross-platform-development-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=11105027">How to Distribute Binaries for OS X Using Homebrew (Hacker News)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 16 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Generating a random MAC address</title>
<link>https://xenodium.com/generating-a-random-mac-address</link>
<guid isPermaLink="false">https://xenodium.com/generating-a-random-mac-address</guid>
    <description><![CDATA[<p>As some point I had to generate a random MAC address. This is the snippet I used:</p>
<pre><code class="language-{.python">import random

def randomMAC():
  mac = [0x00, 0x16, 0x3e,
         random.randint(0x00, 0x7f),
         random.randint(0x00, 0xff),
         random.randint(0x00, 0xff),
  ]
  return ':'.join(map(lambda x: &quot;%02x&quot; % x, mac))

print 'MAC =&gt; %s' % randomMAC()
</code></pre>
<pre><code class="language-example">MAC =&gt; 00:16:3e:7e:f7:fa
</code></pre>
]]></description>
    <pubDate>Mon, 15 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Defined elisp variables matching regexp</title>
<link>https://xenodium.com/defined-elisp-variables-matching-regexp</link>
<guid isPermaLink="false">https://xenodium.com/defined-elisp-variables-matching-regexp</guid>
    <description><![CDATA[<p>You can use &quot;M-x <em>apropos-variable</em>&quot; to get documentation for variables matching a pattern. For more flexibility, some elisp can help with getting a list of all variables matching a regexp:</p>
<pre><code class="language-{.commonlisp">(defun ar/variables-matching-pattern (pattern)
  &quot;Get a list of all variables matching PATTERN.&quot;
  (let ((matched-variables '()))
    (mapatoms
     (lambda (symbol)
       ;; Symbol is variable?
       (when (and (boundp symbol)
                  (string-match pattern (symbol-name symbol)))
         (add-to-list 'matched-variables symbol))))
    matched-variables))

(let ((variables &quot;&quot;))
  (mapc (lambda (variable-symbol)
          (setq variables
                (concat variables
                        (format &quot;%s =&gt; %s\n&quot;
                                (symbol-name variable-symbol)
                                (symbol-value variable-symbol)))))
        (ar/variables-matching-pattern &quot;^tern-.*&quot;))
  variables)
</code></pre>
<pre><code class="language-example">tern-mode-keymap =&gt; (keymap (3 keymap (4 . tern-get-docs) (3 . tern-get-type) (18 . tern-rename-variable)) (27 keymap (44 . tern-pop-find-definition) (67108910 . tern-find-definition-by-name) (46 . tern-find-definition)))
tern-update-argument-hints-async =&gt; nil
tern-known-port =&gt; nil
tern-mode =&gt; nil
tern-activity-since-command =&gt; -1
tern-project-dir =&gt; nil
tern-last-point-pos =&gt; nil
tern-last-completions =&gt; nil
tern-explicit-port =&gt; nil
tern-idle-time =&gt; 2.5
tern-find-definition-stack =&gt; nil
tern-last-argument-hints =&gt; nil
tern-idle-timer =&gt; nil
tern-server =&gt; nil
tern-last-docs-url =&gt; nil
tern-buffer-is-dirty =&gt; nil
tern-command-generation =&gt; 0
tern-flash-timeout =&gt; 0.5
tern-update-argument-hints-timer =&gt; 500
tern-mode-hook =&gt; nil
tern-command =&gt; (tern)
</code></pre>
]]></description>
    <pubDate>Sun, 14 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Proselint via Emacs flycheck</title>
<link>https://xenodium.com/proselint-via-emacs-flycheck</link>
<guid isPermaLink="false">https://xenodium.com/proselint-via-emacs-flycheck</guid>
    <description><![CDATA[<p>Based on <a href="http://unconj.ca/blog/linting-prose-in-emacs.html">Linting Prose in Emacs</a>…</p>
<p>Needs proselint installed:</p>
<pre><code class="language-{.bash">pip install proselint
</code></pre>
<p>Also needs a flycheck checker defined:</p>
<pre><code class="language-{.commonlisp">(flycheck-define-checker proselint
  &quot;A linter for prose.&quot;
  :command (&quot;proselint&quot; source-inplace)
  :error-patterns
  ((warning line-start (file-name) &quot;:&quot; line &quot;:&quot; column &quot;: &quot;
            (id (one-or-more (not (any &quot; &quot;))))
            (message) line-end))
  :modes (gfm-mode
          markdown-mode
          org-mode
          text-mode))

(add-to-list 'flycheck-checkers 'proselint)
</code></pre>
]]></description>
    <pubDate>Sat, 13 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Generate go struct definition from json file</title>
<link>https://xenodium.com/generate-go-struct-definition-from-json-file</link>
<guid isPermaLink="false">https://xenodium.com/generate-go-struct-definition-from-json-file</guid>
    <description><![CDATA[<p>From <a href="https://github.com/bittersweet/dotfiles/blob/master/notes/go.txt#L3">Generate go struct definition from json file</a>, and before I forget:</p>
<pre><code class="language-go">curl http://url.tld/file.json | gojson -name=Repository
</code></pre>
]]></description>
    <pubDate>Thu, 11 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Doh! undo last commit (Magit edition)</title>
<link>https://xenodium.com/doh-undo-last-commit-magit-edition</link>
<guid isPermaLink="false">https://xenodium.com/doh-undo-last-commit-magit-edition</guid>
    <description><![CDATA[<p>I previously noted <a href="#doh-undo-last-git-commit">how to undo your last git commit (ie. soft reset)</a>. Using Magit:</p>
<ol>
<li>M-x <em>magit-log-current</em>.</li>
<li>Move point to prior revision.</li>
<li>M-x <em>magit-reset-soft</em> (defaults to revision at point).</li>
</ol>
<p>Or if you want a single function:</p>
<pre><code class="language-{.commonlisp">(require 'magit)

(defun ar/magit-soft-reset-head~1 ()
  &quot;Soft reset current git repo to HEAD~1.&quot;
  (interactive)
  (magit-reset-soft &quot;HEAD~1&quot;))
</code></pre>
]]></description>
    <pubDate>Thu, 11 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Redux bookmarks</title>
<link>https://xenodium.com/redux-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/redux-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://medium.com/@spitzwegerich/a-different-way-of-supplying-react-components-with-state-1093f8f79802#.n1ffge76m">A different way of supplying React-components with state</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11890229">A SoundCloud client in React and Redux (Hacker News)</a>.</li>
<li><a href="https://github.com/xgrommx/awesome-redux">Awesome redux</a> (collection of libraries in ecosystem).</li>
<li><a href="https://news.ycombinator.com/item?id=11886662">Building React Applications with idiomatic redux (Hacker News)</a>.</li>
<li><a href="https://blog.boldlisting.com/connecting-redux-to-your-api-eac51ad9ff89#.nu7dpwklf">Connecting Redux to your API</a>.</li>
<li><a href="https://github.com/markerikson/react-redux-links">Curated awesome Redux tutorial and resource links</a>.</li>
<li><a href="https://github.com/acdlite/redux-actions">Flux Standard Action utilities for Redux</a>.</li>
<li><a href="http://stackoverflow.com/questions/33992812/how-to-integrate-redux-with-very-large-data-sets-and-indexeddb">How to integrate Redux with very large data-sets and IndexedDB? (Stack Overflow)</a>.</li>
<li><a href="https://medium.com/@matt.krick/introducing-redux-operations-332ab56e468b#.buk8m7oug">Introducing Redux operations</a>.</li>
<li><a href="https://blog.madewithlove.be/post/redux/">Managing data flow on the client-side</a>.</li>
<li><a href="http://redux.js.org/docs/introduction/Motivation.html">Motivation for flux</a>.</li>
<li><a href="https://gist.github.com/brentvatne/52af349a6b6ef2ee1b06">NavigationExperimental notes</a>.</li>
<li><a href="https://www.youtube.com/watch?v=76FRrbY18Bs">Preethi Kasireddy - MobX vs Redux: Comparing the Opposing Paradigms</a>.</li>
<li><a href="https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.plqwdhbyo">Presentational and Container Components</a>.</li>
<li><a href="https://github.com/rackt/react-redux">React-redux official bindings</a>.</li>
<li><a href="https://egghead.io/courses/react-flux-architecture-es6">React: Flux Architecture (ES6) - Course by @joemaddalone @eggheadio</a>.</li>
<li><a href="http://lucamezzalira.com/2016/03/08/reactive-programming-with-rxjs/">Reactive Programming with RxJS</a>.</li>
<li><a href="http://redux.js.org/docs/advanced/AsyncActions.html">Redux async actions</a>.</li>
<li><a href="https://medium.com/lexical-labs-engineering/redux-best-practices-64d59775802e#.7y43ask6a">Redux best practices</a>.</li>
<li><a href="http://redux.js.org/docs/introduction/Examples.html#real-world">Redux code examples</a>.</li>
<li><a href="https://github.com/markerikson/redux-ecosystem-links">Redux ecosystem links</a>.</li>
<li><a href="https://github.com/acdlite/redux-promise">Redux promise</a>.</li>
<li><a href="http://stackoverflow.com/questions/33726644/redux-state-persistence-with-a-database">Redux state persistence with a database (State Overflow)</a>.</li>
<li><a href="https://github.com/gaearon/redux-thunk">Redux thunk</a>.</li>
<li><a href="http://stackoverflow.com/questions/32949859/redux-opinions-examples-of-how-to-do-backend-persistence/33055146">Redux: Opinions/examples of how to do backend persistence? (Stack Overflow)</a>.</li>
<li><a href="https://github.com/guangmingzizai/RefluxCocoa">RefluxCocoa: an implementation of Reflux in Objective-C</a>.</li>
<li><a href="http://jaysoo.ca/2016/02/28/organizing-redux-application/">Rules for structuring (redux) applications </a>.</li>
<li><a href="https://medium.com/swlh/the-case-for-flux-379b7d1982c6#.7tcw9qi01">The case for flux</a>.</li>
<li><a href="http://jlongster.com/Two-Weird-Tricks-with-Redux">Two weird tricks with redux</a>.</li>
<li><a href="https://github.com/ServiceStackApps/typescript-redux">TypeScript Redux</a>.</li>
<li><a href="https://medium.com/@lizdenhup/understanding-unidirectional-data-flow-in-react-3e3524c09d8e">Understanding unidirectional data flow in React – Elizabeth Denhup – Medium</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 06 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Javascript tips backlog</title>
<link>https://xenodium.com/javascript-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/javascript-tips-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://vinta.ws/code/tern-js-with-atom.html">Tern.js with Atom</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/sebmarkbage/ecmascript-rest-spread">Object spread syntax proposed for ES7</a>.</p>
<p>[TODO]{.todo .TODO} if (typeof myvar <code>=</code> 'undefined') …</p>
<p>[TODO]{.todo .TODO} copy object and set with Object.assign({}, state, {property: newValue}).</p>
<p>[TODO]{.todo .TODO} Use ES6 computed property syntax.</p>
<p>[TODO]{.todo .TODO} ES6 syntax: import * as reducers from './reducers'.</p>
]]></description>
    <pubDate>Sat, 06 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs lisp tips backlog</title>
<link>https://xenodium.com/emacs-lisp-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/emacs-lisp-tips-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://github.com/mola-T/signal">Signal: a library offering enriched hook-like features</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://mbork.pl/2016-05-15_debug-on-whatever">Debugging tips</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://article.gmane.org/gmane.emacs.devel/202535">Examples of Emacs modules</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://gitlab.com/RobertCochran/neato-graph-bar">htop-like CPU and memory graphs for Emacs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/mola-T/timp">Timp: multithreading library</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.wilfred.me.uk/blog/2016/04/28/effortless-major-mode-development/">Effortless Major Mode Development</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/tkych/cl-spark">cl-spark implementation of Zach Holman's spark and Gil Gonçalves' vspark with little extension</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://endlessparentheses.com/new-in-emacs-25-1-map-el-library.html">map.el for map-like collections built-in as of 25.1</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/map.el">Standard library for key/value data structures</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://oremacs.com/2015/01/11/pretty-elisp-regex/">Making Elisp regex look nicer</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Porting-old-advices.html#Porting-old-advices">Adapting code using the old defadvice</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://endlessparentheses.com/new-on-elpa-and-in-emacs-25-1-seq-el.html">seq.el sequence library built-in as of 25.1</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/syohex/emacs-parson">Binding of parson JSON parser</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://puntoblogspot.blogspot.co.uk/2016/02/with-this-little-trick-helm-dash-gets.html?m=1">Helm-dash find-as-you-type</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://emacs.stackexchange.com/questions/12121/org-mode-parsing-rich-html-directly-when-pasting">Org mode - Parsing rich HTML directly when pasting? (Stack Overflow)</a>.</p>
<p>[TODO]{.todo .TODO} From <a href="https://twitter.com/_wilfredh/status/694643167056916480">@_wilfredh</a>, use (interactive &quot;*&quot;) for commands that edit the buffer, so they show a helpful error if the buffer is read only.</p>
]]></description>
    <pubDate>Sat, 06 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Entering accents in Emacs</title>
<link>https://xenodium.com/entering-accents-in-emacs</link>
<guid isPermaLink="false">https://xenodium.com/entering-accents-in-emacs</guid>
    <description><![CDATA[<p>Via Irreal's <a href="http://irreal.org/blog/?p=4945">Entering Accented Characters in Emacs</a>, a reminder on how to enter accents using <strong>C-x 8</strong>. For example:</p>
<pre><code class="language-example">C-x 8 ' A -&gt; Á
</code></pre>
]]></description>
    <pubDate>Thu, 04 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Really delete iPhone photos</title>
<link>https://xenodium.com/really-delete-iphone-photos</link>
<guid isPermaLink="false">https://xenodium.com/really-delete-iphone-photos</guid>
    <description><![CDATA[<p>After deleting photos, go to:</p>
<blockquote>
<p>Albums -&gt; Recently Deleted -&gt; Select -&gt; Delete All</p>
</blockquote>
]]></description>
    <pubDate>Thu, 04 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Vancouver travel bookmarks</title>
<link>https://xenodium.com/vancouver-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/vancouver-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.myfiveacres.com/travel-inspiration/17-reasons-to-visit-vancouver-this-summer/">17 Reasons To Visit Vancouver This Summer</a>.</li>
<li><a href="https://www.lonelyplanet.com/amp/articles/best-places-to-visit-in-canada">The 15 most incredible places to visit in Canada</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 03 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Schnitzel recipe</title>
<link>https://xenodium.com/schnitzel-recipe</link>
<guid isPermaLink="false">https://xenodium.com/schnitzel-recipe</guid>
    <description><![CDATA[<p>Since <a href="#fischers-london-yes-but">eating at Fischers's</a>, I've been inclined to make Schnitzel. This is my attempt.</p>
<h2>Ingredients</h2>
<ul>
<li>Salt and ground black pepper.</li>
<li>All-purpose flour.</li>
<li>Eggs (beaten).</li>
<li>Bread crumbs (natural).</li>
<li>Oil.</li>
</ul>
<h2>Preparation</h2>
<ul>
<li>Flatten the pork/chicken/veal.</li>
<li>Season (salt and pepper).</li>
<li>Heat pan with a generous amount of oil.</li>
<li>Dip into flour -&gt; egg -&gt; bread crumbs.</li>
</ul>
<h2>Garnish</h2>
<ul>
<li>Anchovies.</li>
<li>Capers.</li>
</ul>
<h2>Photo</h2>
<p><img src="https://xenodium.github.io/images/schnitzel-recipe/schnitzel.jpg" alt=""></p>
]]></description>
    <pubDate>Wed, 03 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hot reloading with react and redux</title>
<link>https://xenodium.com/hot-reloading-with-react-and-redux</link>
<guid isPermaLink="false">https://xenodium.com/hot-reloading-with-react-and-redux</guid>
    <description><![CDATA[<h2>By Robert Knight (<a href="http://twitter.com/robknight_">@robknight_</a>).</h2>
<h2>Checkout</h2>
<ul>
<li><a href="http://browserify.org">Browserify</a>.</li>
<li><a href="https://webpack.github.io">Webpack</a> (more stable?).</li>
<li><a href="https://github.com/gaearon/react-transform-hmr">React-transform-hmr</a>.</li>
<li><a href="https://github.com/jchansen/reselect">Reselect</a>: A redux selector for redux.</li>
</ul>
<h2>Slides</h2>
<ul>
<li><a href="https://github.com/robertknight/hot-reloading-talk">https://github.com/robertknight/hot-reloading-talk</a></li>
</ul>
]]></description>
    <pubDate>Wed, 03 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Converting Unix epoc time to human readable date</title>
<link>https://xenodium.com/converting-unix-epoc-time-to-human-readable-date</link>
<guid isPermaLink="false">https://xenodium.com/converting-unix-epoc-time-to-human-readable-date</guid>
    <description><![CDATA[<p>Via <a href="https://twitter.com/climagic">climagic</a>'s <a href="https://twitter.com/climagic/status/694780560221147136">Turn a Unix epoch time back into a human readable date</a>:</p>
<h2>GNU</h2>
<pre><code class="language-{.bash">date -d @192179700
</code></pre>
<pre><code class="language-example">Tue Feb  3 07:15:00 GMT 1976
</code></pre>
<h2>BSD/OS X</h2>
<pre><code class="language-{.bash">date -r 192179700
</code></pre>
<pre><code class="language-example">Tue Feb  3 07:15:00 GMT 1976
</code></pre>
]]></description>
    <pubDate>Wed, 03 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Objective-C bookmarks</title>
<link>https://xenodium.com/objective-c-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/objective-c-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.miqu.me/blog/2015/04/17/adopting-nullability-annotations/">Adopting Nullability Annotation</a>.</li>
<li><a href="http://www.miqu.me/blog/2015/06/09/adopting-objectivec-generics/">Adopting Objective-C generics</a>.</li>
<li><a href="https://cocoa.tumblr.com">Cocoa at Tumblr</a>.</li>
<li><a href="https://github.com/uhub/awesome-objective-c">Curated list of awesome Objective-C frameworks, libraries and software</a>.</li>
<li><a href="https://www.raywenderlich.com/66395/documenting-in-xcode-with-headerdoc-tutorial">Documenting in Xcode with HeaderDoc Tutorial</a>.</li>
<li><a href="http://fuckingblocksyntax.com">How Do I Declare A Block in Objective-C?</a>.</li>
<li><a href="https://www.objc.io/issues/13-architecture/mvvm">Introduction to MVVM</a>.</li>
<li><a href="https://developer.apple.com/swift/blog/?id=25">Nullability and Objective-C</a>.</li>
<li><a href="http://oleb.net/">Ole Begemann's page</a>.</li>
<li><a href="https://github.com/ReactiveCocoa/ReactiveCocoa">ReactiveCocoa</a>.</li>
<li><a href="https://pewpewthespells.com/blog/xcode_build_system.html">The Xcode Build System</a>.</li>
<li><a href="http://iosdevtips.co/post/118711491198/avoid-retain-cycles-weak-strong">Tip: Avoid retain cycles without doing the strong to weak dance</a>.</li>
<li><a href="https://medium.com/@oscarcortes/using-swift-string-enums-in-objective-c-f6683da5b92e#.4526yy6s4">Using Swift String enums in Objective-C</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 03 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Timesinking bookmarks</title>
<link>https://xenodium.com/timesinking-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/timesinking-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q">In a Nutshell channel (YouTube)</a>.</li>
<li><a href="https://www.reddit.com/r/oddlysatisfying">Oddly Satisfying (Subreddit)</a>.</li>
<li><a href="https://anvaka.github.io/sayit">Related subreddits based on your comments</a>.</li>
<li><a href="https://www.reddit.com/r/knolling">To knoll me is to love me (Subreddit)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Suspend and reattach processes</title>
<link>https://xenodium.com/suspend-and-reattach-processes</link>
<guid isPermaLink="false">https://xenodium.com/suspend-and-reattach-processes</guid>
    <description><![CDATA[<p>Via <a href="https://twitter.com/climagic">climagic</a>'s <a href="https://twitter.com/climagic/status/694242271286431744?refsrc=email&amp;s=11">Suspend and reattach a process to screen</a>:</p>
<pre><code class="language-{.bash">longcmd ; [Ctrl-Z] ; bg ; disown ; screen ; reptyr $( pidof longcmd )
</code></pre>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Czech Republic travel bookmarks</title>
<link>https://xenodium.com/czech-republic-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/czech-republic-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Strahov_Monastery">Strahov Monastery</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Meditation tips backlog</title>
<link>https://xenodium.com/meditation-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/meditation-tips-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="http://www.workman.com/static/realhappinessebook/">Real Happiness Audio Files</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.intelligentlifemagazine.com/content/features/wanting-versus-liking">The science of craving</a>.</p>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Append jpegs in a video sequence</title>
<link>https://xenodium.com/append-jpegs-in-a-video-sequence</link>
<guid isPermaLink="false">https://xenodium.com/append-jpegs-in-a-video-sequence</guid>
    <description><![CDATA[<p>Via <a href="https://twitter.com/climagic">climagic</a>'s <a href="https://twitter.com/climagic/status/692821765110767616?refsrc=email&amp;s=11">make slideshow from *.jpg</a>:</p>
<pre><code class="language-{.bash">for p in *.jpg; do
    ffmpeg -loop_input -f image2 -i $p -t 3 -r 4 -s 1080x720 -f avi - &gt;&gt; slides.avi;
done
</code></pre>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Regular expressions bookmarks</title>
<link>https://xenodium.com/regular-expressions-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/regular-expressions-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://dev.to/emmawedekind/regex-cheat-sheet-2j2a">Regex Cheat Sheet - DEV Community</a>.</li>
<li><a href="https://www.janmeppe.com/blog/regex-for-noobs/">Regex For Noobs (like me!) - An Illustrated Guide - Janmeppe.com</a>.</li>
<li><a href="https://regex101.com/">regex101.com</a>.</li>
<li><a href="https://regex101.com/">Regex101</a>: Online regex tool.</li>
<li><a href="https://refrf.shreyasminocha.me/">Regular Expressions for Regular Folk</a>.</li>
<li><a href="https://rubular.com/">Rubular: a Ruby regular expression editor</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Typescript bookmarks</title>
<link>https://xenodium.com/typescript-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/typescript-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://blog.mgechev.com/2018/11/19/introduction-bazel-typescript-tutorial/">Building TypeScript Projects with Bazel (Minko Gechev's blog)</a>.</li>
<li><a href="http://definitelytyped.org">DefinitelyTyped: The repository for high quality TypeScript type definitions</a>.</li>
<li><a href="https://github.com/ivogabe/gulp-typescript">gulp-typescript</a>.</li>
<li><a href="https://www.ovistoica.com/blog/2024-7-05-modern-emacs-typescript-web-tsx-config">Modern Emacs Typescript Web (React) Config with lsp-mode, treesitter, tailwind, TSX &amp; more…</a>.</li>
<li><a href="https://github.com/Microsoft/TypeScript/wiki/JSX">React/JSX Typescript support</a>.</li>
<li><a href="https://github.com/palantir/tslint">tslint</a>.</li>
<li><a href="https://github.com/Asana/typed-react">Typed-react</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18975373">TypeScript Tricks: Type Guards (Hacker News)</a>.</li>
<li><a href="https://github.com/TypeStrong">TypeStrong: TypeScript workflows</a>.</li>
<li><a href="https://github.com/typings">Typings: The type definition manager for TypeScript</a>.</li>
<li><a href="https://medium.com/react-native-training/up-and-running-with-react-native-and-typescript-8d398e910a19">Up and Running with React Native and TypeScript</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hiding HTML elements</title>
<link>https://xenodium.com/hiding-html-elements</link>
<guid isPermaLink="false">https://xenodium.com/hiding-html-elements</guid>
    <description><![CDATA[<p>Hide with <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/display">display:none</a> (exclude from layout) and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/visibility">visibility:hidden</a> (include in layout).</p>
]]></description>
    <pubDate>Tue, 02 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Echo Emacs keybiding from function name</title>
<link>https://xenodium.com/echo-emacs-keybiding-from-function-name</link>
<guid isPermaLink="false">https://xenodium.com/echo-emacs-keybiding-from-function-name</guid>
    <description><![CDATA[<p>Picked up via Emacs Redux's <a href="http://emacsredux.com/blog/2016/02/01/display-the-keybinding-for-a-command-with-substitute-command-keys/">Display the Keybinding for a Command With Substitute-command-keys</a>, with my own example:</p>
<pre><code class="language-{.commonlisp">(message (substitute-command-keys &quot;Press \\[ar/ox-html-export] to export org file&quot;))
</code></pre>
<pre><code class="language-example">Press &lt;f6&gt; to export org file
</code></pre>
]]></description>
    <pubDate>Mon, 01 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs dired for batch byte compilation</title>
<link>https://xenodium.com/emacs-dired-for-batch-byte-compilation</link>
<guid isPermaLink="false">https://xenodium.com/emacs-dired-for-batch-byte-compilation</guid>
    <description><![CDATA[<p>Recently updated org-mode and started seeing an invalid function error:</p>
<blockquote>
<p>Error (use-package): ob :config: Invalid function: org-babel-header-args-safe-fn</p>
</blockquote>
<p>Just learned dired enables you to mark files and byte compile via <em>M-x dired-do-byte-compile</em>.</p>
]]></description>
    <pubDate>Mon, 01 Feb 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Serializing to JSON on iOS</title>
<link>https://xenodium.com/serializing-to-json-on-ios</link>
<guid isPermaLink="false">https://xenodium.com/serializing-to-json-on-ios</guid>
    <description><![CDATA[<pre><code class="language-objc">NSDictionary *dictionary = @{
  @&quot;key1&quot; : @&quot;val1\n&quot;,
  @&quot;key2&quot; : @&quot;val2\n&quot;,
  @&quot;key3&quot; : @&quot;val3\n&quot;,
  @&quot;key4&quot; : @&quot;val4\n&quot;,
  @&quot;key5&quot; : @&quot;val5\n&quot;,
  @&quot;key6&quot; : @&quot;val6\n&quot;,
};
NSError *error;
NSData *jsonData =
    [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&amp;error];
if (error) {
  // noooooooooo!
}
NSString *json =
    [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
</code></pre>
]]></description>
    <pubDate>Fri, 29 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fischer's London: yes, but…</title>
<link>https://xenodium.com/fischers-london-yes-but</link>
<guid isPermaLink="false">https://xenodium.com/fischers-london-yes-but</guid>
    <description><![CDATA[<h2>Yes</h2>
<p>Step into a Viennese blast from the past. Beautiful setting and pleasant vibe. Ordered a dirty martini on the rocks, a bottle of Merlot, Käsespätzle (with bacon), and Wiener Schnitzel (with anchovy/capers/egg). All very tasty.</p>
<h2>But…</h2>
<p>Surprisingly, desserts (Topfenstrudel, Berggasse and coffee) were nothing spectacular. Also not a cheap eat (£50 per person).</p>
<h2>Photos</h2>
<p><img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-03.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-04.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-05.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-06.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-07.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-08.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-09.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-10.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-11.JPG" alt=""> <img src="https://xenodium.github.io/images/fischers-london-yes-but/fischers-12.JPG" alt=""></p>
]]></description>
    <pubDate>Mon, 25 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Polar travel bookmarks</title>
<link>https://xenodium.com/polar-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/polar-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.quarkexpeditions.com/en">Quark expeditions</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sweden travel bookmarks</title>
<link>https://xenodium.com/sweden-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sweden-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.theworlds50best.com/list/1-50-winners/Faviken">Fäviken restaurant (world's most isolated restaurant)</a>.</li>
<li><a href="https://theculturetrip.com/europe/sweden/articles/the-most-hipster-hangouts-in-stockholm">Hangouts in Stockholm</a>.</li>
<li>Vasa Museum.</li>
</ul>
]]></description>
    <pubDate>Sun, 24 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Handwriting bookmarks</title>
<link>https://xenodium.com/handwriting-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/handwriting-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://briem.net">briem.net</a>.</li>
<li><a href="http://www.handwritingthatworks.com">Handwriting that works</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 20 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Chocolate fondant recipe</title>
<link>https://xenodium.com/chocolate-fondant-recipe</link>
<guid isPermaLink="false">https://xenodium.com/chocolate-fondant-recipe</guid>
    <description><![CDATA[<p>My girlfriend recently made a delicious chocolate fondant. Saving the <a href="http://www.theguardian.com/lifeandstyle/wordofmouth/2011/feb/10/how-cook-perfect-chocolate-fondants">The Guardian's recipe</a>:</p>
<h2>Ingredients (2 servings)</h2>
<ul>
<li>60g unsalted butter, cut into dice, plus extra to grease</li>
<li>1 tbsp cocoa powder</li>
<li>60g dark chocolate, broken into pieces</li>
<li>1 egg and 1 egg yolk</li>
<li>60g caster sugar</li>
<li>1 tbsp plain flour</li>
</ul>
<h2>Preparation</h2>
<ol>
<li>Pre-heat the oven to 200C if cooking immediately, and put a baking tray on the middle shelf. Butter the inside of 2 small ramekins or pudding moulds, and then put the cocoa in one and turn it to coat the inside, holding it over the second mould to catch any that escapes. Do the same with the other mould.</li>
<li>Put the butter and chocolate into a heatproof bowl set over, but not touching, a pan of simmering water and stir occasionally until melted. Allow to cool slightly.</li>
<li>Vigorously whisk together the egg, yolk, sugar and a pinch of salt until pale and fluffy. Gently fold in the melted chocolate and butter, and then the flour. Spoon into the prepared moulds, stopping just shy of the top – at this point the mixture can be refrigerated until needed, or even frozen, as the puddings will not wait around once cooked.</li>
<li>Put on to a hot baking tray and cook for 12 minutes (14 if from cold, 16 if frozen) until the tops are set and coming away from the sides of the moulds. Leave to rest for 30 seconds and then serve in the ramekins or turn out on to plates if you're feeling confident – they're great with clotted cream or plain ice cream.</li>
</ol>
]]></description>
    <pubDate>Wed, 20 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Parenting bookmarks</title>
<link>https://xenodium.com/parenting-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/parenting-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.janetlansbury.com/2018/07/a-toddlers-do-it-myself-attitude-ends-in-tantrums/">A Toddler's Do-It-Myself Attitude Ends In Tantrums - Janet Lansbury</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17023693">Ask HN: Any good collaboratively built documentation on good parenting? (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=20069714">Ask HN: I need ideas to impress fifth graders with technology</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23711942">Ask HN: Recommend a maths book for a teenager? | Hacker News</a>.</li>
<li><a href="https://codecombat.com/">CodeCombat - Learn how to code by playing a game</a>.</li>
<li><a href="https://www.goodreads.com/book/show/32497573-everyone-s-a-aliebn-when-ur-a-aliebn-too">Everyone's a Aliebn When Ur a Aliebn Too by Jomny Sun</a>.</li>
<li><a href="https://twitter.com/ankitshah/status/1305588478592217088">For parents out there, how much money did you have saved up when you had your first kid?</a>.</li>
<li><a href="http://blog.growingwithscience.com/">Growing With Science Blog</a>.</li>
<li><a href="https://conference.michellegale.com/">Home - Mindful Parenting Online Conference</a>.</li>
<li><a href="https://www.npr.org/sections/goatsandsoda/2019/03/13/685533353/a-playful-way-to-teach-kids-to-control-their-anger">How Inuit Parents Teach Kids To Control Their Anger (NPR)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17435671">How to get kids to pay attention (Hacker News)</a>.</li>
<li><a href="https://twitter.com/brainpicker/status/1173363871035383808">How to raise a child – 10 rules from young single mom</a>.</li>
<li><a href="https://www.brainpickings.org/2012/09/13/susan-sontag-10-rules-for-raising-a-child/">How to Raise a Child: 10 Rules from Young Susan Sontag – Brain Pickings</a>.</li>
<li><a href="https://www.amazon.co.uk/How-Talk-Kids-Will-Listen/dp/1848123094/ref=sr_1_1">How to Talk so Kids Will Listen and Listen so Kids Will Talk</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/af2z1b/im_becoming_a_dad_for_the_first_time_in_may_what/">I'm becoming a Dad for the first time in May. What are you top finacial tips when becoming a parent? : UKPersonalFinance</a>.</li>
<li><a href="https://aeon.co/essays/do-people-have-a-moral-duty-to-have-children-if-they-can">Is it OK to have kids?</a>.</li>
<li><a href="https://letgrow.org/">Let Grow | When Adults Step Back, Kids Step Up.</a>.</li>
<li><a href="https://www.designmom.com/lets-talk-about-protecting-our-families/">Let's Talk About Protecting Our Families (debunked gun defense arguments)</a>.</li>
<li><a href="https://blog.codinghorror.com/on-parenthood/">On Parenthood</a>.</li>
<li><a href="https://www.techwillsaveus.com/">Tech kits for bright sparks (from techwillsaveus)</a>.</li>
<li><a href="http://www.theglobeandmail.com/life/parenting/the-disintegration-of-the-parent-child-bond/article28191786/">The disintegration of the parent-child bond</a>.</li>
<li><a href="https://www.designmom.com/">The Intersection of Design &amp; Motherhood | Top Lifestyle Blog | Design Mom</a>.</li>
<li><a href="https://www.amazon.com/Monster-End-This-Book/dp/0307010856">The Monster at the End of This Book: Jon Stone, Michael Smollin</a>.</li>
<li><a href="https://twitter.com/biomickwatson/status/1138778734054510592">Things people don't warn you about parenthood</a>.</li>
<li><a href="http://sachachua.com/blog/2019/03/visual-book-notes-no-drama-discipline-2014/">Visual Book Notes: No-Drama Discipline (2014)</a>.</li>
<li><a href="https://www.theatlantic.com/family/archive/2018/09/throw-your-childrens-art-away/570379/">Why It's Okay to Throw Your Children's Art Away - The Atlantic</a>.</li>
<li><a href="https://www.youtube.com/watch?v=VbgLXurbS2M">Yoto player review// is it worth it? everything you need to know - YouTube</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 20 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ippudo London: yes, but…</title>
<link>https://xenodium.com/ippudo-london-yes-but</link>
<guid isPermaLink="false">https://xenodium.com/ippudo-london-yes-but</guid>
    <description><![CDATA[<h2>Yes</h2>
<p><a href="http://www.ippudo.co.uk/find_us/">Central St. Giles</a> location. Ordered a Kirin Ichiban beer and a Spicy Tonkotsu with a seasoned boiled egg. Awesome medium-spice broth, tasty egg and firm noodles. Got additional noodles for £1.50.</p>
<h2>But…</h2>
<p>The space feels soulless. Think generic, chain, Pizza Express…</p>
<h2>Photos</h2>
<p><img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_00.JPG" alt=""> <img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_01.JPG" alt=""> <img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_02.JPG" alt=""> <img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_03.JPG" alt=""> <img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_04.JPG" alt=""> <img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_05.JPG" alt=""> <img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_06.JPG" alt=""> <img src="https://xenodium.github.io/images/ippudo-london-yes-but/ipuddo_07.JPG" alt=""></p>
]]></description>
    <pubDate>Tue, 19 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Added Emacs zone-rainbow</title>
<link>https://xenodium.com/added-emacs-zone-rainbow</link>
<guid isPermaLink="false">https://xenodium.com/added-emacs-zone-rainbow</guid>
    <description><![CDATA[<p><a href="http://twitter.com/kawabata">kawabata's</a> <a href="https://github.com/kawabata/zone-rainbow">zone-rainbow</a> popped up on melpa today. Added to zone-programs. Just because :)</p>
<pre><code class="language-{.commonlisp">(use-package zone-rainbow :ensure t
  :after zone
  :config
  (setq zone-programs (vconcat [zone-rainbow] zone-programs)))
</code></pre>
<p><img src="https://xenodium.github.io/images/added-emacs-zone-rainbow/zone-rainbow.gif" alt=""></p>
]]></description>
    <pubDate>Tue, 19 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Safari's Web Inspector keyboard shortcuts</title>
<link>https://xenodium.com/safaris-web-inspector-keyboard-shortcuts</link>
<guid isPermaLink="false">https://xenodium.com/safaris-web-inspector-keyboard-shortcuts</guid>
    <description><![CDATA[<p>Via WebKit's blog, <a href="https://webkit.org/blog/4038/web-inspector-keyboard-shortcuts/">Web Inspector Keyboard Shortcuts</a>:</p>
<ul>
<li>⌃⌘Y or ⌘\ continue.</li>
<li>F8 or ⇧⌘; step out.</li>
<li>F7 or ⌘; step in.</li>
<li>F6 or ⌘’ step over.</li>
</ul>
]]></description>
    <pubDate>Tue, 19 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Copenhagen travel bookmarks</title>
<link>https://xenodium.com/copenhagen-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/copenhagen-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Christiania.</li>
<li><a href="http://www.hijadesanchez.dk/">Hija de Sanchez</a> restaurant.</li>
<li><a href="http://cargocollective.com/marvogben">Marv og Ben</a> restaurant.</li>
<li><a href="http://mikkeller.dk/location/mikkeller-bar-viktoriagade-copenhagen/">Mikkeller Bar – Mikkeller</a>.</li>
<li>Mikkeller Bar.</li>
<li><a href="http://www.restaurantschonnemann.dk/">Schonnemann</a> restaurant.</li>
<li>Tivoli.</li>
<li>Torvehallerne (food).</li>
</ul>
]]></description>
    <pubDate>Thu, 14 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Import UIKit for simpler debugging</title>
<link>https://xenodium.com/import-uikit-for-simpler-debugging</link>
<guid isPermaLink="false">https://xenodium.com/import-uikit-for-simpler-debugging</guid>
    <description><![CDATA[<p>I bookmarked <a href="http://furbo.org/2015/05/11/an-import-ant-change-in-xcode/">An @import-ant Change in Xcode</a> and immediately forgot about it. The gist is to import UIKit to simplify inspecting objects during an lldb session:</p>
<pre><code class="language-example">(lldb) expr @import UIKit
</code></pre>
<p>Shorten typing by creating aliases in ~/.lldbinit:</p>
<pre><code class="language-example">command alias uikit expr @import UIKit
command alias foundation expr @import Foundation
</code></pre>
]]></description>
    <pubDate>Tue, 12 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>iOS development tips backlog</title>
<link>https://xenodium.com/ios-development-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/ios-development-tips-backlog</guid>
    <description><![CDATA[<p>[DONE]{.done .DONE} <a href="http://ruenzuo.github.io/static-analysis-on-ios-part-ii/">Static Analysis on iOS - Part II</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/lukhnos/refactorial/">Clang-based C/C++/Objective-C refactoring toolset (unmaintained)</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/dsmelov/simsim">SimSim: access to application data folders</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/supermarin/xcpretty">xcpretty (fast and flexible formatter/prettifier for xcodebuild output)</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/facebook/xctool">xctool</a>.</p>
]]></description>
    <pubDate>Tue, 12 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Basic Emacs keybindings on Linux desktop</title>
<link>https://xenodium.com/basic-emacs-keybindings-on-linux-desktop</link>
<guid isPermaLink="false">https://xenodium.com/basic-emacs-keybindings-on-linux-desktop</guid>
    <description><![CDATA[<p>Miss C-a, C-e in your browser and other Linux apps? You can enable the GTK Emacs key theme:</p>
<pre><code class="language-{.bash">$ gsettings set org.gnome.desktop.interface gtk-key-theme &quot;Emacs&quot;
</code></pre>
<p>or if on Cinnamon:</p>
<pre><code class="language-{.bash">$ gsettings set org.cinnamon.desktop.interface gtk-key-theme Emacs
</code></pre>
<p>If your desktop environment is not running gnome-settings-daemon, start it with:</p>
<pre><code class="language-{.bash">$ gnome-settings-daemon
</code></pre>
<p>More at <a href="http://www.jefftk.com/p/emacs-keybindings-in-chrome-without-gnome">Emacs Keybindings in Chrome Without Gnome</a> and <a href="http://promberger.info/linux/2010/02/16/how-to-get-emacs-key-bindings-in-ubuntu/">How to get Emacs key bindings in Ubuntu</a>.</p>
]]></description>
    <pubDate>Mon, 11 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs Objective-C completion with Irony</title>
<link>https://xenodium.com/emacs-objective-c-completion-with-irony</link>
<guid isPermaLink="false">https://xenodium.com/emacs-objective-c-completion-with-irony</guid>
    <description><![CDATA[<h2>Install libclang on Mac</h2>
<pre><code class="language-{.bash">brew install llvm --with-clang
</code></pre>
<h2>Configure Emacs</h2>
<pre><code class="language-{.commonlisp">(use-package irony :ensure t
  :config
  (add-hook 'objc-mode-hook 'irony-mode)
  (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))

(use-package company-irony :ensure t
  :config
  (add-hook  'objc-mode-hook (lambda ()
                               (setq-local company-backends '((company-irony)))))
  (add-hook 'irony-mode-hook 'company-irony-setup-begin-commands))
</code></pre>
<h2>install irony server</h2>
<p>Run:</p>
<pre><code class="language-example">M-x irony-install-server
</code></pre>
<p>NOTE: Needs libclang: Install with &quot;brew install llvm –with-clang&quot; By default, irony-install-server did not find libclang on Mac OS. <em>irony-install-server</em> invokes cmake for you. Work around by adding:</p>
<pre><code class="language-example">-DCMAKE_PREFIX_PATH=/Users/your-user-name/homebrew/opt/llvm
</code></pre>
<p>For example:</p>
<pre><code class="language-example">cmake -DCMAKE_PREFIX_PATH=/Users/your-user-name/homebrew/opt/llvm -DCMAKE_INSTALL_PREFIX\=/Users/your-user-name/.emacs.d/irony/ /Users/your-user-name/.emacs.d/elpa/irony-20160106.1223/server &amp;&amp; cmake --build . --use-stderr --config Release --target install
</code></pre>
<h2>Compilation database</h2>
<h3>Install xctool</h3>
<pre><code class="language-{.bash">brew install xctool
</code></pre>
<h3>Generate compilation database</h3>
<pre><code class="language-{.bash">xctool -sdk iphonesimulator -arch x86_64 -scheme SomeScheme -reporter pretty -reporter json-compilation-database:compile_commands.json clean build
</code></pre>
<h2>Set Irony's database path</h2>
<blockquote>
<p>M-x irony-cdb-json-add-compile-commands-path</p>
</blockquote>
]]></description>
    <pubDate>Fri, 08 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Finland travel bookmarks</title>
<link>https://xenodium.com/finland-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/finland-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.nytimes.com/interactive/2016/07/07/travel/what-to-do-36-hours-helsinki-finland.html?smid=tw-nytimestravel&amp;smtyp=cur">36 Hours in Helsinki</a>.</li>
<li>Boat to the Baltics; Tallinn (Estonia).</li>
<li>Helsinki - Suomenlinna (former maritime fortress).</li>
<li>Lapland (husky sledding, reindeer, Santa Claus village).</li>
<li><a href="https://www.flickr.com/photos/discounterintelligence/25360452443">Päivä no:23 Reitti no:23 no:12 | Leipomo K.E.Avikainen (try munkkipossu: pig shaped donut)</a>.</li>
<li><a href="https://www.ragu.fi/">Ragu Ravintola (try panfried fiesh, pulled pork, steak tartare, chocolate mouse)</a>.</li>
<li>Rovaniemi for reindeer, dog sled, santaland, artic circle photos.</li>
</ul>
]]></description>
    <pubDate>Thu, 07 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Northern lights travel bookmarks</title>
<link>https://xenodium.com/northern-lights-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/northern-lights-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Aim for a new moon (eg. 2016-01-10 or 2016-02-08).</li>
<li>Aim for <a href="http://sci.esa.int/cluster/33272-plasma-regions/?fbodylongid%3D1173">auroral zone</a>.</li>
<li><a href="http://www.guide-gunnar.no/?ac_id%3D1&amp;ac_parent%3D1&amp;ao_name%3Dforside">Guide Gunnar</a> will go distance to ensure you see the lights.</li>
<li><a href="http://www.sleddog.se/">Kiruna Sleddog Tours</a>.</li>
<li><a href="http://www.msm.no/sami-week-tromsoe-2015.287592-242995.html">Tromsø's reindeer racing</a>.</li>
<li><a href="http://www.visittromso.no/en">Tromsø</a>.</li>
<li><a href="http://villmarkssenter.no/vinterprogram/hundekj%25C3%25B8ring/">Hundekjøring</a>: drive your own sled.</li>
<li>Tromsø whale watching.</li>
</ul>
]]></description>
    <pubDate>Thu, 07 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mexico travel bookmarks</title>
<link>https://xenodium.com/mexico-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/mexico-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lonelyplanet.com/amp/articles/best-places-to-visit-in-mexico">15 best places to visit in Mexico</a>.</li>
<li><a href="http://www.corazondepuebla.com.mx/acatepec.html">San Francisco Acatepec</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 06 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs highlight-symbol-mode</title>
<link>https://xenodium.com/emacs-highlight-symbol-mode</link>
<guid isPermaLink="false">https://xenodium.com/emacs-highlight-symbol-mode</guid>
    <description><![CDATA[<p>Been a fan of <a href="https://github.com/fgeller/highlight-thing.el">highlight-thing-mode</a>. It automatically highlights all instances of symbol at point. Today, I gave <a href="https://github.com/nschum/highlight-symbol.el">highlight-symbol</a> a try. Similar concept, but also adds the ability to jump to next/previous instances of symbol at point.</p>
<pre><code class="language-{.commonlisp">(use-package highlight-symbol :ensure t
  :config
  (set-face-attribute 'highlight-symbol-face nil
                      :background &quot;default&quot;
                      :foreground &quot;#FA009A&quot;)
  (setq highlight-symbol-idle-delay 0)
  (setq highlight-symbol-on-navigation-p t)
  (add-hook 'prog-mode-hook #'highlight-symbol-mode)
  (add-hook 'prog-mode-hook #'highlight-symbol-nav-mode))
</code></pre>
<p><img src="https://xenodium.github.io/images/emacs-highlight-symbol-mode/highlight-symbol.gif" alt=""></p>
]]></description>
    <pubDate>Sun, 03 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Gandhi's ever-contemporary wisdom</title>
<link>https://xenodium.com/gandhis-ever-contemporary-wisdom</link>
<guid isPermaLink="false">https://xenodium.com/gandhis-ever-contemporary-wisdom</guid>
    <description><![CDATA[<p>From <a href="http://www.amazon.co.uk/Gandhi-Changing-Mohandas-Karamchand-published/dp/B015GRZTP2">Gandhi: Radical Wisdom for a Changing World</a>:</p>
<h2>Anger</h2>
<p>&quot;I do get angry, but I feel angry with myself for it. Full conquest of anger is possible only through self-realization. We should love even those who have the worst opinion of us. This is ahimsa, the rest is only ignorance.&quot;</p>
<h2>Bad handwriting</h2>
<p>&quot;I am now of opinion that children should first be taught the art of drawing before learning how to write. Let the child learn his letters by observation as he does different objectives, such as flowers, birds, etc., and let him learn handwriting only after he has learned to draw objects.&quot;</p>
<h2>Conduct of the Ashram</h2>
<p>&quot;Service without humility is selfishness and egotism.&quot;</p>
<h2>Eating</h2>
<p>&quot;There is a great deal of truth in the saying that man becomes what he eats. The grosser the food, the grosser the body.&quot;</p>
<h2>Heart</h2>
<p>&quot;There are chords in every human heart. If we only know how to strike the right chord, we bring out the music.&quot;</p>
<h2>Moral law</h2>
<p>The law of truth and love.</p>
<h2>Renouncing or forgoing</h2>
<p>Nishkulanand sings: &quot;Renunciation of objects, without the renunciation of desires, is short-lived, however hard you may try.&quot;</p>
<h2>Silence</h2>
<p>&quot;Man spoils matters much more by speech than by silence.&quot;</p>
<h2>Time</h2>
<p>&quot;Every minute that runs to waste never returns. Yet, knowing this, how much time do we waste?&quot;</p>
<h2>The palate</h2>
<p>&quot;Turn to the birds and beasts, and what do you find? They never eat merely to please the palate, they never go on eating till their inside is full to overflowing. And yet, we regard ourselves as superior to the animal creation!&quot;</p>
<h2>Vow of Swadeshi</h2>
<p>&quot;The person who has taken the vow of swadeshi will never use articles which conceivably involve violation of truth in their manufature or on the part of their manufacturers.&quot;</p>
]]></description>
    <pubDate>Sun, 03 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Functional programming bookmarks</title>
<link>https://xenodium.com/functional-programming-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/functional-programming-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html">Functors, Applicatives, And Monads In Pictures</a>.</li>
<li><a href="http://www.russbishop.net/monoids-monads-and-functors">Functors, Applicatives, and Monads in Plain English</a>.</li>
<li><a href="http://blog.tomduncalf.com/posts/functional-programming-fundamentals-talk">Tom Ducalf's Programming Fundamentals Talk</a>.</li>
<li><a href="http://blog.jenkster.com/2015/12/what-is-functional-programming.html">What is functional programming?</a></li>
<li><a href="http://blog.jenkster.com/2015/12/which-programming-languages-are-functional.html">Which programming languages are functional?</a></li>
<li><a href="https://blog.acolyer.org/2016/09/14/why-functional-programming-matters/">Why Functional Programming Matters</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 02 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>9 Productivity tips</title>
<link>https://xenodium.com/9-productivity-tips</link>
<guid isPermaLink="false">https://xenodium.com/9-productivity-tips</guid>
    <description><![CDATA[<p>From HBR's <a href="https://hbr.org/2015/12/9-productivity-tips-from-people-who-write-about-productivity">9 Productivity Tips from People Who Write About Productivity</a>:</p>
<ol>
<li>Block time away from reactive tasks (email).</li>
<li>Business = wasted energy.</li>
<li>Exercise, sleep, and 90 minute work bursts.</li>
<li>Incomplete tasks prompt healthy thinking out of context.</li>
<li>Time off or stepping back is invaluable.</li>
<li>Genuinely help were most successful/enjoyable.</li>
<li>Plan for saying no while highlighting priority and seeking feedback.</li>
<li>Measure important behavior change.</li>
<li>Make time now (automate, simplify, etc.).</li>
</ol>
]]></description>
    <pubDate>Sat, 02 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>First meal of 2016</title>
<link>https://xenodium.com/first-meal-of-2016</link>
<guid isPermaLink="false">https://xenodium.com/first-meal-of-2016</guid>
    <description><![CDATA[<h2>Pancakes</h2>
<ul>
<li>1 teaspoon of salt.</li>
<li>1.5 cups of milk.</li>
<li>2 cups of flour.</li>
<li>2 eggs.</li>
<li>2 tablespoons sugar.</li>
<li>4 tablespoons of melted butter.</li>
<li>6 teaspoons of baking powder.</li>
</ul>
<p>Makes 10/11 pancakes.</p>
<p><img src="https://xenodium.github.io/images/first-meal-of-2016/shortstack.jpg" alt=""></p>
]]></description>
    <pubDate>Fri, 01 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Last meal of 2015</title>
<link>https://xenodium.com/last-meal-of-2015</link>
<guid isPermaLink="false">https://xenodium.com/last-meal-of-2015</guid>
    <description><![CDATA[<p>For our last meal of 2015, I contributed dal and rotis. This is my first attempt at making either one of these. Both recipes based on Anupy Singla's <a href="http://www.amazon.co.uk/Indian-Everyone-Anupy-Singla/dp/1572841621">Indian for Everyone</a>.</p>
<h2>Dal Makhani (Buttered black lentils)</h2>
<p><img src="https://xenodium.github.io/images/last-meal-of-2015/dal-grid.png" alt=""> <img src="https://xenodium.github.io/images/last-meal-of-2015/dal.jpg" alt=""></p>
<h2>Roti-Chapati-Phulka</h2>
<p><img src="https://xenodium.github.io/images/last-meal-of-2015/roti-grid.png" alt=""> <img src="https://xenodium.github.io/images/last-meal-of-2015/roti.jpg" alt=""></p>
]]></description>
    <pubDate>Fri, 01 Jan 2016 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Find in \$PATH with type and which</title>
<link>https://xenodium.com/find-in-path-with-type-and-which</link>
<guid isPermaLink="false">https://xenodium.com/find-in-path-with-type-and-which</guid>
    <description><![CDATA[<p>I typically use <em>which</em> to figure out the first binary found in $PATH:</p>
<pre><code class="language-{.bash">which -a emacsclient
</code></pre>
<pre><code class="language-example">/Users/user/homebrew/bin/emacsclient
/usr/bin/emacsclient
</code></pre>
<p>I always forget about <em>type</em> though:</p>
<pre><code class="language-{.bash">type -a emacsclient
</code></pre>
<pre><code class="language-example">emacsclient is /Users/user/homebrew/bin/emacsclient
emacsclient is /usr/bin/emacsclient
</code></pre>
]]></description>
    <pubDate>Wed, 30 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>npm basics</title>
<link>https://xenodium.com/npm-basics</link>
<guid isPermaLink="false">https://xenodium.com/npm-basics</guid>
    <description><![CDATA[<h2>Global vs local package installation location</h2>
<blockquote>
<p>{prefix}/lib/node_modules</p>
</blockquote>
<p>vs</p>
<blockquote>
<p>path/to/project/node_modules</p>
</blockquote>
<h2>View npm config</h2>
<pre><code class="language-{.bash">npm config list
</code></pre>
<pre><code class="language-example">; cli configs
user-agent = &quot;npm/2.14.2 node/v4.0.0 darwin x64&quot;

; node bin location = /Users/user/.nvm/versions/node/v4.0.0/bin/node
; cwd = /Users/user/stuff/active/blog
; HOME = /Users/user
; 'npm config ls -l' to show all defaults.

</code></pre>
<h2>Get config value</h2>
<pre><code class="language-{.bash">npm config get prefix
</code></pre>
<pre><code class="language-example">/Users/user/.nvm/versions/node/v4.0.0
</code></pre>
<h2>Set config value</h2>
<pre><code class="language-{.bash">npm config set prefix=$HOME/some/location
</code></pre>
<h2>Install package globally</h2>
<pre><code class="language-{.bash">node install --global &lt;package-name&gt;
</code></pre>
<p>or</p>
<pre><code class="language-{.bash">node install -g &lt;package-name&gt;
</code></pre>
<h2>List global packages</h2>
<pre><code class="language-{.bash">npm list --global
</code></pre>
<p>You can also use –depth=0 to make less verbose.</p>
<pre><code class="language-example">/Users/user/.nvm/versions/node/v4.0.0/lib
├─┬ babel-eslint@4.1.3
│ ├── acorn-to-esprima@1.0.4
│ ├─┬ babel-core@5.8.25
│ │ ├── babel-plugin-constant-folding@1.0.1
│ │ ├── babel-plugin-dead-code-elimination@1.0.2
...
</code></pre>
<h2>Install local package</h2>
<pre><code class="language-{.bash">npm install &lt;package-name&gt; --save
</code></pre>
<p>–save will add &lt;package-name&gt; dependency to your package.json.</p>
<h2>package.json</h2>
<p>See <a href="https://docs.npmjs.com/getting-started/using-a-package.json">using a package.json</a>.</p>
<h2>Uninstall package</h2>
<pre><code class="language-{.bash">npm uninstall &lt;package-name&gt;
</code></pre>
<h2>Install package at version</h2>
<pre><code class="language-{.bash">npm install &lt;package-name&gt;@1.7.0
</code></pre>
<h2>Search packages</h2>
<pre><code class="language-{.bash">npm search linter
</code></pre>
<h2>Online documentation</h2>
<p>Online documentation is great so far. More at <a href="https://docs.npmjs.com">docs.npmjs.com</a>.</p>
]]></description>
    <pubDate>Wed, 30 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Clojure bookmarks</title>
<link>https://xenodium.com/clojure-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/clojure-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.youtube.com/watch"> Clojure in Emacs from absolute zero </a>.</li>
<li><a href="http://swannodette.github.io/2015/12/23/year-in-review/">2015 in review</a>.</li>
<li><a href="http://www.clojurestacks.com/misc/2018/05/06/a-call-for-clojure-stacks.html">A call for Clojure stacks · Clojure Stacks</a>.</li>
<li><a href="https://github.com/nrepl/nrepl">GitHub - nrepl/nrepl: A Clojure network REPL that provides a server and client, along with some common APIs of use to IDEs and other tools that may need to evaluate Clojure code in remote environments</a>.</li>
<li><a href="https://whatacold.io/blog/2024-12-22-getting-started-with-cider/">Getting Started with Cider for Clojure Programming - Blog</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 25 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mac OS X tips backlog</title>
<link>https://xenodium.com/mac-os-x-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/mac-os-x-tips-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="http://tracesof.net/uebersicht/">Uebersicht: Keep an eye on what is happening on your machine and in the World</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/koekeishiya/kwm">Kwm: Tiling window manager with focus follows mouse for OSX</a>.</p>
<pre><code class="language-{.bash">cp ~/homebrew/Cellar/kwm/1.1.3/homebrew.mxcl.kwm.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.kwm.plist
</code></pre>
<p>[DONE]{.done .DONE} Turn off shadows with <a href="https://github.com/ocodo/ShadowToggle">ShadowToggle</a>.</p>
<p>[DONE]{.done .DONE} <a href="http://www.derlien.com">Disk Inventory X</a>: disk usage utility for Mac.</p>
]]></description>
    <pubDate>Mon, 21 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Search bash history with Emacs helm</title>
<link>https://xenodium.com/search-bash-history-with-emacs-helm</link>
<guid isPermaLink="false">https://xenodium.com/search-bash-history-with-emacs-helm</guid>
    <description><![CDATA[<p>Following up from <a href="#change-emacs-shells-cwd-with-helm-projectile">changing CWD with helm projectile</a>, here's a way to search your bash history with helm:</p>
<p><img src="https://xenodium.github.io/images/search-bash-history-with-emacs-helm/helm-bash-history.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(defun ar/helm-helm (title candidates on-select-function)
  &quot;Helm with TITLE CANDIDATES and ON-SELECT-FUNCTION.&quot;
  (helm :sources `((name . ,title)
                   (candidates . ,candidates)
                   (action . ,on-select-function))
        :buffer &quot;*helm-exec*&quot;
        :candidate-number-limit 10000))

(defun ar/shell-send-command (command)
  &quot;Send COMMAND to shell mode.&quot;
  (assert (string-equal mode-name &quot;Shell&quot;) nil &quot;Not in Shell mode&quot;)
  (goto-char (point-max))
  (comint-kill-input)
  (insert command)
  (comint-send-input))

(defun ar/helm-shell-search-history ()
  &quot;Narrow down bash history with helm.&quot;
  (interactive)
  (assert (string-equal mode-name &quot;Shell&quot;) nil &quot;Not in Shell mode&quot;)
  (ar/helm-helm &quot;bash history&quot;
                (with-temp-buffer
                  (insert-file-contents &quot;~/.bash_history&quot;)
                  (reverse
                   (delete-dups
                    (split-string (buffer-string) &quot;\n&quot;))))
                #'ar/shell-send-command))
</code></pre>
<p>Bonus: Replace existing M-r binding to use ar/helm-shell-search-history.</p>
<pre><code class="language-{.commonlisp">(bind-key &quot;M-r&quot; #'ar/helm-shell-search-history shell-mode-map)
</code></pre>
]]></description>
    <pubDate>Sun, 20 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Medicine bookmarks</title>
<link>https://xenodium.com/medicine-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/medicine-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://sciencebasedmedicine.org/">Science-Based Medicine – Exploring issues and controversies in science and technology</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 19 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>View DICOM files from your X-ray</title>
<link>https://xenodium.com/view-dicom-files-from-your-x-ray</link>
<guid isPermaLink="false">https://xenodium.com/view-dicom-files-from-your-x-ray</guid>
    <description><![CDATA[<p>Got a CD with my chest X-ray from the hospital. Was expecting a pdf or an image of sorts, but the CD content was rather different. For starters, it was targeted at Windows users (AUTORUN.INF, MediaViewerLauncher.EXE and a bunch of DLLs):</p>
<pre><code class="language-text">$ find . -exec file --mime-type '{}' \;

./AUTORUN.INF: text/plain
./DICOMDIR: application/dicom
./MediaViewerLauncher.EXE: application/octet-stream
...
./Libraries/BASEPRINTER.DLL: application/octet-stream
./Libraries/CDDATABURNER.DLL: application/octet-stream
./Libraries/COM.DLL: application/octet-stream
...
./Libraries/ACE.DLL: application/octet-stream
./Libraries/ACE_SSL.DLL: application/octet-stream
./Libraries/ATL90.DLL: application/octet-stream
...
./DICOM/PAT_0000: application/x-directory
./DICOM/PAT_0000/STD_0000/SER_0000/OBJ_0001/IM_0001: application/dicom
./DICOM/PAT_0000/STD_0000/SER_0001/OBJ_0001/ED_0001: application/dicom
./DICOM/PAT_0000/STD_0000/SER_0002/OBJ_0001/ED_0001: application/dicom
./Worklist/ClinicalInfo/067eccde-b299-e511-9114-005056ad3afe.mht: text/html
./Worklist/Report/067eccde-b299-e511-9114-005056ad3afe.mht: text/html
./Worklist/Worklist.wl: application/octet-stream
</code></pre>
<p>I'm on a Mac, so most of these files were not useful to me. The more interesting files were IM_0001 and ED_0001 with &quot;application/dicom&quot; MIME type. <a href="https://en.wikipedia.org/wiki/DICOM">DICOM</a> files stand for Digital Imaging and Communications in Medicine. How to view these on a Mac? <a href="http://www.osirix-viewer.com/Downloads.html">OsiriX viewer</a> is an option. OsiriX, though on the heavy side (100.7MB download), it rendered the X-ray successfully.</p>
<p><img src="https://xenodium.github.io/images/view-dicom-files-from-your-x-ray/2015-12-03-osirix-x-ray-small.png" alt=""></p>
<p>Unsurprisingly, ImageMagick's <a href="http://www.imagemagick.org/script/convert.php">convert</a> utility also handles DICOM files. Converting to PNG worked well.</p>
<pre><code class="language-{.bash">$ convert ./DICOM/PAT_0000/STD_0000/SER_0001/OBJ_0001/ED_0001 ED_0001.png
</code></pre>
<p><img src="https://xenodium.github.io/images/view-dicom-files-from-your-x-ray/2015-12-03-imagemagick-x-ray-small.png" alt=""></p>
<p>DICOM files also hold patient's metadata and optional reports. The file format is <a href="http://cabiatl.com/mricro/dicom/index.html">well known</a>. OsiriX gives you access to it, but a few lines of python can also extract it for you. First install the <a href="https://github.com/darcymason/pydicom">pydicom</a> package:</p>
<pre><code class="language-{.bash">$ sudo pip install pydicom
</code></pre>
<p>Running the python interpreter is enough to peek at the metadata:</p>
<pre><code class="language-python">&gt;&gt;&gt; import dicom
&gt;&gt;&gt; ds = dicom.read_file(&quot;./DICOM/PAT_0000/STD_0000/SER_0000/OBJ_0001/IM_0001&quot;)
&gt;&gt;&gt; ds
</code></pre>
<pre><code class="language-text">(0008, 0000) Group Length                        UL: 400
(0008, 0005) Specific Character Set              CS: 'ISO_IR 100'
(0008, 0016) SOP Class UID                       UI: Computed Radiography Image Storage
(0008, 0020) Study Date                          DA: '20151203'
(0008, 0021) Series Date                         DA: '20151203'
(0008, 0023) Content Date                        DA: '20151203'
(0008, 0030) Study Time                          TM: '120519.000000'
(0008, 0031) Series Time                         TM: '120520.000000'
(0008, 0033) Content Time                        TM: '120643.000000'
(0008, 0060) Modality                            CS: 'CR'
(0008, 0070) Manufacturer                        LO: 'Canon Inc.'
...
</code></pre>
<p>There were other DICOM files with a report:</p>
<pre><code class="language-python">&gt;&gt;&gt; import dicom
&gt;&gt;&gt; ds = dicom.read_file(&quot;./DICOM/PAT_0000/STD_0000/SER_0001/OBJ_0001/ED_0001&quot;)
&gt;&gt;&gt; ds
</code></pre>
<pre><code class="language-text">(0008, 0005) Specific Character Set              CS: 'ISO_IR 100'
(0008, 0016) SOP Class UID                       UI: Encapsulated PDF Storage
...
(0042, 0012) MIME Type of Encapsulated Document  LO: 'application/pdf'
</code></pre>
<p><a href="http://dcmtk.org/dcmtk.php.en">DCMTK</a> is another alternative tool to extract DICOM metadata. The source is available and can be built:</p>
<pre><code class="language-{.bash">$ tar xf dcmtk-3.6.0.tar.gz
$ cd dcmtk-3.6.0
$ cmake .
$ make
</code></pre>
<p>Or installed via homebrew:</p>
<pre><code class="language-{.bash">$ brew install dcmtk
</code></pre>
<p>DCMTK includes dcmdump. You can use it to dump DICOM files:</p>
<pre><code class="language-{.bash">$ dcmdata/apps/dcmdump DICOM/PAT_0000/STD_0000/SER_0000/OBJ_0001/IM_0001
</code></pre>
<pre><code class="language-text"># Dicom-File-Format

# Dicom-Meta-Information-Header
# Used TransferSyntax: Little Endian Explicit
(0002,0000) UL 192                                      #   4, 1 FileMetaInformationGroupLength
(0002,0001) OB 01\00                                    #   2, 1 FileMetaInformationVersion
(0002,0002) UI =ComputedRadiographyImageStorage         #  26, 1 MediaStorageSOPClassUID
(0002,0003) UI [1.2.392.200046.100.2.1.1.42667.20151203120519.1.1.1] #  52, 1 MediaStorageSOPInstanceUID
(0002,0010) UI =LittleEndianExplicit                    #  20, 1 TransferSyntaxUID
(0002,0012) UI [1.3.46.670589.42.1.4.4.5]               #  24, 1 ImplementationClassUID
(0002,0013) SH [PhilipsISPACS445]                       #  16, 1 ImplementationVersionName
...
</code></pre>
<p>Of interest, David Clunie's <a href="http://www.dclunie.com/">Medical Image Format Site</a>.</p>
]]></description>
    <pubDate>Sat, 19 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Tip: GOOGLETRANSLATE your Spreadsheet</title>
<link>https://xenodium.com/tip-googletranslate-your-spreadsheet</link>
<guid isPermaLink="false">https://xenodium.com/tip-googletranslate-your-spreadsheet</guid>
    <description><![CDATA[<p>Examples from <a href="https://support.google.com/docs/answer/3093331">reference</a>:</p>
<pre><code class="language-text">=GOOGLETRANSLATE(&quot;Hello World\n&quot;,&quot;en\n&quot;,&quot;es&quot;)
=GOOGLETRANSLATE(A2,B2,C2)
=GOOGLETRANSLATE(A2)
</code></pre>
]]></description>
    <pubDate>Fri, 18 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Organize your data with camlistore</title>
<link>https://xenodium.com/organize-your-data-with-camlistore</link>
<guid isPermaLink="false">https://xenodium.com/organize-your-data-with-camlistore</guid>
    <description><![CDATA[<p>Checking out <a href="https://camlistore.org">camlistore</a> to organize all sorts of data. <a href="https://www.scaleway.com/imagehub/camlistore/">Scaleway</a> enables you to deploy camlistore servers.</p>
]]></description>
    <pubDate>Fri, 18 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Maps dev bookmarks</title>
<link>https://xenodium.com/maps-dev-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/maps-dev-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=26918259">A new way to make maps with OpenStreetMap | Hacker News</a>.</li>
<li><a href="https://www.mapzen.com/data/borders/">borders: Country, region and city boundary data from OpenStreetMap, served monthly (mapzen.com)</a>.</li>
<li><a href="https://www.inderapotheke.de/blog/farewell-google-maps">Farewell, Google Maps (In der Apotheke)</a>.</li>
<li><a href="https://hamberg.no/erlend/posts/2015-10-22-geocoding.html">Fast, Offline, Reverse Geocoding; or, in Which Polygon am I?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22252330">Free OpenStreetMap tile library: watercolor, black and white, terrain</a>.</li>
<li><a href="https://github.com/ue4plugins/StreetMap/blob/master/README.md">Import OpenStreetMap XML data into your Unreal Engine 4</a>.</li>
<li><a href="https://www.locationtech.org">Location Tech</a>.</li>
<li><a href="https://wiki.openstreetmap.org/wiki/Map_Features#Amenity">Map's POI categories</a>.</li>
<li><a href="https://www.mapbox.com/">Mapbox</a>.</li>
<li><a href="http://maperitive.net/">Maperitive (offline maps)</a>.</li>
<li><a href="https://mapzen.com">Mapzen</a>.</li>
<li><a href="https://medium.com/tag/mapping">Medium's mapping tag</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18390425">Migrating away from Google Maps and cutting costs by 99% (Hacker News)</a>.</li>
<li><a href="https://openaddresses.io/">Open Addresses</a>.</li>
<li><a href="https://openstreetcam.org/map/">OpenStreetCam</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23722133">Openstreetmap, a global map for worldwide insight | Hacker News</a>.</li>
<li><a href="https://www.openstreetmap.org/user/mvexel/diary/39274">OpenStreetMap: Introducing OpenStreetView</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27543012">Organicmaps: Android and iOS offline maps app for travelers, tourists, hikers…</a>.</li>
<li><a href="http://wiki.openstreetmap.org/wiki/Planet.osm">OSM data in one file</a>.</li>
<li><a href="http://wiki.openstreetmap.org/wiki/OSM_on_Paper">OSM on paper</a>.</li>
<li><a href="http://download.osmand.net/rawindexes/">OSM raw indices</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17952361">Pigeon Maps – Maps in React with no external dependencies (Hacker News)</a>.</li>
<li><a href="http://news.spatialdev.com/portable-open-street-map/">Portable OSM</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27781895">Show HN: Tilemaker – DIY vector tiles from OpenStreetMap data | Hacker News</a>.</li>
<li><a href="https://developer.mapquest.com/documentation/static-map-api/v5/">Static Map API - Overview | MapQuest API Documentation</a>.</li>
<li><a href="http://www.mostlymaths.net/2015/06/using-qgis-to-create-custom-map.html">Using QGIS to create a custom map</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=25615394">Why Openstreetmap’s product fails to compete with Google Maps | Hacker News</a>.</li>
<li><a href="http://thematicmapping.org/downloads/world_borders.php">World Borders Dataset (thematicmapping.org)</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 17 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Use ImageMagick to convert image to grayscale</title>
<link>https://xenodium.com/use-imagemagick-to-convert-image-to-grayscale</link>
<guid isPermaLink="false">https://xenodium.com/use-imagemagick-to-convert-image-to-grayscale</guid>
    <description><![CDATA[<p>Another ImageMagick one-liner I'll likely forget.</p>
<pre><code class="language-{.bash">mogrify -type Grayscale image.png
</code></pre>
]]></description>
    <pubDate>Thu, 17 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Drill down Emacs dired with dired-subtree</title>
<link>https://xenodium.com/drill-down-emacs-dired-with-dired-subtree</link>
<guid isPermaLink="false">https://xenodium.com/drill-down-emacs-dired-with-dired-subtree</guid>
    <description><![CDATA[<p>JCS, from <a href="http://irreal.org/blog">Irreal</a>, recently <a href="http://irreal.org/blog/?p%3D4777">highlighted</a> fuco's <a href="https://github.com/Fuco1/dired-hacks">dired-hacks</a>. <a href="https://github.com/Fuco1/dired-hacks/blob/master/dired-subtree.el">dired-subtree</a> is super handy for drilling subdirectories down. Bound &lt;tab&gt; and &lt;backtab&gt; to toggle and cycle subtrees.</p>
<pre><code class="language-{.commonlisp">(use-package dired-subtree :ensure t
  :after dired
  :config
  (bind-key &quot;&lt;tab&gt;&quot; #'dired-subtree-toggle dired-mode-map)
  (bind-key &quot;&lt;backtab&gt;&quot; #'dired-subtree-cycle dired-mode-map))
</code></pre>
<p><img src="https://xenodium.github.io/images/drill-down-emacs-dired-with-dired-subtree/dired-subtree.gif" alt=""></p>
]]></description>
    <pubDate>Mon, 14 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>GPG (GnuPG) examples</title>
<link>https://xenodium.com/gpg-examples</link>
<guid isPermaLink="false">https://xenodium.com/gpg-examples</guid>
    <description><![CDATA[<h2>Generate key</h2>
<pre><code class="language-{.bash">gpg --full-generate-key
</code></pre>
<h2>Export private key</h2>
<pre><code class="language-{.bash">gpg --export-secret-key -a &lt;keyid&gt; &gt; &lt;private.asc&gt;
</code></pre>
<h2>Import key</h2>
<pre><code class="language-{.bash">gpg --import &lt; &lt;private.asc&gt;
</code></pre>
<h2>Delete public key</h2>
<pre><code class="language-{.bash">gpg --delete-keys &lt;keyid&gt;
</code></pre>
<h2>Delete private key</h2>
<pre><code class="language-{.bash">gpg --delete-secret-keys &lt;keyid&gt;
</code></pre>
<h2>Edit key</h2>
<pre><code class="language-{.bash">gpg --edit-key &lt;keyid&gt;
gpg&gt; uid (lists IDs)
gpg&gt; uid 2 (marks ID)
gpg&gt; deluid (deletes marked ID)
Really remove this user ID? (y/N) y
</code></pre>
<h2>Change passphrase of the secret key</h2>
<pre><code class="language-{.bash">gpg --edit-key Your-Key-ID-Here
gpg&gt; passwd
gpg&gt; save
</code></pre>
<h2>References</h2>
<ul>
<li><a href="http://blog.ghostinthemachines.com/2015/03/01/how-to-use-gpg-command-line/">How To Use GPG on the Command Line (Ghost in the Machines)</a>.</li>
<li><a href="https://www.cyberciti.biz/faq/linux-unix-gpg-change-passphrase-command/">GPG Change Passphrase Secret Key Password Command - nixCraft</a>.</li>
<li><a href="https://www.gnupg.org/gph/en/manual.html">The GNU Privacy handbook</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>CSS bookmarks</title>
<link>https://xenodium.com/css-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/css-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://jrl.ninja/etc/1/">58 bytes of css to look great nearly everywhere</a>.</li>
<li><a href="https://csslayout.io/">CSS Layout</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D10731360">CSS Protips: A collection of tips to help take your CSS skills pro (Hacker News)</a>.</li>
<li><a href="https://github.com/AllThingsSmitty/css-protips">CSS Protips: A collection of tips to help take your CSS skills pro</a>.</li>
<li><a href="http://cssguidelin.es">CSS style guide</a>.</li>
<li><a href="https://css-tricks.com/">CSS-Tricks</a>.</li>
<li><a href="https://github.com/jamztang/CSStickyHeaderFlowLayout">CSStickyHeaderFlowLayout</a>.</li>
<li><a href="http://dynamicsjs.com/">Dynamics.js: JavaScript library to create physics-based CSS animations</a>.</li>
<li><a href="http://flexboxfroggy.com/">Flexbox Froggy, a game for writing CSS code</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D9405284">Howtocenterincss.com (Hacker News)</a>.</li>
<li><a href="http://howtocenterincss.com/">Howtocenterincss.com</a>.</li>
<li><a href="https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery">Optimize CSS delivery (Google Developers)</a>.</li>
<li><a href="https://jgthms.com/web-design-in-4-minutes/">Web Design in 4 minutes (minimal css rules)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Resume partial downloads with ssh and rsync</title>
<link>https://xenodium.com/resume-partial-downloads-with-ssh-and-rsync</link>
<guid isPermaLink="false">https://xenodium.com/resume-partial-downloads-with-ssh-and-rsync</guid>
    <description><![CDATA[<pre><code class="language-{.bash">rsync --rsync-path=/usr/local/bin/rsync \
      --partial \
      --progress \
      --rsh=ssh \
      john@host:/path/to/file \
      path/to/partial/file
</code></pre>
]]></description>
    <pubDate>Sat, 12 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs text faces</title>
<link>https://xenodium.com/emacs-text-faces</link>
<guid isPermaLink="false">https://xenodium.com/emacs-text-faces</guid>
    <description><![CDATA[<ul>
<li>Text faces = Text styles.</li>
<li>Face attributes: font, height, weight, slant, foreground/background color, and underlining or overlining.</li>
<li>Font lock mode automatically assigns faces to text.</li>
<li>M-x list-faces-display: Shows faces defined.</li>
<li>M-x helm-colors: Also handy.</li>
<li>Unspecified attributes are taken from 'default' face.</li>
</ul>
]]></description>
    <pubDate>Sat, 12 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Preview HTML pages on github</title>
<link>https://xenodium.com/preview-html-pages-on-github</link>
<guid isPermaLink="false">https://xenodium.com/preview-html-pages-on-github</guid>
    <description><![CDATA[<p>Prepend with <a href="http://htmlpreview.github.io/">http://htmlpreview.github.io/</a>?. For example: <a href="http://htmlpreview.github.io/?https://github.com/xenodium/xenodium.github.io/blob/master/index.html">http://htmlpreview.github.io/?https://github.com/xenodium/xenodium.github.io/blob/master/index.html</a></p>
]]></description>
    <pubDate>Tue, 08 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flutter setup</title>
<link>https://xenodium.com/flutter-setup</link>
<guid isPermaLink="false">https://xenodium.com/flutter-setup</guid>
    <description><![CDATA[<p>Based on <a href="http://flutter.io/getting-started/">Getting Started with Flutter</a>.</p>
<pre><code class="language-{.bash">$ curl -O https://storage.googleapis.com/dart-archive/channels/stable/release/1.13.0/sdk/dartsdk-macos-x64-release.zip
$ unzip dartsdk-macos-x64-release.zip
$ export PATH=`pwd`/dart-sdk/bin:$PATH
</code></pre>
<p>Verify with:</p>
<pre><code class="language-{.bash">$ pub --version
</code></pre>
]]></description>
    <pubDate>Mon, 07 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Playing with Dart's analysis server</title>
<link>https://xenodium.com/playing-with-darts-analysis-server</link>
<guid isPermaLink="false">https://xenodium.com/playing-with-darts-analysis-server</guid>
    <description><![CDATA[<p>Dart SDK ships with an <a href="https://github.com/dart-lang/sdk/tree/master/pkg/analysis_server">analysis server</a>. Very handy if you'd like to write a completion plugin for your favorite editor. The API is well <a href="http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html">documented</a>. Of interest, there's <a href="https://github.com/tomsontom/dartedit/blob/master/bundles/at.bestsolution.dart.server.api/src-gen/at/bestsolution/dart/server/api/internal/local/LocalDartServer.java">LocalDartServer.java</a>, part of <a href="https://github.com/tomsontom/dartedit/blob/master/bundles/at.bestsolution.dart.server.api/src-gen/at/bestsolution/dart/server/api/internal/local/LocalDartServer.java">dartedit</a>.</p>
<pre><code class="language-{.bash">$ dart path/to/bin/snapshots/analysis_server.dart.snapshot  --sdk=path/to/dart-sdk
</code></pre>
<p>NOTE: The server reads requests from standard input. Either escape or execute the following as one-liner json requests.</p>
<pre><code class="language-json">{
  &quot;id&quot;: &quot;1\n&quot;,
  &quot;method&quot;: &quot;analysis.setAnalysisRoots\n&quot;,
  &quot;params&quot;: {
    &quot;included&quot;: [
      &quot;path/to/your/dart/project&quot;
    ],
    &quot;excluded&quot;: []
  }
}
</code></pre>
<pre><code class="language-json">{
  &quot;id&quot;: &quot;3\n&quot;,
  &quot;method&quot;: &quot;completion.getSuggestions\n&quot;,
  &quot;params&quot;: {
    &quot;file&quot;: &quot;path/to/some/file.dart\n&quot;,
    &quot;offset&quot;: 673
  }
}
</code></pre>
]]></description>
    <pubDate>Mon, 07 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Dart bookmarks</title>
<link>https://xenodium.com/dart-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/dart-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://tomsondev.bestsolution.at/2015/08/25/access-dart-analysis-server-from-java/">Access Dart Analysis server from Java</a>.</li>
<li><a href="http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html">Analysis server API</a>.</li>
<li><a href="https://www.dartlang.org/tools/">Dart tools</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 07 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flutter bookmarks</title>
<link>https://xenodium.com/flutter-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/flutter-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.youtube.com/watch?list%3DPLOU2XLYxmsIIQorIS8gagUiMau9S84vZV&amp;v%3DPnIWl33YMwA">Eric Seidel introduces Sky, Dart Developer Summit 2015 (YouTube)</a>.</li>
<li><a href="https://www.didierboelens.com/2019/01/futures---isolates---event-loop/">Flutter - Futures - Isolates - Event Loop</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18958747">Flutter: Futures, Isolates, Event Loop (Hacker News)</a>.</li>
<li><a href="https://medium.com/asos-techblog/flutter-vs-react-native-for-ios-android-app-development-c41b4e038db9">Flutter: the good, the bad and the ugly – The ASOS Tech Blog – Medium</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 06 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Swift bookmarks</title>
<link>https://xenodium.com/swift-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/swift-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.uraimo.com/2016/01/06/10-Swift-One-Liners-To-Impress-Your-Friends/">10 Swift One Liners To Impress Your Friends</a>.</li>
<li><a href="https://binarapps.com/blog/5-secrets-of-swift-api-design">5 secrets of Swift API design</a>.</li>
<li><a href="https://www.swiftbysundell.com/articles/5-small-but-significant-improvements-in-swift-5-1/">5 small but significant improvements in Swift 5.1 | Swift by Sundell</a>.</li>
<li><a href="https://forums.swift.org/t/state-messing-with-initializer-flow/25276/10">@State messing with initializer flow - Using Swift - Swift Forums</a>.</li>
<li><a href="https://github.com/CosmicMind/Material">A beautiful graphics framework for Material Design in Swift</a>.</li>
<li><a href="https://github.com/airbnb/MagazineLayout">A collection view layout capable of laying out views in vertically scrolling grids and lists (AirBnB)</a>.</li>
<li><a href="https://wwdcbysundell.com/2019/diffable-data-sources-first-look/">A first look at the new diffable data sources for table views and collection view</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=20908452">A Technology Freelancer's Guide to Starting a Worker Cooperative</a>.</li>
<li><a href="https://medium.com/@eneko/aes256-cbc-file-encryption-from-the-command-line-with-swift-cd1f88f2e1ec">AES256-CBC File Encryption from the Command Line with Swift</a>.</li>
<li><a href="https://talk.objc.io/episodes">All Episodes · Swift Talk · objc.io</a>.</li>
<li><a href="https://www.objc.io/books/app-architecture/">App Architecture (objc.io)</a>.</li>
<li><a href="https://www.swiftbysundell.com/posts/asyncawait-in-swift-unit-tests">Async/await in Swift unit tests</a>.</li>
<li><a href="https://www.swiftbysundell.com/articles/avoiding-race-conditions-in-swift/">Avoiding race conditions in Swift | Swift by Sundell</a>.</li>
<li><a href="https://github.com/Awesome-Server-Side-Swift/TheList">Awesome server side swift</a>.</li>
<li><a href="https://github.com/hsavit1/Awesome-Swift-Education">Awesome-Swift-Education</a>.</li>
<li><a href="https://www.swiftbysundell.com/posts/building-dsls-in-swift">Building DSLs in Swift (Swift by Sundell)</a>.</li>
<li><a href="https://davedelong.com/blog/2018/07/25/conditional-compilation-in-swift-part-1/">Conditional Compilation in Swift, Part 1 (Dave DeLong)</a>.</li>
<li><a href="https://www.swiftbysundell.com/posts/constructing-urls-in-swift">Constructing URLs in Swift</a>.</li>
<li><a href="https://www.hackingwithswift.com/read/4/2/creating-a-simple-browser-with-wkwebview">Creating a simple browser with WKWebView in Swift</a>.</li>
<li><a href="https://github.com/danielmartin/swift-info">Curated Swift 5 documentation and reference in GNU Info format</a>.</li>
<li><a href="https://forums.swift.org/t/debugging-sourcekit-lsp-using-lldb/28328/14">Debugging sourcekit-lsp using LLDB - LLDB - Swift Forums</a>.</li>
<li><a href="https://www.swiftbysundell.com/articles/deciding-whether-to-adopt-new-swift-technologies/">Deciding whether to adopt new Swift technologies | Swift by Sundell</a>.</li>
<li><a href="https://theswiftdev.com/deep-dive-into-swift-frameworks/">Deep dive into Swift frameworks - The.Swift.Dev.</a>.</li>
<li><a href="https://github.com/krzysztofzablocki/Difference">Difference: diff between 2 Swift object instances</a>.</li>
<li><a href="https://www.swiftbysundell.com/articles/encapsulating-configuration-code-in-swift/">Encapsulating configuration code in Swift | Swift by Sundell</a>.</li>
<li><a href="https://talk.objc.io/episodes/S01E125-building-a-responsive-layout">Episode 125 – Building a Layout Library: Building a Responsive Layout · Swift Talk · objc.io</a>.</li>
<li><a href="https://swiftunboxed.com/protocols/equatable/">Equatable - Swift Unboxed</a>.</li>
<li><a href="https://nshipster.com/formatter/">Formatting everything in swift (lovation, dates, time)</a>.</li>
<li><a href="https://www.polpiella.dev/from-nsregular-expression-to-swift-regex">From NSRegularExpression to SwiftRegex</a>.</li>
<li><a href="https://github.com/mpangburn/FunctionKit/blob/master/README.md">FunctionKit/README.md at master · mpangburn/FunctionKit · GitHub</a>.</li>
<li><a href="http://rshankar.com/get-your-current-address-in-swift/">Get your current address in Swift – Ravi Shankar</a>.</li>
<li><a href="https://kinderas.com/technology/2014/6/7/getting-started-with-wkwebview-using-swift-in-ios-8">Getting started with WKWebView using Swift in iOS 8</a>.</li>
<li><a href="https://grokswift.com/uitextfield">Getting to know UITextField</a>.</li>
<li><a href="https://github.com/almassapargali/LocationPicker">GitHub - almassapargali/LocationPicker (Swift)</a>.</li>
<li><a href="https://github.com/anas-p/ImagePicker">GitHub - anas-p/ImagePicker: UIImagePickerController for camera and photo library</a>.</li>
<li><a href="https://github.com/burczyk/XcodeSwiftSnippets">GitHub - burczyk/XcodeSwiftSnippets: Swift 4 code snippets for Xcode</a>.</li>
<li><a href="https://github.com/DevLiuSir/CircleProgressBar">GitHub - DevLiuSir/CircleProgressBar: This is a simple animation circle progress bar</a>.</li>
<li><a href="https://github.com/hyperoslo/Cache">GitHub - hyperoslo/Cache: Nothing but Cache.</a>.</li>
<li><a href="https://github.com/liuliu/dflat">GitHub - liuliu/dflat: Structured Data Store for Mobile</a>.</li>
<li><a href="https://github.com/phynet/iOS-URL-Schemes">GitHub - phynet/iOS-URL-Schemes: iOS URL list schemes (Settings)</a>.</li>
<li><a href="https://github.com/Raizlabs/BonMot">GitHub - Raizlabs/BonMot: Beautiful, easy attributed strings in Swift</a>.</li>
<li><a href="https://github.com/raywenderlich/swift-algorithm-club">GitHub - raywenderlich/swift-algorithm-club: Swift Algorithm Club</a>.</li>
<li><a href="https://github.com/saoudrizwan/Disk">GitHub - saoudrizwan/Disk: Delightful framework for iOS to easily persist strcts, images, and data</a>.</li>
<li><a href="https://github.com/swift-embedded/swift-embedded">GitHub - swift-embedded/swift-embedded: Swift for Embedded Systems </a>.</li>
<li><a href="https://github.com/zhuorantan/LocationPicker">GitHub - zhuorantan/LocationPicke (Swift)</a>.</li>
<li><a href="https://medium.com/better-programming/how-to-add-compiled-frameworks-in-swift-package-manager-f0cdbde84fc7">How to Add Compiled Frameworks in Swift Package Manager</a>.</li>
<li><a href="http://browniefed.com/blog/2015/11/28/react-native-how-to-bridge-a-swift-view/">How to bridge a Swift View</a>.</li>
<li><a href="https://www.hackingwithswift.com/example-code/cryptokit/how-to-calculate-the-sha-hash-of-a-string-or-data-instance">How to calculate the SHA hash of a String or Data instance</a>.</li>
<li><a href="https://whatdidilearn.info/2018/07/29/how-to-capture-regex-group-values-in-swift.html">How to capture Regex group values in Swift | What did I learn</a>.</li>
<li><a href="https://www.hackingwithswift.com/example-code/networking/how-to-check-for-internet-connectivity-using-nwpathmonitor">How to check for internet connectivity using NWPathMonitor</a>.</li>
<li><a href="https://www.hackingwithswift.com/example-code/games/how-to-create-a-random-terrain-tile-map-using-sktilemapnode-and-gkperlinnoisesource">How to create a random terrain tile map using SKTileMapNode and GKPerlinNoiseSource</a>.</li>
<li><a href="https://www.hackingwithswift.com/example-code/system/how-to-run-an-external-program-using-process">How to run an external program using Process</a>.</li>
<li><a href="http://www.globalnerdy.com/2020/05/28/how-to-work-with-dates-and-times-in-swift-5-part-4-adding-swift-syntactic-magic/">How to work with dates and times in Swift 5, part 4: Adding Swift syntactic sugar</a>.</li>
<li><a href="https://twitter.com/olebegemann/status/1004458683428950018?s=12">I made a “What’s new in Swift 4.2” playground</a>.</li>
<li><a href="https://stackoverflow.com/questions/3554244/uiimagepngrepresentation-issues-images-rotated-by-90-degrees">iphone - UIImagePNGRepresentation issues? / Images rotated by 90 degrees</a>.</li>
<li><a href="https://www.bignerdranch.com/blog/it-looks-like-youre-still-trying-to-use-a-framework/">It Looks Like You're Still Trying to Use/Create a Swift Framework</a>.</li>
<li><a href="https://www.youtube.com/watch?v=XJreRR0cC3E">Jason Zurita - Compositional UI Styling in Swift - YouTube</a>.</li>
<li><a href="https://khanlou.com/2016/07/implementing-dictionary-in-swift/">Khanlou | Implementing Dictionary In Swift</a>.</li>
<li><a href="https://medium.com/@PavelGnatyuk/large-title-and-search-in-ios-11-514d5e020cee">Large Title and Search in iOS 11 – Pavel Gnatyuk – Medium</a>.</li>
<li><a href="https://github.com/hyperoslo/Lightbox">Lightbox is a convenient and easy to use image viewer for your iOS app</a>.</li>
<li><a href="https://github.com/zhuorantan/LocationPicker">Location picker: A ready for use and fully customizable location picker for your app</a>.</li>
<li><a href="https://steipete.com/posts/logging-in-swift/">Logging in Swift | steipete's blog</a>.</li>
<li><a href="https://www.raywenderlich.com/731-macos-development-for-beginners-part-1">macOS Swift Development for Beginners: Part 1</a>.</li>
<li><a href="https://twitter.com/MartinLasek/status/1256349442472505344">Martin Lasek on Twitter: &quot;Handling prices in Swift.&quot;</a>.</li>
<li><a href="https://oleb.net/2018/objc-swift-transition/">Migrating an Objective-C class to Swift: a piecemeal approach – Ole Begemann</a>.</li>
<li><a href="https://theswiftdev.com/migrating-from-cocoapods-to-swift-package-manager/">Migrating from CocoaPods to Swift Package Manager - The.Swift.Dev.</a>.</li>
<li><a href="https://medium.com/thecreateschool/migrating-from-swift-4-to-swift-5-2f425b99436b">Migrating from Swift 4 to Swift 5 – The Create School – Medium</a>.</li>
<li><a href="https://ericasadun.com/2018/12/14/more-fun-with-swift-5-string-interpolation-radix-formatting/">More fun with Swift 5 String Interpolation: Radix (Erica Sadun)</a>.</li>
<li><a href="https://github.com/netguru/swift-style-guide">Netguru's Swift Style Guide</a>.</li>
<li><a href="https://nshipster.com/never/">Never: Eliminating Impossible States in Swift Generic Types - NSHipster</a>.</li>
<li><a href="https://lukakerr.github.io/swift/nswindow-styles">NSWindow Styles | lukakerr.github.io</a>.</li>
<li><a href="https://medium.com/ios-os-x-development/optionals-in-swift-for-newbies-7199a30707d5">Optionals in Swift for newbies</a>.</li>
<li><a href="https://github.com/mxcl/Path.swift">Path.swift: Delightful, robust, cross-platform and chainable file-pathing functions</a>.</li>
<li><a href="https://www.bignerdranch.com/blog/pro-pattern-matching-in-swift/">Pro Pattern-Matching in Swift - Digital product development agency | Big Nerd Ranch</a>.</li>
<li><a href="https://nshipster.com/swift-regular-expressions/">Regular Expressions in Swift (groups) - NSHipster</a>.</li>
<li><a href="https://zacwood.me/2018/09/09/simple-networking-swift/">Simple networking in Swift</a>.</li>
<li><a href="https://www.swiftbysundell.com/posts/slot-based-ui-development-in-swift">Slot-based UI development in Swift (Sundell)</a>.</li>
<li><a href="https://www.donnywals.com/splitting-a-json-object-into-an-enum-and-an-associated-object-with-codable/">Splitting a JSON object into an enum and an associated object with Codable</a>.</li>
<li><a href="https://swiftbysundell.com/articles/splitting-up-swift-types/">Splitting up Swift types | Swift by Sundell</a>.</li>
<li><a href="https://github.com/seorenn/SRChoco">SRChoco: Seorenn's Development Libraries for OS X and iOS (github)</a>.</li>
<li>[[<a href="https://twitter.com/steipete/status/1281578201165320192">https://twitter.com/steipete/status/1281578201165320192</a>][String(string[currentIndex])]].</li>
<li><a href="https://stackoverflow.com/questions/43797913/how-to-authenticate-a-grpc-call-for-the-assistant-sdk">Swift - How to authenticate a gRPC call for the Assistant SDK?</a>.</li>
<li><a href="https://ericasadun.com/2018/12/16/swift-5-interpolation-part-3-dates-and-number-formatters/">Swift 5 Interpolation Part 3: Dates and Number Formatters (Erica Sadun)</a>.</li>
<li><a href="https://nshipster.com/vscode/">Swift Development with Visual Studio Code - NSHipster</a>.</li>
<li><a href="http://www.h4labs.com/dev/ios/swift.html">Swift Resources</a>.</li>
<li><a href="https://github.com/mxcl/swift-sh">swift sh adds automatic dependency loading in scripts</a>.</li>
<li><a href="https://pragprog.com/book/esswift2/swift-style-second-edition">Swift Style, Second Edition: An Opinionated Guide to an Opinionated Language by Erica Sadun (The Pragmatic Bookshelf)</a>.</li>
<li><a href="https://www.objc.io/blog/2018/10/02/using-appkit-from-the-command-line/">Swift Tip: Using AppKit from the Command-line · objc.io</a>.</li>
<li><a href="https://swift.org/blog/argument-parser/">Swift.org - Announcing ArgumentParser</a>.</li>
<li><a href="https://swift.org/documentation/api-design-guidelines/">Swift.org - API Design Guidelines</a>.</li>
<li><a href="https://github.com/apple/swift/blob/master/docs/ErrorHandlingRationale.rst">swift/ErrorHandlingRationale.rst at master · apple/swift · GitHub</a>.</li>
<li><a href="https://github.com/LeonardoCardoso/SwiftLinkPreview">SwiftLinkPreview: Link Previewer for iOS, macOS, watchOS and tvOS</a>.</li>
<li><a href="http://swiftmonthly.com/">SwiftMothly</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=44917450">TextKit 2 – The Promised Land | Hacker News</a>.</li>
<li><a href="https://www.hackingwithswift.com/articles/136/the-complete-guide-to-optionals-in-swift">The Complete Guide to Optionals in Swift – Hacking with Swift</a>.</li>
<li><a href="https://www.youtube.com/user/TheSwiftLanguage">The Shift Language (YouTube)</a>.</li>
<li><a href="https://swiftpm.co/">The SwiftPM Library, a place to find packages for Swift</a>.</li>
<li><a href="https://twitter.com/scottberrevoets/status/1151228835947401216">Today marks 4 years since shipping the first release of the rewrite of the Lyft app in Swift</a>.</li>
<li><a href="https://troz.net/">TrozWare blogs on Swift</a>.</li>
<li><a href="https://medium.com/the-traveled-ios-developers-guide/uilayoutguide-6b3b552b1890">UILayoutGuide – The Traveled iOS Developer’s Guide – Medium</a>.</li>
<li><a href="https://swiftrocks.com/understanding-dispatchqueues.html">Understanding DispatchQueues - SwiftRocks</a>.</li>
<li><a href="https://www.hackingwithswift.com/quick-start/understanding-swift">Understanding Swift - free quick start tutorials for Swift developers (hackingwithswift)</a>.</li>
<li><a href="https://aozsky.com/swift/swift_ide">Use Neovim as Swift IDE - The Go Blog</a>.</li>
<li><a href="https://www.swiftbysundell.com/posts/using-errors-as-control-flow-in-swift">Using errors as control flow in Swif (Sundell)</a>.</li>
<li><a href="https://medium.com/@PhiJay/why-swift-enums-with-associated-values-cannot-have-a-raw-value-21e41d5ec11">Why Swift Enums with Associated Values Cannot Have a Raw Value</a>.</li>
<li><a href="https://nshipster.com/wkwebview">WKWebView (NSHipster)</a>.</li>
<li><a href="https://www.slideshare.net/SommerPanage1/writing-your-app-swiftly/SommerPanage1/writing-your-app-swiftly">Writing Your App Swiftly</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 06 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Installing Emacs spaceline</title>
<link>https://xenodium.com/installing-emacs-spaceline</link>
<guid isPermaLink="false">https://xenodium.com/installing-emacs-spaceline</guid>
    <description><![CDATA[<p>Gave <a href="https://github.com/TheBB/spaceline/">Spaceline</a> a try. <a href="https://github.com/syl20bnr/spacemacs">Spacemacs</a>'s powerline theme. Setup was super simple (Thanks <a href="https://github.com/TheBB">Eivind Fonn</a> and <a href="https://github.com/syl20bnr/spacemacs">Sylvain Benner</a>):</p>
<pre><code class="language-{.commonlisp">(use-package spaceline :ensure t
  :config
  (use-package spaceline-config
    :config
    (spaceline-toggle-minor-modes-off)
    (spaceline-toggle-buffer-encoding-off)
    (spaceline-toggle-buffer-encoding-abbrev-off)
    (setq powerline-default-separator 'rounded)
    (setq spaceline-highlight-face-func 'spaceline-highlight-face-evil-state)
    (spaceline-define-segment line-column
      &quot;The current line and column numbers.&quot;
      &quot;l:%l c:%2c&quot;)
    (spaceline-define-segment time
      &quot;The current time.&quot;
      (format-time-string &quot;%H:%M&quot;))
    (spaceline-define-segment date
      &quot;The current date.&quot;
      (format-time-string &quot;%h %d&quot;))
    (spaceline-toggle-time-on)
    (spaceline-emacs-theme 'date 'time))
</code></pre>
<p><img src="https://xenodium.github.io/images/installing-emacs-spaceline/spaceline.png" alt=""></p>
]]></description>
    <pubDate>Mon, 30 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>package.el incomprehensible buffer</title>
<link>https://xenodium.com/package-el-incomprehensible-buffer</link>
<guid isPermaLink="false">https://xenodium.com/package-el-incomprehensible-buffer</guid>
    <description><![CDATA[<p>Came across &quot;incomprehensible buffer&quot; error in package.el. <a href="http://osdir.com/ml/general/2015-11/msg22232.html">Workaround patch</a>:</p>
<pre><code class="language-{.commonlisp">--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1161,6 +1161,7 @@ package--with-work-buffer
(let* ((url (concat ,url-1 ,file))
       (callback (lambda (status)
                   (let ((b (current-buffer)))
+                    (goto-char (point-min))
                     (unwind-protect (wrap-errors
                                      (when-let ((er (plist-get
                                                      status :error)))
                                        (error &quot;Error retrieving: %s %S&quot; url er))
</code></pre>
]]></description>
    <pubDate>Sun, 29 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Leading bookmarks</title>
<link>https://xenodium.com/leading-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/leading-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=22969533">Agile's early evangelists wouldn't mind watching Agile die</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27414443">An incomplete list of skills senior engineers need, beyond coding | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D10395046">Ask HN: How to Be a Good Technical Lead? (Hacker News)</a>.</li>
<li><a href="https://twitter.com/DanielleMorrill/status/1321092574837383168">Books on leveling up as a manager</a>.</li>
<li><a href="https://twitter.com/bcantrill/status/1216491216356823040">Bryan Cantrill on Twitter: &quot;So, my thoughts on engineering performance management…&quot;</a>.</li>
<li><a href="https://twitter.com/dan_abramov/status/1203486500731719681">Dan Abramov: What is your favorite book about management… (twitter)</a>.</li>
<li><a href="https://hbr.org/2015/10/do-you-have-a-managers-mindset">Do You Have a Manager’s Mindset?</a>.</li>
<li><a href="https://medium.com/@kentcdodds/first-timers-only-78281ea47455#.hj28umxei">First Timers Only: A suggestion to Open Source project maintainers</a>.</li>
<li><a href="https://hbr.org/2015/08/how-to-give-tough-feedback-that-helps-people-grow">How to Give Tough Feedback That Helps People Grow</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19485559">Interviews with developers who became managers (Hacker News)</a>.</li>
<li><a href="https://hbr.org/2016/01/secrets-of-the-superbosses">Secrets of the Superbosses</a>.</li>
<li><a href="https://hbr.org/2015/10/shifting-from-star-performer-to-star-manager">Shifting from Star Performer to Star Manager</a>.</li>
<li><a href="http://www.joelonsoftware.com/articles/fog0000000043.html?__s=5ww3bdbkavuhrw1fhfpp">The Joel Test: 12 Steps to Better Code</a>.</li>
<li><a href="http://whilefalse.blogspot.co.uk/2015/11/the-manager-as-debugger.html?m=1">The Manager as Debugger</a>.</li>
<li><a href="https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897">The Manager's Path: A Guide for Tech Leaders Navigating Growth and Change</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 29 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Online reading backlog</title>
<link>https://xenodium.com/online-reading-backlog</link>
<guid isPermaLink="false">https://xenodium.com/online-reading-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="http://phrack.org/issues/69/1.html">Phrack 69</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://hbr.org/2015/10/a-simple-formula-for-changing-our-behavior?utm_campaign=harvardbiz&amp;utm_source=twitter&amp;utm_medium=social">A Simple Formula for Changing Our Behavior</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://hbr.org/2013/11/be-grateful-more-often">Be Grateful More Often</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://heydave.org/post/24286720323/gtd-sucks-for-creative-work-heres-an-alternative">GTD sucks for creative work</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://continuations.com/post/131372549150/land-capital-attention-this-time-it-is-the-same">Land, Capital, Attention: This Time it Is the Same</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.gatesnotes.com/Books/Mindset-The-New-Psychology-of-Success">Mindset: What You Believe Affects What You Achieve (Gates Notes)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.theatlantic.com/business/archive/2015/10/get-rid-borders-completely/409501/?single_page%3Dtrue">The Case for Getting Rid of Borders—Completely</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://blog.todoist.com/2015/11/30/ultimate-guide-personal-productivity-methods/">The Ultimate Guide to Personal Productivity Methods</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.gatesnotes.com/Books/Thing-Explainer">Thing Explainer: A Basic Guide for Curious Minds (Gates Notes)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.ted.com/talks/amy_cuddy_your_body_language_shapes_who_you_are?language%3Den">Your body language shapes who you are</a>.</p>
]]></description>
    <pubDate>Sun, 29 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Travel lifestyle bookmarks</title>
<link>https://xenodium.com/travel-lifestyle-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/travel-lifestyle-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/getterhiss/status/1325835494773592071">1991 VW Vanagon Westfalia campervan</a>.</li>
<li><a href="http://fourhourworkweek.com/2010/02/25/rolf-potts-vagabonding-travel/">5 Travel Lessons You Can Use at Home</a>.</li>
<li><a href="https://www.your-rv-lifestyle.com/travel-tips.html">50 Best Travel Tips from 10 Years of Travel - Your RV Lifestyle</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=26284635">A new chapter – full-time working from a van in a forest | Hacker News</a>.</li>
<li><a href="https://liveworkplaytravel.com/bali-digital-nomad-guide-live-in-bali-as-a-digital-nomad/">Bali Digital Nomad Guide - How To Live In Bali As A Digital Nomad</a>.</li>
<li><a href="https://medium.com/ohmygeorge-blog/bootstrapping-in-bangkok-is-the-best-option-c70e98f2b781#.2qbxef7oa">Bootstrapping in Bangkok is the best option</a>.</li>
<li><a href="http://www.goruck.com/en">goruck bag</a>.</li>
<li><a href="https://www.washingtonpost.com/travel/tips/dos-donts-in-flight-grooming/">Grooming on airplanes: What's acceptable? - The Washington Post</a>.</li>
<li><a href="https://jamesstuber.com/long-term-travel-costs/">How Much Does it Cost to Drop Everything and Travel Asia for 3 Months?</a>.</li>
<li><a href="https://www.quora.com/I-am-a-US-citizen-and-I-am-thinking-of-retiring-in-Thailand-What-are-the-pros-and-cons-and-is-it-advisable">I am a US citizen and I am thinking of retiring in Thailand.</a>.</li>
<li><a href="https://uncorneredmarket.com/planning-travel-covid19/">Lessons in Planning and Travel During COVID-19 – Uncornered Market</a>.</li>
<li><a href="https://expertvagabond.com/best-travel-tips/">My 30 Best Travel Tips After 8 Years Traveling The World • Expert Vagabond</a>.</li>
<li><a href="https://www.quora.com/My-partner-I-want-to-backpack-around-as-much-of-the-world-as-we-can-for-6-12-months-What-surprises-did-you-learn-on-the-way-I-should-plan-for">My partner &amp; I want to backpack around as much of the world as we can for 6-12 months. What surprises did you learn on the way I should plan for?</a>.</li>
<li><a href="http://nomadlist.io/?hn">NomadList</a>: Best cities to work from remotely.</li>
<li><a href="http://www.oecdbetterlifeindex.org/topics/life-satisfaction/">OECD Better Life Index</a>.</li>
<li><a href="https://blog.calebjay.com/posts/taxman-prices/">onlinetaxman.com Prices</a>.</li>
<li><a href="https://servas.org/">Peace and understanding through travel and hosting | Servas Online</a>.</li>
<li><a href="http://www.justanotherbackpacker.com/round-the-world-trip-20172018-the-costs/">Round The World Trip 2017/2018: The Costs - Just Another Backpacker</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11890991">Show HN: I made a database of remote companies (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=28167358">Show HN: Nomad Visa – Working remotely? Explore your visa options | Hacker News</a>.</li>
<li><a href="http://www.tombihn.com">tom bihn bags</a>.</li>
<li><a href="https://www.travistranslator.com/product-category/translators/">Travis translators</a>.</li>
<li><a href="http://waveuptravel.com">waveUPtravel</a>.</li>
<li><a href="https://www.quora.com/What-are-the-best-ways-to-earn-money-while-traveling-around-the-world">What are the best ways to earn money while traveling around the world? (Quora)</a>.</li>
<li><a href="https://twitter.com/twostraws/status/1336613071347982336">where to emigrate to?</a>.</li>
<li><a href="https://blog.calebjay.com/posts/why-taiwan/">Why You Should Remote Work in Taiwan</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 28 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>SQL bookmarks</title>
<link>https://xenodium.com/sql-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sql-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.pgcli.com/launching-litecli.html">Launching LiteCLI</a>.</li>
<li><a href="https://modern-sql.com/use-case/literate-sql">Literate SQL</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18335723">Show HN: SQL Trainer – Learn SQL by doing live data exercises (Hacker News)</a>.</li>
<li><a href="https://dev.to/helenanders26/sql-series-from-a-to-z-2pk9">SQL Series: From A to Z - DEV Community</a>.</li>
<li><a href="https://github.com/ben-n93/SQL-tips-and-tricks">SQL tips and tricks</a>.</li>
<li><a href="https://simonwillison.net/2018/Oct/4/datasette-ideas/">The interesting ideas in Datasette</a>.</li>
<li><a href="https://dev.to/geshan/you-can-do-it-in-sql-stop-writing-extra-code-for-it-lok">You Can Do it in SQL, Stop Writing Extra Code for it - DEV Community</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 26 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Unix/Linux tools bookmarks</title>
<link>https://xenodium.com/unix-linux-tools-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/unix-linux-tools-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://forums.freebsd.org/threads/small-guide-on-using-mtree.61113/">(small) Guide on using mtree (The FreeBSD Forums)</a>.</li>
<li><a href="http://www.thegeekstuff.com/2012/04/curl-examples/">15 Practical Linux cURL Command Examples</a>.</li>
<li><a href="https://linuxhint.com/20_awk_examples/">20 awk examples – Linux Hint</a>.</li>
<li><a href="https://www.cyberciti.biz/open-source/7-awesome-open-source-analytics-weblog-analysis-softwares/">7 Awesome Open Source Analytics Software For Linux and Unix - nixCraft</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12137576">A practical proposal for migrating to safe long sessions on the web (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12140477">A practical security guide for web developers (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12364077">A Unix Utility to Know About: lsof (2009) (Hacker News)</a>.</li>
<li><a href="https://gist.github.com/rtfpessoa/7a745be31e89673b8fc7">agnoster.bash</a>.</li>
<li><a href="https://huxiaoxing.com/tools/an-elegant-way-of-managing-dotfiles">An Elegant Way of Managing Dotfiles</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=16612580">Announcing gRPC Support in Nginx (Hacker News)</a>.</li>
<li><a href="http://www.figlet.org">ASCII art text with figlet</a>.</li>
<li><a href="https://autotools.io/index.html">Autotools Mythbuster</a>.</li>
<li><a href="http://www.faqs.org/faqs/computer-lang/awk/faq/">awk FAQ</a>.</li>
<li><a href="http://ferd.ca/awk-in-20-minutes.html">awk in 20 minutes</a>.</li>
<li><a href="https://blog.balthazar-rouberol.com/text-processing-in-the-shell">Balthazar – Text processing in the shell</a>.</li>
<li><a href="https://linuxhint.com/bash_parameter_expansion/">Bash Parameter Expansion (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/bash_pipe_tutorial/">Bash pipe tutorial (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/bash_until_loops/">Bash Until Loops (Linux Hint)</a>.</li>
<li><a href="https://joshrollinswrites.com/help-desk-head-desk/basic-ssh-security/">Basic SSH Security (The Art of Not Asking Why)</a>.</li>
<li><a href="http://www.unixwiz.net/techtips/chroot-practices.html">Best Practices for UNIX chroot</a>.</li>
<li><a href="http://johnbokma.com/blog/2019/05/13/blacklisting-domains-with-postfix.html">Blacklisting domains with Postfix - John Bokma</a>.</li>
<li><a href="http://www.grymoire.com/Unix/Awk.html">Bruce Barnett's awk tutorial</a>.</li>
<li><a href="http://www.grymoire.com/Unix/sed.html">Bruce Barnett's sed tutorial</a>.</li>
<li><a href="https://github.com/skorokithakis/catt">Cast All The Things</a>.</li>
<li><a href="https://remysharp.com/2018/08/23/cli-improved">CLI: improved (better cli alternatives)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17874718">CLI: Improved, better CLI alternatives (Hacker News)</a>.</li>
<li><a href="https://github.com/learnbyexample/Command-line-text-processing">Command-line-text-processing: From finding text to search and replace, from sorting to beautifying text and more</a>.</li>
<li><a href="http://kkovacs.eu/cool-but-obscure-unix-tools#">Cool but obscure unix tools at kkovacs.eu</a>.</li>
<li><a href="https://catonmat.net/cookbooks/curl">Curl Cookbook</a>.</li>
<li><a href="https://jvns.ca/blog/2019/08/27/curl-exercises/">curl exercises (Julia Evans)</a>.</li>
<li><a href="https://linuxhint.com/curl_bash_examples/">Curl in Bash Scripts by Example (Linux Hint)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11213213">Curl vs Wget (Hacker News)</a>.</li>
<li><a href="https://dualuse.io/blog/curryfinger/">CURRYFINGER - SNI &amp; Host header spoofing utility - DUALUSE</a>.</li>
<li><a href="https://gchq.github.io/CyberChef/">CyberChef</a>.</li>
<li><a href="https://www.romanzolotarev.com/openbsd/bioctl-crypto.html">Encrypt disk with bioctl(8) and CRYPTO - Roman Zolotarev</a>.</li>
<li><a href="http://puntoblogspot.blogspot.co.uk/2016/01/entr-suckless-inotify-tools.html?m=1">entr runs commands when a file changes</a>.</li>
<li><a href="https://wizardzines.com/networking-tools-poster/">Every Linux networking tool I know (zine)</a>.</li>
<li><a href="https://github.com/clvv/fasd">fasd a command-line productivity booster</a>.</li>
<li><a href="https://linuxhint.com/length_of_string_bash/">Find Length of String in Bash (Linux Hint)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18967249">For the Love of Pipes (Hacker News)</a>.</li>
<li><a href="http://git-annex.branchable.com/assistant/">git-annex</a>.</li>
<li><a href="https://github.com/antonmedv/fx/">GitHub - antonmedv/fx: Command-line tool and terminal JSON viewer</a>.</li>
<li><a href="https://github.com/atorstling/origin">GitHub - atorstling/origin: Track down the origin of a command</a>.</li>
<li><a href="https://github.com/insanum/gcalcli">GitHub - insanum/gcalcli: Google Calendar Command Line Interface</a>.</li>
<li><a href="https://github.com/raboof/nethogs">GitHub - raboof/nethogs: Linux 'net top' tool</a>.</li>
<li><a href="https://linuxhint.com/trim_string_bash/">How to trim string in bash (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/array_awk_command/">How to use array in awk command (Linux Hint)</a>.</li>
<li><a href="https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes">How To Use Bash's Job Control to Manage Foreground and Background Processes</a>.</li>
<li><a href="https://linuxhint.com/conditional_statement_awk_command/">How to use conditional statement in awk command (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/dd_command_linux-2/">How to Use dd Command on Linux (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/for_loop_awk_command/">How to use for loop in awk command (Linux Hint)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22082585">HTTP static server one-liners | Hacker News</a>.</li>
<li><a href="https://github.com/jkbrzt/httpie">httpie: Command line HTTP client, a user-friendly curl alternative</a>.</li>
<li><a href="https://linuxhint.com/iptables_for_beginners/">Iptables for beginners (Linux Hint)</a>.</li>
<li><a href="https://sneak.berlin/20191011/stupid-unix-tricks/">Jeffrey Paul: Stupid Unix Tricks (Yubikey ssh on macOS)</a>.</li>
<li><a href="https://blog.jessfraz.com/post/for-the-love-of-pipes/">Jessie Frazelle's Blog: For the Love of Pipes</a>.</li>
<li><a href="https://jvns.ca/zines/">Julia Evans's zines (unix tools)</a>.</li>
<li><a href="https://kiramclean.com/blog/how-to-set-up-your-own-nextcloud-server/">Kira McLean | How To Set Up Your Own Nextcloud Server</a>.</li>
<li><a href="https://twitter.com/beorn__/status/1281504590073073666">LD_DEBUG awesomeness (using ls)</a>.</li>
<li><a href="http://irreal.org/blog/?p=7323">Learn a Little AWK (Irreal)</a>.</li>
<li><a href="https://linuxhint.com/linux_cp_command/">Linux cp Command (Linux Hint)</a>.</li>
<li><a href="http://bryan-murdock.blogspot.co.uk/2015/12/linux-environment-management.html">Linux environment management</a>.</li>
<li><a href="https://linuxhint.com/linux_grep_command/">Linux grep Command (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/linux_lsof_command/">Linux lsof Command (Linux Hint)</a>.</li>
<li><a href="http://www.slideshare.net/brendangregg/scale2015-linux-perfprofiling">Linux profiling at Netflix</a>.</li>
<li><a href="https://linuxhint.com/linux_tar_command-2/">Linux tar Command (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/linux_tr_command/">Linux tr Command (Linux Hint)</a>.</li>
<li><a href="https://kitten-technologies.co.uk/project/magic-pipes/doc/trunk/README.wiki">Magic Pipes: suite of tools to construct powerful Unix shell pipelines that operate on structured data</a>.</li>
<li><a href="http://stackoverflow.com/questions/3519939/make-curl-follow-redirects">Make cURL follow redirects</a>.</li>
<li><a href="https://github.com/idcrook/i-dotfiles/blob/master/INSTALL-macos.md">Managing macOS dot files with stow</a>.</li>
<li><a href="http://mbork.pl/2019-03-11_Name-based_UUID_generation">Marcin Borkowski: 2019-03-11 Name-based UUID generation</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18922030">More than you really wanted to know about Patch (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11909543">My First 10 Minutes on a Server (Hacker News)</a>.</li>
<li><a href="https://www.keycdn.com/support/nginx-vs-apache">Nginx vs Apache</a>.</li>
<li><a href="https://linuxhint.com/nmap_alternatives/">Nmap Alternatives (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/nmap_basics_tutorial/">NMAP basics Tutorial (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/nmap_flags/">nmap flags and what they do (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/nmap_scan_ip_ranges/">Nmap: scan IP ranges (Linux Hint)</a>.</li>
<li><a href="https://github.com/phw/peek">Peek: Simple animated GIF screen recorder with an easy to use interface</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18992930">Practical Linux Hardening Guide (Hacker News)</a>.</li>
<li><a href="https://rclone.org/">Rclone (mount many cloud services locally)</a>.</li>
<li><a href="https://justine.lol/redbean/index.html">redbean</a>.</li>
<li><a href="https://iridakos.com/how-to/2019/05/16/remove-duplicate-lines-preserving-order-linux.html">Remove duplicate lines from files keeping the original order</a>.</li>
<li><a href="https://www.philipdaniels.com/blog/2019/ripgrep-cheatsheet/">Ripgrep Cheatsheet • Phil's Blog</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18291302">Show HN: Ultimate Plumber – a tool for writing Linux pipes with live preview (Hacker News)</a>.</li>
<li><a href="https://github.com/p-gen/smenu">smenu is a selection filter just like sed is an editing filter</a>.</li>
<li><a href="http://www.softether.org">SoftEther VPN</a>.</li>
<li><a href="https://blog.0xbadc0de.be/archives/300">SSH: Best practices</a>.</li>
<li><a href="http://irreal.org/blog/?p=7184">Text Manipulation with Command Line Utilities</a>.</li>
<li><a href="https://github.com/trimstray/the-book-of-secret-knowledge">the-book-of-secret-knowledge: A collection of inspiring lists, manuals, cheatsheets, blogs, hacks, one-liners, cli/web tools, and more</a>.</li>
<li><a href="https://github.com/calebmadrigal/trackerjacker/blob/master/README.md">trackerjacker/README.md at master · calebmadrigal/trackerjacker · GitHub</a>.</li>
<li><a href="https://devarea.com/understanding-awk-practical-guide/">Understanding Awk (Practical Guide)</a>.</li>
<li><a href="https://www.cis.upenn.edu/~bcpierce/unison/">Unison File Synchronizer</a>.</li>
<li><a href="https://www.reddit.com/r/linux/comments/mi80x/give_me_that_one_command_you_wish_you_knew_years/">Unix commands you wish you knew years ago (Reddit)</a>.</li>
<li><a href="http://unixmages.com/ufbm.pdf">Unix for the Beginning Mage</a>.</li>
<li><a href="https://github.com/snovvcrash/usbrip">usbrip: Simple CLI forensics tool for tracking USB device artifacts (history of USB events) on GNU/Linux</a>.</li>
<li><a href="http://brandon.invergo.net/news/2012-05-26-using-gnu-stow-to-manage-your-dotfiles.html">Using gnu stow to manage your dotfiles</a>.</li>
<li><a href="https://magic-wormhole.readthedocs.io/en/latest/welcome.html#example">Welcome &amp; Magic-Wormhole</a>.</li>
<li><a href="https://www.semicomplete.com/projects/xdotool/">xdotool - fake keyboard/mouse input, window management, and more - semicomplete</a>.</li>
<li>xmllint –format.</li>
<li><a href="https://lucasfcosta.com/2019/04/07/streams-introduction.html">Your terminal is not a terminal: An Introduction to Streams</a>.</li>
<li><a href="https://dotfiles.github.io/">Your unofficial guide to dotfiles on GitHub</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 26 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Couchbase React Native bookmarks</title>
<link>https://xenodium.com/couchbase-react-native-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/couchbase-react-native-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://groups.google.com/forum/#!forum/mobile-couchbase">Couchbase Mobile discussion group</a>.</li>
<li><a href="http://developer.couchbase.com/documentation/mobile/current/develop/guides/couchbase-lite/native-api/index.html">Couchbase Mobile Native API</a>.</li>
<li><a href="http://developer.couchbase.com/mobile/">Couchbase Mobile</a>.</li>
<li><a href="https://github.com/couchbase/sync_gateway">Couchbase sync gateway</a>.</li>
<li><a href="http://blog.couchbase.com/2015/november/getting-started-with-react-native-android-and-couchbase-lite">Getting Started with React Native Android and Couchbase Lite</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 26 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Installing Emacs 25 devel on Mac OS X</title>
<link>https://xenodium.com/installing-emacs-on-mac-os-x</link>
<guid isPermaLink="false">https://xenodium.com/installing-emacs-on-mac-os-x</guid>
    <description><![CDATA[<h2>Stable</h2>
<pre><code class="language-{.bash">brew update
brew install emacs --HEAD --use-git-head --with-cocoa --with-srgb --with-gnutls
brew linkapps emacs
</code></pre>
<h2>Development</h2>
<pre><code class="language-{.bash">  brew update
  brew install emacs --devel --with-cocoa --with-srgb --with-gnutls
  brew linkapps emacs
then
</code></pre>
<p>Had problems loading seq. Removed byte-compiled packages:</p>
<pre><code class="language-{.bash">$ find ~/.emacs.d/elpa -iname *.elc -exec rm '{}' \;
</code></pre>
]]></description>
    <pubDate>Thu, 26 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Diagram tools bookmarks</title>
<link>https://xenodium.com/diagram-tools-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/diagram-tools-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.worthe-it.co.za/programming/2017/09/19/quick-introduction-to-graphviz.html">A Quick Introduction to Graphviz</a>.</li>
<li><a href="https://ncona.com/2020/06/create-diagrams-with-code-using-graphviz/">Create diagrams with code using Graphviz – ncona.com – Learning about computers</a>.</li>
<li><a href="https://www.diagram.codes/">Diagram.Codes</a>.</li>
<li><a href="https://www.draw.io/">Flowchart Maker &amp; Online Diagram Software</a>.</li>
<li><a href="http://graphviz.it/">Graphviz it! - fiddle with diagrams</a>.</li>
<li><a href="http://soc.if.usp.br/manual/graphviz/html/info/shapes.html">Graphviz node shapes</a>.</li>
<li><a href="https://www.planttext.com/">PlantText UML Editor</a>.</li>
<li><a href="https://news.ycombinator.com/item">Svgbob: Convert your ASCII diagram scribbles into happy little SVG</a>.</li>
<li><a href="http://www.texample.net/tikz/examples/tag/graphs/">TeXample.net (TeX examples)</a>.</li>
<li><a href="https://twitter.com/maybekatz/status/1137254612468154370">What do you like using for software architecture diagrams? (twitter)</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 25 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Licensing bookmarks</title>
<link>https://xenodium.com/licensing-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/licensing-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://choosealicense.com/">choosealicense.com</a> (Choosing an open source license doesn’t need to be scary).</li>
<li><a href="https://github.com/github/choosealicense.com">choosealicense.com (github)</a>.</li>
<li><a href="https://tldrlegal.com/">tldrlegal.com</a> (Software Licenses in Plain English).</li>
</ul>
]]></description>
    <pubDate>Tue, 24 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Synology bookmarks</title>
<link>https://xenodium.com/synology-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/synology-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://synoguide.com/2016/04/21/backup-your-files-to-an-external-drive-or-a-shared-file-dsm-6-0/">Backup your files to an external drive or a shared file DSM 6.0 – Synoguide</a>.</li>
<li><a href="https://www.makeuseof.com/tag/ext4-btrfs-making-switch-linux/">Ext4 vs. Btrfs: Why We're Making The Switch {Linux}</a>.</li>
<li><a href="https://bpmsg.com/how-to-make-your-synology-disk-station-nas-more-secure/">How to make your Synology Disk station (NAS) more secure? – BPMSG</a>.</li>
<li><a href="https://www.techrepublic.com/article/how-to-use-the-files-app-to-connect-to-a-network-server-from-your-iphone-or-ipad/">How to use the Files app to connect to a network server from your iPhone</a>.</li>
<li><a href="https://joshdick.net/2014/04/12/configuring_ssh_and_scp_sftp_on_dsm_5.0_for_synology_diskstations.html">Josh Dick » Configuring SSH and SCP/SFTP on DSM 5.0 for Synology DiskStations</a>.</li>
<li><a href="https://www.chainsawonatireswing.com/2012/01/16/log-in-to-a-synology-diskstation-using-ssh-keys-as-a-user-other-than-root/">Log in to a Synology DiskStation using SSH keys as a user other than root</a>.</li>
<li><a href="http://blog.markusbordihn.de/2012/02/encryption-of-synology-diskstation-how.html">Look into Synology's file encryption</a>.</li>
<li><a href="https://arstechnica.com/civis/viewtopic.php?t=1273997">RAID5 vs SHR - Ars Technica OpenForum</a>.</li>
<li><a href="https://www.reddit.com/r/synology/comments/73f7tb/please_confirm_that_i_chose_the_right_option_shr1/">reddit: Please confirm that I chose the right option (SHR1 with DS718+)</a>.</li>
<li><a href="https://synoguide.com/2014/07/30/reset-admin-password-synology/">Reset your Admin password in your Synology – Synoguide</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 23 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Backup bookmarks</title>
<link>https://xenodium.com/backup-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/backup-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.amazon.com/gp/product/B00O0M5QK8">HGST Deskstar NAS 3.5-Inch 6TB 7200RPM SATA III 128MB Cache Internal Hard Drive (0S03839)</a>.</li>
<li><a href="https://www.stavros.io/posts/holy-grail-backups/">I found the Holy Grail of backups</a>.</li>
<li><a href="http://www.amazon.com/gp/product/B00CQ35GYE">Kingston Technology 4GB 1600MHz DDR3L PC3-12800 1.35V Non-ECC CL11 SODIMM Intel Laptop Memory KVR16LS11/4</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19482280">Show HN: Baxx – Unix-friendly backup service (Hacker News)</a>.</li>
<li><a href="http://www.amazon.com/gp/product/B00P3RPMEO/ref%3Das_li_ss_tl?psc%3D1&amp;redirect%3Dtrue&amp;ref_%3Doh_aui_detailpage_o01_s00&amp;linkCode%3Dsl1&amp;tag%3Dnatfrie-20&amp;linkId%3D9867e6a1134b8c16fb39bd06c39bf1ef">Synology Disk Station 8-Bay (Diskless) Network Attached Storage (NAS) (DS1815+)</a>.</li>
<li><a href="http://www.tarsnap.com/">Tarsnap: online backups for the truly paranoid</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 22 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Making hummus</title>
<link>https://xenodium.com/making-hummus</link>
<guid isPermaLink="false">https://xenodium.com/making-hummus</guid>
    <description><![CDATA[<p>Made hummus, based on <a href="http://www.deliciousistanbul.com/blog/2013/04/28/5-secrets-to-perfect-hummus/">Delicious Istanbul's</a> <a href="http://www.deliciousistanbul.com/blog/2013/04/28/5-secrets-to-perfect-hummus/">5 Secrets to Perfect Hummus</a> (<a href="https://web.archive.org/web/20160829162734/deliciousistanbul.com/blog/2013/04/28/5-secrets-to-perfect-hummus/">wayback machine</a>) post.</p>
<ul>
<li>160 g dry chickpeas.</li>
<li>4 cloves garlic minced.</li>
<li>1 tsp fine sea salt.</li>
<li>1 1/2 tbsp lemon juice.</li>
<li>1/4 tsp ground cumin.</li>
<li>6 tbsp tahini paste.</li>
<li>2/3 cup cooking water.</li>
<li>Extra virgin olive oil, for serving.</li>
<li>Red pepper flakes, for serving.</li>
<li>Zahter mixture, for serving.</li>
</ul>
<ol>
<li>Soak chickpeas overnight.</li>
<li>Discard water and rinse chickpeas.</li>
<li>Cook in low heat (about 5 cups water) for 1.5 hours for until soft (but keeping shape.) Check if can be mashed with thumnb.</li>
<li>Save cooking water.</li>
<li>Peal chickpeas (optional).</li>
<li>Blend ingredients until silky paste. Taste and add lemon/salt/cooking water.</li>
</ol>
<p>Keeps in fridge for 3-4 days. Freeze otherwise.</p>
<p><img src="https://xenodium.github.io/images/making-hummus/hummus-01.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-02.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-03.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-04.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-05.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-06.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-07.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-08.jpg" alt=""> <img src="https://xenodium.github.io/images/making-hummus/hummus-09.jpg" alt=""></p>
]]></description>
    <pubDate>Sun, 22 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Nara travel bookmarks</title>
<link>https://xenodium.com/nara-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/nara-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/K%25C5%258Dfuku-ji">Kōfuku-ji</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/T%C5%8Ddai-ji">Nara Buddha temple</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 22 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Kubernetes bookmarks</title>
<link>https://xenodium.com/kubernetes-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/kubernetes-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=17462043">A Tutorial Introduction to Kubernetes (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11216020">Borg, Omega, Kubernetes: Lessons learned from container management over a decade (Hacker News)</a>.</li>
<li><a href="http://fabric8.io/">Fabric8 is an integrated open source DevOps and Integration Platform (Kubernetes or OpenShift)</a>.</li>
<li><a href="https://github.com/artsy/hokusai">hokusai: Artsy's Docker / Kubernetes CLI and Workflow</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=14452819">Kubernetes by Example | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D10438273">Swarm vs. Fleet vs. Kubernetes vs. Mesos (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D10438273">Swarm vs. Fleet vs. Kubernetes vs. Mesos</a>.</li>
<li><a href="https://codefresh.io/howtos/local-k8s-draft-skaffold-garden/">The ultimate guide for local development on Kubernetes</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 21 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Docker bookmarks</title>
<link>https://xenodium.com/docker-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/docker-bookmarks</guid>
    <description><![CDATA[<ul>
<li>[[<a href="https://news.ycombinator.com/item?id=25619319">https://news.ycombinator.com/item?id=25619319</a></li>
</ul>
<p>][Dockerfile Best Practices | Hacker News]].</p>
<ul>
<li><a href="https://linuxhint.com/beginners_guide_docker_compose/">A Beginner’s Guide To Docker Compose – Linux Hint</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22964972">Basic Docker Commands for Beginners | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D10890233">Docker for Beginners (Hacker News)</a>.</li>
<li><a href="http://prakhar.me/docker-curriculum/">Docker for Beginners</a>.</li>
<li><a href="https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes">How To Remove Docker Images, Containers, and Volumes | DigitalOcean</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D10969052">Simplifying Docker on OS X (Hacker News)</a>.</li>
<li><a href="https://twitter.com/b0rk/status/1237528379097616388">What problems have you run into in practice when using containers?</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 21 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Angular bookmarks</title>
<link>https://xenodium.com/angular-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/angular-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://egghead.io/technologies/angular2">Egghead.io's Angular 2 lessons</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 21 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mac OS bookmarks</title>
<link>https://xenodium.com/mac-os-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/mac-os-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/jrus/cocoa-text-system">Customizing the Cocoa Text System (github)</a>.</li>
<li><a href="http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html">Customizing the Cocoa Text System (~/Library/KeyBindings/DefaultKeyBinding.dict)</a>.</li>
<li><a href="https://github.com/ttscoff/KeyBindings">GitHub - ttscoff/KeyBindings: DefaultKeybindings.dict for Mac OS X</a>.</li>
<li><a href="https://developer.apple.com/documentation/appkit/nsstandardkeybindingresponding?language=objc">NSResponder (useful for DefaultKeyBinding.dict)</a>.</li>
<li><a href="https://www.daisydiskapp.com/">DaisyDisk</a> (what's taking up your disk space).</li>
<li><a href="https://8thlight.com/blog/colin-jones/2015/11/06/dtrace-even-better-than-strace-for-osx.html">DTrace: {even better than} strace for OS X | 8th Light</a>.</li>
<li><a href="http://flummox-engineering.blogspot.com/2014/06/getting-absolute-path-in-bash-in-osx.html">Getting absolute path in Bash in OSX</a>.</li>
<li><a href="https://github.com/fitztrev/shuttle">GitHub - fitztrev/shuttle: A simple SSH shortcut menu for macOS</a>.</li>
<li><a href="http://csrc.nist.gov/publications/drafts/800-179/sp800_179_draft.pdf">Guide to Securing Apple OS X</a>.</li>
<li><a href="http://www.hammerspoon.org">Hammerspoon</a>.</li>
<li><a href="http://www.manpagez.com/man/8/kextstat/">kextstat</a>.</li>
<li><a href="https://objective-see.com/products/kextviewr.html">KextViewr: View all modules on that are loaded in the OS kernel</a>.</li>
<li><a href="https://www.obdev.at/products/littlesnitch/index.html">Little Snitch</a>.</li>
<li><a href="https://www.raywenderlich.com/151741/macos-development-beginners-part-1">macOS Development for Beginners: Part 1</a>.</li>
<li><a href="https://www.raywenderlich.com/151746/macos-development-beginners-part-2">macOS Development for Beginners: Part 2</a>.</li>
<li><a href="https://www.raywenderlich.com/151748/macos-development-beginners-part-3">macOS Development for Beginners: Part 3</a>.</li>
<li><a href="https://pspdfkit.com/blog/2018/porting-ios-apps-to-mac-marzipan-iosmac-uikit-appkit/">Marzipan: Porting iOS Apps to the Mac (Inside PSPDFKit)</a>.</li>
<li><a href="https://github.com/kasper/phoenix">Phoenix: A lightweight macOS window and app manager scriptable with JavaScript</a>.</li>
<li><a href="https://subler.org/">Subler: Mac OS X app created to mux and tag mp4 files</a>.</li>
<li><a href="https://apple.stackexchange.com/questions/82/which-os-x-applications-do-you-find-indispensable/">Which OS X Applications do you find indispensable? (Stack Exchange)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 21 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>easy_install-\>pip-\>conda</title>
<link>https://xenodium.com/easy_install-pip-conda</link>
<guid isPermaLink="false">https://xenodium.com/easy_install-pip-conda</guid>
    <description><![CDATA[<p>Spotted <a href="http://conda.pydata.org/docs/index.html">Conda</a> package manager. It handles python installations, in addition to package management. There's also a package index provided by <a href="https://binstar.org/">Binstar</a>. Installed <a href="http://conda.pydata.org/miniconda.html">Miniconda</a>, the bare bones Conda environment.</p>
<p>Can't find a python package in Binstar? Here's a post on <a href="http://www.peterbronez.com/Using%2520PyPi%2520Packages%2520with%2520Conda">Using PyPi Packages with Conda</a>. If that fails, you can try pip from your Conda python environment.</p>
]]></description>
    <pubDate>Sat, 21 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Traditional music bookmarks</title>
<link>https://xenodium.com/traditional-music-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/traditional-music-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://asianclassicalmp3.org/">Cliff Sloane's asian classical music in mp3 format</a>.</li>
<li><a href="http://oriental-traditional-music.blogspot.in">Oriental traditional music</a>.</li>
<li><a href="https://www.youtube.com/watch?v%3D4PVGmjYypGU&amp;feature%3Dyoutu.be">Shruti Box comparison</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 16 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Recover from an unresponsive Emacs</title>
<link>https://xenodium.com/recover-from-an-unresponsive-emacs</link>
<guid isPermaLink="false">https://xenodium.com/recover-from-an-unresponsive-emacs</guid>
    <description><![CDATA[<p><a href="https://twitter.com/_wilfredh">Wilfred Hughes</a> has a handy <a href="https://twitter.com/_wilfredh/status/659499112677642242?refsrc%3Demail&amp;s%3D11">tip</a> to bail you out of a hung Emacs instance:</p>
<pre><code class="language-{.bash">pkill -SIGUSR2 emacs
</code></pre>
<p>ps. Not had a chance to try it, but next time it happens…</p>
]]></description>
    <pubDate>Wed, 04 Nov 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Training for under 50 min 10k run</title>
<link>https://xenodium.com/training-for-under-50-min-10k-run</link>
<guid isPermaLink="false">https://xenodium.com/training-for-under-50-min-10k-run</guid>
    <description><![CDATA[<p>Not much training time for an under 50 minute 10k run, but here's an attempt (based on time-to-run's <a href="http://www.time-to-run.com/training/10k/sub50.htm">sub-50</a>):</p>
<p>Mon        Tue        Wed            Thu        Fri            Sat        Sun</p>
<hr>
<p><em>Oct 26</em>   <em>Oct 27</em>   <em>Oct 28</em>       <em>Oct 29</em>   <em>Oct 30</em>       <em>Oct 31</em>   <em>Nov 1</em>
60 min         30 min     2k @ 4.55/k    rest       105 min
2 min rest
✔                         (repeat x 3)
<em>Nov 2</em>    <em>Nov 3</em>    <em>Nov 4</em>        <em>Nov 5</em>    <em>Nov 6</em>        <em>Nov 7</em>    <em>Nov 8</em>
30 min     30 min     1k @ 4.50/k    30 min     30 min         rest       5k @ 4.55/k
90 sec rest
(repeat x 5)
<em>Nov 9</em>    <em>Nov 10</em>   <em>Nov 11</em>       <em>Nov 12</em>   <em>Nov 13</em>       <em>Nov 14</em>   <em>Nov 15</em>
10k easy   30 min     1k @ 4.55/k    30 min     30 min         rest       race day
1 min easy
(repeat x 3)</p>
]]></description>
    <pubDate>Sun, 25 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Reading a running training plan</title>
<link>https://xenodium.com/reading-a-running-training-plan</link>
<guid isPermaLink="false">https://xenodium.com/reading-a-running-training-plan</guid>
    <description><![CDATA[<p>A sample from <a href="http://lsanderstri.com/2014/10/15/kona-part-2/">Kona Part 2's</a> comments:</p>
<pre><code class="language-example">2.5 w/u to 4x(1.25@11.5 w/0.25R@7) to 3x(3.75@10.5 w/0.5R@7) to 2.5 c/d.
</code></pre>
<p>Is read from left to right as:</p>
<pre><code class="language-example">2.5 mile warm up to four times through 1.25 miles at 11.5 miles per hour with 0.25 miles recovery at 7 miles per hour to three times through 3.75 miles at 10.5 miles per hour with 0.5 miles recovery at 7 miles per hour to 2.5 miles cool down.
</code></pre>
]]></description>
    <pubDate>Sun, 25 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Find binary in PATH using python</title>
<link>https://xenodium.com/find-binary-in-path-using-python</link>
<guid isPermaLink="false">https://xenodium.com/find-binary-in-path-using-python</guid>
    <description><![CDATA[<pre><code class="language-{.python">import distutils.spawn
print distutils.spawn.find_executable('git')
</code></pre>
<pre><code class="language-example">/usr/bin/git
</code></pre>
]]></description>
    <pubDate>Fri, 23 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Indonesia travel bookmarks</title>
<link>https://xenodium.com/indonesia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/indonesia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://duckduckgo.com/?q%3Dborobudur%2Bindonesia&amp;t%3Dffab&amp;iax%3D1&amp;ia%3Dimages">Borobudur</a>.</li>
<li><a href="https://backpackalmanac.com/2018/05/14/hiking-padar-island-in-komodo-national-park-indonesia/">Hiking Padar Island in Komodo National Park (Indonesia) | The Backpack Almanac</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Rumah_Gadang">Rumah Gadang</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 22 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Malaysia travel bookmarks</title>
<link>https://xenodium.com/malaysia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/malaysia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.tripadvisor.co.uk/Restaurant_Review-g298570-d1164708-Reviews-Coliseum_Cafe-Kuala_Lumpur_Wilayah_Persekutuan.html">Coliseum Cafe, Kuala Lupur</a>.</li>
<li><a href="https://migrationology.com/kek-lok-si-temple-penang/">How to Visit Penang's Kek Lok Si Temple (and What to Eat)</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 22 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mongolia travel bookmarks</title>
<link>https://xenodium.com/mongolia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/mongolia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.lonelyplanet.com/mongolia/travel-tips-and-articles/beyond-the-dunes-road-tripping-mongolias-gobi-desert">Beyond the dunes: road-tripping Mongolia's Gobi Desert</a>.</li>
<li><a href="https://twitter.com/archpics/status/881270695614967808">Terra cotta warriors at Mount Khan, Inner Mongolia</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 22 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Running bookmarks</title>
<link>https://xenodium.com/running-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/running-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://forums.runnersworld.co.uk/discussion/164225/10k-in-under-50-mins">10k in under 50 mins — Runner's World UK Forum</a>.</li>
<li><a href="http://www.dcrainmaker.com/2015/11/garmin-fr230-fr235-review.html">Garmin Forerunner 230 &amp; 235 In-Depth Review (DC Rainmaker)</a>.</li>
<li><a href="http://barefootrunning.fas.harvard.edu/6FAQ.html">Harvard's Running barefoot or in minimal footwear FAQ</a>.</li>
<li><a href="https://therunningbug.com/fitness/tips-and-advice/how-to-run-a-sub-50-10k-race">How to run a sub-50 10K - The Running Bug</a>.</li>
<li><a href="http://www.npr.org/sections/13.7/2016/09/14/493803246/is-running-good-or-bad-for-your-health">Is Running Good Or Bad For Your Health?</a>.</li>
<li><a href="http://www.chaser.me.uk">Mornington Chasers running club</a>.</li>
<li><a href="https://entries.opentrack.run/">Open track: Race Management System</a>.</li>
<li><a href="http://ironrosey.com/blog-posts/review-newton-gravity-iv-motion-iv/">Review : Newton Gravity IV &amp; Motion IV | Ramblings of an IronRose</a>.</li>
<li><a href="https://www.theraceorganiser.com/listed-races/">The Race Organiser</a>.</li>
<li><a href="http://www.time-to-run.com/training/10k/sub50.htm">Training towards a sub 50 minute 10K</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 22 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Media player bookmarks</title>
<link>https://xenodium.com/media-player-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/media-player-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://cmus.github.io">cmus, a small, fast and powerful console music player for Unix-like OS</a>.</li>
<li><a href="https://github.com/mps-youtube/mps-youtube">mps-youtube</a>.</li>
<li><a href="https://mpv.io/">mpv (a fork of mplayer2 and MPlayer)</a>.</li>
<li><a href="https://sandilands.info/sgordon/multimedia-on-linux-command-line">Multimedia on Linux Command Line: wget, PdfTK, ffmpeg, flac, SoX</a>.</li>
<li><a href="https://plex.tv/">PLEX</a> (stream your media everywhere).</li>
<li><a href="https://news.ycombinator.com/item">Soul – A language and IDE for audio coding </a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 22 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Get Emacs to gather links in posts</title>
<link>https://xenodium.com/get-emacs-to-gather-links-in-posts</link>
<guid isPermaLink="false">https://xenodium.com/get-emacs-to-gather-links-in-posts</guid>
    <description><![CDATA[<p>Comments in posts can be a great source of recommendations. Here's a way to extract post links using Emacs and <a href="http://github.com/zweifisch/enlive">enlive</a>.</p>
<p><img src="https://xenodium.github.io/images/get-emacs-to-gather-urls-in-posts/emacs-enlive-url-fetch.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(require 'enlive) ;; https://github.com/zweifisch/enlive
(require 'org)

(defun ar/input-clipboard-url-or-prompt ()
  &quot;Return a URL from clipboard or prompt user for one.&quot;
  (let* ((clipboard (current-kill 0))
         (url (if (string-match &quot;^https?://&quot; clipboard)
                  clipboard
                (read-string &quot;URL: &quot;))))
    (unless (string-match &quot;^https?://&quot; url)
      (error &quot;Not a URL&quot;))
    url))

(defun ar/url-fetch-anchor-elements (url)
  &quot;Fetch anchor elements in URL as list of alist:
\((title . \&quot;my title\&quot;)
 (url . \&quot;http://some.location.com\&quot;)).&quot;
  (let ((elements (enlive-query-all (enlive-fetch url) [a])))
    (mapcar (lambda (element)
              `((title . ,(enlive-text element))
                (url . ,(enlive-attr element 'href))))
            elements)))

(defun ar/url-view-links-at ()
  &quot;View external links in HTML from prompted URL or clipboard.&quot;
  (interactive)
  (with-current-buffer (get-buffer-create &quot;*links*&quot;)
    (org-mode)
    (view-mode -1)
    (erase-buffer)
    (mapc (lambda (anchor)
            (let-alist anchor
              (when (and .url (string-match &quot;^http&quot; .url))
                (insert (org-make-link-string .url
                                              .title) &quot;\n&quot;))))
          (ar/url-fetch-anchor-elements
           (ar/input-clipboard-url-or-prompt)))
    (delete-duplicate-lines (point-min) (point-max))
    (goto-char (point-min))
    (toggle-truncate-lines +1)
    (view-mode +1)
(switch-to-buffer (current-buffer))))
</code></pre>
<p>UPDATE(2019-04-13): Refreshed post with latest code from my <a href="https://github.com/xenodium/dotsies/blob/9cf32157c5fec140218898dfcb11e74f623fec6c/emacs/ar/ar-url.el#L35">init</a>. Thanks to <a href="https://twitter.com/sjig">Gĳs</a> for pinging.</p>
]]></description>
    <pubDate>Sat, 17 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>UX toolbox bookmarks</title>
<link>https://xenodium.com/ux-toolbox-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ux-toolbox-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://affinity.serif.com/en-gb/ui-design-software/">Affinity Designer: the perfect tool for UI and UX design</a>.</li>
<li><a href="https://affinity.serif.com/en-us/publisher/">Affinity Publisher – Professional Desktop Publishing Software</a>.</li>
<li><a href="https://www.youtube.com/watch?v=lWz9G95ITuk&amp;feature=youtu.be&amp;utm_source=designernews">Build a static site with Material Design Lite</a>.</li>
<li><a href="http://eye-dropper.kepi.cz/">Eye dropper Chrome extension (pick colors in browser)</a>.</li>
<li><a href="https://coolors.co/1a181b-5d4d66-703d89-9e2bd8-a304f2">Generate - Coolors.co</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17869229">Google, but for colors (Hacker News)</a>.</li>
<li><a href="https://nodesign.dev/">Nodesign.dev | Design less develop more.</a>.</li>
<li><a href="https://www.paintcodeapp.com">PaintCode - Turn your drawings into Objective-C or Swift drawing code</a>.</li>
<li><a href="http://paletton.com/#uid=30n190kr6u-blKMk5ypvBoeFHhn">Paletton - The Color Scheme Designer</a>.</li>
<li><a href="http://www.myfonts.com/WhatTheFont/">WhatTheFont! (find out font names)</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 16 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Change Emacs shell's CWD with helm projectile</title>
<link>https://xenodium.com/change-emacs-shells-cwd-with-helm-projectile</link>
<guid isPermaLink="false">https://xenodium.com/change-emacs-shells-cwd-with-helm-projectile</guid>
    <description><![CDATA[<p>If using Emacs shell and helm projectile, you can wire these up to quickly change your current working directory.</p>
<p><img src="https://xenodium.github.io/images/change-emacs-shells-cwd-with-helm-projectile/change-cwd-with-helm-projectile.gif" alt=""></p>
<pre><code class="language-{.commonlisp">(require 'helm-projectile)

(defun ar/shell-cd (dir-path)
&quot;Like shell-pop--cd-to-cwd-shell, but without recentering.&quot;
  (unless (string-equal mode-name &quot;Shell&quot;)
    (error &quot;Not in Shell mode&quot;))
  (message mode-name)
  (goto-char (point-max))
  (comint-kill-input)
  (insert (concat &quot;cd &quot; (shell-quote-argument dir-path)))
  (let ((comint-process-echoes t))
    (comint-send-input)))

(defun ar/helm-projectile-shell-cd ()
  &quot;Change shell current working directory using helm projectile.&quot;
  (interactive)
  (unless (string-equal mode-name &quot;Shell&quot;)
    (error &quot;Not in Shell mode&quot;))
  (let ((helm-dir-source (copy-tree  helm-source-projectile-directories-list)))
    (add-to-list 'helm-dir-source '(action . ar/shell-cd))
    (add-to-list 'helm-dir-source '(keymap . nil))
    (add-to-list 'helm-dir-source '(header-line . &quot;cd to directory...&quot;))
    (helm :sources helm-dir-source
          :buffer &quot;*helm-dirs*&quot;
          :candidate-number-limit 10000)))
</code></pre>
]]></description>
    <pubDate>Thu, 08 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Thermostat reset on Bosch WKD28350GB</title>
<link>https://xenodium.com/thermostat-reset-on-bosch-wkd28350gb</link>
<guid isPermaLink="false">https://xenodium.com/thermostat-reset-on-bosch-wkd28350gb</guid>
    <description><![CDATA[<p>My Bosch washer/dryer (WKD28350GB) stopped drying recently. Resetting the dryer's thermostat red breaker did the trick.</p>
<p><img src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-01.jpg" alt=""> <img src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-02.jpg" alt=""> <img src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-03.jpg" alt=""> <img src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-04.jpg" alt=""></p>
<p>Edit: Similar post <a href="https://www.diynot.com/diy/threads/bosch-wkd28350gb-washer-dryer-no-heat-when-drying.466138/">here</a>.</p>
]]></description>
    <pubDate>Wed, 07 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Javascript fetch node sample</title>
<link>https://xenodium.com/javascript-fetch-node-sample</link>
<guid isPermaLink="false">https://xenodium.com/javascript-fetch-node-sample</guid>
    <description><![CDATA[<p>Playing with node and fetch:</p>
<pre><code class="language-{.javascript">// Requisite: npm install node-fetch --save
// Save to fetch-demo.js
// Run: node fetch-demo.js

var fetch = require('node-fetch');

fetch(&quot;http://xenodium.com/data/javascript-fetch-node-sample/message.json\n&quot;, {
  method: 'GET',
  timeout: 5000
}).then(function(response) {
  return response.json();
}).then(function(response) {
  console.log('subject: ' + response.subject);
  console.log('body: ' + response.body);
}).catch(function(reason) {
  console.log(reason);
});
</code></pre>
]]></description>
    <pubDate>Mon, 05 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Extract dominant colors in images</title>
<link>https://xenodium.com/extract-dominant-colors-in-images</link>
<guid isPermaLink="false">https://xenodium.com/extract-dominant-colors-in-images</guid>
    <description><![CDATA[<p>There's a handy <a href="https://news.ycombinator.com/item?id%3D10309441">HN post</a> pointing to Javier López's <a href="http://javier.io/blog/en/2015/09/30/using-imagemagick-and-kmeans-to-find-dominant-colors-in-images.html">Using imagemagick, awk and kmeans to find dominant colors in images</a>. A comment also highlights <a href="https://github.com/andrewgleave/color-extract">color-extract,</a> written in Go.</p>
]]></description>
    <pubDate>Thu, 01 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Find a word with regex and WordNet</title>
<link>https://xenodium.com/find-a-word-with-regex-and-wordnet</link>
<guid isPermaLink="false">https://xenodium.com/find-a-word-with-regex-and-wordnet</guid>
    <description><![CDATA[<p>Recently wanted to come up with a random keyword. Querying <a href="http://wordnet.princeton.edu/">WordNet</a> and a regular expression did the job.</p>
<p>Installed WordNet on Mac:</p>
<pre><code class="language-{.bash">$ brew install wordnet
</code></pre>
<p>Want a word ending in &quot;esome&quot;?</p>
<pre><code class="language-{.bash">$ wn esome -grepn -grepv -grepa -grepr | egrep -o -e &quot;\w*esome\b&quot; | sort | uniq

adventuresome
awesome
blithesome
bunglesome
cuddlesome
esome
fivesome
gruesome
lithesome
lonesome
lovesome
meddlesome
mettlesome
nettlesome
threesome
tiresome
torturesome
troublesome
unwholesome
venturesome
wholesome
</code></pre>
]]></description>
    <pubDate>Mon, 28 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Soundcloud's Go best practices (GopherCon 2014)</title>
<link>https://xenodium.com/soundclouds-go-best-practices-gophercon-2014</link>
<guid isPermaLink="false">https://xenodium.com/soundclouds-go-best-practices-gophercon-2014</guid>
    <description><![CDATA[<p>Having watched the <a href="https://www.youtube.com/watch?v%3DY1-RLAl7iOI">video</a>, some takeaways:</p>
<h2>Single GOPATH</h2>
<h3>$GOPATH/src/github.com/soundcloud/foo</h3>
<h2>Repo structure</h2>
<h3>github.com/soundcloud/whatever</h3>
<ol>
<li>
<p>README.md</p>
</li>
<li>
<p>Makefile</p>
</li>
<li>
<p>main.go</p>
</li>
<li>
<p>support.go</p>
</li>
<li>
<p>foo</p>
<ol>
<li>
<p>foo.go</p>
</li>
<li>
<p>bar.go</p>
</li>
</ol>
</li>
<li>
<p>whatever-server</p>
<ol>
<li>main.go</li>
</ol>
</li>
<li>
<p>wharever-worker</p>
<ol>
<li>main.go</li>
</ol>
</li>
</ol>
<h2>Formatting and style</h2>
<h3>Use gofmt.</h3>
<h3>Google's codereview <a href="https://github.com/golang/go/wiki/CodeReviewComments">guidelines</a>.</h3>
<h3>Avoid named return parameters.</h3>
<h3>Avoid make and new (unless you know sizes).</h3>
<h3>Use struct{} for sentinel values: sets, signal chans.</h3>
<ol>
<li>
<p>Conveys no information in it this part.</p>
</li>
<li>
<p>Instead of empty interface.</p>
</li>
<li>
<p>instead of boolean.</p>
</li>
</ol>
<h3>Break long lines at parameters</h3>
<ol>
<li>
<p>No need to compact.</p>
</li>
<li>
<p>Keep trailing coma in last argument.</p>
</li>
</ol>
<h3>Flags</h3>
<pre><code class="language-go">func main() {
  var (
    foo = flags.String(&quot;foo\n&quot;, &quot;doch\n&quot;, &quot;...&quot;)
    bar = flat.Int(&quot;bar\n&quot;, 34, &quot;...&quot;)
  )
  flag.Parse()
  // ...
}
</code></pre>
<h3>Logging</h3>
<ol>
<li>
<p>package log</p>
</li>
<li>
<p>Telemetry</p>
</li>
<li>
<p>Push model (gets expensive over time)</p>
<ol>
<li>
<p>Graphite</p>
</li>
<li>
<p>Statsd</p>
</li>
<li>
<p>AirBrake</p>
</li>
</ol>
</li>
<li>
<p>Pull model (chosen)</p>
<ol>
<li>
<p>expvar</p>
</li>
<li>
<p>Prometheus</p>
</li>
</ol>
</li>
</ol>
<h3>Testing</h3>
<ol>
<li>
<p>package testing</p>
<ol>
<li>
<p>Unit tests</p>
</li>
<li>
<p>reflect.DeepEqual</p>
</li>
</ol>
</li>
<li>
<p>Integration</p>
<ol>
<li>
<p>Use flags for starting services</p>
</li>
<li>
<p>// +build integration</p>
</li>
</ol>
</li>
</ol>
<h3>Code validation</h3>
<ol>
<li>
<p>On Save</p>
<ol>
<li>
<p>Go fmt</p>
</li>
<li>
<p>Go import (go fmt++)</p>
</li>
</ol>
</li>
<li>
<p>On Build</p>
<ol>
<li>
<p>Go vet</p>
</li>
<li>
<p>Golint</p>
</li>
<li>
<p>Go test</p>
</li>
</ol>
</li>
<li>
<p>On Deploy</p>
<ol>
<li>go test -tags=integration</li>
</ol>
</li>
<li>
<p>GoCov?</p>
</li>
</ol>
<h3>Dependency management</h3>
<ol>
<li>
<p>Unimportant projects</p>
<ol>
<li>go get -d (and hope)</li>
</ol>
</li>
<li>
<p>Important</p>
<ol>
<li>
<p>VENDOR (ie. copy into your repo)</p>
<ol>
<li>
<p>Git submodules (no!).</p>
</li>
<li>
<p>Git subtrees (seem OK).</p>
</li>
<li>
<p>Tool (godep?).</p>
</li>
<li>
<p>Build</p>
</li>
<li>
<p>For binaries (use _vendor subdir)</p>
</li>
</ol>
</li>
</ol>
</li>
</ol>
]]></description>
    <pubDate>Sat, 26 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sync pip with Mac OS updates</title>
<link>https://xenodium.com/sync-pip-with-mac-os-updates</link>
<guid isPermaLink="false">https://xenodium.com/sync-pip-with-mac-os-updates</guid>
    <description><![CDATA[<p>My pip installation recently broke after a Mac OS update.</p>
<pre><code class="language-example">$ pip
Traceback (most recent call last):
  File &quot;/usr/local/bin/pip\n&quot;, line 5, in &lt;module&gt;
    from pkg_resources import load_entry_point
  File &quot;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py\n&quot;, line 2793, in &lt;module&gt;
    working_set.require(__requires__)
  File &quot;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py\n&quot;, line 673, in require
    needed = self.resolve(parse_requirements(requirements))
  File &quot;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py\n&quot;, line 576, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: pip==1.1
</code></pre>
<p>Updating my pip installation fixes the break:</p>
<pre><code class="language-{.bash">$ sudo easy_install -U pip
</code></pre>
]]></description>
    <pubDate>Wed, 23 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Chinatown treats review</title>
<link>https://xenodium.com/chinatown-treats-review</link>
<guid isPermaLink="false">https://xenodium.com/chinatown-treats-review</guid>
    <description><![CDATA[<h2>Recommended? yep</h2>
<p>There's a corner in Chinatown hosting some truly superb treats. If you get caught in the rush between Newport court and Newport place, you'd likely fail to notice some the awesome street food stands.</p>
<p><img src="https://xenodium.github.io/images/chinatown-treats/chinatown.jpg" alt=""> <img src="https://xenodium.github.io/images/chinatown-treats/newport-court.jpg" alt=""></p>
<h2>Chilly squid</h2>
<p>I've walked past this place many times and never noticed it. They serve a handful of items, but the grilled chilly squid skewers caught my attention. They're grilled, brushed with chilly sauce and finished with sprinkled sesame and cumin seeds. Super tasty.</p>
<p><img src="https://xenodium.github.io/images/chinatown-treats/squid-stand.jpg" alt=""></p>
<p><img src="https://xenodium.github.io/images/chinatown-treats/chilly-squid-1.jpg" alt=""> <img src="https://xenodium.github.io/images/chinatown-treats/chilly-squid-2.jpg" alt=""></p>
<h2>Pancake + Crisp + Egg + Hot chillies = Jiān Bǐng 煎餅</h2>
<p>I first had these delicious breakfast savory pancakes at a Beijing street food stall. Never expected to randomly find Jiān Bǐng in London. It's a crepe with an additional egg spread, hoisin sauce, chilly sauce, hot chillies, topped with spring onions and coriander, all wrapping a wonderfully crispy bread cracker. And.. it's awesome.</p>
<p><img src="https://xenodium.github.io/images/chinatown-treats/pancake-3.jpg" alt=""></p>
<h2>Tai Yaki</h2>
<p>Chinatown Bakery is hard to miss. Pedestrian traffic slows down as we all fall under the spell of the Tai Yaki machine. This wonderful assembly line produces fish-shaped sweet waffles filled with custard. They are the perfect dessert after some savory street snacks. You can get a bag of 4 for £2.</p>
<p><img src="https://xenodium.github.io/images/chinatown-treats/fish-1.jpg" alt=""> <img src="https://xenodium.github.io/images/chinatown-treats/fish-4.jpg" alt=""></p>
<h2>All near each other</h2>
<p>All these delights are within a stone's throw away from each other.</p>
<p><img src="https://xenodium.github.io/images/chinatown-treats/pano.png" alt=""></p>
<h2>Useful?</h2>
<p>Was this post useful to you? do <a href="https://twitter.com/xenodium/status/646101779281801216">reply</a>!</p>
<h2>Better suggestion?</h2>
<p>London is full of overhyped, gimmicky, and unnecessarily expensive restaurants. Very few deliver truly awesome food (even those expensive ones). Got suggestions? I'd love to hear from you <a href="https://twitter.com/xenodium">@xenodium</a>.</p>
]]></description>
    <pubDate>Sun, 20 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>React bookmarks</title>
<link>https://xenodium.com/react-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/react-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://medium.com/dailyjs/11-mistakes-ive-made-during-react-native-redux-app-development-8544e2be9a9">11 mistakes I’ve made during React Native / Redux app development</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=10962784">9 things every React.js beginner should know (Hacker News)</a>.</li>
<li><a href="https://camjackson.net/post/9-things-every-reactjs-beginner-should-know">9 things every React.js beginner should know</a>.</li>
<li><a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/">A Complete Guide to Flexbox</a>.</li>
<li><a href="https://github.com/wix/react-native-navigation">A complete native navigation solution for React Native with optional redux support - nav bars, tabs, drawer, modals</a>.</li>
<li><a href="http://mrn.js.org/">A Material Design style React Native component library</a>.</li>
<li><a href="https://github.com/syrusakbary/react-native-refresher/blob/master/README.md">A pull to refresh ListView for React Native</a>.</li>
<li><a href="http://nerds.airbnb.com/facebook-react-native/">Adam Wolf's React Native talk</a>.</li>
<li><a href="http://moduscreate.com/aligning-children-using-flexbox-in-react-native/">Aligning Children using Flexbox in React Native</a>.</li>
<li><a href="https://egghead.io/lessons/react-applying-basic-styles-in-react-native">Applying baisc styles in react native (video)</a>.</li>
<li><a href="https://egghead.io/lessons/react-applying-basic-styles-in-react-native">Applying Basic Styles in React Native</a>.</li>
<li><a href="https://twitter.com/floydophone/status/649786438330945536">Avoid premature fluxing</a>.</li>
<li><a href="https://github.com/enaqx/awesome-react/">Awesome React: a collection of awesome things regarding React ecosystem</a>.</li>
<li><a href="https://github.com/babel/babel-eslint">babel-eslint</a>.</li>
<li><a href="https://medium.com/infinite-red/beginner-s-guide-to-using-cocoapods-with-react-native-46cb4d372995#.i87ebbwl0">Beginner’s Guide to Using CocoaPods with React Native</a>.</li>
<li><a href="https://medium.com/delivery-com-engineering/react-native-in-an-existing-ios-app-delivered-874ba95a3c52#.kin2ke23s">Beyong React Native's &quot;getting started guide&quot;</a>.</li>
<li><a href="http://blog.bonnieeisenman.com/">Bonnie Eisenman's blog (some react)</a>.</li>
<li><a href="https://corbt.com/posts/2015/12/22/breaking-up-heavy-processing-in-react-native.html">Breaking up Heavy Processing in React Native (Blog post)</a>.</li>
<li><a href="https://www.youtube.com/watch?v=cI9bDvDEsYE">Brent Vatne - Building li.st for Android with Exponent and React Native at react-europe 2016</a>.</li>
<li><a href="http://tadeuzagallo.com/blog/react-native-bridge/">Bridging in React Native: An in-depth look into React Native's core</a>.</li>
<li><a href="http://tech.taskrabbit.com/blog/2015/10/18/building-react-native-apps/">Building React Native Apps</a>.</li>
<li><a href="http://makeitopen.com/tutorials/building-the-f8-app">Bulding the F8 app</a>.</li>
<li><a href="https://github.com/adamterlson/cairn">Cairn: a tiny library for React Native replacing default styling syntax</a>.</li>
<li><a href="https://medium.com/the-exponent-log/coding-apps-with-react-native-at-exponent-7a5922da27bf#.udrk6kz05">Coding Apps with React Native at Exponent</a>.</li>
<li><a href="http://codewinds.com/blog/2015-04-02-emacs-flycheck-eslint-jsx.html">Configuring Emacs to use eslint and babel with flycheck for javascript and React.js JSX</a>.</li>
<li><a href="https://github.com/markerikson/react-redux-links">Curated tutorial and resource links I've collected on React, Redux, ES6, and more</a>.</li>
<li><a href="https://www.youtube.com/watch?v=xsSnOQynTHs">Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015</a>.</li>
<li><a href="https://medium.com/@shaheenghiassy/deep-diving-react-native-debugging-ea406ed3a691">Deep Diving React Native Debugging</a>.</li>
<li><a href="http://ilikekillnerds.com/2015/02/developing-react-js-components-using-es6/">Developing React.js Components Using ES6</a>.</li>
<li><a href="https://github.com/rebeccahughes/react-native-device-info">Device Information for React Native iOS and Android</a>.</li>
<li><a href="https://engineering.hexacta.com/didact-learning-how-react-works-by-building-it-from-scratch-51007984e5c5">Didact: a DIY guide to build your own React – Hexacta Engineering</a>.</li>
<li><a href="http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/">ECMAScript 5 Strict Mode, JSON, and More</a>.</li>
<li><a href="https://github.com/Intellicode/eslint-plugin-react-native">ESLint plugin for React Native</a>.</li>
<li><a href="https://github.com/gcazaciuc/eslint-plugin-flowtype">eslint-plugin-flowtype</a>.</li>
<li><a href="https://exponentjs.com/">Exponentjs</a>.</li>
<li><a href="https://github.com/coodoo/flowery">Flowery: prettifies the result generated by Facebook Flow</a>.</li>
<li><a href="http://blog.krawaller.se/img/flux-diagram.png">Flux diagram</a>.</li>
<li><a href="https://egghead.io/series/getting-started-with-redux">Getting Started with Redux (30 lessons)</a>.</li>
<li><a href="https://gist.github.com/joshdover/235714771d94509a83609b16d232014a">Idiomatic React Testing Patterns</a>.</li>
<li><a href="https://github.com/facebook/react-native/commit/1303e6d0392e8bc4da1198c98fc8cd7ad488b81c">Implement XHR timeout for Android and IOS natively</a>.</li>
<li><a href="https://github.com/facebook/react-native/commit/e4c53c28aea7e067e48f5c8c0100c7cafc031b06">Improved shadow performance on iOS</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11093275">Learn Raw React – No JSX, No Flux, No ES6, No Webpack (Hacker News)</a>.</li>
<li><a href="https://github.com/DianQK/LearnRxSwift/blob/master/README.md">LearnRxSwift</a>.</li>
<li><a href="https://github.com/facebook/react-native/issues/499#issuecomment-128836161">ListView rendering issue</a>.</li>
<li><a href="https://github.com/marcshilling/react-native-image-picker">Native image/photo picker for react native</a>.</li>
<li><a href="https://www.youtube.com/watch?v=dOSwHABLvdM">Native react navigation in every platform</a>.</li>
<li><a href="https://github.com/geirman/offlineMovies">OfflineMovies: retrieves movies from an api and caches the result offline</a>.</li>
<li><a href="https://corbt.com/posts/2015/09/16/one-day-with-react-native-for-android.html">One day with React Native for Android</a>.</li>
<li><a href="https://www.youtube.com/watch?v%3Dfh_Y4mPivuM">Optimizing React Native views (Screencast)</a>.</li>
<li><a href="https://www.youtube.com/watch?v=fh_Y4mPivuM">Optimizing React Native views (Screencast)</a>.</li>
<li><a href="https://facebook.github.io/react/docs/context.html">Passing info automatically through a tree</a>.</li>
<li><a href="https://medium.com/@sharathprabhal/progressive-image-loading-in-react-native-ecc88e724343#.ffudiaxf3">Progressive image loading</a>.</li>
<li><a href="http://reactscript.com/categories/layout/">React and React Native Layout Components - ReactScript</a>.</li>
<li><a href="https://github.com/kriasoft/react-component-starter">React Component Starter Kit</a>.</li>
<li><a href="http://iamdustan.com/2016/01/18/react-custom-renderers/">React Custom Renderers (Blog post)</a>.</li>
<li><a href="https://facebook.github.io/react/contributing/design-principles.html">React Design Principles</a>.</li>
<li><a href="https://github.com/naoufal/react-native-accordion">React Native accordion</a>.</li>
<li><a href="https://github.com/mastermoo/react-native-action-button">React Native action button</a>.</li>
<li><a href="https://medium.com/react-weekly/react-native-and-typescript-ad57b7413ead#.w5lky7jol">React Native and Typescript</a>.</li>
<li><a href="http://browniefed.com/blog/2015/08/01/react-native-animated-listview-row-swipe/">React Native Animated ScrollView Row Swipe Actions</a>.</li>
<li><a href="http://zaicheng.me/2016/06/20/react-native-initial-setup/">React Native App initial setup</a>.</li>
<li><a href="https://medium.com/delivery-com-engineering/react-native-in-an-existing-ios-app-dynamic-routing-7013e03fa9ad#.cyv7v7oez">React Native in an Existing iOS App: Dynamic Routing</a>.</li>
<li><a href="https://github.com/ericvicenti/react-native-community/">React Native in the Github Community</a>.</li>
<li><a href="http://moduscreate.com/react-native-layout-system/">React Native Layout System</a>.</li>
<li><a href="https://github.com/lelandrichardson/react-native-maps">React Native Mapview component for iOS + Android</a>.</li>
<li><a href="https://github.com/react-native-material-design/react-native-material-design">React Native Material Design (react-native-material-design)</a>.</li>
<li><a href="https://github.com/xinthink/react-native-material-kit">React Native Material Design (xinthink)</a>.</li>
<li><a href="http://us10.campaign-archive2.com/?u%3Ddb0dd948e2b729ee62625b1a8&amp;id%3Dfbfe8b6010&amp;e%3Dc7b5ce9f56">React Native Newsletter - Issue #24</a>.</li>
<li><a href="http://us10.campaign-archive2.com/?u%3Ddb0dd948e2b729ee62625b1a8&amp;id%3D674b414994&amp;e%3Dc7b5ce9f56">React Native Newsletter - Issue #25</a>.</li>
<li><a href="https://github.com/rnpm/rnpm">React Native Package Manager (rnpn)</a>.</li>
<li><a href="https://rnplay.org/">React Native Playground</a>.</li>
<li><a href="http://npm.taobao.org/package/react-native-scrollable-decorator">React Native scrollable decorator</a>.</li>
<li><a href="https://github.com/marty-wang/react-native-toolkit">React Native Toolkit (navigation examples)</a>.</li>
<li><a href="http://www.raywenderlich.com/99473/introducing-react-native-building-apps-javascript">React Native Tutorial: Building Apps with JavaScript</a>.</li>
<li><a href="https://medium.com/@Jpoliachik/react-native-s-layoutanimation-is-awesome-4a4d317afd3e#.97zx978rl">React Native’s LayoutAnimation is Awesome</a>.</li>
<li><a href="http://aeflash.com/2015-02/react-tips-and-best-practices.html">React Tips and Best Practices</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=14144142">React-Move – Animate anything in React (Hacker News)</a>.</li>
<li><a href="https://github.com/lwansbrough/react-native-camera">react-native-camera: A Camera component for React Native</a>.</li>
<li><a href="https://github.com/aksonov/react-native-redux-router">react-native-redux-router (replace push/pop screens with easy syntax)</a>.</li>
<li><a href="http://www.reactjsprogram.com/">React.js Program: A project based, linear approach to learning React.js and the React.js ecosystem</a>.</li>
<li><a href="https://react.parts/native">react.parts/native feed</a>.</li>
<li><a href="https://www.youtube.com/watch?v=dwP1TNXE6fc">Reactive Programming Overview</a>.</li>
<li><a href="https://github.com/aerofs/react-native-auto-updater">ReactNativeAutoUpdater</a>.</li>
<li><a href="https://github.com/rackt/redux">Redux: Predictable state container for JavaScript apps</a>.</li>
<li><a href="http://jlongster.com/Removing-User-Interface-Complexity,-or-Why-React-is-Awesome">Removing User Interface Complexity, or Why React is Awesome</a>.</li>
<li><a href="https://medium.com/@elieslama/responsive-design-in-react-native-876ea9cd72a8#.cjpedynak">Responsive Design in React Native</a>.</li>
<li><a href="https://rnplay.org/">rnplay.org: Test and share React Native code samples</a>.</li>
<li><a href="https://github.com/bartonhammond/snowflake">Snowflake (React iOS/Android + Redux + Jest testable + parse.com + bitrise.io)</a>.</li>
<li><a href="http://hharnisc.github.io/2015/04/15/react-native-and-meteor.html">Some Thoughts On Gluing React Native and Meteor (Blog post)</a>.</li>
<li><a href="http://www.schibsted.pl/2015/10/testing-react-native-components-with-jest/">Testing react Native with jest</a>.</li>
<li><a href="https://www.firebase.com/blog/2016-01-20-tutorial-firebase-react-native.html">The beginners guide to React Native and Firebase (Blog post)</a>.</li>
<li><a href="https://medium.com/swlh/the-case-for-flux-379b7d1982c6#.109lf7s2a">The Case for Flux</a>.</li>
<li><a href="https://github.com/Reactive-Extensions/RxJS">The Reactive Extensions for JavaScript</a>.</li>
<li><a href="http://www.reactivemanifesto.org/">The reactive manifesto</a>.</li>
<li><a href="https://facebook.github.io/react/docs/thinking-in-react.html">Thinking in React</a>.</li>
<li><a href="https://getsiphon.com/blog/2016/01/20/future-of-app-development/">Thoughts on the future of mobile app development (Blog post)</a>.</li>
<li><a href="https://medium.com/the-react-native-log/tips-for-styling-your-react-native-apps-3f61608655eb#.tg2qh13vd">Tips for styling your React Native apps</a>.</li>
<li><a href="http://stanleycyang.github.io/technology/reactjs/native/ios/2015/10/04/react-native-tutorial-with-navigation-and-animation.html">Tutorial: Handcrafting an iOS Application with React Native (and lots of love)</a>.</li>
<li><a href="https://medium.com/@jcfrancisco/unit-testing-react-native-components-a-firsthand-guide-cea561df242b#.arff9dygw">Unit Testing React Native Components: A Firsthand Guide</a>.</li>
<li><a href="https://medium.com/infinite-red/using-redux-saga-to-simplify-your-growing-react-native-codebase-2b8036f650de#.382a5inf8">Using redux-saga To Simplify Your Growing React Native Codebase</a>.</li>
<li><a href="https://medium.com/shoutem/ways-to-pass-objects-between-native-and-javascript-in-react-native-c3dcae7bf4f5">Ways to pass objects between native and JavaScript in React Native</a>.</li>
<li><a href="http://blog.zmxv.com/2015/09/what-i-learned-from-building-react.html">What I learned from building with React</a>.</li>
<li><a href="https://www.youtube.com/watch?v=QQRDcYsN4xs">Why React Native is Better than Native for Your Mobile Application</a>.</li>
<li><a href="http://addyosmani.com/writing-modular-js/">Writing Modular JavaScript With AMD, CommonJS &amp; ES Harmony</a>.</li>
<li><a href="https://github.com/johnmastro/react-snippets.el">Yasnippets for React</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 18 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Chinese rice vinegar</title>
<link>https://xenodium.com/chinese-rice-vinegar</link>
<guid isPermaLink="false">https://xenodium.com/chinese-rice-vinegar</guid>
    <description><![CDATA[<p>Note to self to buy <a href="http://www.amazon.co.uk/dp/B00OG3L7N6/ref%3Dsr_1_1?ie%3DUTF8&amp;qid%3D1442442376&amp;sr%3D8-1&amp;">Gold Plum Chinkiang Vinegar</a>. Awesome with dim sum.</p>
<p><img src="https://xenodium.github.io/images/chinese-rice-vinegar/chinkiang-vinegar.jpg" alt=""></p>
]]></description>
    <pubDate>Wed, 16 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Use ImageMagick to batch-resize images</title>
<link>https://xenodium.com/use-imagemagick-to-batch-resize-images</link>
<guid isPermaLink="false">https://xenodium.com/use-imagemagick-to-batch-resize-images</guid>
    <description><![CDATA[<p>Using percentage:</p>
<pre><code class="language-{.bash">$ mogrify -resize 10% *.png
</code></pre>
<p>Using dimensions:</p>
<pre><code class="language-{.bash">$ mogrify -resize 120x120 *.png
</code></pre>
<p>Lots of other alternatives from ImageMagick's <a href="http://www.imagemagick.org/script/command-line-processing.php#geometry">documentation</a>:</p>
<hr>
<p>-resize   scale%
-resize   scale-x%xscale-y%
-resize   width
-resize   xheight
-resize   widthxheight
-resize   widthxheight^
-resize   widthxheight!
-resize   widthxheight&gt;
-resize   widthxheight&lt;
-resize   area@</p>
<hr>
<p>Fix image aspect ratios for Instagram:</p>
<pre><code class="language-{.bash">$ mogrify -resize 1080x1350 -gravity center -extent 1080 *.jpg
</code></pre>
]]></description>
    <pubDate>Sun, 13 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Lucky 7 review</title>
<link>https://xenodium.com/lucky-7-review</link>
<guid isPermaLink="false">https://xenodium.com/lucky-7-review</guid>
    <description><![CDATA[<h2>Recommended? yep</h2>
<p><a href="http://www.lucky7london.co.uk">Lucky 7</a> is a small nostalgic American diner on Westbourne Park road. I like the vibe, the space, and the unpretentious waiting staff. I go to Lucky 7 often enough, originally for the buttermilk pancakes, but the list of favorites on the menu keeps growing.</p>
<p><img src="https://xenodium.github.io/images/lucky-7-review/lucky-7-menu-board.jpg" alt=""> <img src="https://xenodium.github.io/images/lucky-7-review/lucky-7-staff.jpg" alt=""></p>
<p>Smileys by <a href="https://openclipart.org/detail/219291/smile">w.dyer</a>.</p>
<h2>Buttermilk Banana pancakes</h2>
<p>These are my favorite pancakes in London by far. Banana buttermilk pancakes and a few free coffee refills usually sort me out until dinner time. Add a side of bacon if extra hungry. You probably don't need it though.</p>
<p><img src="https://xenodium.github.io/images/lucky-7-review/lucky-7-coffee.jpg" alt=""> <img src="https://xenodium.github.io/images/lucky-7-review/lucky-7-pancakes.jpg" alt=""></p>
<h2>Reuben sandwich</h2>
<p>The reuben has been on Lucky 7's specials menu for months now. Not had many of these in London, but compared to The Brass Rail's, this reuben was a clear winner. The sandwich is huge and comes with fries. My girlfriend and I struggled to finish one between the two of us.</p>
<p><img src="http://localhost:8787/alvaro/lucky-7-review/lucky-7-reuben-fries.jpg" alt="" title="1"></p>
<p><img src="http://localhost:8787/alvaro/lucky-7-review/lucky-7-reuben-cross-section.jpg" alt="" title="1"></p>
<h2>Vanilla milkshake (add malt!)</h2>
<p>This milkshake hits the spot every time, but it's filling. You almost have to decide between the shake and an actual meal. If you must have it, add malt. Sorry, no picture.</p>
<h2>Huevos Rancheros</h2>
<p>This is a breakfast dish I can equally make (better?) at home, but Lucky 7 wins hands down every time I'm feeling particularly lazy. Sorry, no picture.</p>
<h2>Useful?</h2>
<p>Was this post useful to you? do <a href="https://twitter.com/xenodium/status/643139264302186497">reply</a>!</p>
<h2>Better suggestion?</h2>
<p>London is full of overhyped, gimmicky, and unnecessarily expensive restaurants. Very few deliver truly awesome food (even those expensive ones). Got suggestions? I'd love to hear from you <a href="https://twitter.com/xenodium">@xenodium</a>.</p>
]]></description>
    <pubDate>Tue, 08 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sierra Leone travel bookmarks</title>
<link>https://xenodium.com/sierra-leone-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sierra-leone-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.sierraleonemarathon.com/">Sierra Leone marathon</a>.</li>
<li><a href="http://www.street-child.co.uk/">Street Child charity</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 02 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>London travel bookmarks</title>
<link>https://xenodium.com/london-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/london-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.chgt.org.uk">Chiswick House &amp; Gardens</a>.</li>
<li><a href="https://www.heathrobinsonmuseum.org">Heath Robinson Museum</a>.</li>
<li><a href="http://www.londonlibrary.co.uk/">London Library (book your free tour)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Quaker_Gardens,_Islington">Quaker gardens</a>, Islington.</li>
<li><a href="http://www.sohotheatre.com/">Soho Theatre</a> (not tried yet).</li>
<li><a href="https://www.cntraveller.com/gallery/best-brunch-london">The best brunch London 2020 | CN Traveller</a>.</li>
<li><a href="https://www.cntraveller.com/gallery/the-most-beautiful-restaurants-in-london">The most beautiful restaurants in London for 2020 | CN Traveller</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 02 Sep 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Use ImageMagick to auto-orient images</title>
<link>https://xenodium.com/use-imagemagick-to-auto-orient-images</link>
<guid isPermaLink="false">https://xenodium.com/use-imagemagick-to-auto-orient-images</guid>
    <description><![CDATA[<p>Recently needed to rotate images based on EXIF metadata. ImageMagick to the rescue:</p>
<pre><code class="language-{.bash">$ for i in *.png; do convert -auto-orient &quot;$i&quot; &quot;$i&quot;; done
</code></pre>
]]></description>
    <pubDate>Sun, 23 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bengali Macher Jhol</title>
<link>https://xenodium.com/bengali-macher-jhol</link>
<guid isPermaLink="false">https://xenodium.com/bengali-macher-jhol</guid>
    <description><![CDATA[<p>My friend Sakhya brought me the wonderful <a href="http://www.nitamehta.com/Cookbook-of-Regional-Cuisines-of-India-%2528Veg-%2B-Non-Veg%2529_431.html">Cookbook of Regional Cuisines of India</a>. After improvisations and substitutions, here's my attempt at making Bengali Machcher Jhol:</p>
<p><img src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-00.png" alt=""> <img src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-01.png" alt=""> <img src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-02.png" alt=""> <img src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-03.png" alt=""> <img src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-04.png" alt=""> <img src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-05.png" alt=""></p>
]]></description>
    <pubDate>Sun, 23 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>New habits for 2015</title>
<link>https://xenodium.com/new-habits-for-2015</link>
<guid isPermaLink="false">https://xenodium.com/new-habits-for-2015</guid>
    <description><![CDATA[<ul>
<li>20 min morning meditations.</li>
<li><a href="http://www.ted.com/talks/terry_moore_how_to_tie_your_shoes">A better way to tie your shoes</a>.</li>
<li>Cold showers (all of them!).</li>
<li>Keys, wallet, phone, badge, and headphones live together.</li>
<li>Listen to audio books.</li>
<li>Morning runs.</li>
<li>Nightly flossing.</li>
</ul>
]]></description>
    <pubDate>Sat, 22 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Meditation retreats bookmarks</title>
<link>https://xenodium.com/meditation-retreats-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/meditation-retreats-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/best-places-to-seek-silence">Best places to seek silence</a>.</li>
<li><a href="http://www.dhanakosa.com/retreat/2015/opening-life-0">Opening to life @ Dhanakosa Buddhist Retreat Centre</a>.</li>
<li><a href="http://www.samyeling.org/">Samye Ling (Tibetan- buddhist monastery)</a>.</li>
<li><a href="https://www.dhamma.org/en-US/index">Vipassana Meditation (centers across world)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 22 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Human memory bookmarks</title>
<link>https://xenodium.com/human-memory-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/human-memory-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://augmentingcognition.com/ltm.html">Augmenting Long-term Memory (Michael Nielsen)</a>.</li>
<li><a href="http://www.ludism.org/mentat/">Ludism's memory techniques</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22492381">Using Anki to remember what you read | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22492381">Using Anki to remember what you read | Hacker News</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Jul 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mindfulness/meditation bookmarks</title>
<link>https://xenodium.com/meditation-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/meditation-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.10percenthappier.com/">10% Happier: Mindfulness Meditation Courses with Dan Harris and Joseph Goldstein</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Aimless_wandering">Aimless Wandering</a>.</li>
<li><a href="http://www.nytimes.com/2016/06/05/opinion/sunday/are-you-in-despair-thats-good.html">Are You in Despair? That’s Good (NY Times)</a>.</li>
<li><a href="http://lesswrong.com/lw/3w3/how_to_beat_procrastination/">Beating procrastination</a>.</li>
<li><a href="http://theenergyproject.com/blog/take-back-your-life-ten-steps">Best 10 life changes</a>.</li>
<li><a href="https://www.drweil.com/health-wellness/body-mind-spirit/stress-anxiety/breathing-three-exercises/">Breathing Exercise: Three To Try | 4-7-8 Breath (Andrew Weil, M.D.)</a>.</li>
<li><a href="http://theoryengine.org/life/contemplative-practice-that-isnt-meditating/">Contemplative Practice That Isn’t Meditating</a>.</li>
<li><a href="https://dayoneapp.com/">Day One - The award-winning journal app for iPhone, iPad, and Mac.</a>.</li>
<li><a href="https://www.youtube.com/watch?v%3DZ8LOhZmuVaE&amp;feature%3Dyoutu.be">Developing Lotus Flexibility - Preparing Yoga Padmasana Sitting Position, part 1 (YouTube)</a>.</li>
<li><a href="http://franticworld.com/free-meditations-from-mindfulness/">Free meditations from Mindfulness | Mindfulness: Finding Peace in a Frantic World</a>.</li>
<li><a href="https://hbr.org/2014/02/how-to-make-yourself-work-when-you-just-dont-want-to/">How to Make Yourself Work When You Just Don’t Want To</a>.</li>
<li><a href="http://www.tricycle.com/blog/how-sit-zen-and-stretching-excercises-full-lotus">How to sit Zen</a>.</li>
<li><a href="http://jonathanfoust.libsyn.com/webpage">Jonathan Foust's talks</a>.</li>
<li><a href="http://buddhistinspiration.blogspot.com/2011/12/well-see-zen-story.html">Kalyanamittas: We'll See - A Zen Story</a>.</li>
<li><a href="http://www.theguardian.com/lifeandstyle/2011/jan/22/meditation-centres-uk">Meditation centres around the UK</a>.</li>
<li><a href="https://twitter.com/g_s_bhogal/status/1225561131122597896">MEGATHREAD TIME: In 40 tweets I will describe 40 power powerful concepts for understanding the world</a>.</li>
<li><a href="http://www.memrise.com/blog/">Memreise's blog</a>.</li>
<li><a href="https://medium.com/@yegg/mental-models-i-find-repeatedly-useful-936f1cc405d">Mental Models I Find Repeatedly Useful - Gabriel Weinberg (Medium)</a>.</li>
<li><a href="https://medium.com/@yegg/mental-models-i-find-repeatedly-useful-936f1cc405d#.g0gjbdp8z">Mental Models I Find Repeatedly Useful</a>.</li>
<li><a href="https://www.mindbodyattention.com/">Mind Body Attention — thinking, moving, and meditating</a>.</li>
<li><a href="https://thebuddhistcentre.com/text/mindfulness-breathing">Mindfulness breathing</a>.</li>
<li><a href="https://hbr.org/2014/12/mindfulness-mitigates-biases-you-may-not-know-you-have">Mindfulness Mitigates Biases You May Not Know You Have</a>.</li>
<li><a href="https://www.youtube.com/watch">Nam Myoho Renge Kyo</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21861986">Ram Dass has died (Hacker News)</a>.</li>
<li><a href="https://www.smilingmind.com.au/smiling-mind-app">Smiling Mind free apps</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=13019767">The Challenge of Consciousness (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21036927">The effect of meditation on brain structure (2012) | Hacker News</a>.</li>
<li><a href="http://theenergyproject.com/blog">The Energy Project blog</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 22 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Learning bookmarks</title>
<link>https://xenodium.com/learning-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/learning-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.quora.com/What-are-the-best-YouTube-channels-for-learning-growth-and-development">Best YouTube channels for learning (Quora)</a>.</li>
<li><a href="https://www.supermemo.com/en/articles/20rules">Effective learning: Twenty rules of formulating knowledge</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=7826745">HN's comments on learning languages</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=6522901">HN's comments on memory</a>.</li>
<li><a href="http://fourhourworkweek.com/2012/12/11/how-to-play-the-guitar/">How to Finally Play the Guitar: 80/20 Guitar and Minimalist Music</a>.</li>
<li><a href="http://betterexplained.com/articles/adept-method/">Learn Difficult Concepts with the ADEPT Method</a>.</li>
<li><a href="https://www.youtube.com/playlist?list=PL2FF649D0C4407B30">Learning to learn</a>.</li>
<li><a href="http://betterexplained.com/articles/intuition-isnt-optional/">Learning to Learn: Intuition Isn’t Optional | BetterExplained</a>.</li>
<li><a href="http://fourhourworkweek.com/2009/07/30/speed-reading-and-accelerated-learning/">Scientific Speed Reading: How to Read 300% Faster in 20 Minutes</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 22 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bundi travel bookmarks</title>
<link>https://xenodium.com/bundi-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bundi-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Bundi Haveli (accomodation).</li>
<li>Hadoti Palace (accomodation).</li>
<li>Haveli Braj Bhushan Ji ki (accomodation).</li>
<li>Haveli Katkoun Guest House (accomodation).</li>
<li>Kasera Paradise (accomodation).</li>
</ul>
]]></description>
    <pubDate>Sat, 22 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Upgrading PL30 headphones</title>
<link>https://xenodium.com/upgrading-pl30-headphones</link>
<guid isPermaLink="false">https://xenodium.com/upgrading-pl30-headphones</guid>
    <description><![CDATA[<p>I've loved my <a href="http://www.amazon.com/Soundmagic-PL30-In-Ear-Headphones/dp/B001MQ3CCO">Soundmagic PL30 in-ear headphones</a>. They're relatively inexpensive, comfortable, and great for exercising (they stay in). Audio quality and bass have been good enough (I don't need much). Unfortunately, I've had two pairs of PL30's and both stopped working after a year or two. I'm replacing the last pair with <a href="http://www.amazon.co.uk/RHA-MA750-Isolating-In-Ear-Headphone-Black/dp/B00ELAM8LE">RHA's MA750</a> (an upgrade, me hopes).</p>
<p>Other contenders considered: <a href="http://www.amazon.co.uk/Etymotic-Research-Portable-iPhone-Earphones-Black/dp/B000XPG2QI">Etymotic Research HF5</a>, and <a href="http://www.amazon.co.uk/Shure-SE215-In-Ear-Isolating-Earphones-Clear/dp/B004U9NH3E">Shure SE215</a>. Also considered bluetooth alternatives like <a href="http://www.amazon.com/JayBird-BlueBuds-Sport-Bluetooth-Headphones/dp/B00AIRUOI8?">JayBird BlueBuds X</a> and <a href="http://www.amazon.co.uk/Plantronics-BackBeat-Wireless-Earbuds-Frustration-Black/dp/B00DZTHW9U">Plantronics BackBeat GO 2</a>.</p>
<p>I'm somewhat nervous to pay more for a pair of headphones. Let's hope they don't meet the same unfortunate fate. We'll see.</p>
]]></description>
    <pubDate>Fri, 14 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Quotes</title>
<link>https://xenodium.com/quotes</link>
<guid isPermaLink="false">https://xenodium.com/quotes</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/stevemagness/status/633778359156125696?refsrc%3Demail&amp;s%3D11">&quot;Being good at something is about being curious enough to explore things to a level where most people give up.&quot;</a></li>
<li>&quot;The world is a book and those who do not travel read only one page.&quot; - Augustine of Hippo.</li>
<li>&quot;National identity is not your only identity.&quot; - Xiaolu Guo?</li>
<li><a href="https://news.ycombinator.com/item?id=27696310">&quot;Choose your words carefully. Words are cheap, but their effect can be expensive.&quot;</a></li>
</ul>
]]></description>
    <pubDate>Thu, 13 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bhutan travel bookmarks</title>
<link>https://xenodium.com/bhutan-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bhutan-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.tigersnestbhutan.com/">Taktsang (Tiger’s Nest) Monastery</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 13 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cooking bookmarks</title>
<link>https://xenodium.com/cooking-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cooking-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://food.ndtv.com/lists/10-best-indian-breakfast-recipes-696080">14 Best Indian Breakfast Recipes | Easy Indian Breakfast Recipes - NDTV Food</a>.</li>
<li><a href="http://drinks.seriouseats.com/2013/05/25-essential-cocktails-everyone-should-know-cocktail-101-easy-mixed-drink-recipes-classic-cocktail-guide.html">25 Cocktails Everyone Should Know</a>.</li>
<li><a href="https://www.amazon.com/Taylor-Precision-Products-Stainless-11-Pound/dp/B002SXV8G2/ref=sr_1_1?s=home-garden&amp;ie=UTF8&amp;qid=1481553229&amp;sr=1-1-spons&amp;keywords=Taylor+Precision+stainless+steel&amp;psc=1">Amazon.com: Taylor Precision Products Stainless Steel Kitchen Scale</a>.</li>
<li><a href="https://www.seriouseats.com/recipes/2012/07/basic-new-york-style-pizza-dough.html">Basic New York-Style Pizza Dough Recipe | Serious Eats</a>.</li>
<li><a href="http://www.world-of-crepes.com/cast-iron-fry-pans.html">Cast Iron Fry Pans</a>.</li>
<li><a href="https://www.quora.com/How-is-authentic-fried-rice-prepared/answer/ChienLing-Koo-1/share">ChienLing Koo's answer to How is authentic fried rice prepared? (Quora)</a>.</li>
<li><a href="https://cooking.nytimes.com/recipes/1018717-eggs-kejriwal">Eggs Kejriwal Recipe - NYT Cooking</a>.</li>
<li><a href="https://www.youtube.com/watch?v=-suTmUX4Vbk">Equipment Review: Best Carbon-Steel Skillets (YouTube)</a>.</li>
<li><a href="http://www.seriouseats.com/2010/06/how-to-buy-season-clean-maintain-cast-iron-pans.html">Equipment: How to Buy, Season, and Maintain Cast Iron Cookware</a>.</li>
<li><a href="https://www.quora.com/How-do-Chinese-restaurants-get-their-beef-to-be-so-tender-Like-beef-in-black-bean-sauce-or-Mongolian-beef-etc-It-almost-falls-apart-in-the-mouth">How do Chinese restaurants get their beef to be so tender?</a>.</li>
<li><a href="https://www.youtube.com/watch?v=KLGSLCaksdY#action=share">How To Cook With Cast Iron (YouTube)</a>.</li>
<li><a href="https://getpocket.com/explore/item/how-to-make-french-onion-soup">How To Make French Onion Soup</a>.</li>
<li><a href="https://www.amazon.co.uk/Imperia-Italian-Double-Cutter-Machine/dp/B0001IXA0I">Imperia Italian Double Cutter Pasta Machine</a>.</li>
<li><a href="https://www.digitaltrends.com/home/steaming-hard-boiled-eggs/">It's Not Rocket Science, Steaming Hard-Boiled Eggs Makes Peeling Easier (Digital trends)</a>.</li>
<li><a href="http://www.varasanos.com/PizzaRecipe.htm">Jeff Varasano's NY Pizza Recipe</a>.</li>
<li><a href="https://www.amazon.co.uk/Marcato-machine-Chrome-Silver-Wellness/dp/B0009U5OSO/">Marcato Atlas 150 pasta machine Chrome, Silver Wellness</a>.</li>
<li><a href="https://www.thecuriouschickpea.com/masoor-dal-tadka/">Masoor Dal Tadka - Indian Red Lentil Dal</a>.</li>
<li><a href="http://ohsheglows.com/2013/01/24/my-favourite-homemade-almond-milk-step-by-step-photos/">My Favourite Homemade Almond Milk + Step By Step Photos</a>.</li>
<li><a href="http://cooking.nytimes.com/">New York Times cooking</a>.</li>
<li><a href="http://www.womenshealthmag.co.uk/nutrition/recipes/2321/pho-tai-lan-hanoi-style-flash-fried-steak-garlic-soup/">Pho Tai Lan (Hanoi style flash-fried steak &amp; garlic soup)</a>.</li>
<li><a href="https://www.pizzamaking.com/pizza-recipes.html">Pizza Recipes - PizzaMaking.com</a>.</li>
<li><a href="https://www.portlandfarmersmarket.org/cookbook/">Portland Farmers Market » Cookbook</a>.</li>
<li><a href="https://www.fixfeastflair.com/home/2015/2/9/swedish-cardamom-rolls-kardemummabullar-recipe">Swedish Cardamom Rolls (Kardemummabullar) — Fix Feast Flair</a>.</li>
<li><a href="http://www.amazon.com/The-Ringer-Cleaner-Stainless-Chainmail/dp/B00FKBR1ZG">The Ringer Cast Iron Cleaner XL 8x6 Inch Stainless Steel Chainmail (Amazon)</a>.</li>
<li><a href="http://www.seriouseats.com/2014/11/the-truth-about-cast-iron.html">The Truth About Cast Iron Pans: 7 Myths That Need To Go Away</a>.</li>
<li><a href="http://www.cooksillustrated.com/how_tos/5820-the-ultimate-way-to-season-cast-iron">The ultimate way to season cast iron</a>.</li>
<li><a href="https://www.quora.com/Why-do-steaks-at-high-end-restaurants-taste-so-different-from-other-steaks">Why do steaks at high end restaurants taste so different from other steaks? (Quora)</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 12 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>9 week half-marathon training</title>
<link>https://xenodium.com/9-week-half-marathon-training</link>
<guid isPermaLink="false">https://xenodium.com/9-week-half-marathon-training</guid>
    <description><![CDATA[<p>While reading <a href="https://zenhabitsbook.s3.amazonaws.com/Zen%2520Habits%2520book.pdf">Zen Habits: Mastering the Art of Change</a>, I comitted to running half marathon in mid-October. That's roughly two months from now. Here's a 9 week training schedule:</p>
<p>WEEK   MON    TUE    WED    THU     FRI    SAT    SUN</p>
<hr>
<p>1      Rest   5 Km   5 Km   Cycle   Rest   5 Km   7 Km
2      Rest   5 Km   5 Km   Cycle   Rest   5 Km   8 Km
3      Rest   7 Km   5 Km   Cycle   Rest   5 Km   10 Km
4      Rest   8 Km   5 Km   Cycle   Rest   5 Km   12 Km
5      Rest   8 Km   Rest   8 Km    Rest   5 Km   14 Km
6      Rest   8 Km   Rest   8 Km    Rest   6 Km   16 Km
7      Rest   8 Km   8 Km   8 Km    Rest   8 Km   19 Km
8      Rest   8 Km   Rest   12 Km   Rest   8 Km   16 Km
9      Rest   8 Km   Rest   5 Km    5 Km   Rest   Race</p>
<p>My times:</p>
<p>WEEK   MON    TUE     WED     THU           FRI     SAT     SUN</p>
<hr>
<p>1      Rest   ✘       29:04   ✔             Rest    26:36   38:40
2      Rest   29:11   28:50   ✔             Rest    27:07   44:55
3      Rest   40:46   26:29   ✔             Rest    ✘       57:01
4      Rest   46:46   ✘       ✘             Rest    30:08   1:12:10
5      Rest   46:59   Rest    44:46         Rest    24:50   1:25:24
6      Rest   50:02   Rest    46:24         Rest    ✘       1:37:39
7      Rest   46:54   46:41   46:42         Rest    ✘       1:57:57
8      Rest   45:28   Rest    48:13 (8km)   Rest    43:56   ✘
9      Rest   44:24   Rest    27:12         26:09   Rest    1:58:28</p>
]]></description>
    <pubDate>Tue, 11 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Shanghai travel bookmarks</title>
<link>https://xenodium.com/shanghai-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/shanghai-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.nytimes.com/2013/12/01/travel/36-hours-in-shanghai.html">36 Hours in Shanghai</a>.</li>
<li>Shanghai Xiaolongbao at <a href="http://www.yelp.com/biz/shanghai-dumpling-house-edison-2">Dumpling House Edison (on Rt 27)</a>.</li>
<li><a href="https://goo.gl/maps/FQmSF">Tianzi Fang street art (Google maps)</a>.</li>
<li><a href="http://tianzifang.cn/">Tianzi Fang street art</a>.</li>
<li><a href="https://goo.gl/maps/Ngqwk">Town God's Temple</a>, street Food!</li>
<li><a href="https://en.wikipedia.org/wiki/Yu_Garden">Yu Garden/Huxinting Teahouse</a>.</li>
<li>佳家 for 小龙包.</li>
<li>小样 (Little Yang's) for 生煎包 (sheng jian bao). Fried soup filled dumplings. Think skin crunchy bottom texture.</li>
</ul>
]]></description>
    <pubDate>Tue, 11 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Singapore job board bookmarks</title>
<link>https://xenodium.com/singapore-job-board-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/singapore-job-board-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://angel.co/singapore/jobs">Angel.co (Singapore Startup Jobs)</a>.</li>
<li><a href="http://e27.co/jobs">e27</a>.</li>
<li><a href="http://www.startupjobs.asia/">Startupjobs.asia</a>.</li>
<li><a href="https://twitter.com/NataliePis/status/1130811744027316224">Those who relocated to Europe for a tech position: where did you find your job?</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 10 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Germany travel bookmarks</title>
<link>https://xenodium.com/germany-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/germany-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Azalea_and_Rhododendron_Park_Kromlau">Azalea and Rhododendron Park Kromlau</a>.</li>
<li><a href="https://zerokspot.com/weblog/2020/04/05/post-lockdown-bucketlist/">Having a post-lockdown bucket list - zerokspot.com</a>.</li>
<li><a href="http://www.7stern.at/de-de/">Home - 7STERN Bräu</a>.</li>
<li><a href="https://kerriescupoftea.blogspot.co.uk/2014/10/lai-fufu-in-munich-germany.html">Kerrie's Cup of Tea: lai fufu in Munich Germany</a>.</li>
<li><a href="https://www.laifufu.de/">Laifufu Teesalon - Teezeremonie - Tee - Oolong - München - Laifufu Teesalon</a>.</li>
<li><a href="https://www.sudhaus.at/">SUDHAUS — Brauerei &amp; Restaurant (try beef tartar. also pizza?)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 08 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Menorca travel bookmarks</title>
<link>https://xenodium.com/menorca-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/menorca-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.flickr.com/photos/paul_stephenson/4282369223/">Cala Macarella, Menorca</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Punta_Nati_Lighthouse">Punta Nati</a>.</li>
<li><a href="http://www.lonelyplanet.com/spain/balearic-islands/menorca/activities/driving-offroading/scooter-rental-menorca">Scooter rental in Menorca</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 08 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Travel tools bookmarks</title>
<link>https://xenodium.com/travel-tools-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/travel-tools-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.cool-cities.com/">Cool cities, a visual city guide</a>.</li>
<li><a href="https://www.producthunt.com/tech/detour-2-0">Detour 2.0</a>.</li>
<li><a href="https://play.google.com/store/apps/details?id%3Dco.dojoapp.dojo&amp;hl%3Den_GB">Dojo: Best stuff to do in London</a>.</li>
<li><a href="http://www.escapethecity.org">escapethecity.org</a>.</li>
<li><a href="https://everplaces.com">Find the best places to sleep, eat and play</a>.</li>
<li><a href="http://www.hostelworld.com">hostelworld.com</a>.</li>
<li><a href="http://ezroadtrips.com/blogs/2015/03/How-To-Travel-The-World-Without-Money.html">How to travel the world without money</a>.</li>
<li><a href="https://indie.bootsnall.com/">Indie: a simple, powerful way to buy multi-stop flights</a>.</li>
<li><a href="http://app.internationalsos.com">International SOS Assistance App</a>.</li>
<li><a href="https://izi.travel/en">IziTravel: audio guides and city/museum tours</a>.</li>
<li><a href="http://www.jetsetter.com">Jet Setter</a>.</li>
<li><a href="http://us.louisvuitton.com/eng-us/men/books/city-guides">Louis Vuitton city guide</a>.</li>
<li><a href="http://mapiac.com/travel-map/">Mapiac: discover hidden wonders</a>.</li>
<li><a href="http://www.roadsharing.com">roadsharing.com</a>.</li>
<li><a href="https://tripcast.co/">Tripcast</a>.</li>
<li><a href="https://www.triposo.com/">Triposo</a>.</li>
<li><a href="https://www.vayable.com/">Vayable (find a new experience)</a>.</li>
<li><a href="https://www.visahq.com/citizens/">Visa Requirements by Citizenship</a>.</li>
<li><a href="https://www.quora.com/What-is-the-best-website-or-app-to-use-for-trip-planning-and-why">What is the best website or app to use for trip planning, and why? (Quora)</a>.</li>
<li><a href="https://www.quora.com/What-travel-hacks-have-saved-you-a-lot-of-money">What travel hacks have saved you a lot of money? (Quora)</a>.</li>
<li><a href="http://www.wwoof.net">wwoof.net (Worldwide Opportunities on Organic Farms)</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 08 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Philippines travel bookmarks</title>
<link>https://xenodium.com/philippines-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/philippines-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://rachfeed.com/5-unique-tourist-spots-philippines/">5 Unique Tourist Spots in the Philippines - RachFeed</a>.</li>
<li><a href="http://www.lonelyplanet.com/philippines/travel-tips-and-articles/the-philippines-for-beginners-7-first-timer-fails-to-avoid-on-your-trip">7 first-timer fails</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Palawan_%28island%29">Palawan (island)</a>.</li>
<li><a href="http://www.lonelyplanet.com/philippines/travel-tips-and-articles/77222">The best beaches of the Philippines</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 08 Aug 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Add site-specific browsers to your workflow</title>
<link>https://xenodium.com/add-site-specific-browsers-to-your-workflow</link>
<guid isPermaLink="false">https://xenodium.com/add-site-specific-browsers-to-your-workflow</guid>
    <description><![CDATA[<p>There are three browser tabs continously used in my workflow: GMail, Google Calendar, and Google Play Music. I normally have many more tabs open, but these three I access periodically. As the number of open tabs increases, and I fail to cleanup, getting back to my usual three gets a little trickier.</p>
<p>So far, I've kept each of these services open in separate windows. But that doesn't always work. Click on any link in your inbox and you're back to playing cleanup. This is where <a href="https://en.wikipedia.org/wiki/Site-specific_browser">site-specific browsers</a> (SSB) can help.</p>
<p><a href="https://github.com/dmarmor/epichrome">Epichrome</a> enables you to build Chrome-based SSBs (on Mac OSX). Build an SSB for the usual suspects and easily jump to them using the app switcher.</p>
<p><img src="https://xenodium.github.io/images/add-site-specific-browsers-to-your-workflow/switcher-small.png" alt=""></p>
<p>More at <a href="https://github.com/dmarmor/osx-chrome-ssb-gui/">OSX Chrome SSB</a> and <a href="http://www.quora.com/Is-there-a-way-to-use-Chrome-as-a-site-specific-browser">Quora thread</a></p>
<p>UPDATE: Enable the Chrome extension to open URLs in default browser.</p>
<p><img src="https://xenodium.github.io/images/add-site-specific-browsers-to-your-workflow/helper.png" alt=""></p>
<p>And choose the default browser to open URLs.</p>
<p><img src="https://xenodium.github.io/images/add-site-specific-browsers-to-your-workflow/default.png" alt=""></p>
]]></description>
    <pubDate>Thu, 23 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sardinia travel bookmarks</title>
<link>https://xenodium.com/sardinia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sardinia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Alghero.</li>
<li>Baja Sardinia.</li>
<li>Budoni.</li>
<li><a href="http://www.sardinianbeaches.com/beaches-of-sardinia/east/baunei/cala-goloritze/">Cala Goloritze, Sardinia</a>.</li>
<li>Castelsardo (gifts maybe?).</li>
<li>Food: Maialetto sardo (Pig), Sebadas, Pardula, Papassinas, Pani e sapa.</li>
<li>L'Asinara boat trip (abandoned penitentiary).</li>
<li>La Pelosa beach.</li>
<li>Nuraghe.</li>
<li>Porto Cervo.</li>
<li>Porto Torres.</li>
<li>San Teodoro.</li>
<li>Stintino (fishing port).</li>
<li>Zedda e Piras vinyards (Alghero).</li>
</ul>
]]></description>
    <pubDate>Mon, 20 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Open closest build file in Emacs</title>
<link>https://xenodium.com/open-closest-build-file-in-emacs</link>
<guid isPermaLink="false">https://xenodium.com/open-closest-build-file-in-emacs</guid>
    <description><![CDATA[<p>Whether it's Makefile, SConstruct, BUILD, or your favorite build file, chances are you have to tweak it from time to time. <code>ar/open-build-file</code> searches your current and parent directories to find a build file.</p>
<pre><code class="language-{.commonlisp">(defvar ar/project-file-names '(&quot;Makefile&quot; &quot;SConstruct&quot; &quot;BUILD&quot;))

(defun ar/parent-directory (path)
  &quot;Get parent directory for PATH.&quot;
  (unless (equal &quot;/&quot; path)
    (file-name-directory (directory-file-name path))))

(defun ar/find-upwards (path filename)
  &quot;Search upwards from PATH for a file named FILENAME.&quot;
  (let ((file (concat path filename))
        (parent (ar/parent-directory (expand-file-name path))))
    (if (file-exists-p file)
        file
      (when parent
        (ar/find-upwards parent filename)))))

(defun ar/open-closest (filename)
  &quot;Open the closest FILENAME in current or parent dirs (handy for finding Makefiles).&quot;
  (let ((closest-file-path (ar/find-upwards (buffer-file-name)
                                                 filename)))
    (when closest-file-path
      (message closest-file-path)
      (switch-to-buffer (find-file-noselect closest-file-path)))
    closest-file-path))

(defun ar/open-build-file ()
  &quot;Open the closest project file in current or parent directory.
For example: Makefile, SConstruct, BUILD, etc.
Append `ar/project-file-names' to search for other file names.&quot;
  (interactive)
  (catch 'found
    (mapc (lambda (filename)
            (when (ar/open-closest filename)
              (throw 'found t)))
          ar/project-file-names)
    (error &quot;No project file found&quot;)))
</code></pre>
]]></description>
    <pubDate>Fri, 17 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Create iOS static fat libraries</title>
<link>https://xenodium.com/create-ios-static-fat-libraries</link>
<guid isPermaLink="false">https://xenodium.com/create-ios-static-fat-libraries</guid>
    <description><![CDATA[<p>Have separate static libraries for different iOS architectures? Stitch 'em up into a single fat library using with lipo:</p>
<pre><code class="language-{.bash">$ lipo -create libOne_i386.a libOne_x86_64.a libOne_armv7.a libOne_arm64.a -output libOne.a
</code></pre>
]]></description>
    <pubDate>Wed, 15 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Settling scores with an org table</title>
<link>https://xenodium.com/settling-scores-with-an-org-table</link>
<guid isPermaLink="false">https://xenodium.com/settling-scores-with-an-org-table</guid>
    <description><![CDATA[<p>Recently kept track of expenses between a group of us. To settle the scores, I emailed an exported HTML table from an org file. This was simple enough and required no external viewer from recepients. The org table, in all its textful glory, looked as follows…</p>
<pre><code class="language-example">
| Date             | Item           |   Charge |
|------------------+----------------+----------|
| [2015-06-18 Thu] | Cash           |    20.00 |
| [2015-07-11 Sat] | Lucky 7        |    42.97 |
| [2015-07-13 Mon] | Santa Maria    |    32.00 |
| [2015-07-12 Sun] | Tayyabs        |    46.00 |
| [2015-07-13 Mon] | The Brass Rail |    39.00 |
| [2015-07-13 Mon] | Underground    |    10.00 |
| [2015-07-10 Fri] | Cash           |    20.00 |
| [2015-07-13 Mon] | Cash           |    20.00 |
| [2015-07-14 Tue] | Cash           |    20.00 |
|------------------+----------------+----------|
|                  | total          | £ 249.97 |
#+TBLFM: @11$3=vsum(@2..@10);£ %.2f
</code></pre>
<p>…while the exported HTML below could be easily pasted on to an email.</p>
<p>Date                 Item             Charge</p>
<hr>
<p>[2015-06-18 Thu]   Cash             20.00
[2015-07-11 Sat]   Lucky 7          42.97
[2015-07-13 Mon]   Santa Maria      32.00
[2015-07-12 Sun]   Tayyabs          46.00
[2015-07-13 Mon]   The Brass Rail   39.00
[2015-07-13 Mon]   Underground      10.00
[2015-07-10 Fri]   Cash             20.00
[2015-07-13 Mon]   Cash             20.00
[2015-07-14 Tue]   Cash             20.00
total            £ 249.97</p>
<pre><code class="language-{=org}">#+TBLFM: @11$3=vsum(@2..@10);£ %.2f
</code></pre>
]]></description>
    <pubDate>Wed, 15 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Recognize new password prompts in Emacs shell</title>
<link>https://xenodium.com/recognize-new-password-prompts-in-emacs-shell</link>
<guid isPermaLink="false">https://xenodium.com/recognize-new-password-prompts-in-emacs-shell</guid>
    <description><![CDATA[<p>At some point, you may come across a trusted command-line utility prompting you for a password, and Emacs shell happily displaying each typed character to the nearby-world to see. Luckily, you can train Emacs to recognize new password prompts and hide the typed characters in modes deriving from comint. Append the password prompt REGEXP:</p>
<pre><code class="language-{.commonlisp">(setq comint-password-prompt-regexp (concat comint-password-prompt-regexp
                                            &quot;\\|&quot;
                                            &quot;Password for red alert:&quot;))
</code></pre>
]]></description>
    <pubDate>Mon, 13 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bosnia and Hercegovina travel bookmarks</title>
<link>https://xenodium.com/bosnia-and-hercegovina-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bosnia-and-hercegovina-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.lonelyplanet.com/bosnia-and-hercegovina/travel-tips-and-articles/ten-reasons-to-visit-bosnia-hercegovina">Ten reasons to visit Bosnia &amp; Hercegovina</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 11 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ireland travel bookmarks</title>
<link>https://xenodium.com/ireland-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ireland-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Skellig_Michael">Skellig Michael</a>.</li>
<li>Fishy Fishy in Kinsale: beautiful town on the water.</li>
<li>Belfast.</li>
<li>Giant's Causeway.</li>
<li>Greyhound dog races at Shelbourne Park.</li>
<li><a href="https://twitter.com/bilderbergh/status/1066223113774514176?s=12">Old library chamber, Trinity College, Dublin</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 11 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Pizza in London</title>
<link>https://xenodium.com/pizza-in-london</link>
<guid isPermaLink="false">https://xenodium.com/pizza-in-london</guid>
    <description><![CDATA[<p>Not tried these yet. Taking note:</p>
<ul>
<li>Bravi Ragazzi (Streatham).</li>
<li>Homeslice (Covent Garden).</li>
<li>Lord Morpeth (Hackney).</li>
<li>Santa Maria (Ealing).</li>
<li>Voodoo Ray's (Dalston).</li>
<li>Well Kneaded Wagon (Date-dependent location).</li>
</ul>
]]></description>
    <pubDate>Thu, 09 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>mp4 to gif</title>
<link>https://xenodium.com/mp4-to-gif</link>
<guid isPermaLink="false">https://xenodium.com/mp4-to-gif</guid>
    <description><![CDATA[<p>Converting mp4 to gif is handy for posting short screencasts. You can convert to gif using ffmpeg and optimize with imagemagick. To install:</p>
<pre><code class="language-{.bash">apt-get install ffmpeg imagemagick (linux)
brew install ffmpeg imagemagick (Mac)
</code></pre>
<p>Convert to gif:</p>
<pre><code class="language-{.bash">ffmpeg -i my.mp4 -pix_fmt rgb24 -r 5 my.gif
</code></pre>
<p>Optimize with:</p>
<pre><code class="language-{.bash">convert -dither none -layers Optimize my.gif my_optimized.gif
</code></pre>
<p>UPDATE: There's also licecap and subsequently optimize with:</p>
<pre><code class="language-{.bash">cat source.gif | gifsicle --colors 256 --optimize=3 --delay=15 &gt; target.gif
</code></pre>
<p>UPDATE: <a href="https://gist.github.com/dergachev/4627207">Also consider for .mov</a>:</p>
<pre><code class="language-{.bash">ffmpeg -i in.mov -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 &gt; out.gif
</code></pre>
]]></description>
    <pubDate>Thu, 09 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Keyboards bookmarks</title>
<link>https://xenodium.com/keyboards-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/keyboards-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.keyboardco.com/blog/index.php/2012/12/an-introduction-to-cherry-mx-mechanical-switches/">An introduction to Cherry MX mechanical switches</a>.</li>
<li><a href="http://www.codekeyboards.com">Code keyboard</a>.</li>
<li><a href="https://ethanaa.com/blog/i-%E2%99%A5-keyboards/#silver">I ♥ Keyboards | Ethan Anderson</a>.</li>
<li><a href="https://blog.keyboard.io/">Keyboardio Blog</a>.</li>
<li><a href="https://www.keychron.com/">Keychron | Wireless Mechanical Keyboards for Mac, Windows and phones</a>.</li>
<li><a href="https://colemak.com/Learn">Learn - Colemak keyboard layout</a>.</li>
<li><a href="https://mechdb.net/">Mechanical Keyboards Database - custom keyboards photos</a>.</li>
<li><a href="https://5z6p.com/products/plaid-through-hole/">Plaid // Keyboard base board</a>.</li>
<li><a href="https://ultimatehackingkeyboard.com/shop">Products – Ultimate Hacking Keyboard</a>.</li>
<li><a href="https://www.reddit.com/r/cyberDeck/">r/cyberDeck</a>.</li>
<li><a href="https://www.reddit.com/r/ErgoMechKeyboards/">r/ErgoMechKeyboards</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17989303">Ultimate Hacking Keyboard (Hacker News)</a>.</li>
<li><a href="http://sittingscribe.com/why-learn-the-colemak-keyboard-layout/">Why Learn the Colemak Keyboard Layout?</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 06 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>United States travel bookmarks</title>
<link>https://xenodium.com/united-states-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/united-states-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.abandonedamerica.us/">Abandoned America</a>.</li>
<li><a href="https://www.lonelyplanet.com/usa/travel-tips-and-articles/americas-best-food-cities-for-travelers-on-a-budget/40625c8c-8a11-5710-a052-1479d2756c74">America's best food cities for travelers on a budget - Lonely Planet</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Antelope_Canyon">Antelope Canyon (Arizona)</a>.</li>
<li><a href="https://www.statelibraryofiowa.org/services/collections/law-library">Law Library in Iowa</a>.</li>
<li><a href="https://qr.ae/pGIlFt">Peter Wade's answer has restaurants throughout the US</a>.</li>
<li><a href="https://duckduckgo.com/?q=Supai%252C+Arizona&amp;t=ffab&amp;iax=1&amp;ia=images">Supai, Arizona</a>.</li>
<li><a href="https://texastriffidranch.com/">The Texas Triffid Ranch | Dallas's Pretty Much Only Carnivorous Plant Gallery</a>.</li>
<li><a href="https://duckduckgo.com/?q%3DTurnip%2BRock%2Bin%2BPort%2BAustin%252C%2BMichigan&amp;t%3Dffab&amp;iax%3D1&amp;ia%3Dimages">Turnip Rock in Port Austin, Michigan</a>.</li>
<li><a href="https://twitter.com/EarthPix/status/613912754227965952/photo/1">Vance Creek Bridge in Washington</a>.</li>
<li><a href="https://www.wta.org/">Washington trail association (hiking)</a>.</li>
<li><a href="https://www.quora.com/Where-can-I-afford-to-live-in-NYC-with-a-100-000-salary-and-no-debt">Where can I afford to live in NYC with a $100,000 salary and no debt? (Quora)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 05 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Lebanon travel bookmarks</title>
<link>https://xenodium.com/lebanon-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/lebanon-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Baatara_gorge_waterfall">Baatara gorge waterfall</a>.</li>
<li><a href="https://www.instagram.com/steakcrush">STEAK CRUSH (@steakcrush)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 05 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Slovenia travel bookmarks</title>
<link>https://xenodium.com/slovenia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/slovenia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://wildswim.com/lake-bohinj">Lake Bohinj</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 05 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Belgium travel bookmarks</title>
<link>https://xenodium.com/belgium-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/belgium-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/planetepics/status/617003120695099392/photo/1">The Flower Carpet event at the Grand-Place in Brussels</a>.</li>
<li><a href="https://zerokspot.com/weblog/2020/02/03/travel-arrangements-brussels/">Travel arrangements around Brussels - zerokspot.com</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 05 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Fishing with Emacs</title>
<link>https://xenodium.com/fishing-with-emacs</link>
<guid isPermaLink="false">https://xenodium.com/fishing-with-emacs</guid>
    <description><![CDATA[<p>OK not quite, but having recently learned about <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Appending-Kills.html">C-M-w (append-next-kill)</a>, I used it in a keyboard macro to fish out matching lines. This is similar to <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Other-Repeating-Search.html">flush-lines</a>, except the kill ring is also populated. This is handy, if you need the flushed lines. Here's an example.</p>
<p><img src="https://xenodium.github.io/images/fishing-with-emacs/fishing.gif" alt=""></p>
<p>Here's the equivalent in Emacs lisp:</p>
<pre><code class="language-{.commonlisp">(defun flush-kill-lines (regex)
  &quot;Flush lines matching REGEX and append to kill ring.  Restrict to \
region if active.&quot;
  (interactive &quot;sFlush kill regex: &quot;)
  (save-excursion
    (save-restriction
      (when (use-region-p)
        (narrow-to-region (point) (mark))
        (goto-char 0))
      (while (search-forward-regexp regex nil t)
        (move-beginning-of-line nil)
        (kill-whole-line)))))
</code></pre>
]]></description>
    <pubDate>Fri, 03 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>California travel bookmarks</title>
<link>https://xenodium.com/california-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/california-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Sequoia_National_Park">General Sherman Tree at Sequoia National Park</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 03 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Rebind caps lock to control key on Mac OS X</title>
<link>https://xenodium.com/rebind-caps-lock-to-control-key-on-mac-os-x</link>
<guid isPermaLink="false">https://xenodium.com/rebind-caps-lock-to-control-key-on-mac-os-x</guid>
    <description><![CDATA[<p>Let's see if this one sticks. I'll give caps lock as control a try. Rebinding the keys on Mac OS X is easy enough:</p>
<p><img src="https://xenodium.github.io/images/rebind-caps-lock-to-control-key-on-mac-os-x/caps-lock-to-control.png" alt=""></p>
<blockquote>
<p>System Preferences -&gt; Keyboard -&gt; Keyboard Tab -&gt; Modifier Keys…</p>
</blockquote>
]]></description>
    <pubDate>Wed, 01 Jul 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Searchable ebooks in Emacs</title>
<link>https://xenodium.com/searchable-ebooks-in-emacs</link>
<guid isPermaLink="false">https://xenodium.com/searchable-ebooks-in-emacs</guid>
    <description><![CDATA[<p>If you haven't bought <a href="https://www.masteringemacs.org/book">Mastering Emacs</a> by <a href="https://twitter.com/mickeynp">Mickey Petersen</a>, you should. It's a wonderful source of Emacs tips. Having just finished the ebook on my Kindle, I was keen to go back and fish out some of that newly found wisdom. My immediate reaction was to figure out a way to make the ebook searchable from Emacs.</p>
<p>The ebook is available in epub and pdf format. Though Emacs's docview is super handy for viewing pdf's, searching didn't feel as comfortable as searching in org mode. The epub, on the other hand, proved useful. <a href="http://pandoc.org">Pandoc</a> can easily convert from epub to org.</p>
<pre><code class="language-{.bash">pandoc  --from=epub --to=org mastering-emacs.epub &gt; mastering-emacs.org
</code></pre>
<p>After a some tidying (mostly removing BEGIN_HTML/END_HTML blocks and adding TITLE/AUTHOR), the resulting org file is surprisingly clean and easy to search/navigate. <a href="https://github.com/ShingoFukuyama/helm-swoop">helm-swoop</a> and <a href="https://github.com/emacs-helm/helm/blob/199b9feb396eedc0e502dd767b19060f7dc09f6a/helm-org.el">helm-org-in-buffer-headings</a> are great for that.</p>
<p><img src="https://xenodium.github.io/images/searchable-ebooks-in-emacs/mastering-emacs-org-00.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/searchable-ebooks-in-emacs/mastering-emacs-org-01.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/searchable-ebooks-in-emacs/mastering-emacs-org-02.png" alt=""></p>
]]></description>
    <pubDate>Tue, 30 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Portugal travel bookmarks</title>
<link>https://xenodium.com/portugal-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/portugal-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.quora.com/As-a-Dermatologist-what-life-changing-skin-care-advice-would-you-give-me">As a Dermatologist, what life changing skin care advice would you give me?</a>.</li>
<li><a href="https://duckduckgo.com/?q=avenida+dos+platanos&amp;ia=images">Avenida dos Platanos</a>.</li>
<li><a href="https://brunoamaral.eu/page/beautiful-lisbon/">Beautiful Lisbon</a>.</li>
<li><a href="https://www.reddit.com/r/Sardinia/comments/14uwypj/best_restaurants_in_alghero/">Best restaurants in Alghero?</a>.</li>
<li>Boca do inferno.</li>
<li>Cabo da Roca.</li>
<li>Casa dos passarinhos (Steak on hot stone, tuna steak with “mirandesa” sauce, monkfish masada).</li>
<li>Cascais - Guincho.</li>
<li>Cervejaria Ramiro (seafood restaurant in town).</li>
<li>Eduard 7th park.</li>
<li>Estoril.</li>
<li>Fox Trot (bar).</li>
<li><a href="https://en.wikipedia.org/wiki/Hachij%C5%8D-jima">Hachijō-jima island</a>.</li>
<li><a href="https://duckduckgo.com/?q=ilha+da+culatra&amp;t=ffab&amp;iax=1&amp;ia=images">Ilha da Culatra (good for families)</a>.</li>
<li><a href="https://duckduckgo.com/?q=ilha+da+tavira&amp;t=ffab&amp;iax=1&amp;ia=images">Ilha da Tavira (good for food @ Portas do Mar)</a>.</li>
<li><a href="https://duckduckgo.com/?q=ilha+deserta&amp;t=ffab&amp;iax=1&amp;ia=images">Ilha Deserta (seafood as Estaminé)</a>.</li>
<li>Jeronimos Monastery (Lisbon).</li>
<li>Lisbon Castle.</li>
<li><a href="https://www.lisbonlux.com/lisbon-shops/mercado-da-ribeira.html">Mercado da Ribeira in Lisbon</a>.</li>
<li>Mouro's castle (Sintra).</li>
<li>Mouro's castle.</li>
<li>Pasteis de Belem (Lisbon).</li>
<li>Pastelaria piriquita eat queijadas de sintra.</li>
<li>Pasteleria Piriquita (Sintra).</li>
<li>Pavilhao Chines (bar).</li>
<li>Pena's Pallace (must see if you go to sintra)</li>
<li>Pena's Pallace (Sintra).</li>
<li>Pensao do Amor (bar).</li>
<li><a href="https://www.etfoodvoyage.com/category/locations/portugal/">Portugal Archives - ET Food Voyage</a>.</li>
<li>Praça do comercio.</li>
<li>Quinta da Regaleira</li>
<li>Quinta da Regaleira (Sintra).</li>
<li>Sintra village</li>
<li><a href="https://en.wikipedia.org/wiki/Sintra">Sintra</a>.</li>
<li>Stop do bairro (tamboril rice, prawn curry, and seafood rice).</li>
<li><a href="http://www.surfcastle.com/surf/school">Surfcastle</a>.</li>
<li><a href="https://twitter.com/archpng/status/1115037292752723968">São Bento railway station</a>.</li>
<li>Sé (Lisbon Cathedral).</li>
<li><a href="https://twitter.com/lonelyplanet/status/612282216635363328/photo/1">The best beaches in Portugal's Algarve</a>.</li>
<li>Torre Belem (Lisbon).</li>
<li><a href="https://www.eventbrite.com/e/web-summit-ladies-craft-night-tote-bag-embroidery-workshop-tickets-51503431149">Web Summit Ladies Craft Night - Tote Bag Embroidery Workshop Tickets, Tue, Nov 6, 2018 at 7:00 PM (Eventbrite)</a>.</li>
<li><a href="https://www.quora.com/What-tips-would-you-give-to-a-newbie-who-wants-to-travel-like-you">What tips would you give to a newbie who wants to travel like you? - Quora</a>.</li>
<li><a href="https://edition.cnn.com/travel/article/world-longest-pedestrian-suspension-bridge-portugal-arouca/index.html">World's longest pedestrian suspension bridge</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 21 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bulgaria travel bookmarks</title>
<link>https://xenodium.com/bulgaria-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bulgaria-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/EarthPix/status/612661559018528768/photo/1">Devetashka Cave</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 21 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Presenting bookmarks</title>
<link>https://xenodium.com/presenting-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/presenting-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://s.hbr.org/1A4l5OX">How to give a presentation people will remember</a>.</li>
<li><a href="http://s.hbr.org/1A3uvKp">How to give a stellar presentation</a>.</li>
<li><a href="http://www.troyhunt.com/2015/06/speaker-style-bingo-10-presentation.html?m%3D1">Speaker style bingo: 10 presentation anti-patterns</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 21 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bali travel bookmarks</title>
<link>https://xenodium.com/bali-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bali-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lonelyplanet.com/indonesia/nusa-tenggara/gili-islands">Gili Islands travel (Nusa Tenggara, Indonesia - Lonely Planet)</a>.</li>
<li><a href="https://snorkelaroundtheworld.com/2018/09/manta-snorkeling-nusa-penida/">Manta snorkeling Nusa Penida – When? Where? How much?</a>.</li>
<li>Pura Lempuyang, Bali.</li>
</ul>
]]></description>
    <pubDate>Sun, 21 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>WWDC app for OS X</title>
<link>https://xenodium.com/wwdc-app-for-os-x</link>
<guid isPermaLink="false">https://xenodium.com/wwdc-app-for-os-x</guid>
    <description><![CDATA[<p><a href="https://github.com/insidegui">Guilherme Rambo</a> created a great OS X <a href="https://github.com/insidegui/WWDC">OS X app for viewing WWDC content</a>. Just installed it. Super handy. Thanks. Installing as simple as:</p>
<pre><code class="language-{.bash">$ brew cask install wwdc
</code></pre>
]]></description>
    <pubDate>Wed, 17 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Debugging Objective-C reference cycles</title>
<link>https://xenodium.com/debugging-objective-c-reference-cycles</link>
<guid isPermaLink="false">https://xenodium.com/debugging-objective-c-reference-cycles</guid>
    <description><![CDATA[<p>Overriding retain/release/autorelease may be handy while debugging:</p>
<pre><code class="language-objc">- (instancetype)retain {
  NSLog(@&quot;%p, retain\n&quot;, self);
  return [super retain];
}

- (oneway void)release {
  NSLog(@&quot;%p, release\n&quot;, self);
  [super release];
}

- (instancetype)autorelease {
  NSLog(@&quot;%p, autorelease\n&quot;, self);
  return [super autorelease];
}
</code></pre>
]]></description>
    <pubDate>Mon, 15 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>London grub</title>
<link>https://xenodium.com/london-grub</link>
<guid isPermaLink="false">https://xenodium.com/london-grub</guid>
    <description><![CDATA[<p>Beyond the hype, buzz, and pricey gimmicks… Places to eat in London:</p>
<ul>
<li>Antipode.</li>
<li>Arang.</li>
<li>Bone Daddies.</li>
<li>Gelupo.</li>
<li>Grind.</li>
<li>Holy Cow.</li>
<li>Kerbisher and Malt.</li>
<li>Kulu Kulu (South Ken).</li>
<li>Le Relais de Venise.</li>
<li>Lucky 7's.</li>
<li>Royal China.</li>
<li>Shree Krishna Vada Pav.</li>
<li>Sri Suwoon.</li>
<li>Tayyabs.</li>
<li>The Cow.</li>
<li>Tonkotsu.</li>
</ul>
]]></description>
    <pubDate>Sat, 13 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>My working playlist</title>
<link>https://xenodium.com/my-working-playlist</link>
<guid isPermaLink="false">https://xenodium.com/my-working-playlist</guid>
    <description><![CDATA[<p>It's been a while since I spotted <a href="http://www.asianefficiency.com/motivation/music-working/">The Ultimate Music Collection for Getting Work Done</a>. Since then, I've been on the lookout for music to work to. Some favorites:</p>
<ul>
<li><a href="https://play.google.com/store/music/album/B_Fleischmann_I_m_Not_Ready_For_The_Grave_Yet?id%3DBvu3fq5u5nbqcouo55bqi5qukjq">B. Fleischmann - I'm Not Ready For The Grave Yet</a>.</li>
<li><a href="https://play.google.com/store/music/album/B_Fleischmann_Pop_Loops_For_Breakfast?id%3DB55lzvhp5xn2mkrzggq2uymiwm4">B. Fleischmann - Pop Loops For Breakfast</a>.</li>
<li><a href="https://play.google.com/store/music/album/B_Fleischmann_Sidonie?id%3DBu5v5pc4ixxzapcoehnpllfvm5u">B. Fleischmann - Sidonie</a>.</li>
<li><a href="https://play.google.com/store/music/album/B_Fleischmann_The_Humbucking_Coil?id%3DBok7yvyylg7ddkofaaecjdsduky">B. Fleischmann - The Humbucking Coil</a>.</li>
<li><a href="https://play.google.com/store/music/album/Stars_of_the_Lid_The_Tired_Sounds_of_Stars_of_the?id%3DBasr7yt6jlsut3v2tpua7kfcckm">B. Fleischmann - The Tired Sounds of Stars of the Lid</a>.</li>
<li><a href="https://play.google.com/store/music/album/B_Fleischmann_Welcome_Tourist?id%3DByefc55y7psyxg4okrq63mn4nne">B. Fleischmann - Welcome Tourist</a>.</li>
<li><a href="https://play.google.com/store/music/album/Bexar_Bexar_Haralambos?id%3DBpyhpbxh6b4wthiczeokgiuijo4">Bexar Bexar - Haralambos</a>.</li>
<li><a href="https://play.google.com/store/music/album/Budhaditya_Mukherjee_Sitar_Recital?id%3DBtawoyja7nxl2arsuimelitwzay">Budhaditya Mukherjee - Sitar Recital</a>.</li>
<li><a href="https://play.google.com/store/music/album/Daft_Punk_TRON_Legacy?id%3DBbcjlhafmpp5ueztndxevp4cfuq">Daft Punk - TRON: Legacy</a>.</li>
<li><a href="https://play.google.com/store/music/album/General_Fuzz_Soulful_Filling?id%3DB7rb24bzexr2q5bfjzffhvdd5he">General Fuzz - Soulful Filling</a>.</li>
<li><a href="https://play.google.com/store/music/album/Hans_Zimmer_Inception_Music_From_The_Motion_Pictur?id%3DBoebgqwhs6bsgytjw2eybh7jiny">Inception (Music From The Motion Picture)</a>.</li>
<li><a href="https://play.google.com/store/music/album/ISAN_Lucky_Cat?id%3DBjuvgzm2mocch55nolmbsjenaxy">ISAN - Lucky Cat</a>.</li>
<li><a href="https://play.google.com/store/music/album/ISAN_Plans_Drawn_In_Pencil?id%3DBmp2y6k5bstvqlnzn2ncexcyolq">ISAN - Plans Drawn In Pencil</a>.</li>
<li><a href="https://play.google.com/store/music/album/Jayanthi_Kumaresh_Mysterious_Duality?id%3DByrdsgd3b7ixcouemqqouxf45ia">Jayanthi Kumaresh - Mysterious Duality</a>.</li>
<li><a href="https://play.google.com/store/music/album/Mogwai_Les_Revenants?id%3DBu2zb5nvoth3ead6v5riw43by7u">Mogwai - Les Revenants</a>.</li>
<li><a href="https://play.google.com/store/music/album/Moondog_Big_Cat?id%3DB2hq6dlicqboshlev5eeiy53ybe">Moondog - Big Cat</a>.</li>
<li><a href="https://play.google.com/store/music/album/Various_Artists_Moonrise_Kingdom_Original_Soundtra?id%3DB5babupzgcigh6jdprp3ga3owzm">Moonrise Kingdom (Original Soundtrack)</a>.</li>
<li><a href="https://play.google.com/store/music/album/Nico_Muhly_Drones?id%3DBlj2wetseui4m5gfjjk5lssenui">Nico Muhly - Drones</a>.</li>
<li><a href="https://play.google.com/store/music/album/Paul_Leonard_Morgan_Limitless_Original_Motion_Pict?id%3DBev5grya2zxgojikqwkdcxmdijq">Paul Leonard-Morgan - Limitless (Original Motion Picture Soundtrack)</a>.</li>
<li><a href="https://play.google.com/store/music/album/Robert_Scott_Thompson_Upon_the_Edge_of_Night?id%3DBpkg77vpxsfgu4dj53y5ucxa4qe">Robert Scott Thompson - Upon the Edge of Night</a>.</li>
<li><a href="https://play.google.com/store/music/album/Ryan_Miller_The_Kings_of_Summer_Jordan_Vogt_Robert?id%3DBx2mxfujrx5mjkqq6mm23zwzj54">Ryan Miller - The Kings of Summer (Jordan Vogt-Roberts' Original Motion Picture Soundtrack)</a>.</li>
<li><a href="https://play.google.com/music/listen#/album//Stars%2Bof%2Bthe%2BLid/And%2BTheir%2BRefinement%2Bof%2Bthe%2BDecline">Stars of the Lid - And Their Refinement of the Decline</a>.</li>
<li><a href="https://play.google.com/store/music/album/Stars_of_the_Lid_Gravitational_Pull_vs_The_Desire?id%3DBdnfpvqwopgqufuy2ly6u3lkhvy">Start of the Lid - Gravitational Pull vs. The Desire for an Aquatic Life</a>.</li>
<li><a href="https://play.google.com/store/music/album/Terry_Riley_Terry_Riley_A_Rainbow_In_Curved_Air_Po?id%3DBmfe6h2d7heiey4xz74ocg6sx6e">Terry Riley - A Rainbow In Curved Air; Poppy Nogood and the Phantom Band</a>.</li>
<li><a href="http://www.amazon.com/Social-Network-Trent-Reznor-Atticus/dp/B0044430H8/ref%3Dtmm_msc_swatch_0?_encoding%3DUTF8&amp;sr%3D&amp;qid%3D">Trent Reznor &amp; Atticus Ross - The Social Network (Soundtrack from the Motion Picture)</a>.</li>
<li><a href="https://play.google.com/store/music/album/Trentem%25C3%25B8ller_Into_The_Great_Wide_Yonder?id%3DBf6v47rm3dvgrjaircusjtocbfq">Trentemøller - Into The Great Wide Yonder</a>.</li>
<li><a href="https://play.google.com/store/music/album/Tycho_Awake?id%3DBtc34r45fy7qwk4t6irzpkduv4a">Tycho - Awake</a>.</li>
<li><a href="https://play.google.com/store/music/album/Various_Artists_Singing_Strings_From_India?id%3DBvkavd7gn62io3lmskjsbgpvtvy">Various Artists - Singing Strings From India</a>.</li>
<li><a href="http://www.vitling.com/toys/triple_saw/">vitling: Triple Saw (algorithmic music) #algorave</a>.</li>
<li><a href="https://play.google.com/store/music/album/Justin_Hurwitz_Whiplash_Original_Motion_Picture_So?id%3DBfdbec3biny47s6rwchdifzgrg4">Whiplash (Original Motion Picture Soundtrack)</a>.</li>
<li><a href="https://play.google.com/store/music/album/Youth_Lagoon_The_Year_Of_Hibernation?id%3DBfw6onp7zxplpmlrheu3rmd3yui">Youth Lagoon - The Year Of Hibernation</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 08 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Xcode bookmarks</title>
<link>https://xenodium.com/xcode-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/xcode-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://medium.com/ios-os-x-development/a-better-way-to-automatically-merge-changes-in-your-xcode-project-files-3d83b3583fe4#.hz33egjv1">A Better Way to Automatically Merge Changes in Your XCode Project Files</a>.</li>
<li><a href="http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;qid=1444472656&amp;sr=8-1&amp;keywords=Clean+Code%3A+A+Handbook+of+Agile+Software+Craftsmanship">Clean Code: A Handbook of Agile Software Craftsmanship (Book)</a>.</li>
<li><a href="https://medium.com/passei-direto-product-and-technology/from-xcode-to-testflight-using-command-line-288c3a85bd93">From Xcode to TestFlight using command line</a>.</li>
<li><a href="https://github.com/FuzzyAutocomplete/FuzzyAutocompletePlugin/blob/master/README.md">Fuzzy autocomplete for Xcode</a>.</li>
<li><a href="https://github.com/kolinkrewinkel/Multiplex">Multiplex (like Emacs multiple cursor but for Xcode)</a>.</li>
<li><a href="http://chen.do/blog/2013/10/22/reverse-engineering-xcode-with-dtrace/">Reverse-engineering Xcode with dtrace</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Costa Rica travel bookmarks</title>
<link>https://xenodium.com/costa-rica-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/costa-rica-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/planetepics/status/603851463509540864/photo/1">Catarata del Toro</a>.</li>
<li><a href="https://www.quora.com/What-are-the-best-travel-hacks-when-traveling-to-Costa-Rica">What are the best travel hacks when traveling to Costa Rica? (Quora)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Australia travel bookmarks</title>
<link>https://xenodium.com/australia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/australia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.lonelyplanet.com/australia/sydney/travel-tips-and-articles/australias-best-food-experiences-state-by-state">Australia's best food experiences: state by state</a>.</li>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/best-queensland-island-escapes-for-small-budgets">Best Queensland island escapes for small budgets</a>.</li>
<li><a href="http://myproducetrail.com.au/directory/215">Des and Debi O’Tooles Honey</a>.</li>
<li>Fish and chips at Bondi beach.</li>
<li><a href="https://www.lonelyplanet.com/australia/tasmania/travel-tips-and-articles/tasmania-the-formidable-isle-thats-wild-at-heart">Tasmania: the isle that's wild at heart</a>.</li>
<li>The Butler Potts Point (bar &amp; restaurant).</li>
<li><a href="https://www.tripadvisor.com/Attraction_Review-g488368-d2415480-Reviews-Tree_Top_Walk-Walpole_Western_Australia.html">Tree Top Walk (Walpole, Australia): Top Tips Before You Go - TripAdvisor</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Samoa travel bookmarks</title>
<link>https://xenodium.com/samoa-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/samoa-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.samoa.travel/activity/to-sua-ocean-trench">To Sua ocean trench</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Norway travel bookmarks</title>
<link>https://xenodium.com/norway-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/norway-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/archpics/status/613586879645155328/photo/1">Atlantic Road</a>.</li>
<li>Bergen (check out colorful wooden houses).</li>
<li>Bergen railway (Bergen-Oslo): 300 miles of beautiful Norwegian scenery.</li>
<li><a href="http://www.lofoten-info.no/">Lofoten Islands</a>.</li>
<li>Norwegian Air (cheap flights between all the</li>
<li><a href="https://duckduckgo.com/?q=olden+norway&amp;t=ffab&amp;iax=1&amp;ia=images">Olden</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Reine">Reine</a>.</li>
<li><a href="https://www.pinterest.com/pin/377950593706704729/?utm_campaign%3Drecs_150817&amp;utm_term%3D1&amp;utm_content%3D377950593706704729&amp;e_t%3Dbce987c654c54dfa8733bc2f9df20080&amp;utm_source%3D31&amp;e_t_s%3Dpins&amp;utm_medium%3D2004">Sakrisøy, Lofoten Islands</a>.</li>
<li><a href="https://duckduckgo.com/?q=Spitsbergen&amp;t=ffsb&amp;iax=1&amp;ia=images">Spitsbergen</a>.</li>
<li><a href="http://www.theatlanticroad.com/">The Atlantic Road - Atlanterhavsveien / Atlanterhavsvegen</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Los Angeles travel bookmarks</title>
<link>https://xenodium.com/los-angeles-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/los-angeles-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.beerbellyla.com/">Beer Belly (Craft Beer + Crafty Food)</a>.</li>
<li><a href="http://www.bluestardonuts.com/">Blue Star Donuts (SF + LA)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 02 Jun 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Mastering Emacs is out</title>
<link>https://xenodium.com/mastering-emacs-is-out</link>
<guid isPermaLink="false">https://xenodium.com/mastering-emacs-is-out</guid>
    <description><![CDATA[<p>Emacs is amazingly alive. New packages are regularly listed on <a href="http://melpa.org">melpa</a> and a new book just came out: <a href="https://www.masteringemacs.org/book">Mastering Emacs</a> by <a href="https://twitter.com/mickeynp">Mickey Petersen</a>.</p>
<p><a href="https://www.masteringemacs.org/book"><img src="https://xenodium.github.io/images/mastering-emacs-is-out/cover.png" alt=""></a></p>
]]></description>
    <pubDate>Thu, 28 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>South Carolina travel bookmarks</title>
<link>https://xenodium.com/south-carolina-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/south-carolina-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Angel_Oak">Angel Oak tree</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Colorado travel bookmarks</title>
<link>https://xenodium.com/colorado-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/colorado-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://horseshoebend.com/">Horseshoe Bend</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cuzco travel bookmarks</title>
<link>https://xenodium.com/cuzco-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cuzco-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Gelatina de patita (mercado)</li>
<li>Yolanda. Adobo/chicarron. Chicarroneria Yoli.</li>
<li>Pan de chocolate Oropeza.</li>
<li>La esquina de los lechones y tamales dulces de Sra Elsa.</li>
<li>Cafe el Ayllu (lengua de suegra)</li>
<li>La Chomba (picanteria). Costillar frito. Frutillada. Chicharron. Ubre. Tripa.</li>
<li>La quinta Eulaia. Asado y chicarron. Rocoto. Humita.</li>
<li>Chicheria la loba.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Bash bookmarks</title>
<link>https://xenodium.com/bash-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/bash-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://linuxhint.com/bash_conditional_statement/">Bash conditional statement (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/bash_echo/">Bash Echo Examples (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/bash_error_handling/">Bash Error Handling (Linux Hint)</a>.</li>
<li><a href="https://linuxhint.com/bash_for_loop/">Bash for loop examples (Linux Hint)</a>.</li>
<li><a href="https://www.gnu.org/software/bash/manual/bashref.html">Bash Reference Manual</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11832941">Common shell script mistakes (Hacker News)</a>.</li>
<li><a href="http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming">Defensive bash programming</a>.</li>
<li><a href="https://www.cyberciti.biz/faq/linux-unix-bash-for-loop-one-line-command/">HowTo: Use bash For Loop In One Line - nixCraft</a>.</li>
<li><a href="http://www.etalabs.net/sh_tricks.html">Rich’s sh (POSIX shell) tricks</a>.</li>
<li><a href="https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md">Safe ways to do things in bash</a>.</li>
<li><a href="https://github.com/koalaman/shellcheck">shellcheck: ShellCheck, a static analysis tool for shell scripts</a>.</li>
<li><a href="https://linuxhint.com/string_concatenation_bash/">String concatenation in bash (Linux Hint)</a>.</li>
<li><a href="http://bash.academy">The Bash Academy</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>restclient.el</title>
<link>https://xenodium.com/restclient.el</link>
<guid isPermaLink="false">https://xenodium.com/restclient.el</guid>
    <description><![CDATA[<p>Installed <a href="https://github.com/pashky/restclient.el">Pashky's</a> <a href="https://github.com/pashky/restclient.el">restclient.el</a> Emacs package. Super helpful when trying out REST APIs.</p>
<p><img src="https://xenodium.github.io/images/restclient.el/restclient.png" alt=""></p>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Seatle travel bookmarks</title>
<link>https://xenodium.com/seatle-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/seatle-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.lonelyplanet.com/usa/seattle/travel-tips-and-articles/14-free-things-to-do-in-seattle">14 free things to do in Seattle</a>.</li>
<li><a href="https://indichocolate.com/">Indi chocolate</a>.</li>
<li><a href="https://www.lepanier.com/">Le Panier</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Berlin travel bookmarks</title>
<link>https://xenodium.com/berlin-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/berlin-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.topinspired.com/top-10-things-to-do-in-berlin/">10 things to do in Berlin</a>.</li>
<li><a href="http://www.angloitalianfollowus.com/berlin-on-a-budget">Berlin On A Budget: Our Slow Travel Guide</a>.</li>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/69756">Perfect day in Berlin</a>.</li>
<li><a href="http://www.lonelyplanet.com/germany/berlin/travel-tips-and-articles/75972">The best of hidden Berlin</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Skeuomorph</title>
<link>https://xenodium.com/skeuomorph</link>
<guid isPermaLink="false">https://xenodium.com/skeuomorph</guid>
    <description><![CDATA[<p>From <a href="https://en.wikipedia.org/wiki/Skeuomorph">Wikipedia</a>, skeuomorph <em>ˈskjuːəmɔrf</em> is a derivative object that retains ornamental design cues from structures that were necessary in the original. Examples include pottery embellished with imitation rivets reminiscent of similar pots made of metal and a software calendar that imitates the appearance of binding on a paper desk calendar.</p>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>define-word</title>
<link>https://xenodium.com/define-word</link>
<guid isPermaLink="false">https://xenodium.com/define-word</guid>
    <description><![CDATA[<p>Installed <a href="https://github.com/abo-abo">Abo Abo's</a> <a href="https://github.com/abo-abo/define-word">define-word</a> Emacs package. A handy package to define words at point.</p>
<p><img src="https://xenodium.github.io/images/define-word/define-word.png" alt=""></p>
]]></description>
    <pubDate>Mon, 25 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flushing empty lines in Emacs</title>
<link>https://xenodium.com/flushing-empty-lines-in-emacs</link>
<guid isPermaLink="false">https://xenodium.com/flushing-empty-lines-in-emacs</guid>
    <description><![CDATA[<p>Via <a href="https://www.masteringemacs.org">masteringemacs.org</a>, <a href="https://www.masteringemacs.org/article/removing-blank-lines-buffer">removing blank lines in a buffer</a>:</p>
<pre><code class="language-example">M-x flush-lines RET ^$ RET
</code></pre>
]]></description>
    <pubDate>Fri, 22 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Regex bookmarks</title>
<link>https://xenodium.com/regex-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/regex-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://ergoemacs.org/emacs/emacs_regex.html">Emacs: Text Pattern Matching (regex) tutorial</a>.</li>
<li><a href="https://dev.to/emmawedekind/regex-cheat-sheet-2j2a">Regex Cheat Sheet (DEV Community)</a>.</li>
<li><a href="http://regexrenamer.sourceforge.net/help/regex_quickref.html">Regex quick reference</a>: From regexrenamer.</li>
<li><a href="https://news.ycombinator.com/item">RegExr, see hacker news comments for other suggestions</a>.</li>
<li><a href="http://regexr.com/">RegExr: A website for interactive regex prototyping with syntax highlighting</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 22 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Write to temp iOS snippet</title>
<link>https://xenodium.com/write-to-temp-ios-snippet</link>
<guid isPermaLink="false">https://xenodium.com/write-to-temp-ios-snippet</guid>
    <description><![CDATA[<pre><code class="language-objc">NSString *tempDir = NSTemporaryDirectory();
NSLog(@&quot;%@\n&quot;, tempDir);
NSString *dataFilePath = [tempDir stringByAppendingPathComponent:@&quot;my.file&quot;];
[data writeToFile:dataFilePath atomically:YES];
</code></pre>
]]></description>
    <pubDate>Wed, 06 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Greece travel bookmarks</title>
<link>https://xenodium.com/greece-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/greece-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://island-ikaria.com/villages/Armenistis">Armenistis - Ikaria</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Hydra_%2528island%2529">Hydra (island). No cars or motorcycles allowed</a>.</li>
<li><a href="https://twitter.com/planetepics/status/584886491534471168/photo/1">Kathisma Beach - Lefkada</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Cephalonia">Kefalonia Island</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Melissani_Cave">Melissani Cave</a>.</li>
<li><a href="https://duckduckgo.com/?q=monemvasia+greece&amp;iac=1">Momnevasia</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Navagio">Navagio bay</a>.</li>
<li><a href="http://www.milos-island.gr/beaches/papafragas-beach.html">Papafragas beach</a>.</li>
<li><a href="https://duckduckgo.com/?q=preveza&amp;t=ffab&amp;iax=images&amp;ia=images">Preveza at DuckDuckGo</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sri Lanka travel bookmarks</title>
<link>https://xenodium.com/sri-lanka-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/sri-lanka-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://exploreslk.com/ambuluwawa-temple/">Ambuluwawa Temple</a>.</li>
<li><a href="https://www.nomadicmatt.com/travel-blogs/sri-lanka-trip-planning-guide/">Sri Lanka Travel Guide | Best Tips For Your Trip (Nomadic Matt)</a>.</li>
<li><a href="https://www.lonelyplanet.com/amp/articles/best-train-rides-sri-lanka">The best train journeys in Sri Lanka</a>.</li>
<li><a href="http://www.agoda.com/the-safari-hotel/hotel/yala-lk.html%20">The Safari Hotel (great area to go on safari, see leopards)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Switzerland travel bookmarks</title>
<link>https://xenodium.com/switzerland-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/switzerland-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Bernina_railway">Bernina railway</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Lauterbrunnen">Lauterbrunnen village</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Lion_Monument">Lion Monument (Lucerne)</a>.</li>
<li><a href="http://www.luzern.com/en/index.cfm">Lucerne lake/city</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Oeschinen_Lake">Oeschinen Lake</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Thailand travel bookmarks</title>
<link>https://xenodium.com/thailand-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/thailand-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.traveller.com.au/bangkok-street-food-restaurant-raan-jay-fai-awarded-with-michelin-star-h03h7v">Best Thai street food: Bangkok stall Raan Jay Fai awarded with Michelin star</a>.</li>
<li><a href="http://www.thebuddhism.net/2012/07/11/buddha-statue-in-forest-pak-chong-thailand/">Buddha Statue in Forest Pak Chong</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Phanom_Rung_Historical_Park">Phanom Rung Historical Park</a>.</li>
<li><a href="https://twitter.com/archpics/status/607334981971623936/photo/1">Rama IX park, Bangkok</a>.</li>
<li><a href="https://duckduckgo.com/?q=Sanctuary+of+truth%2C+Thailand+&amp;t=ffsb&amp;iax=1&amp;ia=images">Sanctuary of Truth</a>.</li>
<li><a href="https://www.quora.com/What-makes-Bangkok-so-popular">What makes Bangkok so popular? (Quora)</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Madagascar travel bookmarks</title>
<link>https://xenodium.com/madagascar-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/madagascar-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://en.wikipedia.org/wiki/Avenue_of_the_Baobabs">Avenue of the Baobabs</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hong Kong travel bookmarks</title>
<link>https://xenodium.com/hong-kong-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/hong-kong-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://hongkongthrumyeyes.com/2013/07/13/crowd-of-pedestrians-crossing-at-sogo-in-causeway-bay/">Causeway Bay pedestrian crossing</a>.</li>
<li><a href="http://www.lonelyplanet.com/china/travel-tips-and-articles/75797">Hong Kong's most breathtaking views: where to glimpse the city from above</a>.</li>
<li><a href="http://www.hotel-icon.com/">Hotel Icon (allegedly amazing service/extras)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Lin_Heung_Tea_House">Lin Heung Tea House (bakery/tea/dim sum)</a>.</li>
<li><a href="https://www.tripadvisor.co.uk/Restaurant_Review-g294217-d8028365-Reviews-Mak_s_Noodle_Jordan-Hong_Kong.html">Mak's Noodle (Jordan)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Siu_yuk">Siu yuk (Roasted Pig)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Tsang_Tsou_Choi">Tsang Tsou Choi (King of Hong Kong)</a>.</li>
<li><a href="http://danielfooddiary.com/2014/12/13/tsimchaikee/">Tsim Chai Kee</a> (recommended over Mak's wonton/soup).</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Barcelona travel bookmarks</title>
<link>https://xenodium.com/barcelona-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/barcelona-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.lonelyplanet.com/spain/barcelona/travel-tips-and-articles/77782">18 free things to do in Barcelona</a>.</li>
<li><a href="https://twitter.com/merowing_/status/884349497685549056">Dessert place you can recommend in Barcelona? (Twitter)</a>.</li>
<li><a href="https://www.lapedrera.com/en/home">La Pedrera</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Iceland travel bookmarks</title>
<link>https://xenodium.com/iceland-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/iceland-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.gertenbach.info/e_reisen_2010.htm">An Iceland travel log</a>.</li>
<li><a href="http://www.apartmenthouse.is/">Apartmenthouse.is</a> for local flats.</li>
<li>Blue lagoon spa.</li>
<li><a href="http://citywalk.is/">citywalk.is</a>: Free walking tour.</li>
<li><a href="http://designmarch.is/">Design March</a>.</li>
<li><a href="http://www.iheartreykjavik.net/2015/04/drive-it-yourself-the-snaefellsnes-peninsula/">Drive it yourself: The Snæfellsnes peninsula</a>.</li>
<li><a href="https://www.google.co.uk/maps/place/Efstidalur/@64.2428231,-20.5525875,17z/data%3D!3m1!4b1!4m2!3m1!1s0x48d699ea8baff6ab:0x9c26aa93153abbec?hl%3Den">Efstidalur</a>: farm to table restaurant.</li>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/eight-must-see-spots-in-icelands-wild-west">Eight must-see spots in Iceland's wild west</a>.</li>
<li><a href="http://www.fridrikv.is/en/">Fridrikv restaurant</a>.</li>
<li><a href="http://outfitters.is/en/">Gangleri outfitters</a>.</li>
<li>Golden circle's waterfalls and geysers.</li>
<li><a href="http://www.grillmarkadurinn.is/">grillmarkadurinn.is</a> restaurant.</li>
<li><a href="http://www.smaratun.is/">Horse farm hotel</a>.</li>
<li><a href="http://www.hotelbudir.is/">Hotel Budir</a>.</li>
<li><a href="http://www.lonelyplanet.com/iceland/travel-tips-and-articles/how-to-have-a-budget-break-in-iceland">How to have a budget break in iceland</a>.</li>
<li><a href="https://drive.google.com/a/google.com/file/d/0B_7OFb4eNjNWeEFzM29maE9EUkU/view">Iceland itinerary</a>.</li>
<li><a href="http://www.lebowskibar.is/">Lebowski Bar</a> seriously?</li>
<li>Noodle Station.</li>
<li><a href="http://www.pinkiceland.is/#!tours/cbo8">Pink Iceland tours</a>.</li>
<li><a href="https://swanhouse.is/">Reykjavik Apartment Hotel – Accommodation in City Centre (swanhouse.is)</a>.</li>
<li><a href="https://www.britishairways.com/en-gb/destinations/reykjavik/reykjavik-holidays">Reykjavik City Breaks (Book now with British Airways)</a>.</li>
<li><a href="http://sandholt.is/">Sandholt</a>.</li>
<li>South coast's waterfalls and caves.</li>
</ul>
]]></description>
    <pubDate>Mon, 04 May 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Building clang-format</title>
<link>https://xenodium.com/building-clang-format</link>
<guid isPermaLink="false">https://xenodium.com/building-clang-format</guid>
    <description><![CDATA[<p>Based on instructions from <a href="http://blog.hardcodes.de/articles/63/building-clang-format-and-friends-on-osx-mountain-lion">Building clang-format and friends on OSX Mountain Lion</a>.</p>
<pre><code class="language-{.bash">#!/bin/bash
  set -o nounset
  set -o errexit

  # Based on instructions from:
  # http://blog.hardcodes.de/articles/63/building-clang-format-and-friends-on-osx-mountain-lion

  readonly LLVM_DIR_PATH='/tmp/llvm'

  update_repo() {
    if [[ ! -d $1 ]]; then
      git clone $2
    else
      cd $1
      git pull
      cd ..
    fi
    cd ..
  }

  update_all_repos() {
    update_repo &quot;llvm&quot; &quot;http://llvm.org/git/llvm.git&quot;
    pushd &quot;${LLVM_DIR_PATH}/llvm/tools&quot;
    update_repo &quot;clang&quot; &quot;http://llvm.org/git/clang.git&quot;
    popd
    cd &quot;../../${LLVM_DIR_PATH}/llvm/tools/clang/tools&quot;
    update_repo &quot;clang-tools-extra&quot; &quot;http://llvm.org/git/clang-tools-extra.git&quot;
    cd &quot;../../..&quot;
  }

  build_clang() {
    mkdir -p clang
    mkdir -p build
    cd clang
    ../llvm/configure --enable-libcpp --enable-cxx11 --enable-debug-symbols=no --enable-optimized --prefix=&quot;${LLVM_DIR_PATH}/build&quot;
    make install
  }

  mkdir -p $LLVM_DIR_PATH
  cd ${LLVM_DIR_PATH}
  update_all_repos
  build_clang
</code></pre>
<p>Bonus: use <a href="http://zed0.co.uk/clang-format-configurator/">clang-format-configurator</a>.</p>
]]></description>
    <pubDate>Thu, 30 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Programmatic iOS Auto Layout</title>
<link>https://xenodium.com/programmatic-ios-auto-layout</link>
<guid isPermaLink="false">https://xenodium.com/programmatic-ios-auto-layout</guid>
    <description><![CDATA[<p>Basic iOS auto layout usage. See <a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AdoptingAutoLayout/AdoptingAutoLayout.html">Adopting Auto Layout</a> and <a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage.html">Visual Format language</a> for reference.</p>
<pre><code class="language-objc">- (instancetype)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) {
    // Disable autoresizing mask translation for parent.
    self.translatesAutoresizingMaskIntoConstraints = NO;

    _subview1 = [[UIView alloc] init];
    // Disable autoresizing mask translation for subview.
    _subview1.translatesAutoresizingMaskIntoConstraints = NO;

    _subview1.backgroundColor = [UIColor redColor];
    [self addSubview:_subview1];

    // Creates a dictionary of bindings to be used in visual format.
    NSDictionary *viewBindings = NSDictionaryOfVariableBindings(_subview1);

    // H: horizontal layout
    // |-50- spacing in relation to superview
    // [_subview1(==50)] subview1's width
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@&quot;H:|-50-[_subview1(==50)]&quot;
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewBindings]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@&quot;V:[_subview1(==50)]&quot;
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewBindings]];
  }
  return self;
}
</code></pre>
<h2>Also consider:</h2>
<ul>
<li>A UIView Subclass should implement intrinsicContentSize.</li>
<li>A UIView Subclass should never add constraints on neither itself (ie. self) nor superview.</li>
</ul>
<h2>References</h2>
<ul>
<li><a href="https://medium.com/@NSomar/auto-layout-best-practices-for-minimum-pain-c130b2b1a0f6#.uu0xxmqbr">Auto layout best practices for minimum pain</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 30 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Learning Japanese bookmarks</title>
<link>https://xenodium.com/learning-japanese-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/learning-japanese-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.ihlondon.com/foreign-languages/learn-japanese/beginners-japanese/">Beginners Japanese - International House London</a>.</li>
<li><a href="https://files.tofugu.com/articles/japanese/2016-04-05-hiragana-chart/sasagami-hiragana-chart-sample.jpg">Hiragana stroke table</a>.</li>
<li><a href="https://www.reddit.com/r/LearnJapanese/s/sb0he9nYnQ">I discovered a website that has a list of the most common 6000</a>.</li>
<li><a href="https://www.soas.ac.uk/study/find-course/japanese-beginners-course">Japanese Beginners Course | SOAS</a>.</li>
<li><a href="https://learnjapanese.moe/guide/">Japanese Guide - TheMoeWay</a>.</li>
<li><a href="https://docs.google.com/document/d/1LH82FjsCqCgp6-TFqUcS_EB15V7sx7O1VCjREp6Lexw/edit">Japanese Resources - Google Docs</a>.</li>
<li><a href="https://mangadex.org/title/53c628b3-d1f5-43aa-8df3-080034285cb4/junji-ito-s-cat-diary-yon-mu">Junji Ito's Cat Diary: Yon &amp; Mu (reading)</a>.</li>
<li><a href="https://www.kansaiben.com/">Kansai-ben: Kansai Dialect Self-study Site</a>.</li>
<li><a href="https://www.tofugu.com/japanese/learn-hiragana/">Learn Hiragana: Tofugu's Ultimate Guide</a>.</li>
<li><a href="https://www.reddit.com/r/LearnJapanese/comments/1gdfrqg/sites_to_practice_japanese_reading">Sites to practice Japanese reading? </a>.</li>
<li><a href="https://jpf.org.uk/language/courses.php">The Japan Foundation, London - Language Centre - Japanese Language Courses</a>.</li>
<li><a href="https://www.reddit.com/r/LearnJapanese/comments/1hhch8s/the_shortest_guide_to_learning_japanese">The shortest guide to learning Japanese</a>.</li>
<li><a href="https://kana-quiz.tofugu.com/">Tofugu’s Learn Kana Quiz</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 23 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Japan travel bookmarks</title>
<link>https://xenodium.com/japan-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/japan-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.nomadasaurus.com/things-to-do-in-yokohama-japan/">21 Awesome Things to Do in Yokohama, Japan (2020 Guide)</a>.</li>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/77715">21 free things to do in Tokyo</a>.</li>
<li><a href="http://www.tokyoweekender.com/2017/11/6-tokyo-travel-tips-to-help-you-get-around-the-city/">6 Tokyo Travel Tips to Help You Get Around the City | Tokyo Weekender</a>.</li>
<li>7 day Japan Rail pass (first class?), possibly only sold outside Japan.</li>
<li><a href="https://publishizer.com/8020-japanese/">80/20 Japanese by Richard Webb - Publishizer</a>.</li>
<li><a href="http://luckypeach.com/a-guide-to-the-regional-ramen-of-japan/">A Guide to the regional ramen of Japan</a>.</li>
<li><a href="https://smallseasons.guide/">A guide to understanding &quot;Small Seasons&quot;</a>.</li>
<li><a href="http://ignition.co/398">A Moss Girl’s Guide to Japanese Moss Viewing</a>.</li>
<li><a href="http://www.lonelyplanet.com/japan/travel-tips-and-articles/77501">A no-sushi guide to food in Japan</a>.</li>
<li><a href="http://www.quora.com/How-does-it-feel-to-travel-alone#__w2_kxAuQyJ_answer_content">A trip to Japan (Quora answer)</a>.</li>
<li><a href="https://www.annees-de-pelerinage.com/tawaraya-ryokan-review-best-hotel-in-the-world/">An unsponsored review of the Tawaraya Ryokan in Kyoto, Japan</a>.</li>
<li><a href="http://www.insidekyoto.com/arashiyama-bamboo-grove">Arashiyama Bamboo Grove</a>.</li>
<li><a href="http://jnto.org.au/autumn-leaves-in-hokkaido/">Autumn Leaves in Hokkaido</a>.</li>
<li><a href="http://www.bbc.com/travel/story/20181009-japans-special-take-on-a-packed-lunch">BBC - Travel - Japan’s special take on a packed lunch</a>.</li>
<li><a href="https://www.tofugu.com/japan/bushido/">Bushido: Way of Total Bullshit</a>.</li>
<li><a href="https://www.reddit.com/r/japanlife/comments/1i2ikgo/cool_japan_what_are_things_about_japan_that_you/">COOL JAPAN(?)&quot; - What are things about Japan that you think are actually cool?</a>.</li>
<li><a href="http://www.amazon.co.uk/Drinking-Japan-Alcoholic-Beverages-Establishments/dp/4805310545">Drinking Japan</a>.</li>
<li><a href="https://japan.elifessler.com/eki-stamps/">Eki-stamps / 駅スタンプ | eli's japan blog</a>.</li>
<li><a href="http://www.independent.co.uk/travel/asia/five-best-japanese-ryokan-406127.html">Five Best: Japanese Ryokan</a>.</li>
<li>Fuji Q Highland (rollercoaster theme park). Check out haunted hospital.</li>
<li><a href="http://www.city.furano.hokkaido.jp/">Furano, Hokaido</a>.</li>
<li><a href="http://rubyronin.com/going-to-kyushu-japan-why-visiting-yakushima-is-worth-it/">Going to Kyushu, Japan? Why Visiting Yakushima is Worth it - The Ruby Ronin</a>.</li>
<li>Guest houses: <a href="http://kazari-ya.com/index-e.html">Kazariya</a>, <a href="http://rakuza.gh-project.com/e/home.html">Rakuza</a>, <a href="http://ja-jp.facebook.com/musubian.kyoto">Musubian</a>.</li>
<li><a href="http://www.hiiragiya.co.jp/">Hiiragiya ryokan</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Himeji_Castle">Himeji Castle</a>.</li>
<li>Hiroshima oysters (try the one with cheese).</li>
<li><a href="https://en.wikipedia.org/wiki/Historic_Villages_of_Shirakawa-g%C5%8D_and_Gokayama">Historic Villages of Shirakawa-gō and Gokayama - Wikipedia</a>.</li>
<li>Hokkaido summer flowers.</li>
<li><a href="http://www.hyperdia.com/en/">Hypermedia (internal travel website)</a>.</li>
<li><a href="http://www.jalan.net/en/japan_hotels_ryokan/?cc%3Deng_banner">jalan.net (travel booking site)</a>.</li>
<li><a href="http://www.japan-guide.com">Japan guide</a>.</li>
<li><a href="http://jpninfo.com/">Japan Info</a>.</li>
<li><a href="https://www.thisisinsider.com/japan-program-free-abandoned-homes-2018-11">Japan is launching a program that will give away abandoned homes - INSIDER</a>.</li>
<li><a href="http://www.japan-guide.com/e/e2361.html">Japan Rail Pass</a>.</li>
<li><a href="http://www.mext.go.jp/english/highered/1303739.htm">Japan Study Program</a>.</li>
<li><a href="https://www.amazon.co.uk/JAPAN-TRAVEL-15DAYS-3-5GB-SIM/dp/B01J0Q8132">JAPAN TRAVEL DATA 15DAYS, 3.5GB on 4G/LTE- NANO SIM</a>.</li>
<li><a href="https://www.japantimes.co.jp/news/2017/12/26/national/japans-glut-abandoned-homes-hard-sell-bargains-opportunity-knocks/">Japan's glut of abandoned homes: Hard to sell but bargains when opportunity knocks (The Japan Times)</a>.</li>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/the-other-japan-okinawas-secret-beaches">Japanese beaches</a>.</li>
<li><a href="https://gurunavi.com/">Japanese Foods Encounter Like No Others (food search)</a>.</li>
<li><a href="http://japaneseruleof7.com/">Japanese rule of 7</a>.</li>
<li><a href="https://www.nippon.com/en/features/h00124/">Japan’s 72 Microseasons</a>.</li>
<li><a href="http://www.japanonwheels.com/kawachi_fujien.html">Kawachi Fujien 河内藤園 (Kawachi Wisteria Garden)</a>.</li>
<li><a href="http://www.japanese-incense.com/kodo-censer.htm">Kodo – Preparing the Censor</a>.</li>
<li><a href="https://cromwell-intl.com/travel/japan/koyasan/kongo-sanmai-in.html">Kongō Sanmai-in at Kōya-san</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=13136252">Koya Bound – Eight Days on the Kumano Kodo | Hacker News</a>.</li>
<li><a href="http://eng.shukubo.net/">Koyasan (needs booking)</a>.</li>
<li><a href="http://landedbook.com/landed-japan/">Landed Japan Book (local knowledge to buy Japanese real estate)</a>.</li>
<li><a href="http://www.japan-guide.com/e/e3912.html">Lots of goodies. Bamboo forest, oh my</a>.</li>
<li><a href="https://blackshipcoffee.com/cafe/">Michael’s Cafe American – Black Ship Coffee</a>.</li>
<li><a href="http://visit-miyajima-japan.com/en/">Miyajima: One of the top three scenic spots in Japan</a>.</li>
<li><a href="https://www.flickr.com/photos/26608745@N05/2845439357/">Monument in front of the Shin-Yatsushiro Station</a>.</li>
<li><a href="https://duckduckgo.com/?q=Nagakushiyama+park%2C+Japan+&amp;t=ffsb&amp;iax=1&amp;ia=images">Nagakushiyama park</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Nagoya">Nagoya</a>.</li>
<li>Natadera Temple in winter.</li>
<li><a href="http://www.skijapan.com/resorts/niseko/">Niseko Ski Resort</a>.</li>
<li><a href="https://www.lonelyplanet.com/japan/okinawa-and-the-southwest-islands/okinawa-honto/travel-tips-and-articles/the-other-japan-okinawas-secret-beaches">Okinawa: secrets for a long and happy life</a>.</li>
<li>Okonomimura (all okonomiyaki restaurants).</li>
<li>Onsen.</li>
<li><a href="http://www.quora.com/What-are-some-of-Japans-best-kept-secrets">Quora: What are some of Japans best kept secrets</a>?</li>
<li><a href="https://www.youtube.com/watch?v=geZWL_gE-Ak">Saitamaya: The Master of Grilled Meat - YouTube</a>.</li>
<li><a href="https://www.historynet.com/satsuma-rebellion-satsuma-clan-samurai-against-the-imperial-japanese-army.htm">Satsuma Rebellion: Satsuma Clan Samurai Against the Imperial Japanese Army</a>.</li>
<li><a href="https://twitter.com/tokyo_gov/status/1146931698837291008">Shitamachi #Museum in Ueno and catch a glimpse into old-fashioned living</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Siege_of_Kumamoto_Castle">Siege of Kumamoto Castle (Wikipedia)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18442097">Snapshots of Tokyo’s vivid street life (Hacker News)</a>.</li>
<li><a href="http://marc.merlins.org/perso/japan2013/links.html">Table of Content for japan2013</a>.</li>
<li><a href="http://marc.merlins.org/perso/japan2014/links.html">Table of Content for japan2014</a>.</li>
<li><a href="http://marc.merlins.org/perso/japan2015/links.html">Table of Content for japan2015</a>.</li>
<li><a href="http://www.4wd-networks.com/makers/detail/takazawa-candle.html">TAKAZAWA Candle (or look for ikaragata shape candle)</a>.</li>
<li><a href="https://visithachinohe.com/en/stories/the-2020-hachinohe-enburi-festival-schedule/">The 2020 Hachinohe Enburi Festival Schedule (Sakura festival)</a>.</li>
<li><a href="http://jpninfo.com/13012">The village of living water</a>.</li>
<li><a href="https://www.quora.com/What-are-the-most-inconvenient-things-foreign-tourists-who-travel-to-Japan-experience">Things to look out for in Japan (Quora)</a>.</li>
<li><a href="https://www.japan-guide.com/list/e1102.html">Tohoku Travel Guide</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Sukiyaki">Try out sukiyaki</a>.</li>
<li><a href="https://docs.google.com/document/d/1wjqJKYEKbHSUTsj8Lxj8OCn0gSOXOpf_SroyBEjLbKY/edit">Uncharted Tokyo</a>.</li>
<li><a href="https://www.vitra.com/en-gb/magazine/details/the-hill-of-the-buddha">Vitra | The Hill of the Buddha</a>.</li>
<li><a href="http://www.mymodernmet.com/profiles/blogs/zao-fox-village-miyagi-japan">Zao Fox Village</a>.</li>
<li><a href="http://hekiunsou.jp/">国指定重要文化財「野村別邸　碧雲荘」</a>.</li>
<li>Neighbourhoods
<ul>
<li>Mishuku</li>
<li>Sancha neighborhood. Lots of places to eat.</li>
<li>Sangenjaya</li>
<li>Soba Noodle Kochi</li>
<li>Seiki (Japanese dishes)</li>
<li>Sent from my iPhone</li>
<li>Sakae street</li>
<li>Tokoshima (wine and yakitori)</li>
</ul>
</li>
</ul>
]]></description>
    <pubDate>Thu, 23 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Kyoto travel bookmarks</title>
<link>https://xenodium.com/kyoto-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/kyoto-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.everintransit.com/nishiki-market-tour-kyoto/">Eating My Way Through Nishiki Market, Kyoto | Ever In Transit</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Fushimi_Inari-taisha">Fushimi Inari Temple</a>: 4KM mountain trail lined with bright orange shinto gates.</li>
<li>Golden Pavillion (macha and biscuits at tea house).</li>
<li>Hakone (day trip for hot baths), see Yuryo spa. Also the pirate boat.</li>
<li><a href="http://www.aaronwilliamson.com/old_web/travel/japan/kibune/kibune.htm">Kibune</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Kinkaku-ji">Kinkakuji Temple</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Kiyomizu-dera">Kiyomizu Temple</a>.</li>
<li>Kuramadera Temple &amp; Kibune Shrine: More peaceful shrine.</li>
<li><a href="http://www.insidekyoto.com/kyoto-itineraries">Kyoto itineraries</a>.</li>
<li><a href="https://docs.google.com/document/d/1bQb4GeiTElx0Gsv84wTDQlOVrbkqwTChSnMPMzrCcr4/edit?authkey%3DCJPtzocJ&amp;hl%3Den_US&amp;authkey%3DCJPtzocJ">Kyoto travel tips (doc)</a>.</li>
<li><a href="http://www.kyotoguide.com/ver2/walking/walking-top.html">Kyoto walking maps</a>.</li>
<li>Kyoto's train station itself.</li>
<li><a href="http://en.wikipedia.org/wiki/Nij%C5%8D_Castle">Nijo-Jo’</a>.</li>
<li>Nishiki Market: Awesome market. Some say better than Tsukiji.</li>
<li>Origami master and school <a href="http://www.orizurusalon-yume.com">http://www.orizurusalon-yume.com</a> info@orizurusalon-yume.com</li>
<li><a href="http://www.orizurusalon-yume.com/">orizurusalon yume (origami)</a>.</li>
<li>Ryokan (&quot;kaiseki&quot; meals).</li>
<li>Ryōan-ji (竜安寺).</li>
<li><a href="http://en.wikipedia.org/wiki/Sanj%C5%ABsangen-d%C5%8D">Sanjusangendo</a>.</li>
<li><a href="http://globalhelpswap.com/things-to-do-in-kyoto-japan/">Things to do in Kyoto, Japan</a>.</li>
<li><a href="http://maps.google.com/maps/ms?msid%3D202789377275033201812.00049d620c1fcd8fb451e&amp;msa%3D0&amp;ll%3D35.019734,135.756168&amp;spn%3D0.093628,0.181789">Walking courses (Google maps)</a>.</li>
<li><a href="http://www.waraido.com/walking/gion.html">WaRaiDo Nighttime tour</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 21 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Tokyo travel bookmarks</title>
<link>https://xenodium.com/tokyo-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/tokyo-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://roadsandkingdoms.com/travel-guide/tokyo/know-before-you-go-to-tokyo/">14 Things to Know Before You Go to Tokyo</a>.</li>
<li><a href="http://globalhelpswap.com/5-alternative-things-to-do-in-tokyo/">5 alternative things to do in Tokyo (by globalhelpswap)</a>.</li>
<li><a href="https://roadsandkingdoms.com/travel-guide/tokyo/a-history-of-tokyo-in-8-dishes/">A History of Tokyo in 8 Dishes</a>.</li>
<li>Akasaka area (N/E of Roppongi).</li>
<li>Akasaka Sagamiya (also Mamekan, established in 1895).</li>
<li>Akihabara: Electronics district, arcades and comic stores.</li>
<li>Asakusa (tourist spot). Kaminarimon, Nakamise (oldest shopping street in Japan). Sensoji Temple.</li>
<li><a href="https://www.hokke.co.jp/english/asakusa/">Asakusa hotel</a>.</li>
<li>Asakusa Shrine: Shinto shrine and market.</li>
<li><a href="http://bar-navi.suntory.co.jp/shop/0334413588/index.html">Bar Epilogue</a>.</li>
<li><a href="http://authenticbar.com/odin/yebisu.html">Bar Odin</a>.</li>
<li><a href="https://www.tripadvisor.co.uk/Restaurant_Review-g1066461-d1688630-Reviews-Benten-Taito_Tokyo_Tokyo_Prefecture_Kanto.html">Benten, Taito - 3-21-8 Asakusa, Ueno, Asakusa (Buckwheat noodles shop)</a>.</li>
<li>Bentomi (Sushi).</li>
<li><a href="https://cheese-stand.com/">CHEESE STAND （チーズスタンド）</a>.</li>
<li>Coffee Tengoku, Asakusa (best hotcakes/pancakes). Noting is premade. After 12 years, best hotcakes.</li>
<li>Cup noodle museum.</li>
<li><a href="http://tabelog.com/en/tokyo/A1313/A131301/13002389/">Daiwasushi (food)</a>. An account <a href="http://mjkobb.com/Prattling%20on/6570A66F-8F2F-49FD-912C-4A5D0C3862C8.html">here</a>.</li>
<li>Dorayaki (in Ukenbukuru). Seijuken is long established in Ningyocho.</li>
<li><a href="http://dairycream.blogspot.co.uk/2016/07/doteno-iseya-127-year-old-tempura-don.html">Doteno-Iseya 土手の伊勢屋: 127-year old Tempura</a>.</li>
<li>Eateries around Takadanobaba eki</li>
<li>Ebisu (area for izakaya experience, drink/chat with bartender). Look for Ebisu Yokocho.</li>
<li>Fish market (6am sushi).</li>
<li><a href="https://en.rocketnews24.com/2017/10/11/five-of-the-worst-areas-to-live-in-and-around-tokyo/?utm_content=buffer38deb&amp;utm_medium=social&amp;utm_source=twitter.com&amp;utm_campaign=buffer">Five of the worst areas to live in and around Tokyo | SoraNews24</a>.</li>
<li><a href="http://www.tokyoeats.jp/fuunji/">Fu-unji &amp; 風雲児 | Tokyo Eats</a>.</li>
<li><a href="http://www.ghibli-museum.jp/en/welcome">Ghibli museum</a> (book in advance or try <a href="http://www.lawson.co.jp/ghibli/museum/ticket/english.html">lawson</a>).</li>
<li>Ginza Kimuraya (bakery). Try anpan (invented here).</li>
<li>Ginza.</li>
<li><a href="http://tabelog.com/en/tokyo/A1301/A130103/13002611/">Ginzakyuubee (food)</a>.</li>
<li><a href="http://unmissabletokyo.com/golden-gai">Golden Gai (lots tiny bars)</a>.</li>
<li><a href="https://blog.govoyagin.com/tokyo-christmas">How to Spend a Magical Christmas in Tokyo (2019 update)</a>.</li>
<li><a href="https://www.timeout.com/tokyo/restaurants/tokyo-coolest-kakigori">https://www.timeout.com/tokyo/restaurants/tokyo-coolest-kakigori</a></li>
<li>Ichiran Ramen.</li>
<li>Imperial Palace: Book to go inside. Beautiful park, great for pictures.</li>
<li><a href="https://www.reddit.com/r/Tokyo/comments/1dnwpwr/in_which_ward_are_you_living">In which ward are you living?</a>.</li>
<li>Irie known (sweet shop) for Mamekan. In Monzen-Nakacho.</li>
<li>Isetan (upscale food market).</li>
<li><a href="http://tabelog.com/en/tokyo/A1313/A131301/13091991/">Isozushi (food)</a>.</li>
<li><a href="https://trulytokyo.com/jimbocho-book-town/">Jimbocho Book Town (largest second-hand book town in the world, classic-style cafes, old school charm)</a>.</li>
<li>Kaiden-don, near tsukiji (Sushi).</li>
<li>Kajitsuen Libre. Peach Parfait. Fresh fruit.</li>
<li>Kinozen restaurant for Matcha Bavarian cream (matcha bavaroa). Kagurazaka. Check out the backstreets.</li>
<li><a href="http://www.waentei-kikko.com/">Kodai's Fukui restaurant (old tea house)</a>.</li>
<li>Kushikatsu restaurant in Golden Gai, a karaoke booth in Ebisu, or drifting through the back alley izakayas of Akabane.</li>
<li>Menya Musashi and Fuunji are both generally very well regarded and about a 5-7 minute walk from the SW part of Shinjuku station.</li>
<li><a href="http://openbuildings.com/buildings/mikimoto-ginza-2-profile-2818">Mikimoto building in Ginza</a>.</li>
<li><a href="http://www.mori.art.museum/eng/index.html">Mori Art museum</a>.</li>
<li><a href="https://www.google.co.uk/webhp?sourceid=chrome-instant&amp;ion=1&amp;espv=2&amp;ie=UTF-8#q=musashiya+tripadvisor+tokyo">Musashiya ramen</a>.</li>
<li><a href="https://tokyocheapo.com/food-and-drink/michelin-star-ramen-nakiryu/">Nakiryu: Tantalizing Tantanmen Noodles with a Michelin Star</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Nezu_Museum">Nezu museum</a>.</li>
<li><a href="https://www.gotokyo.org/en/destinations/southern-tokyo/odaiba/index.html">Odaiba</a>.</li>
<li><a href="http://tokyoplaying.blogspot.co.uk/2012/01/not-japanese-pizza-okonomiyaki-in.html">Okonomiyaki in Tokyo</a>.</li>
<li>Omoide yokocho: Alleyway next to Shinjuku station. Lots of yakitori restaurants.</li>
<li><a href="http://ooo-koffee.com/">Omotesando Koffee</a> (coffee and baked custard slice).</li>
<li>Omotesando side streets.</li>
<li>Pan No Tora Bakery (Kyoto?).</li>
<li><a href="http://pignontokyo.jp/">Pignon | French Restaurant</a>.</li>
<li>Pound cake from Patisserie Gondola in Kudanue.</li>
<li>Roppongi.</li>
<li>Savarin (brioge-based, of french origin) in Yokohama. Cafe Recherche.</li>
<li>Seafood street south of Ueno eki</li>
<li><a href="https://www.huckmag.com/art-and-culture/photography-2/tokyo-street-photographer-mikiko-hara/">Secret snapshots of Tokyo vivid street life</a>.</li>
<li><a href="https://livejapan.com/en/in-shibamata_kita-senju_kameari/article-a0001571/">Shibamata: Snacking and Sightseeing in Tokyo’s Old Edo Neighborhood</a>.</li>
<li>Shibuya Crossing: Largest pedestrian crossing in the world.</li>
<li>Shimokitazawa (Shimokita for short). Bohemian, vintage shopping.</li>
<li>Shimokitazawa (thirft stores, music bands, pubs, and cafes).</li>
<li><a href="https://www.reddit.com/r/Tokyo/comments/1dikh1q/short_trips_from_tokyo/">Short trips from Tokyo</a>.</li>
<li><a href="https://www.reddit.com/r/Tokyo/comments/1dikh1q/short_trips_from_tokyo">Short trips from Tokyo</a>.</li>
<li><a href="http://tabelog.com/en/tokyo/A1301/A130101/13002260/">Sukiyabashi Jiro</a>.</li>
<li>Sushi dai (Sushi, long queue, maybe turisty).</li>
<li><a href="http://tabelog.com/en/tokyo/A1301/A130103/13005003/">Sushi Kanesaka</a>.</li>
<li>Sushi places around Tsukiji market in the morning (much better than the market visit itself, these days)</li>
<li><a href="http://tabelog.com/en/tokyo/A1308/A130802/13015251/">Sushi Saito</a>.</li>
<li><a href="http://tabelog.com/en/tokyo/A1313/A131301/13002388/">Sushidai (food)</a>.</li>
<li><a href="http://tabelog.com/en/tokyo/A1307/A130701/13061640/">Sushitsu (food)</a>.</li>
<li><a href="http://tabelog.com/en/tokyo/A1316/A131603/13013967/">Sutekihausukatsura</a>.</li>
<li><a href="http://www.japan-guide.com/e/e3029.html">Takaosan (Mount Takao)</a>.</li>
<li><a href="https://www.minube.com/rincon/restaurante-tsunahachi-a186891">Tempura Tsunahachi en Tokio: 4 opiniones y 7 fotos</a>.</li>
<li><a href="http://tabelog.com/en/tokyo/A1303/A130301/13001783/">Tenkazushi (food)</a>.</li>
<li>The whole of Kabukicho (area in-between Shinjuku station and Shin-Okubo)</li>
<li><a href="http://www.ytravelblog.com/things-to-do-in-tokyo-japan/">Things to Do in Tokyo Japan - Sunday Spotlight</a>.</li>
<li><a href="https://twitter.com/tokyo_gov/status/1201652265649606656">Tokyo Gov on Twitter: Higashikurume Station</a>.</li>
<li><a href="https://www.lonelyplanet.com/japan/travel-tips-and-articles/tokyo-in-winter-what-to-see-do-and-eat/40625c8c-8a11-5710-a052-1479d276b0f5">Tokyo in winter: what to see, do and eat (Lonely Planet)</a>.</li>
<li>Tokyo Municipal Government building: Only for observation deck with view to Fuji (if clear day).</li>
<li><a href="https://www.lonelyplanet.com/japan/tokyo/travel-tips-and-articles/tokyo-on-a-budget-tips-for-making-your-yen-go-further/40625c8c-8a11-5710-a052-1479d2775214?utm_campaign=article&amp;utm_medium=social&amp;utm_source=twitter&amp;utm_content=Tokyo%20on%20a%20budget:%20tips%20for%20making%20your%20yen%20go%20further">Tokyo on a budget: tips for making your yen go further (Lonely Planet)</a>.</li>
<li><a href="http://tokyoplaying.blogspot.co.uk/">Tokyo play blog</a>.</li>
<li><a href="http://japaneseruleof7.com/tokyo-salaries-all-you-need-to-know">Tokyo Salaries: all you need to know</a>.</li>
<li>Tokyo station: Friendly JR office (english spoken). They help book all trips/tickets/reservations.</li>
<li>Tokyo Station: Massive station. Lots of restaurants and shops (check out ramen street).</li>
<li><a href="http://coffeeandpassport.com/tokyo-travel-tips/">Tokyo Travel Tips: 5 Things You Need In Japan | Coffee and Passport</a>.</li>
<li><a href="https://twitter.com/yanarchy/status/1162570360769798144">Tokyo Twitter: any Japanese breakfast restaurants</a>.</li>
<li><a href="https://www.cntraveller.com/article/travel-guide-tokyo">Tokyo, Japan - Condé Nast Traveller | CN Traveller</a>.</li>
<li><a href="http://tokyocheapo.com/">TokyoCheapo</a>.</li>
<li><a href="https://www.theguardian.com/artanddesign/gallery/2024/jul/08/tokyos-oldest-train-line-jr-yamanote-in-pictures">Tokyo’s oldest train line – in pictures | Art and design | The Guardian</a>.</li>
<li>Tokyu Hands and Loft (shops in Shibuya).</li>
<li>Toritake (yakitori at Shibuya).</li>
<li>Try Mos rice burger (fast food).</li>
<li>Try out Pancan (bread in can).</li>
<li><a href="http://www.tsukiji-market.or.jp/etc/calendar/2016.html">Tsukiji Fish Market calendar</a>.</li>
<li>Tsukiji Fish Market: Sushi bars and food vendors (get there early, visitor numbers restricted).</li>
<li>Umemura in Asakusa (also Mamekan).</li>
<li><a href="https://www.reddit.com/r/JapanTravel/comments/79c82l/unusual_things_to_do_in_tokyo/">Unusual things to do in Tokyo? </a>.</li>
<li><a href="https://www.alojapan.com/253056/walk-around-yoyogi-uehara-station-shibuya-binaural-city-soundsasmr-in-tokyo-japan-osmo-pocket/">Walk around Yoyogi-Uehara Station, Shibuya, Binaural City Sounds(ASMR) in Tok…</a>.</li>
<li><a href="https://www.reddit.com/r/Tokyo/s/1mBB6ix3aW">What's something you know about in Tokyo that you think others should know about?</a>.</li>
<li>Yurakucho Yakitori Alley</li>
<li>Zauo.com &quot;Let's fixhing enjoy&quot;. Catch your own fish to eat.</li>
<li><a href="http://tabelog.com/en/tokyo/A1303/A130301/13058009/">婁熊東京 (raw and grilled pork)</a>.</li>
<li><a href="http://r.tabelog.com/tokyo/A1307/A130701/13041724/">酒友</a> (Sake &amp; good Shabushabu), Roppongi.</li>
</ul>
]]></description>
    <pubDate>Sun, 19 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>UK travel bookmarks</title>
<link>https://xenodium.com/uk-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/uk-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.buzzfeed.com/chelseypippin/25-wanderlust-worthy-day-trips-from-london#.xbkbNaApW">25 stunning british places you can reach from London</a>.</li>
<li><a href="https://twitter.com/ddoniolvalcroze/status/1278326573070876672">A graveyard of red telephone boxes located in the small village of Carlton Miniott</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Dunmore_Pineapple">Dunmore Pinapple</a>.</li>
<li><a href="http://www.hitchinlavender.co.uk/">Hitchin Lavender</a>.</li>
<li><a href="http://www.theguardian.com/travel/2015/may/10/scotland-beach-swimming-wild-camping">In search of Scotland’s best beach</a>.</li>
<li><a href="http://www.seemytravels.com/2015/01/23/the-isle-of-man-mist/">Isle of Man</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Sandwood_Bay">Sandwood Bay</a>.</li>
<li><a href="https://duckduckgo.com/?q=sark+island&amp;t=ffsb&amp;iax=1&amp;ia=images">Sark island</a>.</li>
<li><a href="http://www.theguardian.com/travel/2015/aug/23/scotland-north-coast-500-road-trip?CMP%3Dshare_btn_tw">Scotland’s new North Coast 500 route</a>.</li>
<li><a href="https://www.lonelyplanet.com/amp/articles/best-hikes-in-england">The 8 most dramatic hikes in England</a>.</li>
<li><a href="http://www.thenewforest.co.uk/">The New Forest</a>.</li>
<li><a href="http://www.seemytravels.com/2015/02/15/where-to-find-street-art-in-liverpool/">Where to Find Street Art in Liverpool</a>.</li>
<li><a href="http://www.x-pilot.co.uk/">X-Pilot (Redsand towers)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 19 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Development quotes</title>
<link>https://xenodium.com/development-quotes</link>
<guid isPermaLink="false">https://xenodium.com/development-quotes</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/giorgiosironi/status/587507955521708032">If your backlog is exploding the problem is not that your developers are slow, but that your business model is not based on reality</a>.</li>
<li><a href="http://redux.js.org/docs/introduction/PriorArt.html">If you lose out on object allocation, you still win by avoiding expensive re-renders and re-calculations</a>.</li>
<li><a href="https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction">Duplication is far cheaper than the wrong abstraction (prefer duplication up to a point)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming)">Choosing an appropriate design to duplication avoid might benefit from more examples to see patterns in. Attempting premature refactoring risks selecting a wrong abstraction</a>.</li>
<li><a href="https://www.deconstructconf.com/2017/brian-marick-patterns-failed-why-should-we-care">Patterns failed, why we should case</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 19 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Development philosophy</title>
<link>https://xenodium.com/development-philosophy</link>
<guid isPermaLink="false">https://xenodium.com/development-philosophy</guid>
    <description><![CDATA[<ul>
<li>Boyscout rule: Leave campground cleaner than found.</li>
<li><a href="https://nibblestew.blogspot.com/2019/12/what-can-clang-format-teach-us-about.html?m=1">What can clang-format teach us about the human condition?</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 19 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Spain travel bookmarks</title>
<link>https://xenodium.com/spain-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/spain-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.larecomendadora.com/2019/11/cafeterias-bonitas-originales-encanto-madrid.html">7 CAFETERIAS BONITAS, ORIGINALES y CON ENCANTO en MADRID</a>.</li>
<li><a href="https://www.tripadvisor.co.uk/Restaurant_Review-g187514-d6673431-Reviews-Bomboneria_Santa-Madrid.html">BOMBONERIA SANTA, Madrid - Barrio de Salamanca</a>.</li>
<li><a href="https://www.timeout.com/madrid/cinemas/cine-dore-filmoteca-espanyola">Cine Doré Filmoteca Española | Cinemas in Lavapiés, Madrid</a>.</li>
<li><a href="https://www.timeout.com/madrid/art/espacio-fundacion-telefonica">Espacio Fundación Telefónica | Art in Malasaña, Madrid</a>.</li>
<li><a href="https://www.timeout.com/madrid/art/fundacion-masaveu">Fundación Masaveu | Art in Madrid, Madrid</a>.</li>
<li><a href="https://www.larecomendadora.com/2019/10/juanchis-burgers-hamburguesas-madrid.html">JUANCHI'S BURGERS</a>.</li>
<li><a href="https://laduquesita.es/">La Duquesita. Pastelería - Bombonería - Confitería repostería desde 1914</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/La_Palma">La Palma, most north-westerly of the Canary Islands</a>.</li>
<li><a href="https://www.facebook.com/pages/La-Perejila/116839091715751">La Perejila - Madrid - Bar de tapas y restaurante, Restaurante español</a>.</li>
<li><a href="http://www.tripadvisor.com/ShowUserReviews-g1802172-d1887157-r141602833-El_Lago_Verde-El_Golfo_Lanzarote_Canary_Islands.html">Lanzarote's green lagoon</a>.</li>
<li><a href="https://www.viajenaviagem.com/destino/madri/onde-comer-madri/">Madri: onde comer | Restaurantes e bares de tapas recomendados</a>.</li>
<li><a href="http://www.madricioso.com">Madricioso</a>.</li>
<li><a href="https://www.timeout.com/madrid/art/matadero-madrid">Matadero Madrid | Art in Legazpi, Madrid</a>.</li>
<li><a href="http://www.mataderomadrid.org">Matadero Madrid. Centro de creación contemporánea</a>.</li>
<li><a href="https://www.timeout.com/madrid/shopping/mercado-de-san-fernando">Mercado de San Fernando | Shopping in Lavapiés, Madrid</a>.</li>
<li><a href="https://www.timeout.com/madrid/things-to-do/mercado-de-vallehermoso">Mercado de Vallehermoso | Things to do in Chamberí, Madrid</a>.</li>
<li><a href="https://commons.wikimedia.org/wiki/Category:Rock_carved_hermitage_of_Saints_Justus_and_Pastor,_Olleros_de_Pisuerga">Rock carved hermitage of Saints Justus and Pastor, Olleros de Pisuerga</a>.</li>
<li><a href="https://eltriciclo.es/triciclo/">triciclo - grupotriciclo</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 19 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Meet up bookmarks</title>
<link>https://xenodium.com/meet-up-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/meet-up-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.couchsurfing.com">Couchsurfing.org</a>.</li>
<li><a href="http://www.meetup.com/">Meetup</a>.</li>
<li><a href="http://teawithstrangers.com">Tea with strangers</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 19 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Plantuml example</title>
<link>https://xenodium.com/plantuml-example</link>
<guid isPermaLink="false">https://xenodium.com/plantuml-example</guid>
    <description><![CDATA[<p>Played with <a href="http://plantuml.sourceforge.net/PlantUML_Language_Reference_Guide.pdf">Plantuml</a>. Convenient for generating UML diagrams from text. Here's the <a href="http://plantuml.sourceforge.net/PlantUML_Language_Reference_Guide.pdf">Language Reference Guide</a>. Here's an example:</p>
<pre><code class="language-{.plantuml">@startuml
  abstract class Singer {
    abstract void sing()
    void Dance()
  }

  skinparam monochrome true
  Singer &lt;|-- PopSinger
  Singer &lt;|-- SalsaSinger

  class PopSinger {
    void sing()
  }

  class SalsaSinger {
    void sing()
  }

@enduml
</code></pre>
<p><img src="https://xenodium.github.io/images/plantuml-example/plantuml-singer.png" alt=""></p>
<p>Install plantuml on Mac OS X:</p>
<pre><code class="language-{.bash">brew install plantum
</code></pre>
<p>Generating diagram:</p>
<pre><code class="language-{.bash">$GRAPHVIZ_DOT=~/homebrew/bin/dot java -jar path/to/plantuml.8018.jar diagram.plantuml
</code></pre>
<p>ps. Installation and verification <a href="https://gist.github.com/NLKNguyen/c39596c205ba1f1866c8">gist</a>.</p>
<p>ps2. More handy UML examples in this <a href="https://github.com/xenodium/uml">fork</a>.</p>
]]></description>
    <pubDate>Fri, 17 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Helm-describe-helm-attribute</title>
<link>https://xenodium.com/helm-describe-helm-attribute</link>
<guid isPermaLink="false">https://xenodium.com/helm-describe-helm-attribute</guid>
    <description><![CDATA[<p><a href="https://www.youtube.com/watch?v%3DXjKtkEMUYGc">Writing A Spotify Client in 16 Minutes</a> is fantastic for picking up helm and Emacs lisp tips. Of interest helm-describe-helm-attribute, second to the awesomeness of helm-spotify integration.</p>
<pre><code class="language-html">&lt;iframe width='420'
        height='315'
        src='https://www.youtube.com/embed/XjKtkEMUYGc'
        frameborder='0'
        allowfullscreen&gt;
&lt;/iframe&gt;
</code></pre>
]]></description>
    <pubDate>Tue, 14 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Youtube videos in your org html export</title>
<link>https://xenodium.com/youtube-videos-in-your-org-html-export</link>
<guid isPermaLink="false">https://xenodium.com/youtube-videos-in-your-org-html-export</guid>
    <description><![CDATA[<p><a href="https://twitter.com/sachachua">Sacha Chua</a> and <a href="https://twitter.com/jwiegley">John Wiegley</a> posted a wonderful video on <a href="http://sachachua.com/blog/2015/04/2015-04-08-emacs-lisp-development-tips-with-john-wiegley">Emacs lisp development tips</a>. Embedding the following raw HTML using #+BEGIN_HTML/#+END_HTML:</p>
<pre><code class="language-html">&lt;iframe width=&quot;420&quot;
        height=&quot;315&quot;
        src=&quot;https://www.youtube.com/embed/QRBcm6jFJ3Q&quot;
        frameborder=&quot;0&quot;
        allowfullscreen&gt;
&lt;/iframe&gt;
</code></pre>
<p>results in an embedded video when exporting your org file:</p>
<pre><code class="language-html">&lt;iframe width=&quot;420&quot;
        height=&quot;315&quot;
        src=&quot;https://www.youtube.com/embed/QRBcm6jFJ3Q&quot;
        frameborder=&quot;0&quot;
        allowfullscreen&gt;
&lt;/iframe&gt;
</code></pre>
]]></description>
    <pubDate>Sun, 12 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>.net bookmarks</title>
<link>https://xenodium.com/dot-net-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/dot-net-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://thomasvm.github.io/blog/2015/03/17/open-source-net-libraries-that-make-your-life-easier/">Open Source .Net libraries that make your life easier</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 12 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>UK property bookmarks</title>
<link>https://xenodium.com/uk-property-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/uk-property-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://commutefrom.com/">Commute from</a> (find property based on potential commute).</li>
<li><a href="http://property.mapumental.com">Mapumental Property</a> (find property by travel time).</li>
</ul>
]]></description>
    <pubDate>Fri, 10 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Git commit message style</title>
<link>https://xenodium.com/git-commit-message-style</link>
<guid isPermaLink="false">https://xenodium.com/git-commit-message-style</guid>
    <description><![CDATA[<p>Adopted Tim Pope's Git commit message <a href="http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html">style</a>. Also enabled Emacs's git-commit-training-wheels-mode:</p>
<pre><code class="language-{.commonlisp">(use-package git-commit-training-wheels-mode :ensure t
  :commands (git-commit-training-wheels-mode))

(use-package git-commit-mode :ensure t
  :config
  (add-hook 'git-commit-mode-hook 'git-commit-training-wheels-mode)
  :commands (git-commit-mode))
</code></pre>
<p>Another great <a href="http://chris.beams.io/posts/git-commit/">post</a> by Chris Beams.</p>
]]></description>
    <pubDate>Thu, 09 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>fci-mode and org-html-export-to-html bug</title>
<link>https://xenodium.com/fci-mode-and-org-html-export-to-html-bug</link>
<guid isPermaLink="false">https://xenodium.com/fci-mode-and-org-html-export-to-html-bug</guid>
    <description><![CDATA[<p>Having enabled fci-mode in most programing modes, org-html-export-to-html now exports an additional unicode character in source blocks. This <a href="http://lists.gnu.org/archive/html/emacs-orgmode/2014-09/msg00777.html">thread</a> has a workaround:</p>
<pre><code class="language-{.commonlisp">(defun org-html-fontify-code (code lang)
  ;; ...
  (funcall lang-mode)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (when (require 'fill-column-indicator nil 'noerror)
    (fci-mode -1))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (insert code)
  ;; ...
</code></pre>
]]></description>
    <pubDate>Mon, 06 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Try cocoapods out</title>
<link>https://xenodium.com/try-cocoapods-out</link>
<guid isPermaLink="false">https://xenodium.com/try-cocoapods-out</guid>
    <description><![CDATA[<p><a href="https://github.com/CocoaPods/cocoapods-try">Cocapods try</a>:</p>
<pre><code class="language-{.bash">$ pod try POD_NAME
</code></pre>
]]></description>
    <pubDate>Fri, 03 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cornwall travel bookmarks</title>
<link>https://xenodium.com/cornwall-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cornwall-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://barefootcornwall.com/on-the-road/">Food along the way</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 03 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Austria travel bookmarks</title>
<link>https://xenodium.com/austria-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/austria-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lonelyplanet.com/austria/vienna/travel-tips-and-articles/coffee-house-culture-in-vienna-where-to-get-your-caffeine-hit">Coffee houses in Vienna</a>.</li>
<li><a href="https://duckduckgo.com/?q%3Dmelk%2Baustria%2Blibrary&amp;iax%3D1&amp;ia%3Dimages">Melk Abbey library</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 03 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Cinnamon desktop run dialog</title>
<link>https://xenodium.com/cinnamon-desktop-run-dialog</link>
<guid isPermaLink="false">https://xenodium.com/cinnamon-desktop-run-dialog</guid>
    <description><![CDATA[<p>Note to self. Open with Alt-f2.</p>
]]></description>
    <pubDate>Thu, 02 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Books for 2015</title>
<link>https://xenodium.com/books-for-2015</link>
<guid isPermaLink="false">https://xenodium.com/books-for-2015</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.amazon.co.uk/Catch-22-Vintage-Classics-Joseph-Heller/dp/0099470462">Catch 22</a>.</li>
<li><a href="http://www.amazon.co.uk/Circle-Dave-Eggers/dp/0804172293">The Circle</a>.</li>
<li><a href="http://www.amazon.co.uk/Born-Run-Hidden-Ultra-Runners-Greatest/dp/1861978774">Born to Run</a>.</li>
<li><a href="http://www.amazon.co.uk/Thinking-Fast-Slow-Daniel-Kahneman/dp/0141033576">Thinking, Fast and Slow</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 29 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ayahuasca bookmarks</title>
<link>https://xenodium.com/ayahuasca-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ayahuasca-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://ayaadvisor.org/listings/onanya-joni-shipibo-europe/">Ayaadvisor</a>.</li>
<li><a href="https://www.erowid.org/chemicals/ayahuasca/ayahuasca_death.shtml">Ayahuasca fatalities</a>.</li>
<li><a href="https://erowid.org/chemicals/ayahuasca/">Ayahuasca on erowid</a>.</li>
<li><a href="http://www.cbc.ca/m/news/canada/jennifer-logan-s-death-in-peru-puts-focus-on-purging-ceremonies-1.2948955">Jennifer Logan's death in Peru</a>.</li>
<li><a href="https://medium.com/@Grayfox/the-hacker-who-drank-ayahuasca-517148aa1ed4">The hacker who drank Ayahuasca</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 29 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs init.el bookmarks</title>
<link>https://xenodium.com/emacs-init.el-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/emacs-init.el-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/daschwa/emacs.d">Adam Schwartz's init</a>.</li>
<li><a href="https://github.com/apg/emacs-config/tree/master/lisp/activator.d">Andrew Gwozdziewycz's init.el</a>.</li>
<li><a href="http://www.cs.utah.edu/~aek/code/init.el.html">Andrew Kensler's init.el</a>.</li>
<li><a href="https://github.com/Droogans/.emacs.d/blob/mac/init.el">Andrew's .emacs</a>.</li>
<li><a href="https://github.com/ikame/.emacs.d-literate">Anler Hernandez's literate config</a>.</li>
<li><a href="https://github.com/redguardtoo/emacs.d/">Chen Bin's init.el</a>.</li>
<li><a href="https://github.com/eastwood/config/blob/master/emacs.d/org-init.org">Clinton Ryan's init (JS config)</a>.</li>
<li><a href="https://github.com/daviderestivo/emacs-config/blob/master/README.md">daviderestivo/emacs-config (clean/macOS)</a>.</li>
<li><a href="https://github.com/iocanel/dotfiles/blob/master/.config/emacs/config.org">dotfiles/config.org at master · iocanel/dotfiles · GitHub (mu4e config)</a>.</li>
<li><a href="https://www.emacswiki.org/emacs/StarterKits">EmacsWiki: Starter Kits</a>.</li>
<li><a href="https://github.com/ejmr/DotEmacs/blob/master/.emacs">Eric James Michael Ritz</a>.</li>
<li><a href="https://github.com/alhassy/emacs.d">GitHub - alhassy/emacs.d: My Emacs configuration, literately</a>.</li>
<li><a href="https://github.com/rememberYou/.emacs.d/">GitHub - FIXME rememberYou/.emacs.d: Personal GNU Emacs configuration</a>.</li>
<li><a href="https://github.com/Fuco1/.emacs.d">GitHub - Fuco1/.emacs.d: My emacs config</a>.</li>
<li><a href="https://github.com/MatthewZMD/.emacs.d">GitHub - MatthewZMD/.emacs.d: M-EMACS, a full-feature GNU Emacs configuration</a>.</li>
<li><a href="https://github.com/zamansky/emacs.dz">GitHub - zamansky/emacs.dz: Awesome emacs config files</a>.</li>
<li><a href="https://github.com/zoliky/dotemacs">GitHub - zoliky/dotemacs: My GNU Emacs configuration (super clean)</a>.</li>
<li><a href="https://github.com/grettke/home/blob/master/ALEC.txt">Grant Rettke's literate config</a>.</li>
<li><a href="http://doc.rix.si/org/fsem.html">Hardcore Freestyle Emacs</a>.</li>
<li><a href="https://github.com/huseyinyilmaz/emacs-config/blob/master/lisp/user-init.el">Huseyin Yilmaz</a>.</li>
<li><a href="https://github.com/ianpan870102/.personal-emacs.d/blob/master/init.el">ianpan870102/.personal-emacs.d</a>.</li>
<li><a href="http://ivanmalison.github.io/dotfiles/">Ivan Malison's Emacs init</a>.</li>
<li><a href="http://ivanmalison.github.io/dotfiles/#colorizecompliationbuffers">Ivan Malison's init.el</a>.</li>
<li><a href="http://www.john2x.com/emacs.html">John's Emacs Config (mu4e and ledger usage)</a>.</li>
<li><a href="https://justin.abrah.ms/dotfiles/emacs.html">Justin Abrahms: My Emacs Configuration</a>.</li>
<li><a href="https://ladicle.com/post/config/">Ladicle's Emacs Configuration</a>.</li>
<li><a href="https://github.com/MatthewZMD/.emacs.d#lsp">M-EMACS's lsp config</a>.</li>
<li><a href="https://github.com/msparks/dotfiles/blob/master/.emacs">Mark Sparks's init.el</a>.</li>
<li><a href="https://github.com/CQQL/dotfiles/blob/master/src/.emacs.d/init.el">Marten Lienen's init.el</a>.</li>
<li><a href="http://writequit.org/org/settings.html">Mathew Lee Hinman's Emacs settings file</a>.</li>
<li><a href="https://github.com/angrybacon/dotemacs/blob/master/dotemacs.org">Mathieu Marques's wonderful literary config (uses tern for Javascript)</a>.</li>
<li><a href="https://github.com/abdullin/emacs.d/blob/master/emacs.org">Rinat Abdullin's literary config</a>.</li>
<li><a href="https://github.com/To1ne/temacco">Temacco's init</a>.</li>
<li><a href="https://gitlab.com/to1ne/temacco">Temacco's Plutonium empowered emacs</a>.</li>
<li><a href="https://github.com/wasamasa/dotemacs/blob/master/TODO.org">Wasamama's extensive init TODO </a>.</li>
<li><a href="http://zzamboni.org/post/my-emacs-configuration-with-commentary/">zzamboni.org | My Emacs Configuration, With Commentary</a>.</li>
<li><a href="https://etienne.depar.is/emacs.d/init.html">Étienne Deparis's Emacs Main Initialization File</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 28 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>CSS vertical align using flex</title>
<link>https://xenodium.com/css-vertical-align-using-flex</link>
<guid isPermaLink="false">https://xenodium.com/css-vertical-align-using-flex</guid>
    <description><![CDATA[<p>Codepen <a href="http://codepen.io/oisinlavery/pen/Jmjtz">snippet</a>:</p>
<pre><code class="language-css">div{
  height: 200px;
  background: #ccc;
  display: flex;
  justify-content: center;
  align-items: center;
}

p{
  margin: auto
}
</code></pre>
]]></description>
    <pubDate>Sat, 28 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>London diving schools</title>
<link>https://xenodium.com/london-diving-schools</link>
<guid isPermaLink="false">https://xenodium.com/london-diving-schools</guid>
    <description><![CDATA[<ul>
<li><a href="http://londonschoolofdiving.co.uk">London Diving School</a>. Not heard good comments.</li>
<li><a href="http://www.divewimbledon.com">Dive Wimbledon</a>. Heard ok comments.</li>
<li><a href="http://www.clidive.org/">Clidive</a> is a BSAC club (amateur organisation). Not commercial but may take longer.</li>
<li><a href="http://www.sublimediving.co.uk/">Sublime Diving</a>. Heard good comments.</li>
<li><a href="http://www.oysterdiving.com/">Oyster Diving</a>. Pool in cetral London. Good comments.</li>
<li><a href="http://en.wikipedia.org/wiki/SS_Thistlegorm">SS Thistlegorm</a> mentioned as a memorable site.</li>
<li>Many suggest to get certified elsewhere. Perhaps Egypt via <a href="http://www.poseidondivers.com/">Poseidon Divers</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 26 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Helm buffer URLs</title>
<link>https://xenodium.com/helm-buffer-urls</link>
<guid isPermaLink="false">https://xenodium.com/helm-buffer-urls</guid>
    <description><![CDATA[<p>Venturing into Emacs lisp and <a href="https://github.com/emacs-helm/helm">Helm</a>. Here's a go at listing all URLs in current buffer.</p>
<pre><code class="language-{.commonlisp">(require 'goto-addr)

(defun ar/helm-buffer-url-candidates ()
  &quot;Generate helm candidates for all URLs in buffer.&quot;
  (save-excursion
    (goto-char (point-min))
    (let ((helm-candidates '())
          (url))
      (while (re-search-forward goto-address-url-regexp
                                nil t)
        (setq url
              (buffer-substring-no-properties (match-beginning 0)
                                              (match-end 0)))
        (add-to-list 'helm-candidates
                     (cons url
                           url)))
      helm-candidates)))

(defun ar/helm-buffer-urls ()
  &quot;Narrow down and open a URL in buffer.&quot;
  (interactive)
  (helm :sources `(((name . &quot;Buffer URLs&quot;)
                    (candidates . ,(ar/helm-buffer-url-candidates))
                    (action . (lambda (url)
                                (browse-url url)))))))
</code></pre>
]]></description>
    <pubDate>Thu, 26 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Doh! undo last git commit</title>
<link>https://xenodium.com/doh-undo-last-git-commit</link>
<guid isPermaLink="false">https://xenodium.com/doh-undo-last-git-commit</guid>
    <description><![CDATA[<pre><code class="language-{.bash">$ git reset --soft HEAD~1
</code></pre>
]]></description>
    <pubDate>Mon, 23 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Resetting variables using defvar</title>
<link>https://xenodium.com/resetting-variables-using-defvar</link>
<guid isPermaLink="false">https://xenodium.com/resetting-variables-using-defvar</guid>
    <description><![CDATA[<p>Want to re-evaluate defvars and modify variables? eval-defun (bound to C-M-x) can help. From the manual:</p>
<blockquote>
<p>If the current defun is actually a call to `defvar', then reset the variable using its initial value expression even if the variable already has some other value. (Normally `defvar' does not change the variable's value if it already has a value.) Treat `defcustom' similarly.</p>
</blockquote>
]]></description>
    <pubDate>Sun, 22 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Broken Xcode plugins?</title>
<link>https://xenodium.com/broken-xcode-plugins</link>
<guid isPermaLink="false">https://xenodium.com/broken-xcode-plugins</guid>
    <description><![CDATA[<p>Some Xcode plugins stopped loading after updating Xcode. Ensure the latest DVTPlugInCompatibilityUUIDs is added to the plugin's Info.plist. Get from:</p>
<pre><code class="language-{.bash">$ defaults read \
    /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
</code></pre>
<p>Additional suggestions as <a href="http://stackoverflow.com/questions/30361228/why-are-my-xcode-plugins-such-as-clang-format-installed-with-alcatraz-no-longe">Stack Overflow</a>.</p>
]]></description>
    <pubDate>Sun, 22 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Born to Run references</title>
<link>https://xenodium.com/born-to-run-references</link>
<guid isPermaLink="false">https://xenodium.com/born-to-run-references</guid>
    <description><![CDATA[<p>References from reading Christopher McDougall's <a href="http://www.chrismcdougall.com/born-to-run">Born to Run</a>:</p>
<ul>
<li><a href="http://www.chirunning.com">Chi running</a>.</li>
<li>Chia and pinole. Random recipes <a href="http://www.nomeatathlete.com/tarahumara-pinole-chia-recipes/">here</a>.</li>
<li><a href="http://heritageseeds.org/">Heritage Seeds</a>.</li>
<li>Ken Mierke’s <a href="http://www.evolutionrunning.com">Evolution running</a>.</li>
<li><a href="https://posemethod.com/running">Pose method</a>.</li>
<li>Quotes, references, videos, etc. at <a href="http://ultimatepaleoguide.com/born-to-run/">ultimate paleo guide</a>.</li>
</ul>
<p>Recipe by <a href="http://www.bellaonline.com/articles/art51802.asp">Megan Mignot</a>, based on book references:</p>
<h2>Mama Tita’s Pancakes</h2>
<ul>
<li>1 ½ cups cooked brown rice</li>
<li>1 cup coconut milk</li>
<li>2 ripe bananas</li>
<li>1 tablespoon honey</li>
<li>½ cup white cornmeal</li>
<li>2 teaspoons baking powder</li>
</ul>
]]></description>
    <pubDate>Sun, 22 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Org tips from 2015-03-18 Emacs hangout</title>
<link>https://xenodium.com/org-tips-from-2015-03-18-emacs-hangout</link>
<guid isPermaLink="false">https://xenodium.com/org-tips-from-2015-03-18-emacs-hangout</guid>
    <description><![CDATA[<p>Lots of great tips in <a href="http://sachachua.com/blog/2015/03/emacs-hangout-2015-03-18-show-notes/">Emacs Hangout 2015-03-18</a>. Favorites:</p>
<ul>
<li>Private org drawer to prevent export:</li>
</ul>
<pre><code class="language-org">:PRIVATE:
My super duper secret text I don't want to export.
:END:
</code></pre>
<ul>
<li>C-c C-p/C-c C-n Jump over sections.</li>
<li>(setq org-hide-leading-stars t).</li>
<li>(org-bullets-mode).</li>
<li>(org-refile).</li>
<li>C-u (org-refile) jumps, no refile.</li>
<li>(helm-org-in-buffer-headings).</li>
</ul>
]]></description>
    <pubDate>Thu, 19 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Food bookmarks</title>
<link>https://xenodium.com/food-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/food-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/cherdotdev/status/1264343579725647880">Cher's hot sauce collection</a>.</li>
<li><a href="https://twitter.com/hex/status/1320350713734717440">Scott Martin's hot sauce collection</a>.</li>
<li><a href="http://summertomato.com/">Summer tomato</a>.</li>
<li><a href="http://www.tarladalal.com/">Tarladalal recipes</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 19 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Ethiopia travel bookmarks</title>
<link>https://xenodium.com/ethiopia-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ethiopia-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://en.wikipedia.org/wiki/Church_of_Saint_George,_Lalibela">Bet Giyorgis Church</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 19 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>China travel bookmarks</title>
<link>https://xenodium.com/china-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/china-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://en.people.cn/n3/2021/0719/c90000-9874081.html">&quot;If you have not been to Kashgar, then you haven’t really been to Xinjiang”</a>.</li>
<li><a href="http://www.lonelyplanet.com/asia/travel-tips-and-articles/china-for-beginners-7-first-timer-fails-to-avoid-on-your-trip-to-beijing">7 first-timer fails to avoid on your trip to Beijing</a>.</li>
<li><a href="https://twitter.com/archpng/status/1146625946943967232">Archpng on Twitter: &quot;Mount Maiji Grottoes,China… &quot;</a>.</li>
<li><a href="http://t.co/1tSn3xxfP7">Beijing on a budget</a>.</li>
<li><a href="http://www.lonelyplanet.com/china/travel-tips-and-articles/the-most-incredible-chinese-cities-youve-never-heard-of">Chinese cities you've never heard of</a>.</li>
<li>Ctrip for hotels. Stick to high-rated only.</li>
<li><a href="http://www.lonelyplanet.com/asia/travel-tips-and-articles/essential-regional-cuisine-of-china">Essential regional cuisine of China</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Fenghuang_County">Fenghuang ancient town</a>.</li>
<li><a href="http://www.youramazingplaces.com/hallelujah-mountains-china/">Hallelujah Mountains</a>.</li>
<li><a href="https://goo.gl/maps/yP03w">Houhai Lake</a> (Beijing). Miscellaneous bars.</li>
<li><a href="https://en.wikipedia.org/wiki/Jiuzhaigou">Jiuzhaigou nature reserve</a>.</li>
<li><a href="https://twitter.com/planetepics/status/613968121498632192">Luotuofeng peak, Sichuan</a>.</li>
<li><a href="http://www.boredpanda.com/worlds-most-dangerous-hiking-trail-huashan-mountain-china/">Mount Huashan</a>.</li>
<li><a href="https://duckduckgo.com/?q=Mount+Maiji+Grottoes&amp;t=ffab&amp;iax=images&amp;ia=images">Mount Maiji Grottoes (DuckDuckGo)</a>.</li>
<li><a href="https://goo.gl/maps/TfdOV">Nan Luo Gu Xiang</a> (Beijing). Street Food!</li>
<li><a href="https://goo.gl/maps/15aFa">Qianmen Street</a>. Near Tiananmen Square. Artifact shopping and famous food.</li>
<li><a href="http://www.dailymail.co.uk/travel/article-1389739/Chinas-Sichuan-province-Visiting-lair-Yellow-Dragon.html">Rock pools</a>.</li>
<li><a href="http://www.lifeonnanchanglu.com/2010/06/shanghai-street-food-7-jian-bing.html">Shanghai Street Food #7 Jiān Bǐng 煎餅</a>.</li>
<li><a href="http://joi.ito.com/weblog/2014/09/01/shenzhen-trip-r.html">Shenzhen</a> (Hong Kong). The worlds manufacturing ecosystem.</li>
<li><a href="http://arts.cultural-china.com/en/85Arts192.html">Suspended Temple of Mt. Hengshan</a>.</li>
<li><a href="http://www.lonelyplanet.com/round-the-world-travel/best-of-round-the-world-travel/content/travel-tips-and-articles/77807">The essential guide to backpacking China's silk road</a>.</li>
<li><a href="https://www.quora.com/What-are-some-must-try-foods-when-visiting-China">What are some must-try foods when visiting China? (Quora)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Zhangjiajie_National_Forest_Park">Zhangjiajie National Forest Park</a>.</li>
<li><a href="https://www.lonelyplanet.com/china/travel-tips-and-articles/chinas-most-epic-high-speed-rail-journeys/40625c8c-8a11-5710-a052-1479d2768596">China's most epic high-speed rail journeys</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 19 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>South Korea travel bookmarks</title>
<link>https://xenodium.com/south-korea-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/south-korea-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.nomadasaurus.com/things-to-do-in-jeonju-south-korea/">8 Amazing Things to Do in Jeonju, South Korea (2020 Guide)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Hongdae,_Seoul">Hongdae, Seoul</a>.</li>
<li><a href="http://www.humarakausar.com/tag/koi-fish-mural">Koi fish mural at Naksan Park, Seoul</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 18 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Sharing on iOS</title>
<link>https://xenodium.com/sharing-on-ios</link>
<guid isPermaLink="false">https://xenodium.com/sharing-on-ios</guid>
    <description><![CDATA[<ul>
<li><a href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIActivityViewController_Class/">UIActivityViewController</a>.
<ul>
<li>Use completionWithItemsHandler on iOS 8.</li>
<li>Sample:</li>
</ul>
</li>
</ul>
<pre><code class="language-objc">NSString *title = @&quot;Sharing on iOS bookmarks.&quot;;
NSURL *url = [NSURL URLWithString:@&quot;http://xenodium.com/#sharing-on-ios&quot;];
UIImage *image = [UIImage imageNamed:@&quot;beautiful-image&quot;];

UIActivityViewController *controller =
  [[UIActivityViewController alloc]
    initWithActivityItems:@[title, url, image]
    applicationActivities:nil];

// self being a UIViewController.
[self presentViewController:controller animated:YES completion:nil];
</code></pre>
<ul>
<li>Sharing through Mail app on simulator isn't supported.</li>
</ul>
<blockquote>
<p>viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 &quot;The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)&quot; UserInfo=… {Message=Service Connection Interrupted}</p>
</blockquote>
<ul>
<li>Sharing through Mail app on device is OK.</li>
<li><a href="http://devstreaming.apple.com/videos/wwdc/2014/205xxqzduadzo14/205/205_hd_creating_extensions_for_ios_and_os_x,_part_1.mov?dl%3D1">WWDC 2014 Creating Extensions for iOS and OSX, Part 1</a>.
<ul>
<li>Share Extensions talk by Guy Fullerton.
<ul>
<li>Usually view controllers in addition to plist.</li>
<li>CFBundleDisplayName.</li>
<li>NSExtendion.
<ul>
<li>NSExtensionAttributes.
<ul>
<li>NSExtensionActivationRule.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>SLComposeServiceViewController.</li>
<li>UIActivityViewController.</li>
</ul>
</li>
<li><a href="http://devstreaming.apple.com/videos/wwdc/2014/217xxsvxdga3rh5/217/217_hd_creating_extensions_for_ios_and_os_x_part_2.mov?dl%3D1">WWDC 2014 Creating Extensions for iOS and OSX, Part 2</a>.</li>
<li>Want to a share URL to App Store? See <a href="https://developer.apple.com/library/ios/qa/qa1633/_index.html">Technical Q&amp;A 1633</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 18 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>San Francisco travel bookmarks</title>
<link>https://xenodium.com/san-francisco-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/san-francisco-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.bluestardonuts.com/">Blue Star Donuts (Portland + LA)</a>.</li>
<li><a href="https://www.yelp.com/biz/mr-and-mrs-miscellaneous-san-francisco">Mr. and Mrs. Miscellaneous</a>.</li>
<li><a href="https://www.smittenicecream.com/">Smitten Ice Cream</a>.</li>
<li><a href="http://www.tiledsteps.org/">Tiled steps at 16th Moraga Street in San Francisco</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 18 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Istanbul travel bookmarks</title>
<link>https://xenodium.com/istanbul-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/istanbul-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://istanbulfood.com/altan-sekerleme-a-sweet-sweet-bayram/">Altan Şekerleme (turkish delight shop)</a>.</li>
<li><a href="http://www.lonelyplanet.com/turkey/istanbul/travel-tips-and-articles/top-10-traditional-cheap-eats-in-istanbuls-bazaar-district">Cheap eats in Istanbul's Bazaar District</a>.</li>
<li><a href="http://www.turkeyfromtheinside.com/istanbul-guide/f/1255-findikli.html">Findikli rainbow stairs</a>.</li>
<li>Historic neighborhood of Arnavutkoy in Istanbul.</li>
<li><a href="http://istanbulfood.com/altan-sekerleme-a-sweet-sweet-bayram/">Istanbul Food: after the perfect bite</a>.</li>
<li><a href="http://www.lonelyplanet.com/turkey/cappadocia-kapadokya/travel-tips-and-articles/the-rise-of-karakoy-istanbuls-hippest-neighbourhood">The rise of Karakoy: Istanbul's hippest neighbourhood</a>.</li>
<li><a href="http://www.timwilmot.com/2012/04/fish-market-uskudar-istanbul.html">Uskudar Fish Market</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 18 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Rome travel bookmarks</title>
<link>https://xenodium.com/rome-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/rome-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.topbikerental.com/nuovosito/eng/tour-rome/city-center.php">Bike rental in Rome</a>.</li>
<li><a href="http://www.darkrome.com/">Darkrome tours</a>.</li>
<li><a href="http://www.lonelyplanet.com/italy/travel-tips-and-articles/first-time-rome-a-beginners-guide-to-the-eternal-city#ixzz3lhwtbgg0">First time Rome: a beginner’s guide to the Eternal City</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 18 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Italy travel bookmarks</title>
<link>https://xenodium.com/italy-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/italy-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://themindcircle.com/stunning-italy/">22 Towns in Italy That Are Almost Too Perfect Looking</a>.</li>
<li><a href="http://www.monte-oliveto.com/">Abbazia di Monte Oliveto Maggiore</a>.</li>
<li><a href="https://travellingantics.com/">Abbruzzo's Sulmona: one of the oldest towns in the area and home to the Latin poet Ovid, confetti (sugared almonds) and arrosticini (barbecued lamb skewers)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Alberobello">Alberobello - Wikipedia</a>.</li>
<li><a href="http://www.neatorama.com/2015/04/22/Furore-The-Little-Italian-Beach-Hidden-in-a-Fjord/">Amalfi coast's Furore beach</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Boboli_Gardens">Boboli Gardens, Florence</a>.</li>
<li><a href="http://italychronicles.com/heavenly-beauty-braies-lake-italy/">Braie lake</a>.</li>
<li><a href="http://www.caffemeletti.it/">Caffe Meletti</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Cinque_Terre">Cinque Terre</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Emilia-Romagna">Emilia Romagna</a>. (foood!).</li>
<li><a href="http://emilyluxton.co.uk/italy/five-small-towns">Fixe small towns in Italy</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Herculaneum">Herculaneum - Wikipedia</a>.</li>
<li><a href="http://www.lonelyplanet.com/italy/travel-tips-and-articles/italys-six-best-road-trips">Italy's six best road trips</a>.</li>
<li><a href="https://sirenuse.it/en">Le Sirenuse (Positano)</a>.</li>
<li><a href="http://www.lonelyplanet.com/italy/amalfi-coast/travel-tips-and-articles/76904">Live the good life: 12 local experiences on the Amalfi Coast</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Manarola">Manarola</a>.</li>
<li>Milan - Deus cafe.</li>
<li>Milan - <a href="https://www.google.co.uk/search?sa%3DG&amp;hl%3Den&amp;q%3Dgelateria%2Bmilano&amp;npsic%3D0&amp;rflfq%3D1&amp;tbm%3Dlcl&amp;ved%3D0ahUKEwjx8vuA353KAhWIOhoKHaFNDq0QjGoIPQ&amp;biw%3D1600&amp;bih%3D789">Gelato joints</a>.</li>
<li>Milan - <a href="http://www.ilmangione.it/">Il mangione</a> to find restaurants.</li>
<li>Milan - Mercato Metropolitani.</li>
<li>Milan - Navigli and eat at &quot;el brellin&quot;.</li>
<li>Milan - <a href="http://www.taveggia.it">Taveggia</a> for hot chocolate.</li>
<li>Milan - <a href="http://www.msadventuresinitaly.com/blog/2008/04/14/where-to-go-to-aperitivo-in-milan-italy/">Where to go for aperitivo in Milan</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Montalcino">Montalcino, and Brunello wine</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Palace_of_Venaria">Palace of Venaria</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Piazza_dei_Miracoli#Duomo">Piazza dei Miracoli</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Piedmont">Piedmont</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Pienza">Pienza, Tuscany</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Lampedusa">Rabbit beach</a>.</li>
<li><a href="http://www.tripadvisor.co.uk/Restaurant_Review-g635634-d1515714-Reviews-Re_di_Macchia-Montalcino_Tuscany.html">Re di Macchia, restaurant in Montalcino</a>.</li>
<li><a href="http://www.sacred-destinations.com/italy/san-galgano-abbey">San Galgano, Tuscany</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/San_Gimignano">San Gimignano, Tuscany</a>.</li>
<li><a href="http://florence-markets.com/sanlorenzomarket.asp">San Lorenzo leather market</a>.</li>
<li><a href="https://www.lonelyplanet.com/travel-tips-and-articles/skiing-in-italy-find-your-perfect-resort">Skiing in Italy: find your perfect resort</a>.</li>
<li><a href="https://lovefromtuscany.com/devils-bridge-tuscany/">The Devil's Bridge in Borgo a Mozzano, Tuscany, Italy - Love from Tuscany</a>.</li>
<li><a href="https://news.ycombinator.com/item">The New Treasures of Pompeii</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Volterra">Volterra, Tuscany</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 17 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs lisp debug on entry</title>
<link>https://xenodium.com/emacs-lisp-debug-on-entry</link>
<guid isPermaLink="false">https://xenodium.com/emacs-lisp-debug-on-entry</guid>
    <description><![CDATA[<p>Wanted to track down which package was enabling ido-mode on my behalf. debug-on-entry to the rescue. Pass the method name in question and you're good to go.</p>
<pre><code class="language-{.commonlisp">(debug-on-entry 'ido-mode)
</code></pre>
<p>When done, use cancel.</p>
<pre><code class="language-{.commonlisp">(cancel-debug-on-entry 'ido-mode)
</code></pre>
]]></description>
    <pubDate>Tue, 17 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Burma travel bookmarks</title>
<link>https://xenodium.com/burma-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/burma-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Bagan and Inle lake are the &quot;touristy&quot; areas.</li>
<li><a href="http://balloonsoverbagan.com/home">Balloons over Bagan</a>.</li>
<li>For Bagan, get bicycles.</li>
<li>Inle lake guided boat tour.</li>
<li><a href="https://en.wikipedia.org/wiki/Ngapali_Beach">Ngapali beach</a>.</li>
<li><a href="https://www.go-myanmar.com/ngwe-saung/">Ngwe Saung beach</a>.</li>
<li>Shwesandaw at sunset.</li>
<li><a href="http://imgur.com/a/D1EQJ">zyklusdiewelt's Myanmar's photos</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 17 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>OS X Screencasts to animated GIF</title>
<link>https://xenodium.com/os-x-screencasts-to-animated-gif</link>
<guid isPermaLink="false">https://xenodium.com/os-x-screencasts-to-animated-gif</guid>
    <description><![CDATA[<ul>
<li><a href="https://gist.github.com/dergachev/4627207">Alex Dergachev</a> has a great <a href="https://gist.github.com/dergachev/4627207">howto</a> for generating animated GIF out of OS X Screencasts.</li>
<li>Of interest <a href="http://gifbrewery.com/">GIF Brewery</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 16 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Writing Xcode plugins</title>
<link>https://xenodium.com/writing-xcode-plugins</link>
<guid isPermaLink="false">https://xenodium.com/writing-xcode-plugins</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/kattrali/Xcode-Plugin-Template">Xcode-Plugin-Template</a> from <a href="http://www.delisa.me/">Delisa Mason</a>/<a href="https://github.com/kattrali/Xcode-Plugin-Template">kattrali</a>.
<ul>
<li>Ensure DVTPlugInCompatibilityUUIDs is in Info.plist.</li>
<li>Get from:</li>
</ul>
</li>
</ul>
<pre><code class="language-{.bash">defaults read \
    /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
</code></pre>
<ul>
<li>Luis Solanos's <a href="https://github.com/luisobo/Xcode-RuntimeHeaders">Xcode-RuntimeHeaders</a>.</li>
<li>Boris Bügling's <a href="https://github.com/neonichu/Xcode-RuntimeHeaders">Xcode-RuntimeHeaders</a> fork.</li>
<li><a href="http://artsy.github.io/blog/2014/06/17/building-the-xcode-plugin-snapshots/">Building the Xcode plugin snapshots</a>.</li>
<li><a href="https://github.com/edwardaux/XcodeExplorer">Xcode Explorer</a> enables you to explore Xcode events/notifications.</li>
<li><a href="http://www.blackdogfoundry.com/blog/creating-an-xcode4-plugin/">Creating an Xcode4 plugin</a>.</li>
<li><a href="http://www.blackdogfoundry.com/blog/common-xcode4-plugin-techniques/">Common Xcode plugin techniques</a>.</li>
<li><a href="http://www.blackdogfoundry.com/blog/xcodeexplorer-monitor-xcode4-internals/">XcodeExplorer to monitor Xcode internals</a>.</li>
<li><a href="http://www.blackdogfoundry.com/blog/debugging-your-xcode-plugin/">Debugging your Xcode plugin</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 15 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Uninstalling Alcatraz from Xcode</title>
<link>https://xenodium.com/uninstalling-alcatraz-from-xcode</link>
<guid isPermaLink="false">https://xenodium.com/uninstalling-alcatraz-from-xcode</guid>
    <description><![CDATA[<pre><code class="language-{.bash">$ rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin
$ rm -rf ~/Library/Application\ Support/Alcatraz
</code></pre>
<p>ps. Removing all plugins:</p>
<pre><code class="language-{.bash">$ rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/*
</code></pre>
]]></description>
    <pubDate>Sun, 15 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Prefill Emacs swiper with current region</title>
<link>https://xenodium.com/prefill-emacs-swiper-with-current-region</link>
<guid isPermaLink="false">https://xenodium.com/prefill-emacs-swiper-with-current-region</guid>
    <description><![CDATA[<p>The new <a href="https://github.com/abo-abo/swiper">swiper</a> Emacs package is proving to be a great alternative to <a href="https://github.com/ShingoFukuyama/helm-swoop">helm-swoop</a>. Here's how to prefill with current region:</p>
<pre><code class="language-{.commonlisp">(defun ar/prefilled-swiper ()
  &quot;Pre-fill swiper input with region.&quot;
  (interactive)
  (if (region-active-p)
      (let ((region-text (buffer-substring (region-beginning)
                                           (region-end))))
        (swiper region-text))
    (swiper)))

(global-set-key (kbd &quot;C-s&quot;)
                #'ar/prefilled-swiper)
</code></pre>
]]></description>
    <pubDate>Sat, 14 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Change macOS app icon</title>
<link>https://xenodium.com/change-mac-os-app-icon</link>
<guid isPermaLink="false">https://xenodium.com/change-mac-os-app-icon</guid>
    <description><![CDATA[<ul>
<li>Open the new icon (.icns) in Preview.</li>
<li>Click on large image</li>
<li>Select all (⌘-a).</li>
<li>Copy (⌘-c).</li>
<li>Ctrl-click on app icon.</li>
<li>Select Get Info.</li>
<li>Click on app icon (top-left).</li>
<li>Paste (⌘-v).</li>
<li>Done!</li>
</ul>
<p><img src="https://xenodium.github.io/images/change-mac-os-app-icon/overriding.png" alt=""></p>
<p><img src="https://xenodium.github.io/images/change-mac-os-app-icon/after.png" alt=""></p>
]]></description>
    <pubDate>Sat, 14 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Hack on Emacs London meetup bookmarks</title>
<link>https://xenodium.com/hack-on-emacs-meetup</link>
<guid isPermaLink="false">https://xenodium.com/hack-on-emacs-meetup</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.european-lisp-symposium.org">European Lisp Symposium</a>.</li>
<li><a href="https://github.com/kai2nenobu/guide-key">guide-key</a> displays available key bindings.</li>
<li><a href="https://github.com/csrhodes/iplayer-el">iplayer-el</a> Emacs interface to the BBC's iPlayer.</li>
<li><a href="https://github.com/csrhodes/swankr">swankr</a> REPL (swank protocol for R).</li>
</ul>
]]></description>
    <pubDate>Wed, 11 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Working with OS X and Emacs tips</title>
<link>https://xenodium.com/working-with-os-x-and-emacs-tips</link>
<guid isPermaLink="false">https://xenodium.com/working-with-os-x-and-emacs-tips</guid>
    <description><![CDATA[<p>From <a href="http://emacsblog.org">M-x all-things-emacs</a>, Ryan McGeary's OS X/Emacs <a href="http://emacsblog.org/2011/01/04/how-i-work-working-with-os-x-and-emacs/">workflow</a>.</p>
<h2>Frequently used apps:</h2>
<ul>
<li><a href="https://agilebits.com/onepassword">1 password</a>.</li>
<li><a href="http://www.choosyosx.com/">Choosy</a>.</li>
<li><a href="http://mizage.com/divvy/">Divvy</a>.</li>
<li><a href="http://www.red-sweater.com/fastscripts">Fastscript</a>.</li>
<li><a href="http://fluidapp.com/">Fluid</a> (SSB).</li>
<li><a href="http://www.obdev.at/products/launchbar/index.html">Launchbar</a>.</li>
<li><a href="https://evernote.com/skitch/guide/mac/">Skitch (screenshots)</a>.</li>
<li><a href="http://smilesoftware.com/TextExpander/index.html">te (Text expander)</a>.</li>
</ul>
<h2>Dotfiles</h2>
<ul>
<li><a href="https://github.com/rmm5t/dotfiles">Github</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 09 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Building ycmd</title>
<link>https://xenodium.com/building-ycmd</link>
<guid isPermaLink="false">https://xenodium.com/building-ycmd</guid>
    <description><![CDATA[<h2>Build</h2>
<hr>
<h2>id: build-3</h2>
<pre><code class="language-{.bash">$ git clone https://github.com/Valloric/ycmd.git
$ cd ycmd
$ git submodule update --init --recursive
$ ./build.sh --clang-completer
</code></pre>
<h2>Test</h2>
<pre><code class="language-{.bash">$ python ycmd
  serving on http://127.0.0.1:54265
</code></pre>
<h2>More info</h2>
<ul>
<li><a href="https://github.com/Valloric/YouCompleteMe/blob/master/README.md">YouCompleteMe README</a>.</li>
<li><a href="https://github.com/Valloric/ycmd/blob/master/README.md">ycmd README</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 09 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Regular bookmarks</title>
<link>https://xenodium.com/regular-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/regular-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://roadsandkingdoms.com/category/food/">Roads &amp; Kingdoms (food)</a>.</li>
<li><a href="http://roadsandkingdoms.com/category/music">Roads &amp; Kingdoms (music)</a>.</li>
<li><a href="http://roadsandkingdoms.com/category/travel/">Roads &amp; Kingdoms (travel)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Photography bookmarks</title>
<link>https://xenodium.com/photography-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/photography-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.techradar.com/how-to/photography-video-capture/cameras/77-photography-techniques-tips-and-tricks-for-taking-pictures-of-anything-1320768/">77 photography techniques, tips and tricks for taking pictures of anything</a>.</li>
<li><a href="https://sites.google.com/site/marclevoylectures/schedule">Course schedule - Digital Photography</a>.</li>
<li><a href="https://www.qdev.de/?location=mac/exifrenamer">ExifRenamer: Batch rename photos using exif information</a>.</li>
<li><a href="https://github.com/Jack000/Expose">Exposé, A simple static site generator for photoessays</a>.</li>
<li><a href="https://ko-fi.com/s/f7ed5aec56">Japanese Storefront Reference set - Elora 's Ko-fi Shop - Ko-fi</a>.</li>
<li><a href="http://gakuran.com/category/haikyo-ruins/">Michael Gakuran's Gakuranman</a>.</li>
<li><a href="https://openmv.io/">OpenMV (Small - Affordable - Expandable)</a>.</li>
<li><a href="https://www.reddit.com/r/photocritique">Photo Critique (Subreddit)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Paris travel bookmarks</title>
<link>https://xenodium.com/paris-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/paris-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.ateliermaitrealbert.com/">Atelier Maitre Albert (known for its rotisserie chicken)</a>.</li>
<li>Au Passage. Small plates in fun atmosphere.</li>
<li>Berthillon Ice Cream.</li>
<li><a href="http://www.yelp.com/biz/breizh-caf%C3%A9-paris-2">Breizh Café (traditional gallete, savory buckwheat crepes)</a>.</li>
<li>Buvette Gastrotheque. Wine bar with small dishes.</li>
<li>Cheri Bibi, possibly hipster, underneath Sacre Coeur, good cocktails.</li>
<li>Creperie Josseline. Worth the queue. Drink Breton cider with crepes.</li>
<li><a href="http://holybel.ly">Holybelly</a> Canal Saint Martin.</li>
<li><a href="http://xdaysiny.com/how-to-spend-a-culinary-weekend-in-paris/">How To Spend a Culinary Weekend In Paris</a>.</li>
<li>L'Aller Retour. The place for steak-frites.</li>
<li>L'Office. Wine bar/bistrot.</li>
<li>Le Barav'.</li>
<li>Le Petit Poucet (restaurant next to Place de Clichy, Paris).</li>
<li><a href="http://www.lereminet.com">Le Reminet</a> (Paris restaurant).</li>
<li>Marché d'Aligre. Authentic neighbourhood market.</li>
<li>Marché des Enfants Rouge. Small covered market. Eat at food stalls.</li>
<li>Mosquee de Paris. City mosque. Drink mint tea at courtyard under olive trees or eat in restaurant inside. North African food.</li>
<li>Musee d'Orsay.</li>
<li><a href="http://sprudge.com/paris-a-guide-to-some-of-the-best-cafes-in-canal-st-martin-56068.html">Paris: A Guide To Some Of The Best Cafes In Canal St. Martin</a>.</li>
<li>Pierre Herme. For great pastries and macarons.</li>
<li>RATP for transport info including the &quot;carnet&quot; of 10 tickets.</li>
<li>Rodin Museum.</li>
<li><a href="http://www.yelp.com/biz/west-country-girl-paris">West Country Girl (crepes)</a>.</li>
<li><a href="https://www.quora.com/What-are-the-best-boulangeries-and-patisseries-in-Paris-for-each-arrondissement">What are the best boulangeries and patisseries in Paris for each arrondissement? (Quora)</a>.</li>
<li><a href="https://www.quora.com/What-are-the-best-places-to-buy-cheese-in-Paris">What are the best places to buy cheese in Paris? (Quora)</a>.</li>
<li><a href="https://www.quora.com/Where-are-best-vintage-stores-in-Paris">Where are best vintage stores in Paris? (Quora)</a>.</li>
<li><a href="https://www.quora.com/Where-are-the-best-flea-markets-in-Paris">Where are the best flea markets in Paris? (Quora)</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Org mode bookmarks</title>
<link>https://xenodium.com/org-mode-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/org-mode-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.emacslife.com/baby-steps-org.html">A Baby Steps Guide to Managing Your Tasks with Org</a>.</li>
<li><a href="https://blog.aaronbieber.com/2016/09/24/an-agenda-for-life-with-org-mode.html">An Agenda for Life With Org Mode</a>.</li>
<li><a href="https://scripter.co/notes/org-table-spreadsheet/">An Org Table Spreadsheet cheatsheet</a>.</li>
<li><a href="http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode">Assigning ids to entries</a>.</li>
<li><a href="http://thewanderingcoder.com/2015/03/automating-boilerplate-in-org-mode-journalling/">Automating boilerplate in org-mode journalling</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/jc4uou/tags_everywhere/">Beautiful Emacs tags (maybe for org mode?)</a>.</li>
<li><a href="https://zzamboni.org/post/beautifying-org-mode-in-emacs">Beautifying Org Mode in Emacs</a>.</li>
<li><a href="https://emacs-doctor.com/blogging-from-emacs.html">Blogging from GNU Emacs/org (with rss example)</a>.</li>
<li><a href="https://www.sadiqpk.org/blog/2018/08/08/blogging-with-org-mode.html">Blogging with Emacs org-mode</a>.</li>
<li><a href="https://yewtu.be/watch">Build a second brain</a>.</li>
<li><a href="https://mullikine.github.io/posts/arbitrary-interpreters-for-babel/">Compounding Confoundment: arbitrary interpreters for Babel</a>.</li>
<li><a href="https://gitlab.com/sadiq/sadiq.gitlab.io/blob/master/src/blog-atom.sh">Creating org atom xml feed with blog-atom.sh</a>.</li>
<li><a href="https://github.com/philipphoman/org-mode-poster">Creating scientific posters with org-mode</a>.</li>
<li><a href="https://dev.to/learnbyexample/customizing-pandoc-to-generate-beautiful-pdfs-from-markdown-3lbj">Customizing pandoc to generate beautiful pdfs from markdown (helpful to tweak org export)</a>.</li>
<li><a href="https://github.com/dfeich/org-babel-examples/blob/master/README.org">dfeich/org-babel-examples (GitHub)</a>.</li>
<li><a href="https://github.com/dfeich/org-babel-examples/blob/master/README.org">Dfeich’s Org-babel, org-exporter, org-table example collection</a>.</li>
<li><a href="https://gitlab.com/zzamboni/ox-leanpub">Diego Zamboni / ox-leanpub · GitLab</a>.</li>
<li><a href="http://correl.phoenixinquis.net/2015/07/12/git-graphs.html">Drawing Git Graphs with Graphviz and Org-Mode</a>.</li>
<li><a href="http://ergoemacs.org/emacs/elisp_parse_org_mode.html">Elisp: Parse Org Mode (API examples by Xah Lee)</a>.</li>
<li><a href="http://ehneilsen.net/notebook/orgExamples/org-examples.html">Emacs org-mode examples and cookbook</a>.</li>
<li><a href="https://jherrlin.github.io/posts/emacs-orgmode-source-code-blocks2/">Emacs Orgmode Source Code Blocks 2 | jherrlin</a>.</li>
<li><a href="https://emacs.stackexchange.com/questions/51399/org-babel-tangle-with-function-in-header-arguments/51769#51769">Executing org source blocks when loading file (and defining file-local vars)</a>.</li>
<li><a href="https://github.com/nikclayton/ob-html-chrome">Export Org HTML SRC blocks as PNG files using Chrome</a>.</li>
<li><a href="https://gitlab.com/ambrevar/ambrevar.gitlab.io/blob/master/feed-builder/feed-builder.el">feed-builder/feed-builder.el an org/blog rss implementation</a>.</li>
<li><a href="https://howardism.org/Technical/Emacs/getting-more-boxes-done.html">Getting Boxes Done, the Code</a>.</li>
<li><a href="https://github.com/DarkBuffalo/ox-report">GitHub - DarkBuffalo/ox-report: Export your org file to minutes report PDF file</a>.</li>
<li><a href="https://github.com/misohena/el-easydraw">GitHub - misohena/el-easydraw: Embedded drawing tool for Emacs</a>.</li>
<li><a href="https://github.com/niklasfasching/go-org">GitHub - niklasfasching/go-org: Org mode parser with html &amp; pretty printed org rendering</a>.</li>
<li><a href="https://github.com/alphapapa/helm-org-rifle">helm-org-rifle: Rifle through your Org buffers and acquire your target</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/6mzgkg/how_can_orgbabel_be_configured_to_set_variables/">How can org-babel be configured to set variables across multiple language? (Reddit)</a>.</li>
<li><a href="https://her.esy.fun/posts/0015-how-i-use-org-mode/index.html">How I use org-mode</a>.</li>
<li><a href="https://orgmode.org/manual/HTML-doctypes.html#HTML-doctypes">HTML doctypes (The Org Manual)</a>.</li>
<li><a href="https://www.miskatonic.org/2016/08/25/image-display-size-in-org/">Image display size in Org</a>.</li>
<li><a href="https://karl-voit.at/2021/08/28/pim-lecture-tug-2021/">Karl Voit's personal information management PIM Lecture at TU Graz</a>.</li>
<li><a href="http://kelvinh.github.io/wiki/org-mode-manual/">Kevin's org notes</a>.</li>
<li><a href="http://howardism.org/Technical/Emacs/literate-devops.html">Literate DevOps with org source blocks (Howardism)</a>.</li>
<li><a href="http://www.howardism.org/Technical/Emacs/literate-devops.html">Literate DevOps</a>.</li>
<li><a href="http://cachestocaches.com/2018/6/org-literate-programming/">Literate Programming with Org-mode</a>.</li>
<li><a href="https://www.offerzen.com/blog/literate-programming-empower-your-writing-with-emacs-org-mode">Literate Programming: Empower Your Writing with Emacs Org-Mode</a>.</li>
<li><a href="http://www.newartisans.com/2007/08/using-org-mode-as-a-day-planner/">Lost in Technopolis (getting things done with org agenda)</a>.</li>
<li><a href="http://irreal.org/blog/?p=7651">Making a Poster with Org-mode (Irreal)</a>.</li>
<li><a href="https://isamert.net/2021/04/21/managing-your-contacts-in-org-mode-and-syncing-them-to-your-phone-android-ios-whatever-.html">Managing your contacts in org-mode and syncing them to your phone</a>.</li>
<li><a href="https://www.bytedude.com/files/managing-your-life-with-org-mode.html">Managing Your Life With org-mode and Other Tools</a>.</li>
<li><a href="http://mbork.pl/2018-08-18_Embedding_files_in_Org-mode_revisited">Marcin Borkowski: 2018-08-18 Embedding files in Org-mode revisited</a>.</li>
<li><a href="https://fuco1.github.io/2018-12-23-Multiline-fontification-with-org-emphasis-alist.html">Multiline fontification (ie. bold) with org-emphasis-alist</a>.</li>
<li><a href="https://joshrollinswrites.com/emacsorg/org-capture-template-1/">My Org Capture Templates - Part 1 · The Art of Not Asking Why</a>.</li>
<li><a href="https://joshrollinswrites.com/emacsorg/org-capture-template-3/">My Org Capture Templates - Part 3 · The Art of Not Asking Why</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/hnf3cw/my_orgmode_agenda_much_better_now_with_category/">My org-mode agenda, much better now with category icons! : emacs</a>.</li>
<li><a href="https://patrickskiba.com/org-mode/2019/05/22/uses-for-org-mode.html">My Org-mode use cases (Patrick Skiba)</a>.</li>
<li><a href="http://www.cachestocaches.com/2016/9/my-workflow-org-agenda/">My Workflow with Org-Agenda</a>.</li>
<li><a href="https://christiantietze.de/posts/2019/12/emacs-notifications/">Native macOS Notifications for Emacs Org Tasks and Appointments</a>.</li>
<li><a href="https://kitchingroup.cheme.cmu.edu/blog/2016/11/04/New-link-features-in-org-9/">New link features in org 9</a>.</li>
<li><a href="https://github.com/ndwarshuis/om.el/blob/master/README.md">om.el/README.md at master · ndwarshuis/om.el · GitHub</a>.</li>
<li><a href="https://github.com/dfeich/org-babel-examples">Org babel examples repo</a>.</li>
<li><a href="https://org-babel.readthedocs.io/en/latest/">Org Babel reference card</a>.</li>
<li><a href="https://raw.githubusercontent.com/eschulte/babel-dev/master/scraps.org">org babel scraps</a>.</li>
<li><a href="https://ag91.github.io/blog/2020/08/28/org-crypt-and-logbook-how-they-can-work-together-for-a-secure-agenda/">Org crypt and LOGBOOK: how they can work together for a secure agenda.</a>.</li>
<li><a href="https://titan-c.gitlab.io/org-cv/">Org CV/resume</a>.</li>
<li><a href="http://www.star.bris.ac.uk/bjm/org-basics.html">Org mode basics</a>.</li>
<li><a href="https://writepermission.com/org-blogging-rss-feed.html">Org mode blogging: RSS feed</a>.</li>
<li><a href="http://home.fnal.gov/~neilsen/notebook/orgExamples/org-examples.html">Org mode examples and cookbook</a>.</li>
<li><a href="http://home.fnal.gov/~neilsen/notebook/orgExamples/org-examples.html">Org mode examples</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/9d8i7y/org_mode_habits/">Org Mode Habits : emacs</a>.</li>
<li><a href="https://gist.github.com/drj42/1755992">Org mode reference card</a>.</li>
<li><a href="https://orgmode.org/worg/org-tutorials/">Org tutorials</a>.</li>
<li><a href="https://alphapapa.github.io/org-almanac/">org-almanac</a>.</li>
<li><a href="https://github.com/sprig/org-capture-extension/blob/master/README.md">org-capture-extension (GitHub)</a>.</li>
<li><a href="https://github.com/eschulte/org-ehtml">org-ehtml: Export Org-mode files as editable web pages</a>.</li>
<li><a href="https://github.com/theodorewiles/org-mind-map">org-mind-map: creates graphviz directed graphs from org-mode files</a>.</li>
<li><a href="http://pragmaticemacs.com/emacs/org-mode-basics-vii-a-todo-list-with-schedules-and-deadlines/">Org-mode basics VII: A TODO list with schedules and deadlines | Pragmatic Emacs</a>.</li>
<li><a href="https://bzg.fr/en/some-emacs-org-mode-features-you-may-not-know.html/">Org-mode features You May Not Know · Bastien Guerry - Liberté, informatique</a>.</li>
<li><a href="https://yiufung.net/post/org-mode-hidden-gems-pt2/">Org-mode Hidden Gems - 02 Tables</a>.</li>
<li><a href="https://github.com/flexibeast/org-vcard/">org-mode support for vCard export and import</a>.</li>
<li><a href="https://github.com/weirdNox/org-noter">org-noter: Emacs document annotator, using Org-mode</a>.</li>
<li><a href="https://alhassy.github.io/org-special-block-extras/README.html">org-special-block-extras</a>.</li>
<li><a href="https://github.com/alphapapa/org-web-tools">org-web-tools: Commands and functions for retrieving web page content and processing it into and displaying it as Org-mode content.</a>.</li>
<li><a href="https://github.com/alphapapa/org-web-tools">org-web-tools: View, capture, and archive Web pages in Org-mode</a>.</li>
<li><a href="https://github.com/lyon0xd/uml/blob/master/org/test.org">org/uml examples</a>.</li>
<li><a href="https://www.zcl.space/tools/organize-you-life-in-org/">Organize you life in Emacs Org | ZCL.SPACE</a>.</li>
<li><a href="http://doc.norang.ca/org-mode.html">Organize your life in plain text</a>.</li>
<li><a href="https://www.youtube.com/playlist?list=PLVtKhBrRV_ZkPnBtt_TD1Cs9PJlU0IIdE&amp;app=desktop">OrgMode tutorial - YouTube channel</a>.</li>
<li><a href="https://forum.effectivealtruism.org/posts/w4CM7RfTLXxYLDccX/pablo-stafforini-s-forecasting-system-1">Pablo Stafforini’s Forecasting System - EA Forum</a>.</li>
<li><a href="https://medium.com/@tasshin/plan-your-day-daily-time-management-with-emacs-org-mode-and-google-calendar-a9162837fdb3">Plan your day: Daily Time Management with Emacs, Org-Mode, and Google Calendar</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23130104">Prettifying Org Mode with CSS | Hacker News</a>.</li>
<li><a href="https://sandyuraz.com/articles/orgmode-css/">Prettifying Org Mode with CSS</a>.</li>
<li><a href="https://puntoblogspot.blogspot.com/2018/12/3-basic-org-agenda-tips-for.html">puntoblogspot: 3 basic org agenda tips for the fundamentally forgetful</a>.</li>
<li><a href="https://vxlabs.com/2017/06/03/querying-restful-webservices-into-emacs-orgmode-tables/">Querying RESTful webservices into Emacs orgmode tables (vxlabs)</a>.</li>
<li><a href="https://www.youtube.com/playlist?list=PLVtKhBrRV_ZkPnBtt_TD1Cs9PJlU0IIdE">Rainer König's OrgMode YouTube tutorials</a>.</li>
<li><a href="https://fuco1.github.io/2019-02-10-Refiling-hydra-with-pre-defined-targets.html">Refiling hydra with pre-defined targets</a>.</li>
<li><a href="http://blog.lujun9972.win/emacs-document/blog/2018/10/22/ricing-up-org-mode/index.html">Ricing up Org Mode - EMACS-DOCUMENT</a>.</li>
<li><a href="https://lepisma.github.io/2017/10/28/ricing-org-mode/">Ricing up Org Mode</a>.</li>
<li><a href="https://www.arcadianvisions.com/blog/#orga597dcf">Robust Notes with Embedded Code (extensive org babel usage)</a>.</li>
<li><a href="https://orgmode.org/guide/">The compact Org-mode Guide</a>.</li>
<li><a href="https://ag91.github.io/blog/2020/09/04/the-poor-org-user-spaced-repetition/">The Poor Org-User Spaced Repetition - Where parallels cross</a>.</li>
<li><a href="http://www.flutterbys.com.au/stats/tut/tut16.1.html">Tutorial 16.1 - Emacs orgmode tables</a>.</li>
<li><a href="https://karl-voit.at/2017/08/12/org-rabbit-hole/">UOMF: Org Mode As a Rabbit Hole: Agenda Tasks Piling Up</a>.</li>
<li><a href="https://karl-voit.at/2017/01/15/org-clone-subtree-with-time-shift/">UOMF: Recurring Events with Org Mode</a>.</li>
<li><a href="http://www.sastibe.de/2018/05/2018-05-11-emacs-org-mode-rest-apis-stocks/">Use Emacs Org Mode and REST APIs for an up-to-date Stock Portfolio</a>.</li>
<li><a href="http://cestlaz.github.io/posts/using-emacs-24-capture-2/#.WTtEbXWw5pg">Using Emacs - 24 - Org Capture 2</a>.</li>
<li><a href="https://cestlaz.github.io/post/using-emacs-54-org-tables">Using Emacs 54 Org Tables</a>.</li>
<li><a href="https://dpitt.me/blog/2020/03/zettelkasten">Using Emacs's org-mode As Your Zettelkasten</a>.</li>
<li><a href="http://www.diegoberrocal.com/blog/2015/08/19/org-protocol/">Using org-capture with org-protocol be like - Diego Berrocal</a>.</li>
<li><a href="http://kitchingroup.cheme.cmu.edu/blog/2019/02/12/Using-results-from-one-code-block-in-another-org-mode/">Using results from one code block in another org-mode</a>.</li>
<li><a href="https://ofosos.org/2017/12/04/sudo-org-babel/">Using sudo in org-babel</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/jof1p3/visit_tangled_file_with_orgopenatpoint/">Visit tangled file with org-open-at-point (supports tramp/ssh)</a>.</li>
<li><a href="https://pjs64.wordpress.com/2020/12/07/worgsheet-calc-intro/">WorgSheet Calc Intro – Dj Pj (lots of tips and shortcuts)</a>.</li>
<li><a href="http://katherine.cox-buday.com/blog/2015/03/14/writing-specs-with-org-mode/">Writing Specs with Org-mode</a>.</li>
<li><a href="https://www.youtube.com/watch">YouTube: org introduction</a>.</li>
<li><a href="https://github.com/nobiot/Zero-to-Emacs-and-Org-roam">Zero to Emacs and Org-roam: a step-by-step guide</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 08 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>London bar backlog</title>
<link>https://xenodium.com/london-bar-backlog</link>
<guid isPermaLink="false">https://xenodium.com/london-bar-backlog</guid>
    <description><![CDATA[<h2>Soho</h2>
<ul>
<li><a href="http://www.68andboston.com">68 and Boston (cocktails and wine bar)</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 11 Sep 2018 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>London food backlog</title>
<link>https://xenodium.com/london-food-backlog</link>
<guid isPermaLink="false">https://xenodium.com/london-food-backlog</guid>
    <description><![CDATA[<h2>B_acklog</h2>
<h3><a href="https://www.saporitaliarestaurant.co.uk">Saporitalia (Italian/pizza), Notting Hill</a>.</h3>
<h3><a href="https://theblacklock.com/menus/">Menus | Lunch, Dinner, Sunday Roast - Blacklock</a>.</h3>
<h3><a href="https://thebarbary.co.uk/food-drink/">Food &amp; Drink - The Barbary | Covent Garden Restaurant | Neal's Yard | London</a>.</h3>
<h3><a href="https://www.pophamsbakery.com/">Pophams Bakery</a>.</h3>
<h3><a href="https://www.timeout.com/london/restaurants/yipin-china">Yipin China | Restaurants in Islington, London</a>.</h3>
<h3><a href="https://m.facebook.com/sundaybarnsbury/">Sunday (breakfast)</a>.</h3>
<h3><a href="https://www.clifton.co.uk/the-quince-tree-cafe-london">The Quince Tree Cafe London (Cafe), Paddington</a>.</h3>
<h3><a href="https://www.bombaybustle.com">Bombay Bustle (Indian), Mayfair</a>.</h3>
<h3><a href="https://www.kyseri.co.uk">Kyseri (modern turkish), Fitzrovia</a>.</h3>
<h3><a href="http://www.pied-a-terre.co.uk/">Pied a Terre (fine dining), Fitzrovia</a>.</h3>
<h3><a href="http://www.theledbury.com/tasting-menu/">The Ledbury (fine dining), Notting Hill</a>.</h3>
<h3><a href="https://www.flourandgrape.com">Flour and Grape (Pasta), Bermondsey</a>.</h3>
<h3><a href="https://www.honipoke.com/">Honi Pokē (poke), Soho</a>.</h3>
<h3><a href="http://zialucia.com/">ZIA LUCIA (pizza), Highbury Islington</a>.</h3>
<h3>Yeast Bakery.</h3>
<h3>Pavillion Cafe.</h3>
<h3>Palm Vaults.</h3>
<h2>Angel</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.shawarmabar.co.uk/">Shawarma Bar - Berber and Q</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://bombayburrito.co.uk/">Bombay Burrito (Indian burrito takeaway &amp; restaurant: Angel, Islington)</a>.</p>
<h2>Baker Street</h2>
<p>[DONE]{.done .DONE} <a href="http://www.anticapizzeriadamichele.co.uk">L’ANTICA PIZZERIA DA MICHELE (Pizza), Baker Street</a>.</p>
<h2>Barbican</h2>
<p>[TODO]{.todo .TODO} <a href="http://sushitetsu.co.uk">Sushi Tetsu (must book, well in advance)</a>.</p>
<h2>Barnsbury</h2>
<p>[TODO]{.todo .TODO} Sunday (breakfast, cafe, working).</p>
<h2>Battersea</h2>
<p>[TODO]{.todo .TODO} <a href="https://tonkotsu.co.uk/">Tonkotsu (ramen)</a>.</p>
<h2>Brick Lane</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.chezellesbistroquet.co.uk">Chez Elles</a> (french).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.yelp.com/biz/fika-london-2">Fika</a> (Swedish, cinnamon buns, coffee).</p>
<h2>Bermondsey</h2>
<p>[TODO]{.todo .TODO} Druid Street market</p>
<ol>
<li>
<p>FAT London (Kimchee ).</p>
</li>
<li>
<p>&amp; Cultured butter.</p>
</li>
</ol>
<h2>Bethnal Green</h2>
<h3>[DONE]{.done .DONE} <a href="https://lahpet.co.uk/">Lahpet</a> (Burmese) &lt;2018-12-02 Sun&gt; &lt;2018-12-27 Thu&gt;</h3>
<hr>
<h2>id: lahpet-burmese-2018-12-02-sun-2018-12-27-thu</h2>
<h2>Brixton</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.nanban.co.uk/">Nanban</a> (Japanese soul food).</p>
<h2>Borough</h2>
<p>[DONE]{.done .DONE} <a href="http://padella.co">Padella</a> (great fresh pasta).</p>
<p>[TODO]{.todo .TODO} <a href="https://roastingplant.com/">Roasting Plant: Fresh Roasted Coffee</a> &lt;2019-01-15 Tue&gt;</p>
<h2>Camberwell</h2>
<p>[TODO]{.todo .TODO} <a href="http://suncamberwell.com">Sun of Camberwell</a> (Roast beef, Yorkshire, and sticky toffee pudding).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.timeout.com/london/restaurants/silk-road">Silk Road (Chinese, Lamb/cumin skewers)</a>.</p>
<h2>Canada Water</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.chuckburgerbar.com/#canadawater">Chuck burger (truck)</a>.</p>
<h2>Cannon street</h2>
<p>[TODO]{.todo .TODO} <a href="https://www.theinfatuation.com/london/reviews/brigadiers">The Brigadiers (Indian)</a> &lt;2019-01-22 Tue&gt;</p>
<h2>Chiswick</h2>
<p>[TODO]{.todo .TODO} <a href="https://www.thecoffeetraveller.com/">The Coffee Traveller</a> &lt;2019-01-16 Wed&gt;</p>
<h2>Covent Garden</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.punjab.co.uk/">Punjab</a> (Punjabi).</p>
<p>[TODO]{.todo .TODO} <a href="https://www.dintaifung-uk.com/">鼎泰豐・Din Tai Fung・ディンタイフォン・딘타이펑 (soup dumplings)</a> &lt;2019-03-12 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://www.littlekolkata.co.uk/">Little Kolkata (London Restaurant - Kolkata Spirits)</a> &lt;2019-03-12 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://www.duendelondon.com/">Duende</a> (modern Spanish).</p>
<p>[TODO]{.todo .TODO} <a href="http://rockandsoleplaice.com">Rock &amp; Sole Plaice</a> (fish and chips).</p>
<p>[TODO]{.todo .TODO} <a href="https://tyuk.com">Timber Yard</a> (coffee, working).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.chicknsours.co.uk/">Chicks 'n' Sours</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.jidori.co.uk/">Jidori</a> (chicken yakitori) &lt;2018-12-02 Sun&gt;</p>
<p>[DONE]{.done .DONE} Dishoom (Indian), try Lamb raan.</p>
<p>[DONE]{.done .DONE} <a href="http://www.sagarveg.co.uk">Sagar</a> (South Indian): Great food!</p>
<h2>Clapham</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.joepublicpizza.com">Joe Public Pizza</a>.</p>
<h2>Crouch end</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.the-haberdashery.com">The Haberdashery</a> (coffee, working).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.localblend.co.uk/blend-harringay-2">Blend</a> (coffee, working).</p>
<h2>Ealing</h2>
<p>[TODO]{.todo .TODO} Kiraku (Sushi).</p>
<p>[TODO]{.todo .TODO} <a href="https://wacafe.co.uk/">Wa Cafe (Japanese Patiserie)</a>.</p>
<h2>Earls court</h2>
<p>[TODO]{.todo .TODO} <a href="http://mamlondon.com">MAM</a> (Vietnamese) &lt;2018-12-02 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://www.facebook.com/ukjollibee/?utm_source=tripadvisor&amp;utm_medium=referral">Jollibee UK (filipino fried chicken/fast food)</a> &lt;2019-03-12 Tue&gt;</p>
<h2>Edware road</h2>
<p>[DONE]{.done .DONE} <a href="http://gogi-restaurant.com">GOGI</a> (korean): Average. Also, they lied to me and apologized with £10 credit.</p>
<h2>Euston</h2>
<p>[TODO]{.todo .TODO} Roti King (Indian/Pakistani/Singaporean): 40, Doric Way, Euston, NW1 1LH.</p>
<h2>Farringdon</h2>
<p>[TODO]{.todo .TODO} Quality Chop House.</p>
<p>[TODO]{.todo .TODO} Daddy Donkey (Mexican).</p>
<p>[TODO]{.todo .TODO} <a href="http://jandacafe.com">J+A</a> (coffe, working).</p>
<h2>Fitzrovia</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.indianymca.org/">Indian YMCA</a> (inexpensive Indian).</p>
<p>[TODO]{.todo .TODO} <a href="https://www.pastificioaldente.com">Pastificio al dente (Italian, fresh pasta)</a> &lt;2019-03-12 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://www.houseofho.co.uk/home">House of Ho</a> (Vietnamese).</p>
<h2>Golders Green</h2>
<p>[TODO]{.todo .TODO} Cafe Japan (Sushi).</p>
<h2>Hackney</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.pidginlondon.com">Pidgin</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://dabbadrop.co.uk">DabbaDrop (Indian delivery subscription)</a>.</p>
<h2>Hammersmith</h2>
<p>[DONE]{.done .DONE} <a href="http://indian-zing.co.uk/">Indian Zing</a> (Indian): It was OK (not great).</p>
<p>[TODO]{.todo .TODO} <a href="https://www.etfoodvoyage.com/2018/08/24/dragon-cat-cafe/">Dragon cat cafe</a> (bubble tea and wheel cake). &lt;2019-07-14 Sun&gt;</p>
<h2>Hamstead</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.jinkichi.com/">Jin Kichi</a> (Japanese).</p>
<h2>Harrow</h2>
<p>[TODO]{.todo .TODO} <a href="http://mazarafghanrestaurant.co.uk/contact/">Mazar</a> (Afghan).</p>
<h2>Hatch End</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.chuckburgerbar.com/">Chuck Burger</a>.</p>
<h2>Holborn</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.prufrockcoffee.com">Prufrock Café</a> (coffee, working).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.goodandpropertea.com/find-us">Good &amp; Proper</a> (coffee, tea, working).</p>
<p>[TODO]{.todo .TODO} <a href="https://www.theinfatuation.com/london/reviews/noble-rot">Noble Rot (wine bar/food)</a> &lt;2019-01-22 Tue&gt;</p>
<h2>Holloway Road</h2>
<p>[TODO]{.todo .TODO} Xi'an impression (Xi'an)</p>
<h2>Islington</h2>
<p>[TODO]{.todo .TODO} <a href="http://delhigrill.com">Delhi Grill</a> (Indian), try chicken makhani and naan.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.bababoom.london">BabaBoom</a> (the kebab makers) &lt;2018-12-02 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://rootsatn1.com">Roots N1</a> (Indian).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.thepigandbutcher.co.uk/">The pig and butcher</a> (sunday roast).</p>
<p>[TODO]{.todo .TODO} <a href="http://busanbbq.co.uk">Busan BBQ</a> (Korean meets American diner/burgers and fried chicken).</p>
<p>[TODO]{.todo .TODO} <a href="https://smokehouseislington.co.uk/">Smokehouse Islington</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.etfoodvoyage.com/2019/02/19/katsute-100/">Katsuke 100</a> (Japanese tea/cake room). &lt;2019-07-14 Sun&gt;</p>
<h2>Kensington</h2>
<p>[TODO]{.todo .TODO} Clarke's, try the burger.</p>
<h2>Kensal Green</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.tripadvisor.com/Restaurant_Review-g186338-d3531042-Reviews-Centro_Galego_de_Londres-London_England.html">Centro Galego de Londres</a> (Gallician).</p>
<h2>Kentish town</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.timeout.com/london/restaurants/the-fields-beneath">The Fields Beneath</a> (coffee, working).</p>
<h2>King's Cross</h2>
<p>[TODO]{.todo .TODO} Itadaki Zen.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.germangymnasium.com/">German Gymnasium</a>.</p>
<p>[DONE]{.done .DONE} <a href="http://starofkings.co.uk/food-and-drink/">Yeah! Burger at Star of Kings</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.wingwing.co.uk/">Wing Wing (Korean fried chicken)</a>s.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.etfoodvoyage.com/2018/08/31/sambal-shiok-has-a-permanent-home">Sambal Shiok</a> known for laksa and satai burger. &lt;2019-07-14 Sun&gt;</p>
<h2>Leicester square</h2>
<p><a href="https://ichibanya.uk/">Curry House Ichibanya UK Japanese Restaurant London WC2H</a> &lt;2019-03-12 Tue&gt;.</p>
<h2>Leytonstone</h2>
<p><a href="http://www.singburi.co.uk">Singburi (Thai)</a> &lt;2019-05-07 Tue&gt;.</p>
<h2>Liverpool street</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.gunpowderlondon.com">Gunpowder</a> (Indian).</p>
<p>[TODO]{.todo .TODO} Cinnamon Kitchen (Indian).</p>
<h2>London Bridge</h2>
<p>[TODO]{.todo .TODO} <a href="https://www.santoremedio.co.uk/">Santo Remedio</a> (Mexican).</p>
<h2>Marylebone</h2>
<p>[DONE]{.done .DONE} <a href="http://www.timeout.com/london/restaurants/fischers">Fischer's</a> (Austrian). Great atmosphere and schnitzel. Not cheap.</p>
<p>[TODO]{.todo .TODO} Nambutei (Sushi).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.lurra.co.uk/">Lurra</a> (Basque).</p>
<h2>Mayfair</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.mayfairchippy.com">Mayfair chippy</a> (Fish and chips).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.ikedarestaurant.com/">Ikeda</a> (Japanese).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.the-araki.com/">THE ARAKI (Sushi) / pricey</a>.</p>
<h2>Mornington Crescent</h2>
<p>[TODO]{.todo .TODO} Asakusa (Japanese).</p>
<h2>Notting Hill</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.localblend.co.uk/blend-harringay-2">Blend</a> (coffee, working).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.thecontinentalpantry.com/">The continental pantry</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://mamlondon.com">MAM</a> (Vietnamese) &lt;2018-12-02 Sun&gt;</p>
<h2>Old Street</h2>
<p>[TODO]{.todo .TODO} <a href="http://sardine.london">Sardine</a> (French).</p>
<p>[TODO]{.todo .TODO} <a href="http://sasukeramen.co.uk/">Sasuke</a> (ramen).</p>
<h2>Olympia</h2>
<p>[DONE]{.done .DONE} Aborz (Iranian). &lt;2018-12-27 Thu&gt;</p>
<h2>Oxford street</h2>
<p>[TODO]{.todo .TODO} Roti Chai (Indian).</p>
<h2>Peckham</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.ganapatirestaurant.com">Ganapati</a> (South Indian).</p>
<p>[TODO]{.todo .TODO} <a href="http://thebeggingbowl.co.uk/">The Begging Bowl (Thai)</a> &lt;2019-05-07 Tue&gt;.</p>
<h2>Piccadilly</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.urbantearooms.com/menus">Urban tea rooms (coffee/tea/brunch)</a> &lt;2019-03-12 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://machi-ya.co.uk/">Machiya</a> (Japanese comfort) &lt;2018-12-02 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://yoriuk.com/">YORI-Korean Restaurant</a> &lt;2019-03-12 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://www.ica.art/rochelle-canteen">Rochelle Canteen @ The Institute of Contemporary Arts (ICA)</a> (Pie and ping Sunday special) &lt;2019-02-12 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://www.fortnumandmason.com/products/dark-chocolate-coated-chocolate-pearl">Dark Chocolate Coated Chocolate Pearl, 190g - Fortnum &amp; Mason</a> &lt;2020-06-14 Sun&gt;.</p>
<h2>Putney</h2>
<p>[TODO]{.todo .TODO} <a href="https://www.tripadvisor.co.uk/ShowUserReviews-g186338-d807103-r176708451-Tomoe-London_England.html">authentic Japanese restaurant in Putney - Tomoe, London Traveller Reviews - TripAdvisor</a>.</p>
<h2>Sheppherds bush</h2>
<p>[TODO]{.todo .TODO} <a href="https://www.etfoodvoyage.com/2017/09/03/caco-co/">Caco &amp; Co</a> (Portuguese cafe). &lt;2019-07-14 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://www.etfoodvoyage.com/2017/03/17/chop-chop-noodle-bar/">Chop chop</a> (Noodle bar). &lt;2019-07-14 Sun&gt;</p>
<h2>Shoreditch</h2>
<p>[TODO]{.todo .TODO} <a href="http://mastbrothers.com/pages/london">Mast Brothers chocolate makers</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.sagardi.co.uk/en/">Sagardi</a> (basque).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.lookmumnohands.com/">Look mum no hands</a> (cofee, working).</p>
<p>[TODO]{.todo .TODO} <a href="http://jandacafe.com">J+A</a> (coffe, working).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.goodandpropertea.com/find-us">Good &amp; Proper</a> (coffee, tea, working).</p>
<p>[TODO]{.todo .TODO} <a href="https://smokestak.co.uk">Smokestak</a> (BBQ).</p>
<p>[TODO]{.todo .TODO} <a href="https://pickyglutton.com/2015/08/17/banh-mi-in-london-review/">Pho Viet 68</a> (Banh mi).</p>
<h2>Sloane Square</h2>
<p>[TODO]{.todo .TODO} <a href="http://rasoi-uk.com/">Rasoi</a> (Indian).</p>
<h2>Soho</h2>
<p>[TODO]{.todo .TODO} <a href="https://www.lehanoi.uk/">Le Hanoi</a> (Vietnamese) &lt;2018-12-02 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://www.thevietnamesekitchen.co.uk/">Cay Tre</a> (Vietnamese) &lt;2018-12-02 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://vietnamfood.co.uk/vietfood">Viet Food</a> (Vietnamese) &lt;2018-12-02 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://www.taotaoju.co.uk/">Tao Tao Ju</a> (Dim sum) &lt;2018-12-02 Sun&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://www.lokhandwala.co.uk/">Lokhandwala London (Top Indian Tapas Restaurant &amp; Bar in London)</a> &lt;2019-01-15 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://dumlondon.com/">DUM biryani (Indian)</a> &lt;2019-01-15 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="http://pastaio.london">Pastaio (Italian, fresh pasta)</a> &lt;2019-01-15 Tue&gt;.</p>
<p>[TODO]{.todo .TODO} <a href="https://bun.house/">Bun House</a> (ie. pork buns).</p>
<p>[TODO]{.todo .TODO} <a href="http://temperrestaurant.com/">Temper restaurant</a> (BBQ/tapas).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.goldenunion.co.uk">Golden Union</a> (fish bar).</p>
<p>[TODO]{.todo .TODO} <a href="http://meltroom.com/">Melt Room</a> (Cheese toasties).</p>
<p>[TODO]{.todo .TODO} <a href="http://shotgunbbq.com/">Shotgun</a> (BBQ).</p>
<p>[TODO]{.todo .TODO} <a href="http://smacklobster.com/">Smack Lobster</a> (Lobster rolls).</p>
<p>[TODO]{.todo .TODO} <a href="https://pickyglutton.com/2014/11/05/smoking-goat-review/">Smoking Goat</a> (Thai), highly recommended.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.atariya.co.uk/restaurants/">Atari Ya</a> (Sushi).</p>
<p>[TODO]{.todo .TODO} Yumi Izakaya (Japanese).</p>
<p>[TODO]{.todo .TODO} Jugemu (Japanese).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.darjeeling-express.com/">Darjeeling Express</a> (Indian).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.hopperslondon.com">Hoppers</a> Dosas, Rice, Roast, Kothu &amp; Arrack (Sri Lanka and Tamil Nadu).</p>
<p>[TODO]{.todo .TODO} <a href="https://tyuk.com">Timber Yard</a> (coffee, working).</p>
<p>[DONE]{.done .DONE} <a href="http://pizzapilgrims.co.uk/">Pizza Pilgrims</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://pickyglutton.com/2016/10/14/kiln-review-soho/">Kiln</a> (Thai), highly recommended.</p>
<p>[DONE]{.done .DONE} <a href="http://baolondon.com">BAO</a> (Bao buns! enough said).</p>
<p>[DONE]{.done .DONE} <a href="http://said.it/en/london/">SAID</a> (italian chocolate shop). Awesome hot chocolate.</p>
<h2>Southhall</h2>
<h3>[DONE]{.done .DONE} <a href="http://brilliantrestaurant.com">Brilliant restaurant</a> (healthier Indian). &lt;2018-12-27 Thu&gt;</h3>
<hr>
<h2>id: brilliant-restaurant-healthier-indian.-2018-12-27-thu</h2>
<h2>Southbank</h2>
<p>[TODO]{.todo .TODO} <a href="https://tonkotsu.co.uk/">Tonkotsu (ramen)</a>.</p>
<h2>South Kensington</h2>
<p>[TODO]{.todo .TODO} Hour Glass (Pub restaurant).</p>
<h2>Smithfield</h2>
<p>[TODO]{.todo .TODO} <a href="http://birdofsmithfield.com">Bird of Smithfield</a> (Sheppherd's pie, ox cheek, cheesecake).</p>
<h2>Spitafields</h2>
<p>[DONE]{.done .DONE} <a href="https://pickyglutton.com/2016/05/02/som-saa-review-spitalfields/">Som Saa</a> (Thai), highly recommended. &lt;2018-12-27 Thu&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://lahpet.co.uk/">Lahpet</a> (Burmese) &lt;2018-12-02 Sun&gt;</p>
<h2>Strand</h2>
<p>[TODO]{.todo .TODO} <a href="https://www.strand-continental.co.uk/india-club">India Club (around for 50 years)</a> &lt;2019-05-21 Tue&gt;</p>
<h2>Stoke Newingtom</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.the-haberdashery.com">The Haberdashery</a> (coffee, working).</p>
<h2>Tottenham Court Road.</h2>
<p>[DONE]{.done .DONE} <a href="https://www.kanada-ya.com/">Kanada-Ya</a> (rammen): Not bad.</p>
<h2>Tower Hill</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.manze.co.uk">M. Manze</a> (pie and mash).</p>
<p>[TODO]{.todo .TODO} <a href="https://www.google.co.uk/search?q=maltby+street+market&amp;rlz=1C1FLDB_enGB546GB546&amp;espv=2&amp;biw=1449&amp;bih=913&amp;tbm=isch&amp;tbo=u&amp;source=univ&amp;sa=X&amp;ved=0ahUKEwj1nrGQvYvLAhUF2hoKHeaQDQsQsAQIOg&amp;dpr=1">Maltby street market</a>.</p>
<h2>Tufnell Park</h2>
<p>[TODO]{.todo .TODO} Monsoon (Indian), try lamb naga.</p>
<h2>Turnham Green</h2>
<p>[TODO]{.todo .TODO} Chief Coffee.</p>
<h2>Victoria</h2>
<p>[TODO]{.todo .TODO} <a href="http://dominiqueansellondon.com/">Dominique Ansel Bakery (Bakery)</a> &lt;2019-01-22 Tue&gt;</p>
<p>[TODO]{.todo .TODO} Dominique Ansel Bakery &lt;2018-12-11 Tue&gt;</p>
<p>[TODO]{.todo .TODO} <a href="https://bleeckerburger.co.uk">Bleeker (burger)</a> &lt;2019-01-22 Tue&gt;</p>
<h2>Walthamstow</h2>
<p>[TODO]{.todo .TODO} <a href="https://grillstock.co.uk">Grillstock BBQ</a>.</p>
<h2>Waterloo</h2>
<p>[TODO]{.todo .TODO} <a href="http://thelaughinggravy.co.uk">The Laughing Gravy</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://zenchina.co.uk">Zen China</a>.</p>
<h2>West Hamstead</h2>
<p>[TODO]{.todo .TODO} <a href="http://www.timeout.com/london/restaurants/nautilus">Nautilus</a> (fish and chips).</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/MamacitaNW6/media">Mamacita</a> (Mexican).</p>
<h2>Whitechapel</h2>
<p>[TODO]{.todo .TODO} Lahore Kebab House, try seekh kebabs with roti.</p>
<p>[TODO]{.todo .TODO} Sushinoen.</p>
<h2>Wimbledon</h2>
<p>[TODO]{.todo .TODO} Dalchini (Indian), try spicy cocunut fish curry.</p>
]]></description>
    <pubDate>Sun, 08 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>UX bookmarks</title>
<link>https://xenodium.com/ux-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ux-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://99designs.com/designer-blog/2014/01/20/11-kerning-tips/">10 kerning tips for improving your typography</a>.</li>
<li><a href="https://www.nngroup.com/articles/ten-usability-heuristics/">10 Usability Heuristics for User Interface Design</a>.</li>
<li><a href="http://line25.com/inspiration/flat-design-color-palettes">30 Flat Design Color Palettes That Just Work</a>.</li>
<li><a href="https://learnui.design/blog/4-rules-intuitive-ux.html">4 Rules for Intuitive UX</a>.</li>
<li><a href="http://tympanus.net/Development/AnimatedSVGIcons/">Animated SVG icons</a>.</li>
<li><a href="https://developer.apple.com/design/tips/">Apple's UI design Dos and Don'ts</a>.</li>
<li><a href="https://twitter.com/yuanqinglim/status/1357893783803756544">Applying white space in UI design: 8 practical tips, with examples.</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12711060">Ask HN: Good books or articles on UI design? (Hacker News)</a>.</li>
<li><a href="https://www.behance.net/">behance (Showcase &amp; Discover Creative Work)</a>.</li>
<li><a href="https://www.behance.net/gallery/18006477/California-Magazine">California magazine</a>.</li>
<li><a href="http://capptivate.co">capptivate.co (features mobile UIs)</a>.</li>
<li><a href="https://lmjabreu.com/post/creating-badass-users/">Creating badass users</a>.</li>
<li><a href="http://deathtothestockphoto.com/stories/">Death to Stock (stock photos)</a>.</li>
<li><a href="https://www.designernews.co/">Designer News</a>.</li>
<li><a href="https://blogs.gnome.org/tbernard/2019/12/30/designing-an-icon-for-your-app/">Designing an Icon for Your App – Space and Meaning (planet gnome)</a>.</li>
<li><a href="https://developer.bring.com/blog/ui-tips/">DIY UI Tips for Backend Developers</a>.</li>
<li><a href="http://evil-icons.io">Evil icons</a>.</li>
<li><a href="http://www.fontsquirrel.com/">Font squirrel (free fonts for commercial use)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27232297">Freesound just reached 500K Creative Commons sounds | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=13015631">How to Become a UX Designer (Hacker News)</a>.</li>
<li><a href="https://www.sketchbook.com/blog/how-to-draw-imagination-using-references/">How to Draw from Imagination: Beyond References</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=10861521">Images and Sketch files of popular devices (Hacker News)</a>.</li>
<li><a href="http://facebook.github.io/design/devices">Images and Sketch files of popular devices</a>.</li>
<li><a href="https://vimeo.com/137263880">iOS Typography: Stop Saying “No” to Designers on Vimeo</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24030969">Laws of UX | Hacker News</a>.</li>
<li><a href="http://www.underconsideration.com/brandnew/archives/logo_modernism.php#.VhRP_HvoVE4">Logo Modernism (Book)</a>.</li>
<li><a href="http://makerbook.net/">Makerbook: A hand-picked directory of the best free resources for creatives</a>.</li>
<li><a href="https://github.com/google/material-design-icons/releases/tag/1.0.0">Material Design icons</a>.</li>
<li><a href="http://www.mobile-patterns.com/">mobile-patterns.com (UX mobile patterns)</a>.</li>
<li><a href="http://pttrns.com/">pttrns.com (mobile UX patterns)</a>.</li>
<li><a href="https://www.refactoringui.com/book">Refactoring UI: The Book</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=20728645">Rules for Intuitive UX | Hacker News</a>.</li>
<li><a href="https://uxdesign.cc/selection-controls-ui-component-series-3badc0bdb546">Selection controls — UI component series | by Taras Bakusevych | UX Collective</a>.</li>
<li><a href="http://tachyons.io/docs/themes/skins/">Skins / Themes / Docs / TACHYONS</a>.</li>
<li><a href="https://www.swissted.com/">Swissted (punk rock and Swiss Modernism drawings)</a>.</li>
<li><a href="http://tachyons.io/">TACHYONS - Css Toolkit (Minimalistic Swiss-inspired)</a>.</li>
<li><a href="http://www.typewolf.com/blog/most-popular-fonts-of-2014">Ten most popular webfonts of 2014</a>.</li>
<li><a href="http://inkbotdesign.com/100-best-design-blogs/">The 100 Best Design Blogs to Follow</a>.</li>
<li><a href="http://www.codelitt.com/blog/the-foundations-of-a-good-ui/">The Foundations of a Good UI</a>.</li>
<li><a href="http://www.methodsandtools.com/archive/archive.php?id=126">The Psycology of UX</a>.</li>
<li><a href="http://typographica.org/">Typographica (type reviews, books, commentary)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12887416">Unsplash – Beautiful photos free to use under the Unsplash License (Hacker News)</a>.</li>
<li><a href="https://uxplanet.org/">UX Planet</a>.</li>
<li><a href="https://blogs.scientificamerican.com/sa-visual/visualizing-science-illustration-and-beyond">Visualizing Science: Illustration and Beyond - Scientific American Blog Network</a>.</li>
<li><a href="https://dribbble.com/">What are you working on? Dribbble is show and tell for designers</a>.</li>
<li><a href="https://blog.prototypr.io/why-showing-your-process-is-so-important-1e4129a5f5d2#.7o5bfjwd7">Why Showing Your Process is So Important!</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 07 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Recipes</title>
<link>https://xenodium.com/recipes</link>
<guid isPermaLink="false">https://xenodium.com/recipes</guid>
    <description><![CDATA[<h2>Jeera rice (cumin rice)</h2>
<h3>Sizzle spices (40 seconds)</h3>
<ul>
<li>1 tablespoon oil</li>
<li>1 teaspoon cumin seeds</li>
<li>4 cloves</li>
<li>2 black cardamon pods</li>
<li>1 cinnamon stick</li>
</ul>
<h3>Sautee onion (2 mins or browned/opaque)</h3>
<ul>
<li>1 small yellow onion (chopped)</li>
</ul>
<h3>Sautee rice + salt (1 minute)</h3>
<ul>
<li>2 cups of basmati rice</li>
<li>1.2 teaspoon of salt</li>
</ul>
<h3>Boil, then partially cover and simmer (8 minutes or water gone)</h3>
<ul>
<li>4 cups water</li>
</ul>
<h3>Rest 5 minutes (covered)</h3>
<h2>Slow-cooked lamb</h2>
<ol>
<li>Preheat oven: 240°C (no fan) 220°C (fan).</li>
<li>Lamb face up in tray.</li>
<li>Cook for 30 mins (or brown).</li>
<li>Take lamb out.</li>
<li>Add to tray: broth, onions, rosemary.</li>
<li>Lamb face down (broth covers 1/3 or 1/4).</li>
<li>Cover with lid (or baking/parchment paper then 2 layers of foil).</li>
<li>Bake for 3.5 hours at 180°C (no fan).</li>
<li>Take out.</li>
<li>Turn lamb face up (over again). Check if liquid needs top-up.</li>
<li>Cook for 2 more hours.</li>
<li>Check if ready. Does meat fall off the bone with fork?</li>
<li>If not, keep for another 30 mins. Check again.</li>
<li>You are done ø/.</li>
</ol>
<h2>Tom Kha Gai soup</h2>
<ul>
<li>Chicken or Prawns</li>
<li>2 kaffir lime leaves</li>
<li>1 lemongrass stalk</li>
<li>1 1/2 cocunut milk</li>
<li>3/4 sliced fresh galaghal</li>
<li>1 1/2 chicken stock or water</li>
<li>1/2 cup mushrooms</li>
<li>3 1/2 tbsp sugar</li>
<li>1/2 cup of cilantro</li>
<li>1-4 thai chillies</li>
<li>1-2 tbsp chili oil</li>
<li>1 green onion</li>
</ul>
<h2>Veg-Fruit juice</h2>
<ul>
<li>Lime</li>
<li>Ginger</li>
<li>Apple</li>
<li>Chilly</li>
<li>Celery</li>
<li>Fig</li>
<li>Blueberries</li>
</ul>
<h2>Berry Hempster</h2>
<ul>
<li>Hemp milk</li>
<li>Hemp protein</li>
<li>Strawberry</li>
<li>Blueberry</li>
<li>Date</li>
</ul>
<h2>How to cook <a href="https://www.youtube.com/watch?v%3DDaN4ifTG3H0">Beef Chow Fun</a>.</h2>
<h2><a href="http://www.dailymail.co.uk/home/you/article-2248267/Recipe-Cavolo-nero-anchovies-chilli-garlic.html">Cavolo nero with anchovies, chilli and garlic</a>.</h2>
<h2>Vietnamese Pork Lettuce Wraps (my own versions)</h2>
<ul>
<li>Pork Mince.</li>
<li>Chopped garlic.</li>
<li>Chopped chillies.</li>
<li>Chopped ginger.</li>
<li>4 tablespoons of soy sauce.</li>
<li>2 tablespoons of apple cider vinegar.</li>
<li>Sesame oil (for cooking mince).</li>
<li>Half tablespoon of coconut sugar.</li>
<li>Lettuces (for wrapping).</li>
</ul>
]]></description>
    <pubDate>Sat, 07 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Music backlog</title>
<link>https://xenodium.com/music-backlog</link>
<guid isPermaLink="false">https://xenodium.com/music-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://zenodo.org/record/4008297">CatMeows: A Publicly-Available Dataset of Cat Vocalizations | Zenodo</a>.</p>
<p>[TODO]{.todo .TODO} Pay What You Want (bandcamp).</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/cognazor/status/1196464349109530625">Zontali on Twitter: &quot;Name one of your most emotionally resonant songs, and I …</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://generative.fm/">Generative.fm</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://ivanish.ca/diminished-fifth/">Diminished Fifth</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.archiveofindianmusic.org/">Archive of Indian music</a>.</p>
<p>[TODO]{.todo .TODO} Budhaditya Mukherjee.</p>
<p>[TODO]{.todo .TODO} Debashish Bhattcharya.</p>
<p>[TODO]{.todo .TODO} Halim Jafar Khan and his Disciples - Sitar Quintet - LP published in India in 1968.</p>
<p>[TODO]{.todo .TODO} Harjinderpal Singh.</p>
<p>[TODO]{.todo .TODO} Jayanthi Kumaresh.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=jMEjPKBvhzE#t=0">Kayhan Kalhor</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://youtu.be/qQcKzwSmGy0">Malaya Chalo</a>.</p>
<p>[TODO]{.todo .TODO} Mehboob Nadeem.</p>
<p>[TODO]{.todo .TODO} Nirmalya Dey.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=dPSr3swtLDk">Zia Mohiuddin</a>.</p>
<p>[TODO]{.todo .TODO} Music sites</p>
<ul>
<li><a href="http://3hive.com/">3hive</a></li>
<li><a href="https://acloserlisten.com/">A Closer Listen</a></li>
<li><a href="https://alfitude.com/">Alfitude</a></li>
<li><a href="https://abductionradiation.tumblr.com/">Abduction Radiation</a></li>
<li><a href="http://www.weraddicted.com/category/music/">Addicted</a></li>
<li><a href="https://acidstag.com/category/music/">Acid Stag</a></li>
<li><a href="https://www.adhoc.fm/">ADHOC</a></li>
<li><a href="https://www.albumoftheyear.org/">Album of the Year</a></li>
<li><a href="https://americansongwriter.com/news/">American Songwriter</a></li>
<li><a href="http://www.anydecentmusic.com/">Any Decent Music?</a></li>
<li><a href="https://aquariumdrunkard.com/">Aquarium Drunkard</a></li>
<li><a href="https://atwoodmagazine.com/">Atwood Magazine</a></li>
<li><a href="https://www.backseatmafia.com/">Backseat Mafia</a></li>
<li><a href="http://www.birp.fm/">Birp!</a></li>
<li><a href="https://www.blackplastic.co.uk/">Black Plastic</a></li>
<li><a href="https://bleep.com/">Bleep</a></li>
<li><a href="https://www.blindedbythefloodlights.com/">Blinded by the Floodlights</a></li>
<li><a href="http://bloodbuzzed.blogspot.com/">Bloodbuzzed</a></li>
<li><a href="https://brightonmusicblog.co.uk/">Brighton Music Blog</a></li>
<li><a href="https://www.brooklynvegan.com/">Brooklyn Vegan</a></li>
<li><a href="https://boaws.org/">Built on a Weak Spot</a></li>
<li><a href="https://buzzbands.la/">buzzbands.la</a></li>
<li><a href="http://www.cerealandsounds.com/">Cereal and Sounds</a></li>
<li><a href="https://chillhop.com/blog/">Chillhop Blog</a></li>
<li><a href="https://classicsdujour.com/">Classics Dujour</a></li>
<li><a href="https://www.classicrockhistory.com/">Classic Rock History</a></li>
<li><a href="https://cloutcloutclout.com/">Clout</a></li>
<li><a href="https://clunkmag.com/?v=7516fd43adaa">Clunk Magazine</a></li>
<li><a href="https://consequenceofsound.net/category/new-music/">Consequence of Sound</a></li>
<li><a href="https://www.coolmusicandthings.co.uk/">Cool Music and Things</a></li>
<li><a href="https://crackmagazine.net/">Crack Magazine</a></li>
<li><a href="https://www.curiousformusic.com/">Curious for Music</a></li>
<li><a href="https://darrensmusicblog.com/category/rock-music/">Darren’s Music Blog</a></li>
<li><a href="https://www.pastemagazine.com/daytrotter">Daytrotter</a></li>
<li><a href="https://www.desertislandcloud.com/">Desert Island Cloud</a></li>
<li><a href="https://www.digitaltourbus.com/">Digital Tour Bus</a></li>
<li><a href="https://diffuser.fm/">Diffuser.fm</a></li>
<li><a href="https://disconaivete.com/">Disco Naivete’</a></li>
<li><a href="http://www.discovernu.co/">DiscoverNu</a></li>
<li><a href="https://discoverymusicscotland.com/">Discovery Music</a></li>
<li><a href="https://dinkededition.co.uk/">Dinked</a></li>
<li><a href="https://readdork.com/">Dork</a></li>
<li><a href="https://www.dragcity.com/">Drag City</a></li>
<li><a href="http://www.drivenfaroff.com/category/videos/">Driven Far Off</a></li>
<li><a href="https://dmy.co/new-music">Dummy Magazine</a></li>
<li><a href="https://earmilk.com/">Earmilk</a></li>
<li><a href="https://www.eartothegroundmusic.co/">Ear to the Ground Music</a></li>
<li><a href="https://eclecticmusiclover.com/">Eclectic Music Lover</a></li>
<li><a href="http://www.elicitmagazine.com/">Elicit Magazine</a></li>
<li><a href="https://exclaim.ca/music">Exclaim!</a></li>
<li><a href="https://www.exposedmagazine.co.uk/category/music/">Exposed Magazine</a></li>
<li><a href="https://www.famemagazine.co.uk/">Fame Magazine</a></li>
<li><a href="https://www.factmag.com/">Fact Magazine</a></li>
<li><a href="https://www.fashionably-early.com/">Fashionably Early</a></li>
<li><a href="https://www.wunc.org/live-updates/north-carolina-local-music-blog-burns-wunc">First in Music</a></li>
<li><a href="http://www.fluxblog.org/">Fluxblog</a></li>
<li><a href="https://fortheloveofbands.com/">For the Love of Bands</a></li>
<li><a href="https://fortherabbits.net/">For the Rabbits</a></li>
<li><a href="https://fromthestrait.com/">From the Strait</a></li>
<li><a href="https://fvmusicblog.com/blog/">FV Music Blog</a></li>
<li><a href="http://www.gasmaskmagazine.com/">Gas Mask Magazine</a></li>
<li><a href="https://giggoer.com/">Gig Goer</a></li>
<li><a href="https://www.goldflakepaint.co.uk/posts/">GoldFlakePaint</a></li>
<li><a href="https://www.goldenplec.com/">GoldenPlec</a></li>
<li><a href="https://www.goldminemag.com/">Goldmine</a></li>
<li><a href="https://www.gorillavsbear.net/">Gorilla Vs. Bear</a></li>
<li><a href="http://www.godisinthetvzine.co.uk/category/new-music/">God is in the TV</a></li>
<li><a href="https://www.grimygoods.com/new-music-2/">Grimy Goods</a></li>
<li><a href="https://hardofhearingmusic.com/">Hard of Hearing Music</a></li>
<li><a href="https://www.hardlyart.com/">Hardly Art</a></li>
<li><a href="https://www.hearingthings.co/">Hearing Things!</a></li>
<li><a href="https://highclouds.org/">High Clouds</a></li>
<li><a href="https://hypem.com/site/highclouds/23232">Hype Machine</a></li>
<li><a href="https://hi54.blog/">High Five For…</a></li>
<li><a href="https://www.hotpress.com/music">Hot Press</a></li>
<li><a href="https://hypem.com/latest">Hype Machine</a></li>
<li><a href="https://hypem.com/list">hundreds of music sites</a></li>
<li><a href="https://hypem.com/">latest posts</a></li>
<li><a href="https://iheartmoosiq.tumblr.com/">I Herat Moosiq</a></li>
<li><a href="https://imposemagazine.com/">Impose Magazine</a></li>
<li><a href="http://www.intunemusic.co.uk/">In Tune</a></li>
<li><a href="https://independentmusic.reviews/">Independent Music Reviews</a></li>
<li><a href="https://indie-tapes.com/">Indie-Tapes</a></li>
<li><a href="https://indie88.com/">Indie88</a></li>
<li><a href="https://indie30.com/">Indie30</a></li>
<li><a href="https://www.youtube.com/channel/UCVoraDictyd89xgZt-J2Frw">Indie Air</a></li>
<li><a href="https://indieartistgo.com/category/indie-music/indie-music-interviews/">Indie Artist Go</a></li>
<li><a href="https://www.indiecentralmusic.com/">Indie Central Music</a></li>
<li><a href="https://www.indieisnotagenre.com/">Indie is not a Genre</a></li>
<li><a href="https://indiemusicfilter.com/">Indie Music Filter</a></li>
<li><a href="http://indieobsessive.blogspot.com/">Indie Obsessive</a></li>
<li><a href="https://indiepulsemusic.com/">Indie Pulse Magazine</a></li>
<li><a href="https://indierockcafe.com/">Indie Rock Cafe</a></li>
<li><a href="http://indieunderground.ca/">Indie Underground</a></li>
<li><a href="https://www.indiemuck.com/">Indiemuck</a></li>
<li><a href="http://indietronica.org/">Indietronica</a></li>
<li><a href="https://infinitevolumemag.com/">Infinite Volume Magazine</a></li>
<li><a href="https://www.isthismusic.com/">Is This Music?</a></li>
<li><a href="http://www.itsallindie.com/">It’s All Indie</a></li>
<li><a href="https://www.itsindie.co.uk/music">It’s Indie and We Know it</a></li>
<li><a href="https://www.iq-mag.net/">IQ</a></li>
<li><a href="https://www.juno.co.uk/junodaily/category/music-news/">Juno</a></li>
<li><a href="http://kaput-mag.com/en/">Kaput Magazine</a></li>
<li><a href="https://keepwalkingmusic.com/">Keep Walking Music</a></li>
<li><a href="https://twitter.com/SEBenAli">S. Ben Ali</a></li>
<li><a href="https://larecord.com/">LA Record</a></li>
<li><a href="http://blog.largeheartedboy.com/">Largehearted Boy</a></li>
<li><a href="https://lefuturewave.com/">Lefuturewave</a></li>
<li><a href="http://littleindieblogs.blogspot.com/">Little Indie Blogs</a></li>
<li><a href="https://lucymccourt.com/">Lucy McCourt</a></li>
<li><a href="https://madmackerel.org/">Mad Mackeral</a></li>
<li><a href="https://melmagazine.com/entertainment/music">MEL Magazine</a></li>
<li><a href="https://mixitallup.com/">Mix it all Up</a></li>
<li><a href="https://www.youtube.com/user/MORindie">MORIndie</a></li>
<li><a href="http://www.myoldkentuckyblog.com/">My Old Kentucky Blog</a></li>
<li><a href="http://musicassent.com/">Music Assent</a></li>
<li><a href="https://musicauthentic.com/">Music Authentic</a></li>
<li><a href="https://www.musicbloggersnetwork.com/">Music Bloggers Network</a></li>
<li><a href="https://www.musiccrowns.org/">Music Crowns</a></li>
<li><a href="https://musicforthemisfits.com/">Music for Misfits</a></li>
<li><a href="https://musicindustryblog.wordpress.com/">Music Industry Blog</a></li>
<li><a href="https://musicmachinery.com/">Music Machinery</a></li>
<li><a href="https://musicmattersgb.com/">Music Matters</a></li>
<li><a href="https://musicreviewworld.com/">Music Review World</a></li>
<li><a href="http://www.musicsavage.com/">Music Savage</a></li>
<li><a href="https://www.musikblog.de/">Musikblog</a></li>
<li><a href="http://www.neonfiller.com/wordpress/">Neon Filler</a></li>
<li><a href="http://www.neonfiller.com/wordpress/?cat=268">Top 100 Indie and Alternative Albums list</a></li>
<li><a href="https://neonmusic.co.uk/">Neon Music</a></li>
<li><a href="https://newsoundgeneration.co.uk/">New Sound Generation UK</a></li>
<li><a href="https://newsoundsmag.co.uk/">New Sounds</a></li>
<li><a href="http://www.nitestylez.de/">NiteStylez</a></li>
<li><a href="https://noctismag.com/">Noctis</a></li>
<li><a href="https://noiseartists.net/">Noise Artists</a></li>
<li><a href="https://notion.online/">Notion</a></li>
<li><a href="https://nowthenmagazine.com/music">Now Then Magazine</a></li>
<li><a href="https://www.nme.com/news/music">NME</a></li>
<li><a href="https://www.nodepression.com/">No Depression</a></li>
<li><a href="https://twitter.com/search?q=%23RootsMusic&amp;src=hashtag_click">#RootsMusic</a></li>
<li><a href="https://www.nordicmusicreview.com/">Nordic Music Review</a></li>
<li><a href="http://www.nyctaper.com/">NYCTaper</a></li>
<li><a href="http://www.obliviouspop.com/">Oblivious Pop</a></li>
<li><a href="https://www.thegoldentiki.com/">Golden Tiki</a></li>
<li><a href="https://www.obscuresound.com/">Obscure Sound</a></li>
<li><a href="https://www.ohmyrockness.com/">Oh My Rockness</a></li>
<li><a href="https://www.onegreatsong.co.uk/">One Great Song</a></li>
<li><a href="http://www.1songday.com/">One Song a Day</a></li>
<li><a href="http://onestoprecordshop.co.uk/">One Stop Record Shop</a></li>
<li><a href="https://onequartmagazine.com/music/">One Quart Magazine</a></li>
<li><a href="https://overblown.co.uk/">Overblown UK</a></li>
<li><a href="http://ovrld.com/">Ovrld</a></li>
<li><a href="https://pastelwasteland.com/">Pastel Wasteland</a></li>
<li><a href="http://pilerats.com/music/bands/">Pilerats</a></li>
<li><a href="https://pinkwafer.club/">Pink Wafer</a></li>
<li><a href="https://pitchfork.com/">Pitchfork</a></li>
<li><a href="http://plasticmag.co.uk/">Plastic</a></li>
<li><a href="https://www.pleasepasstheindie.com/">Please Pass the Indie</a></li>
<li><a href="https://poppedmusic.co.uk/">Popped Music UK</a></li>
<li><a href="http://prtlsmusic.com/">Portals</a></li>
<li><a href="http://post-trash.com/">Post-Trash</a></li>
<li><a href="https://purplemelonmu.com/">Purple Melon</a></li>
<li><a href="http://www.ravensingstheblues.com/">Raven Sings the Blues</a></li>
<li><a href="https://www.recordoftheday.com/track-archive">Record of the Day</a></li>
<li><a href="https://www.reddit.com/r/indiemusic/">Reddit</a></li>
<li><a href="https://www.wearerhythmsection.com/">Rhythm Section</a></li>
<li><a href="https://www.rightchordmusic.co.uk/">Right Cord Music</a></li>
<li><a href="https://rockthepigeon.com/">Rock the Pigeon</a></li>
<li><a href="https://www.padraigs.com/">Padraigs</a></li>
<li><a href="https://www.scenepointblank.com/">Scene Point Blank</a></li>
<li><a href="https://schonmagazine.com/">Schon!</a></li>
<li><a href="https://www.sos-music.co.uk/">Scientists of Sound</a></li>
<li><a href="http://www.scottishmusicnetwork.co.uk/">Scottish Music Network</a></li>
<li><a href="https://shebops.net/">She Bops</a></li>
<li><a href="https://www.shindig-magazine.com/">Shindig!</a></li>
<li><a href="https://shoegazeblog.com/">Shoegaze Blog</a></li>
<li><a href="https://sidekick-music.com/music-news/">Sidekick Music</a></li>
<li><a href="https://sinusoidalmusic.com/">Sinusoidal Music</a></li>
<li><a href="https://sodwee.com/blog/">Sodwee</a></li>
<li><a href="https://soyoungmagazine.com/journal/">So Young Magazine</a></li>
<li><a href="https://www.somekindofawesome.com/">Some Kind of Wonderful</a></li>
<li><a href="https://www.souldoubtmag.com/">Sould Doubt Magazine</a></li>
<li><a href="https://sgtmt.tumblr.com/">Sound Good to Me Too</a></li>
<li><a href="https://www.spin.com/">SPIN</a></li>
<li><a href="https://spinditty.com/artists-bands/">Spinditty</a></li>
<li><a href="https://www.stampthewax.com/">Stamp The Wax</a></li>
<li><a href="https://staticdive.com/">Static Dive</a></li>
<li><a href="http://stepkid.com/">Stepkid</a></li>
<li><a href="https://www.stereofox.com/">Stereofox</a></li>
<li><a href="https://www.stereogum.com/music/">Stereogum</a></li>
<li><a href="https://stereostickman.com/">Stereo Stickman</a></li>
<li><a href="https://www.stillinrock.com/">Still in Rock</a></li>
<li><a href="http://swelltonemusic.com/">Swell Tone</a></li>
<li><a href="https://swimintothesound.com/">Swim into the Sound</a></li>
<li><a href="https://syncmusicblog.com/">Sync.</a></li>
<li><a href="https://www.tenementtv.com/">Tenement TV</a></li>
<li><a href="https://testpressing.org/">Test Pressing</a></li>
<li><a href="https://thatgrapejuice.net/">That Grape Juice</a></li>
<li><a href="https://www.getalternative.com/category/music/">The Alternative</a></li>
<li><a href="https://thebopscollective.com/">The Bops Collective</a></li>
<li><a href="https://thebluewalrus.com/">The Blue Walrus</a></li>
<li><a href="http://www.theburningear.com/">The Burning Ear</a></li>
<li><a href="https://www.thedailylistening.com/">The Daily Listening</a></li>
<li><a href="https://thedailymusicreport.com/best-new-music/">The Daily Music Report</a></li>
<li><a href="http://www.thefader.com/">Fader</a></li>
<li><a href="https://www.thegreyestates.com/">The Grey Estates</a></li>
<li><a href="https://thehoneypop.com/">The HoneyPop</a></li>
<li><a href="https://theindiegrid.co.uk/">The Indie Grid</a></li>
<li><a href="https://www.theindiescene.co.uk/">The Indie Scene</a></li>
<li><a href="http://theindiesound.com/">The Indie Sound</a></li>
<li><a href="https://thelastmixedtape.com/">The Last Mixed Tape</a></li>
<li><a href="https://www.thelineofbestfit.com/">The Line of Best Fit</a></li>
<li><a href="https://www.thelunacollective.co/">The Luna Collective</a></li>
<li><a href="https://themusic.com.au/">The Music</a></li>
<li><a href="https://the-music-files.com/single-album-reviews/">The Music Files</a></li>
<li><a href="http://www.themusicmanual.co.uk/">The Music Manual</a></li>
<li><a href="https://www.themusicmermaid.com/">The Music Mermaid</a></li>
<li><a href="http://www.themusicninja.com/">The Music Ninja</a></li>
<li><a href="https://thenewlofi.com/">The New LoFi</a></li>
<li><a href="https://www.theothersidereviews.com/">The Other Side Reviews</a></li>
<li><a href="https://www.theplayground.co.uk/">The Playground</a></li>
<li><a href="https://www.thepitldn.com/guestmixes">The Pit London</a></li>
<li><a href="http://www.thepointofeverything.com/">The Point of Everything</a></li>
<li><a href="https://thequietus.com/">The Quietus</a></li>
<li><a href="https://www.thereviewsarein.com/">The Reviews are in</a></li>
<li><a href="https://therevue.ca/category/music/">The Revue</a></li>
<li><a href="https://thescenestar.typepad.com/">The Scenestar</a></li>
<li><a href="https://thesonicmosquitosoup.wordpress.com/">The Sonic Mosquito Soup</a></li>
<li><a href="https://www.theskinny.co.uk/music">The Skinny</a></li>
<li><a href="https://thesoundsniffer.com/">The Sound Sniffer</a></li>
<li><a href="https://staticdive.com/">The Static Dive</a></li>
<li><a href="https://thethinair.net/">The Thin Air</a></li>
<li><a href="http://www.thewaster.com/">The Waster</a></li>
<li><a href="https://thewonderwhy.wixsite.com/website">The WonderWhy</a></li>
<li><a href="https://www.thezineuk.co.uk/music/">The Zine UK</a></li>
<li><a href="http://thissongissick.com/">This Song is Sick</a></li>
<li><a href="https://threeimaginarygirls.com/record_review/">Three Imaginary Girls</a></li>
<li><a href="https://www.tinymixtapes.com/">Tiny Mix Tapes</a></li>
<li><a href="https://tonedefsound.com/">Tone Def Sound</a></li>
<li><a href="https://www.topshelfrecords.com/words">Top Shelf Records</a></li>
<li><a href="https://www.turntablekitchen.com/music/">Turntable Kitchen</a></li>
<li><a href="http://turtletempo.co.uk/">Turtle Tempo UK</a></li>
<li><a href="https://twostorymelody.com/">Two Story Melody</a></li>
<li><a href="https://www.upsetmagazine.com/">Upset Magazine</a></li>
<li><a href="https://upstreamindie.com/">Upstream Indie</a></li>
<li><a href="http://www.undertheradarmag.com/">Under the Radar Magazine</a></li>
<li><a href="https://www.uraniumwaves.com/">Uranium Waves</a></li>
<li><a href="https://varioussmallflames.co.uk/">Various Small Flames</a></li>
<li><a href="https://www.vulture.com/music/">Vulture</a></li>
<li><a href="https://weallwantsomeone.org/">We all want someone to shout for</a></li>
<li><a href="https://www.wepluggoodmusic.com/">We Plug Good Music</a></li>
<li><a href="https://www.wewriteaboutmusic.com/">We Write About Music</a></li>
<li><a href="https://whenthehornblows.com/">When the Horn Blows</a></li>
<li><a href="https://www.wherethemusicmeets.com/">Where the Music Meets</a></li>
<li><a href="https://www.wolfinasuit.com/">Wolf in a Suit</a></li>
<li><a href="https://www.wordsformusic.blog/">Words for Music</a></li>
<li><a href="https://www.xsnoize.com/">ZS Noize</a></li>
<li><a href="https://xunemag.com/">Xune Mag</a></li>
<li><a href="https://xlr8r.com/">XLR8R</a></li>
<li><a href="https://yourromanfeatures.tumblr.com/">Your Roman Features</a></li>
<li><a href="https://www.attackmagazine.com/">Attack Magazine</a></li>
<li><a href="http://www.audiodrums.com/">Audiodrums</a></li>
<li><a href="https://boilerroom.tv/">BoilerRoomTV</a></li>
<li><a href="https://daily-beat.com/">Daily Beat</a></li>
<li><a href="https://www.dancemusicnw.com/">Dance Music NW</a></li>
<li><a href="https://datatransmission.co/">Data Transmission</a></li>
<li><a href="https://www.deephouseamsterdam.com/">Deep House Amsterdam</a></li>
<li><a href="https://www.djgym.co.uk/blog">DJ Gym</a></li>
<li><a href="https://djmag.com/">DJ Mag</a></li>
<li><a href="https://edm.com/">EDM.com</a></li>
<li><a href="https://www.edmsauce.com/">EDM Sauce</a></li>
<li><a href="https://www.edmtunes.com/">EDMTunes</a></li>
<li><a href="https://edmidentity.com/">EDM Identity</a></li>
<li><a href="https://ekm.co/">EKM</a></li>
<li><a href="https://www.electrojams.com/">Electro Jams</a></li>
<li><a href="https://www.electrowow.net/">ElectroWow</a></li>
<li><a href="https://www.electronicbeats.net/">Electronic Beats</a></li>
<li><a href="https://www.emeraldcityedm.com/">Emerald City EDM</a></li>
<li><a href="https://www.fazemag.de/">FAZEmag</a></li>
<li><a href="https://beastbarbecue.com/">of the Beast</a></li>
<li><a href="https://www.dummymag.com/">Dummy Mag</a></li>
<li><a href="https://www.hammarica.com/category/dj-interviews/">Hammarica</a></li>
<li><a href="https://inverted-audio.com/">Inverted Audio</a></li>
<li><a href="https://www.lifesupportmachine.co.uk/">Life Support Machine UK</a></li>
<li><a href="https://www.magneticmag.com/">Magnetic Magazine</a></li>
<li><a href="https://minimalfreaks.co/">Minimal Freaks</a></li>
<li><a href="https://mixing.dj/">Mixing-DJ</a></li>
<li><a href="https://mixmag.net/">MixMag</a></li>
<li><a href="http://pilerats.com/music/electronic/">Pilerats</a></li>
<li><a href="https://plasticmag.co.uk/category/features/">Plastic</a></li>
<li><a href="https://www.purplesneakers.com.au/">Purple Sneakers</a></li>
<li><a href="https://www.raveculture.com/">Rave Culture</a></li>
<li><a href="http://raverrafting.com/">Raver Rafting</a></li>
<li><a href="https://ra.co/">Resident Advisor</a></li>
<li><a href="https://www.reddit.com/r/electronicmusic/">r/electronicmusic</a></li>
<li><a href="http://www.robotdancemusic.com/">Robot Dance Music</a></li>
<li><a href="https://runthetrap.com/">Run the Trap</a></li>
<li><a href="http://www.smashtheclub.com/">Smash the Club</a></li>
<li><a href="https://stoneyroads.com/">Stoney Roads</a></li>
<li><a href="https://www.synthtopia.com/">Synthtopia</a></li>
<li><a href="https://thatdrop.com/">That Drop</a></li>
<li><a href="https://www.theuntz.com/">The Untz</a></li>
<li><a href="https://thissongissick.com/">this song is sick</a></li>
<li><a href="https://thissongslaps.com/">this song slaps</a></li>
<li><a href="https://www.traxsource.com/">Traxsource</a></li>
<li><a href="https://www.tropicalbass.com/">Tropical Bass</a></li>
<li><a href="https://weraveyou.com/">We Rave You</a></li>
<li><a href="https://whenwedip.com/">When We Dip</a></li>
<li><a href="https://2dopeboyz.com/">2DopeBoyz</a></li>
<li><a href="https://24hip-hop.com/category/new-music/">24Hip-Hop</a></li>
<li><a href="https://albumtalks.com/">Album Talks</a></li>
<li><a href="https://www.ballerstatus.com/music/">BallerStatus</a></li>
<li><a href="https://beatroutemedia.com/">BeatRoute</a></li>
<li><a href="https://beats-rhymes-lists.com/">Beats, Rhymes and Lists</a></li>
<li><a href="https://bignoiseradio.com/">BigNoiseRadio</a></li>
<li><a href="https://bignoiseradio.com/radio">Radio Stations</a></li>
<li><a href="https://bignoiseradio.com/gallery">Five Elements</a></li>
<li><a href="http://www.blackouthiphop.com/">BlackoutHipHop</a></li>
<li><a href="https://centralsauce.com/">Central Sauce</a></li>
<li><a href="https://www.complex.com/pigeons-and-planes/">Complex</a></li>
<li><a href="https://rmc.library.cornell.edu/hiphop/digital_collections.php">Cornell Hip Hop Collection</a></li>
<li><a href="https://www.datpiff.com/">Datpiff</a></li>
<li><a href="http://www.desihiphop.com/">DesiHipHop</a></li>
<li><a href="https://djbooth.net/">DJ Booth</a></li>
<li><a href="https://www.dummymag.com/genre/rap/">Dummy Mag</a></li>
<li><a href="https://earmilk.com/category/hiphop/">Earmilk</a></li>
<li><a href="https://www.fakeshoredrive.com/">FakeShoreDrive</a></li>
<li><a href="https://genius.com/">Genius</a></li>
<li><a href="https://grungecake.com/">Grungecake</a></li>
<li><a href="https://www.hiphopallaround.com/">Hip Hop All Around</a></li>
<li><a href="https://hiphopdx.com/news">HipHopDX</a></li>
<li><a href="https://hiphop-n-more.com/">HipHopnMore</a></li>
<li><a href="http://www.hiphopondeck.com/">HipHopOnDeck</a></li>
<li><a href="https://hiphoppush.com/">HipHopPush</a></li>
<li><a href="https://hiphopsince1987.com/">HipHopSince87</a></li>
<li><a href="https://www.hip-hopvibe.com/">Hip-HopVibe</a></li>
<li><a href="https://hiphopwired.com/">HipHopWired</a></li>
<li><a href="https://www.hot97.com/">Hot97</a></li>
<li><a href="https://www.hotnewhiphop.com/">HotNewHipHop</a></li>
<li><a href="https://hypebeast.com/">HypeBeast</a></li>
<li><a href="https://www.thehypemagazine.com/">HypeMagazine</a></li>
<li><a href="https://www.indiehiphop.net/">IndieHipHop</a></li>
<li><a href="https://www.laonlock.com/">LA on Lock</a></li>
<li><a href="https://www.mrcnnlive.com/category/video/">MRCNNLIVE</a></li>
<li><a href="https://www.okayplayer.com/">OkayPlayer</a></li>
<li><a href="http://onsmash.com/">OnSmash</a></li>
<li><a href="http://pilerats.com/music/rap/">Pilerats</a></li>
<li><a href="https://www.rap-up.com/">Rap-Up.com</a></li>
<li><a href="https://rapradar.com/">RapRadar</a></li>
<li><a href="http://www.rapreviews.com/">RapReviews</a></li>
<li><a href="https://raptology.com/">Raptology</a></li>
<li><a href="https://rapzilla.com/">Rapzilla</a></li>
<li><a href="https://www.reddit.com/r/hiphopheads/">reddit/r/hiphopheads</a></li>
<li><a href="https://www.respectmyregion.com/category/music/hip-hop/">RespectMyRegion</a></li>
<li><a href="https://resultsandnohype.com/">ResultsandNoHype</a></li>
<li><a href="https://royalbey.com/">Royal Bey</a></li>
<li><a href="https://www.siccness.net/wp/">Siccness</a></li>
<li><a href="https://www.sohh.com/">SOHH</a></li>
<li><a href="https://www.stardom101mag.net/">Stardom101Mag</a></li>
<li><a href="https://theboombox.com/category/hip-hop-news/">The BoomBox</a></li>
<li><a href="https://www.thepitldn.com/music">The Pit London</a></li>
<li><a href="https://thesource.com/">TheSource</a></li>
<li><a href="https://www.thizzler.com/">Thizzler</a></li>
<li><a href="https://undergroundhiphopblog.com/">UndergoundHipHopBlog</a></li>
<li><a href="http://undergroundunderdogs.com/">Underground Underdogs</a></li>
<li><a href="https://uproxx.com/music/">UPROXX</a></li>
<li><a href="https://urbanvault.co.uk/category/u-s-music-news/">Urban Vault</a></li>
<li><a href="https://www.thewordisbond.com/">WordisBond</a></li>
<li><a href="https://worldstarhiphop.com/videos/">WorldStarHipHop</a></li>
<li><a href="https://www.xxlmag.com/linkinbio/">XXL Magazine</a></li>
<li><a href="https://1063atl.com/">106.3 Radio</a></li>
<li><a href="http://bettermustcome.blogspot.com/">Better Must Come</a></li>
<li><a href="https://www.blazinreggaevibes.com/%5C">Blazin Reggae Vibes</a></li>
<li><a href="http://www.canadianreggaeworld.com/blog">Canadian Reggae World</a></li>
<li><a href="http://www.caribbeandanceradio.com/news">Caribbean Dance Radio</a></li>
<li><a href="http://www.dancecrasher.co.uk/">Dancecrasher UK</a></li>
<li><a href="https://www.dancehallmag.com/">Dancehall Magazine</a></li>
<li><a href="https://www.digestivoreggae.com/">Digestivo Reggae</a></li>
<li><a href="https://www.dubvendor.co.uk/">Dub Vendor UK</a></li>
<li><a href="https://jamaicans.com/jamaica/jamaican-music/">Jamaicans.com</a></li>
<li><a href="https://www.jumpuprecords.com/">Jump Up Records</a></li>
<li><a href="https://reggaearoundtheworld.wordpress.com/">Reggae Around the World</a></li>
<li><a href="https://reggaefestivalguide.com/">Reggae Festival Guide</a></li>
<li><a href="https://www.reggaefraternityuk.com/">Reggae Fraternity UK</a></li>
<li><a href="http://reggaenation.com/">ReggaeNation</a></li>
<li><a href="https://reggaemani.wordpress.com/">ReggaeMani</a></li>
<li><a href="https://www.reggaeshowtimeradio.com/">Reggae Showtime Radio</a></li>
<li><a href="https://reggae-steady-ska.com/">Reggae Steady Ska</a></li>
<li><a href="https://reggaereport.com/">Reggae Report</a></li>
<li><a href="https://reggaeunite.blogspot.com/">Reggae Unite</a></li>
<li><a href="https://reggaevibe.org/">ReggaeVibe</a></li>
<li><a href="https://www.reggaeville.com/">Reggaeville</a></li>
<li><a href="https://riddimsworld.com/">Riddims World</a></li>
<li><a href="https://www.rootsreggaehub.com/">Roots Reggae Hub</a></li>
<li><a href="https://thepier.org/">The Pier</a></li>
<li><a href="https://www.torontoreggae.ca/">Toronto Reggae</a></li>
<li><a href="https://trojanrecords.com/playlists/">Trojan Records</a></li>
<li><a href="https://unitedreggae.com/">United Reggae</a></li>
<li><a href="https://urbanislandz.com/">Urban Islandz</a></li>
<li><a href="https://www.vprecords.com/artists/">VP Records</a></li>
<li><a href="https://www.worldareggae.com/">World A Reggae</a></li>
<li><a href="https://yardhype.com/">YardHype</a></li>
<li><a href="https://americana-uk.com/">Americana UK</a></li>
<li><a href="https://www.bluesandrootsradio.com/">Blues &amp; Roots Radio</a></li>
<li><a href="https://nashvillegab.com/">Nashville Gab</a></li>
<li><a href="https://rockingmagpie.wordpress.com/">Rocking Magpie</a></li>
<li><a href="https://tasteofcountry.com/">Taste of Country</a></li>
<li><a href="https://twangville.com/">Twangville</a></li>
<li><a href="http://www.midwesternhousewives.com/">Battle of the Midwestern Housewives</a></li>
<li><a href="http://freeskafoundation.blogspot.com/">Free Ska Foundation</a></li>
<li><a href="https://duffguidetoska.blogspot.com/">The Duff Guide</a></li>
<li><a href="http://rudeboytrain.com/">Rude Boy Train</a></li>
<li><a href="http://skabook.com/blog/">Skabook</a></li>
<li><a href="https://beatroutemedia.com/category/music/">Beatroute</a></li>
<li><a href="https://muumuse.com/">MuuMuse</a></li>
<li><a href="https://www.folkradio.co.uk/">Folk Radio UK</a></li>
<li><a href="https://www.loudersound.com/classic-rock">Classic Rock</a></li>
<li><a href="https://www.eonmusic.co.uk/">eon music</a></li>
<li><a href="https://lambgoat.com/">Lambgoat</a></li>
<li><a href="https://www.mojo4music.com/">MOJO</a></li>
<li><a href="https://rockandrollgarage.com/">Rock And Roll Garage</a></li>
<li><a href="https://www.talkhouse.com/">Talkhouse</a></li>
<li><a href="https://ultimateclassicrock.com/">Ultimate Classic Rock</a></li>
<li><a href="http://www.disposable-america.com/">Disposable America</a></li>
<li><a href="https://www.exitstencil.org/">Exit Stencil</a></li>
<li><a href="http://www.explodinginsoundrecords.com/">Exploding in Sound Records</a></li>
<li><a href="https://www.lauren-records.com/">Lauren Records</a></li>
<li><a href="https://ghostly.com/">Ghostly</a></li>
<li><a href="https://longwellrecords.com/blogs/news">Longwell Records</a></li>
<li><a href="https://www.matadorrecords.com/">Matador Records</a></li>
<li><a href="https://www.mergerecords.com/">Merge Records</a></li>
<li><a href="https://www.polyvinylrecords.com/">Polyvinyl Records</a></li>
<li><a href="http://www.postpresentmedium.com/releases.html">Post Present Medium</a></li>
<li><a href="https://www.remotecontrolrecords.com.au/">Remote Control</a></li>
<li><a href="https://www.slumberlandrecords.com/">Slumberland Records</a></li>
<li><a href="https://www.subpop.com/">Sub Pop Records</a></li>
<li><a href="http://westernvinyl.com/news/">Western Vinyl</a></li>
<li><a href="https://player.fm/podcasts/vinyl">Best Vinyl Podcasts</a></li>
<li><a href="https://dice.fm/blog">Dice</a></li>
<li><a href="https://www.villagevoice.com/culture/music/">Village Voice</a></li>
<li><a href="https://www.loudersound.com/">Louder</a></li>
<li><a href="https://www.newreleasesnow.com/">New Releases</a></li>
<li><a href="https://www.radiok.org/features/weekly-release-spotlight/">Radio K</a></li>
<li><a href="https://www.rootsmusicreport.com/">Roots Music Report</a></li>
<li><a href="https://www.theunsignedguide.com/news">The Unsigned Guide</a></li>
<li><a href="https://topshelfmusicmag.com/">Top Shelf Music Magazine</a></li>
<li><a href="https://twostorymelody.com/music-promotion-tips/">Two Story Melody</a></li>
<li><a href="https://www.vinylmeplease.com/">Vinyl Me Please</a></li>
<li><a href="https://www.palmersbar.net/">Palmer’s Bar</a></li>
<li><a href="https://dittomusic.com/en/blog">Ditto</a></li>
<li><a href="https://www.rightchordmusic.co.uk/">Rightcord Music UK</a></li>
<li><a href="https://www.ispytunes.com/blog-made-for-musicians">ISpyTunes</a></li>
<li><a href="https://tellingbeatzz.com/blog-2/">TellingBeatzz</a></li>
</ul>
]]></description>
    <pubDate>Sat, 07 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>UX scrapbook bookmarks</title>
<link>https://xenodium.com/ux-scrapbook-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ux-scrapbook-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.vox.com/2015/2/8/7475667/27-fonts-give-or-take-that-explain-your-world">27 fonts* (give or take) that explain your world</a>.</li>
<li><a href="https://timetravel.pixelfika.com/">5 Years of Design (good for inspiration)</a>.</li>
<li><a href="http://engineering.flipboard.com/2015/02/mobile-web/">60 FPS on mobile web (plus layouts)</a>.</li>
<li><a href="http://rix.si/">Another minilimalistic one-pager</a>.</li>
<li><a href="https://exposure.co/">Another minimalistic gallery</a>.</li>
<li><a href="https://www.behance.net/search?search=ios&amp;utm_source=ios%20dev%20tools&amp;utm_medium=website&amp;utm_campaign=ios%20dev%20tools&amp;at=11lvzs&amp;ct=ios%20dev%20tools">Behance</a>.</li>
<li><a href="https://stories.uplabs.com/compact-powerful-great-examples-of-floating-action-buttons-in-interfaces-7079b9926cb5#.7ch9p8n82">Compact &amp; Powerful: Great Examples of Floating Action Buttons in Interfaces</a>.</li>
<li><a href="http://www.flagofplanetearth.com/#intro-shift">Flag of Planet Earth</a>.</li>
<li><a href="http://generative-placeholders.glitch.me/">Generative Placeholders</a>.</li>
<li><a href="https://twitter.com/stroughtonsmith/status/1320966432600006656">Graphic design from other cultures</a>.</li>
<li><a href="https://kevin.is/committed-to-github/">Kevin.is (Simple layout)</a>.</li>
<li><a href="http://mengto.com/img/snoflake-menu.jpg">Meng To's I Love Food I</a>.</li>
<li><a href="http://mengto.com/img/exp-menu.jpg">Meng To's I Love Food II</a>.</li>
<li><a href="https://lmjabreu.com/">Minimalistic blog layout</a>.</li>
<li><a href="http://antirez.com/latest/0">Minimalistic blog layout</a>.</li>
<li><a href="http://www.piotrpisarzphotography.com/">Minimalistic gallery</a>.</li>
<li><a href="http://indie.vc">Minimalistic one-pager</a>.</li>
<li><a href="http://www.wired.com/2015/04/legendary-redesign-helvetica-reborn-30-years">Neue Haas Unica (reborn)</a>.</li>
<li><a href="http://www.monotype.com/libraries/neue-haas-unica/">Neue Haas Unica</a>.</li>
<li><a href="https://uxdesign.cc/neumorphism-in-user-interfaces-b47cef3bf3a6">Neumorphism in user interfaces - UX Collective</a>.</li>
<li><a href="https://medium.com/@sgblank/organizational-debt-is-like-technical-debt-but-worse-3c0c86eae3eb">Organizational Debt is Like Technical debt — But Worse</a>.</li>
<li><a href="http://spootnik.org/">Pierre-Yves Ritschard's minialistic blog</a>.</li>
<li><a href="http://www.fonts2u.com/raleway-heavy.font">Raleway Font</a>.</li>
<li><a href="http://nsainsbury.svbtle.com/java-developers">Svbtle</a>: A post on java developers. Enjoyed its minimalistic layout.</li>
<li><a href="http://whereis-whoishiring-hiring.me/">whereis-whoishiring-hiring.me (minimalistic categorization)</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Travel blog bookmarks</title>
<link>https://xenodium.com/travel-blog-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/travel-blog-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://hiddentraveltreasures.com/">Hidden Travel Treasures</a>.</li>
<li><a href="http://onestep4ward.com/">One Step 4Ward</a>.</li>
<li><a href="http://tigrest.com">Tigrest Travel Blog</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 09 Oct 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Travel bookmarks</title>
<link>https://xenodium.com/travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.buzzfeed.com/ariannarebolini/totally-breathtaking-trails-to-hike-before-you-die#.chOolMjWA">21 Totally Breathtaking Trails</a>.</li>
<li><a href="http://cnnespanol.cnn.com/2015/09/15/5-increibles-escapadas-a-islas-que-quizas-nunca-has-considerado/">5 increíbles escapadas a islas que quizás nunca has considerado</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=10863990">52 Places to Go in 2016 (Hacker News)</a>.</li>
<li><a href="http://www.nytimes.com/interactive/2016/01/07/travel/places-to-visit.html?_r=0">52 Places to Go in 2016</a>.</li>
<li><a href="http://www.lonelyplanet.com/walking-and-trekking/best-of-walking-and-trekking/content/travel-tips-and-articles/a-beginners-guide-to-the-art-of-hiking">A beginner's guide to the art of hiking</a>.</li>
<li><a href="http://abitofculture.net/">abitofculture.net</a>.</li>
<li><a href="http://www.alexinwanderland.com/">Alex in wanderland</a>.</li>
<li><a href="http://imgur.com/a/m9YjK">Amazing places around the world</a>.</li>
<li><a href="http://www.backpacksandbunkbeds.co.uk/">Backpacks and Bunkbeds</a>.</li>
<li><a href="http://beyondblighty.com/">Beyond blighty</a>.</li>
<li><a href="http://www.blouinartinfo.com/travel">BLOUINARTINFO+TRAVEL</a>.</li>
<li><a href="http://continentalbreakfasttravel.com/">Continental Breakfast travel</a>.</li>
<li><a href="http://www.girltweetsworld.com/">Girl tweets world</a>.</li>
<li><a href="http://www.quora.com/How-does-it-feel-to-travel-alone">How does it feel to travel alone? (Quora)</a>.</li>
<li><a href="http://www.lonelyplanet.com/round-the-world-travel/best-of-round-the-world-travel/content/travel-tips-and-articles/how-to-pack-light-tips-from-a-master-packer">How to pack light: tips from a master packer</a>.</li>
<li><a href="http://fourhourworkweek.com/2013/07/14/how-to-travel-21-contrarian-rules/">How to travel: 21 Contrarian rules</a>.</li>
<li><a href="http://www.railjournal.com/">International Railway Journal</a>.</li>
<li><a href="https://izi.travel/en/app?content_lang=fr&amp;content_uuid=ede5d243-ace6-459c-b1cc-f45744c48a5d">izi.TRAVEL: A tour guide in your pocket</a>.</li>
<li><a href="http://joestrippin.blogspot.co.uk/">Joe's Trippin' A few tales from the road by a modern day nomad</a>.</li>
<li><a href="http://www.legalnomads.com/">Legal nomads</a>.</li>
<li><a href="http://www.needanotherholiday.com/">Need another holiday</a>.</li>
<li><a href="http://www.neverendingfootsteps.com/">Never ending footsteps</a>.</li>
<li><a href="https://www.lonelyplanet.com/travel-tips-and-articles/new-in-travel-the-best-new-openings-of-2017-11-to-20">New in Travel: the best new openings of 2017 (11 to 20)</a>.</li>
<li><a href="https://www.lonelyplanet.com/travel-tips-and-articles/new-in-travel-the-best-new-openings-of-2017-21-to-35">New in Travel: the best new openings of 2017 (21 to 35)</a>.</li>
<li><a href="https://www.lonelyplanet.com/travel-tips-and-articles/new-in-travel-the-best-new-openings-of-2017-one-to-10">New in Travel: the best new openings of 2017 (one to 10)</a>.</li>
<li><a href="http://www.ontheluce.com/">On The Luce</a>.</li>
<li><a href="http://www.spiegel.de/international/paradise-lost-tourists-are-destroying-the-places-they-love-a-1223502.html">Paradise Lost: Tourists Are Destroying the Places They Love - SPIEGEL ONLINE</a>.</li>
<li><a href="http://www.pichette.org/">pichette.org's travel blog</a>.</li>
<li><a href="https://www.eliotandme.com/poster">Posters: Create travel gifts/posters and souvenirs (eliot)</a>.</li>
<li><a href="https://restlessjo.wordpress.com/">Restless Jo</a>.</li>
<li><a href="http://www.seemytravels.com/">See my travels</a>.</li>
<li><a href="http://upgrd.com/thecrewlounge">The Crew Lounge</a>.</li>
<li><a href="https://thegrownupgapyear.wordpress.com/">The Grown-up gap year</a>.</li>
<li><a href="http://www.thehappytalent.com/">The Happy Talent. A Travel blog</a>.</li>
<li><a href="http://thetravelhack.com/">The Travel Hack</a>.</li>
<li><a href="http://thetravelbunny.com/">The Travelbunny</a>.</li>
<li><a href="https://helpstay.com/journal/">The Volunteer Journal | Swap Skills For Accommodation</a>.</li>
<li><a href="http://www.lonelyplanet.com/travel-photography/best-of-travel-photography/content/travel-tips-and-articles/the-worlds-best-places-to-see-autumn-colours">The world's best places to see autumn colours</a>.</li>
<li><a href="https://www.lonelyplanet.com/thorntree">Thorn Tree travel forum (Lonely Planet's)</a>.</li>
<li><a href="http://travelwithkat.com/">Travel with Kat</a>.</li>
<li><a href="http://www.traveldudes.org/">Traveldudes</a>.</li>
<li><a href="http://travelingspoon.com/">Traveling Spoon</a>.</li>
<li><a href="http://www.travelistly.com/tv">Travelistly TV (high quality travel content)</a>.</li>
<li><a href="http://www.lonelyplanet.com/travel-tips-and-articles/tried-and-tested-tips-for-a-trouble-free-road-trip">Tried and tested tips for a trouble free road trip</a>.</li>
<li><a href="http://www.two-fortheroad.com/">Two for the road</a>.</li>
<li><a href="https://www.lonelyplanet.com/travel-tips-and-articles/ultimate-travel-list-lonely-planets-top-10-sights-in-the-world">Ultimate travel list: Lonely Planet's top 10 sights in the world</a>.</li>
<li><a href="http://vagabondbaker.com/">Vagabond Baker</a>.</li>
<li><a href="https://www.quora.com/What-are-common-items-that-savvy-travelers-bring-with-them-that-less-savvy-ones-dont">What are common items that savvy travelers bring with them that less-savvy ones don't? (Quora)</a>.</li>
<li><a href="https://www.quora.com/What-are-some-must-eat-dishes-in-your-country">What are some must-eat dishes in your country? - Quora</a>.</li>
<li><a href="https://www.quora.com/What-are-your-top-10-travel-tips">What are your top 10 travel tips? (Quora)</a>.</li>
<li><a href="http://world.dailysecret.com/world/en">World daily secret</a>.</li>
<li><a href="https://plus.google.com/collection/IW-dY">World food and drink</a>.</li>
<li><a href="http://www.xdaysiny.com/">X Days in Y</a>.</li>
<li><a href="http://www.ytravelblog.com/">ytravel</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Startup bookmarks</title>
<link>https://xenodium.com/startup-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/startup-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id%3D10101209">16 Startup Metrics (Hacker News)</a>.</li>
<li><a href="http://a16z.com/2015/08/21/16-metrics/">16 Startup Metrics</a>.</li>
<li><a href="http://sidejobr.com/help/19-amazing-sites-get-free-stock-photos/">19 Amazing Sites To Get Free Stock Photos</a>.</li>
<li><a href="https://moz.com/blog/301-redirection-rules-for-seo">301 Redirects Rules Change: What You Need to Know for SEO</a>.</li>
<li><a href="https://www.appcues.com/blog/increase-user-engagement">6 ways to increase user engagement for product-led growth</a>.</li>
<li><a href="https://landscape.io">A Dashboard for your Code</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=9923709">A guide to PR for startups (Hacker News)</a>.</li>
<li><a href="http://www.craigkerstiens.com/2015/07/21/An-intro-PR-guide-for-startups/">A guide to PR for startups</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22895842">A Guide to Pricing Plans | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22449314">A two-person startup already uses twenty-eight other tools | Hacker News</a>.</li>
<li><a href="https://airtable.com/">Airtable: cloud DB with a spreadsheet web UI</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17899510">All Things Sales: Mini-lessons for startup founders (Hacker News)</a>.</li>
<li><a href="https://www.canva.com/">Amazingly Simple Graphic Design Software – Canva</a>.</li>
<li><a href="https://chrissacca.com/2018/12/an-email-i-will-never-open">An email I will never open (Chris Sacca)</a>.</li>
<li><a href="https://github.com/abaraka/RESTClient">An iOS REST Client that is based on MVVM using ReactiveCocoa</a>.</li>
<li><a href="http://www.raywenderlich.com/55384/ios-7-best-practices-part-1">An iOS Weather app case study</a>.</li>
<li><a href="https://hbr.org/2015/04/how-to-launch-your-digital-platform">Answer these questions about potential digital platform</a>.</li>
<li><a href="https://github.com/aphyr/distsys-class">aphyr/distsys-class: Class materials for a distributed systems lecture</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=25547716">API pagination design | Hacker News</a>.</li>
<li><a href="https://appfigures.com/">AppFigures:</a> App tracking platform.</li>
<li><a href="https://news.ycombinator.com/item?id=22328822">Apple Edge Cache (CDNs) | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19497788">Application-Level Logging Best Practices (Hacker News)</a>.</li>
<li><a href="https://github.com/AppScale/appscale">AppScale, The Open Source Implementation of Google App Engine</a>.</li>
<li><a href="https://arc.io/pricing">Arc (crowdfunded CDN)</a>.</li>
<li><a href="https://arenzana.org/2019/06/artisanal-web-hosting/">Artisanal Web Hosting</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=14146850">Ask HN: Best business advice for software developers (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12376596">Ask HN: How do you handle DDoS attacks? (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23390966">Ask HN: How does your company manage its encryption keys? | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24965115">Ask HN: How to effectively get feedback from users? | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=9561127">Ask HN: Simple alternative to Google Analytics</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=9667247">Ask HN: What tools do you use to build HTML emails?</a></li>
<li><a href="https://news.ycombinator.com/item?id=18236188">Ask HN: What's your advice for someone who's raising capital for the first time? (Hacker News)</a>.</li>
<li><a href="https://www.owasp.org/index.php/Authentication_Cheat_Sheet">Authentication Cheet Sheet</a>.</li>
<li><a href="https://business.axdraft.com/en/business">AXDRAFT (Free legal documents for startups)</a>.</li>
<li><a href="https://docs.google.com/spreadsheet/ccc?key%3D0Al7M8fgKPXoidENFa0M5VnJpb3pMeHQtS0RDcHFvY1E&amp;usp%3Dsharing#gid%3D0">BaaS comparison</a>.</li>
<li><a href="http://www.kinvey.com/images/kinvey_backend-as-a-service_mobileecosystem_2100px.png">BaaS ecosystem map</a>.</li>
<li><a href="https://barnacl.es/">Barnacles</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=10481507">Bayesian ranking of items with up and downvotes or 5 star ratings (Hacker News)</a>.</li>
<li><a href="http://julesjacobs.github.io/2015/08/17/bayesian-scoring-of-ratings.html">Bayesian ranking of items with up and downvotes or 5 star ratings</a>.</li>
<li><a href="http://bbcsfx.acropolis.org.uk/">BBC Sound Effects Archive Resource • Research &amp; Education Space</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Bcrypt">bcrypt: password hashing function alternative to md5 and sha1 (Wikipedia)</a>.</li>
<li><a href="https://hakaselogs.me/2018-12-01/building-small-containers-for-kubernetes">Building a small container for a golang service for kubernetes</a>.</li>
<li><a href="https://hybridcattt.com/blog/website-essentials/">Building a Well-Rounded Website: Essentials (wonderful recommendations for your site)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=25180180">Building Your Color Palette | Hacker News</a>.</li>
<li><a href="https://carrd.co/">Carrd - Simple, free, fully responsive one-page sites for pretty much anything</a>.</li>
<li><a href="http://wordsafety.com/">Check for word safety (wordsafety.com)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17920287">Choosing Your First Marketing Hire (Hacker News)</a>.</li>
<li><a href="http://www.clinkhostels.com/london/clink78/">Clink78 hostel</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12396520">Common Startup Timing Mistakes and How to Avoid Them (Hacker News)</a>.</li>
<li><a href="https://tld-list.com/">Compare Prices of All Top-Level Domains | TLD List</a>.</li>
<li><a href="http://rancher.com/comparing-monitoring-options-for-docker-deployments/">Comparing five monitoring options for docker</a>.</li>
<li><a href="https://www.compose.io/">Compose.io</a>.</li>
<li><a href="https://www.contentful.com/">Contentful: Like a CMS — except for the bad parts</a>.</li>
<li><a href="http://umap.openstreetmap.fr/en/">Create OpenStreetMaps with uMap</a>.</li>
<li><a href="https://curlbuilder.com/">curl online command line builder</a>.</li>
<li><a href="https://danielvassallo.com/">Daniel Vassallo - (quit Amazon story and advice)</a>.</li>
<li><a href="https://github.com/yaronn/blessed-contrib">Dashborads using ASCII and JS</a>.</li>
<li><a href="https://github.com/sag333ar/SRKLocationManager">Detect iOS Device location in just one line</a>.</li>
<li><a href="https://niltalk.com/">Disposable chats in Go</a> (more links <a href="https://news.ycombinator.com/item?id%3D9372918">here</a>).</li>
<li><a href="http://paulgraham.com/ds.html">Do Things that Don't Scale</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/9xyiv7/does_anyone_have_recommendations_for_accounting/">Does anyone have recommendations for accounting software? : UKPersonalFinance</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=14070189">Does it scale? Who cares (2011) (Hacker News)</a>.</li>
<li><a href="https://www.domainsfortherestofus.com/">Domains for the Rest of Us (domain name generator)</a>.</li>
<li><a href="https://speakerdeck.com/appltn/done-is-better-than-perfect">Done is better than perfect</a>.</li>
<li><a href="https://www.eidel.io/2023/07/09/vc-funding/">Don’t Take VC Funding - It Will Destroy Your Company | Oliver Eidel</a>.</li>
<li><a href="https://twitter.com/rsms/status/1324142698161303552">dynamic website/service with Redis leader and follower replicas</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19154082">Earnest Capital is live (Hacker News)</a>.</li>
<li><a href="https://www.fastly.com/">Edge Cloud Platform (Fastly)</a>.</li>
<li><a href="https://mxb.dev/blog/emergency-website-kit/">Emergency Website Kit | Max Böck - Frontend Web Developer</a>.</li>
<li><a href="https://encore.dev">Encore • APIs made simple</a>.</li>
<li><a href="https://hackmd.io/EmPIHGhTRh6pDSJ1VEgkkA">Ethical apps code of conduct - HackMD</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23851870">Everything you need to know about OAuth 2.0 | Hacker News</a>.</li>
<li><a href="https://usefathom.com/">Fathom Analytics - Simple, Privacy-focused Web Analytics</a>.</li>
<li><a href="https://www.litscape.com/word_tools/pattern_match.php">Find words that match your pattern.</a>.</li>
<li><a href="https://rivalseek.com/">Find your competition</a>.</li>
<li><a href="https://www.fiverr.com/">Fiverr (logos, graphic design, etc)</a>.</li>
<li><a href="http://flagtheory.com/">Flag Theory: Freedom, Privacy and Wealth</a>.</li>
<li><a href="https://creativemarket.com/">Fonts, Graphics, Themes and More ~ Creative Market</a>.</li>
<li><a href="https://graphicriver.net/">Fonts, Logos &amp; Icons from GraphicRiver</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17266006">For Static Sites, There’s No Excuse Not to Use a CDN (Hacker News)</a>.</li>
<li><a href="https://cruip.com/">Free HTML landing page templates for startups - Cruip</a>.</li>
<li><a href="http://blog.shyahi.com/post/62901878131/putting-everything-together-free-tools-for">Free tools for startups (Shyahi blog)</a>.</li>
<li><a href="http://www.freevectors.net/">Free vectors</a>.</li>
<li><a href="http://www.backa.co/">Gain valuable, actionable feedback on your startup ideas</a>.</li>
<li><a href="http://www.glyphish.com/">Glyphish icon collection</a>.</li>
<li><a href="http://www.reddit.com/r/golang/comments/20e2to/cheap_go_hosting_with_postgresql/">Go hosting (Reddit comments)</a>.</li>
<li><a href="https://www.goatcounter.com/">GoatCounter web analytics</a>.</li>
<li><a href="http://www.gofundme.com/">gofundme</a>.</li>
<li><a href="https://getgophish.com/">Gophish - Open Source Phishing Framework</a>.</li>
<li><a href="https://github.com/facebook/graphql">GraphQL, a query language and execution engine tied to any backend service</a>.</li>
<li><a href="https://github.com/fullstorydev/grpcui">grpcui: An interactive web UI for gRPC</a>.</li>
<li><a href="https://github.com/fullstorydev/grpcurl">grpcurl: Like cURL, but for gRPC</a>.</li>
<li><a href="https://gumroad.com">Gumroad. Helps creators sell, generate digital licenses, grow audiences, etc</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=9865338">HN: Things to Know When Making a Web Application in 2015</a>.</li>
<li><a href="http://kukuruku.co/hub/ios/how-i-got-to-the-app-store-top-with-a-simple-currency-app">How I got to the app store top with a simple currency app</a>.</li>
<li><a href="https://blog.usejournal.com/how-i-made-8-000-per-month-podcasting-and-why-you-probably-dont-want-to-855966a557aa?gi=58d80835cfc8">How I Made $8,000 per Month Podcasting, and Why You Probably Don’t Want To</a>.</li>
<li><a href="http://www.sentia.com.au/blog/how-much-does-it-cost-to-build-an-app">How much does it cost to build an app? (Sentia Blog)</a>.</li>
<li><a href="https://a16z.com/2016/08/24/options-ownership/">How Startup Options (and Ownership) Works</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18490437">How to Acquire Your First 100 Customers (Hacker News)</a>.</li>
<li><a href="http://bulgerpartners.com/how-to-be-prepared-for-technical-due-diligence-what-to-anticipate-and-how-to-excel/">How to Be Prepared for Technical Due Diligence: What to Anticipate and How to Excel</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24780152">How to Build a Great Series A Pitch and Deck | Hacker News</a>.</li>
<li><a href="https://clearfounder.com/how-to-diy-a-product-launch-video-with-no-experience-and-for-free/">How to DIY a Product Launch Video with No Experience, and for Free</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18880043">How to get your money’s worth from your startup lawyer (Hacker News)</a>.</li>
<li><a href="https://blog.streamroot.io/how-to-implement-a-multi-cdn-strategy-everything-you-need-to-know/">How to implement a multi-CDN strategy: everything you need to know</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21591002">How to Kickstart and Scale a Marketplace | Hacker News</a>.</li>
<li><a href="https://crew.co/backstage/blog/the-psychology-of-pricing">How to price anything: The psychology of why we’ll pay what we pay</a>.</li>
<li><a href="https://www.sendwithus.com/resources/guide">How to Send Email Like a Startup</a>.</li>
<li><a href="http://startupclass.samaltman.com/">How to start a startup lectures</a>.</li>
<li><a href="http://www.iconarchive.com/">Icon archive</a>.</li>
<li><a href="https://www.iconfinder.com">Icon finder</a>.</li>
<li><a href="https://imagetragick.com/">ImageTragick (ImageMagick vulnerabilities and mitigations)</a>.</li>
<li><a href="https://irreal.org/blog/">Irreal: Bad Password Policies (salt + hash with bcrypt)</a>.</li>
<li><a href="https://kaffeine.herokuapp.com/">Kaffeine pings your Heroku app every 30 minutes so it will never go to sleep</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22871180">Keycloak: Open-source identity and access management | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19372623">Launch HN: Axdraft (YC W19) - Legal documents for startups in minutes (Hacker News)</a>.</li>
<li><a href="http://launchaco.com/build/">Launchaco - Name a business</a>.</li>
<li><a href="https://layer.com">Layer, messaging platform</a>.</li>
<li><a href="https://www.legalletters.co/">Legal Letters—At a fraction of the cost</a>.</li>
<li><a href="http://blog.sueraisty.com/lessons-learned-from-co-founding-a-tech-startup/">Lessons I learned from Co-Founding a startup</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23560823">Lightweight Alternatives to Google Analytics | Hacker News</a>.</li>
<li><a href="https://github.com/neiesc/ListOfMinimalistFrameworks">List of Minimal frameworks</a>.</li>
<li><a href="https://hatchful.shopify.com/">Logo Maker &amp; Logo Creator - Free Logo Generator Online</a>.</li>
<li><a href="https://www.namecheap.com/logo-maker/">Logo Maker - Create a Free Logo in Minutes - Namecheap</a>.</li>
<li><a href="http://logodust.com/">Logodust: Free Logo Designs For Your Startup</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=13065015">Logojoy: AI-powered logo creator (Hacker News)</a>.</li>
<li><a href="https://www.logoshi.com/">Logoshi: Online Logo Maker</a>.</li>
<li><a href="http://www.looker.com">Looker (Data analysis)</a>.</li>
<li><a href="https://picsum.photos/">Lorem Picsum: Lorem Ipsum… but for photos</a>.</li>
<li><a href="https://lmjabreu.com/">Luis Abreu, iOS Design/UX Specialist</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21225223">Making Instagram.com faster: Part 3 – cache first (Hacker News)</a>.</li>
<li><a href="https://www.mapbox.com/">Mapbox. Maps for iOS, Android and Web</a>.</li>
<li><a href="https://github.com/mapsme/omim/blob/master/README.md">MAPS.ME (open sourced)</a>.</li>
<li><a href="https://github.com/jessesquires/JSQMessagesViewController">Messaging UI for iOS</a>.</li>
<li><a href="https://muratbuffalo.blogspot.com/2019/12/my-distributed-systems-seminars-reading.html">Metadata: My Distributed Systems Seminar's reading list for Spring 2020</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23803046">Migrating Away from Google Analytics | Hacker News</a>.</li>
<li><a href="https://ldpreload.com/blog/names-to-reserve">Names to reserve for your own service</a>.</li>
<li><a href="https://netflix.github.io/mantis/">Netflix's Mantis: a platform to build an ecosystem of realtime stream processing applications</a>.</li>
<li><a href="https://www.netlify.com/">Netlify: All-in-one platform for automating modern web projects.</a>.</li>
<li><a href="https://www.netlify.com">Netlify: Build, deploy, and manage modern web projects</a>.</li>
<li><a href="https://www.digitalocean.com/community/tools/nginx">NGINX Config generator | DigitalOcean</a>.</li>
<li><a href="http://mobilenighthawk.com/">Nighthawk (Debug iOS apps remotely from your browser)</a>.</li>
<li><a href="https://github.com/nim-lang/nimforum">nimforum: Lightweight alternative to Discourse written in Nim</a>.</li>
<li><a href="https://www.track.tax/">No more tax surprises - Track</a>.</li>
<li><a href="http://officesnapshots.com/">Office Snapshots</a>.</li>
<li><a href="http://blog.fogcreek.com/how-to-onboard-software-engineers-interview-with-kate-heddleston/">Onboarding engineers</a>.</li>
<li><a href="https://onesignal.com/">OneSignal</a>.</li>
<li><a href="https://www.crowdcube.com/">Online investing, equity crowdfunding, business finance : Crowdcube</a>.</li>
<li><a href="https://gusto.com/">Online Payroll Services, HR, and Benefits | Gusto</a>.</li>
<li><a href="https://www.openhunt.co/">Open Hunt: an open and community-run alternative to Product Hunt.</a>.</li>
<li><a href="https://baremetrics.com/open-startups">Open Startups: companies embracing transparency and openness</a>.</li>
<li><a href="http://serverfault.com/questions/219620/which-is-the-best-webserver-for-serving-static-content-and-load-balancing">Options to serve static content</a>.</li>
<li><a href="https://medium.com/@sgblank/organizational-debt-is-like-technical-debt-but-worse-3c0c86eae3eb">Organizational Debt is Like Technical debt — But Worse</a>.</li>
<li><a href="http://facebook.github.io/origami/examples/">Origami for UI patterns and interactions</a>.</li>
<li><a href="http://www.paintcodeapp.com">PaintCode (drawings into ObjC code)</a> - <a href="http://bit.ly/PaintCodeRocks">coupon</a>.</li>
<li><a href="http://eatcodeplay.com/why-we-killed-off-code-reviews/">Pair programming over code-reviews</a>.</li>
<li><a href="https://www.parse.com">parse.com</a>.</li>
<li><a href="http://paymentfont.io/">paymentfont.io (Payment icons)</a>.</li>
<li><a href="http://www.benfrederickson.com/distance-metrics/?hn=1">People Who Like This Also Like</a>…</li>
<li><a href="https://news.ycombinator.com/item?id%3D9453477">People Who Like This Also Like… (Hacker News)</a>.</li>
<li><a href="http://permutive.com/">Permutive (ad-server for sponsored content)</a>.</li>
<li><a href="https://pioneer.app/">Pioneer - The network for ambitious outsiders</a>.</li>
<li><a href="https://porkbun.com/">porkbun.com | An oddly satisfying experience (domain registry)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=10381584">Pragmatic app pricing (Hacker News)</a>.</li>
<li><a href="http://www.marco.org/2015/10/13/pragmatic-pricing">Pragmatic app pricing </a>.</li>
<li><a href="https://mixpanel.com/">Product and User Behavioral Analytics for Mobile, Web, &amp; More | Mixpanel</a>.</li>
<li><a href="https://www.producthunt.com/">Product Hunt: a curation of the best new products, every day</a>.</li>
<li><a href="http://www.theatlantic.com/business/archive/2015/01/the-psychological-difference-between-1200-and-1167/384993/?single_page=true">Psychological differences in price</a>.</li>
<li><a href="https://twitter.com/bmweis/status/1162738837539426304">Questions to ask when joining a startup to help you understand the potential value of your equity</a>.</li>
<li><a href="http://www.quora.com/What-are-the-best-productivity-tools-for-entrepreneurs">Quora: What are the best productivity tools for entrepreneurs</a>?</li>
<li><a href="https://get.gaug.es/">Real Time Web Analytics &amp; Marketing Attribution Tools - Gauges</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18402411">RemoteMac.io – Dedicated Mac mini (Hacker News)</a>.</li>
<li><a href="https://responsevault.com/">ResponseVault - Spreadsheet. Grid Form Builder.</a>.</li>
<li><a href="http://rethinkdb.com/faq/">RethinkDB FAQ</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=9185338">RethinkDB HN comments</a>.</li>
<li><a href="https://retool.com">Retool: Build internal tools fast</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19388489">Roll Your Own Analytics (Hacker News)</a>.</li>
<li><a href="https://www.pcmaffey.com/roll-your-own-analytics/">Roll Your Own Analytics</a>.</li>
<li><a href="https://spin.atomicobject.com/2019/06/12/ip-software-dev-contract/">Securing Intellectual Property Rights in a Software Development Contract</a>.</li>
<li><a href="https://www.sendwithus.com/resources/guide/">Send email like a startup</a>.</li>
<li><a href="https://shareasimage.com/">Share as image</a>.</li>
<li>Show HN: How I made simple Geolocation service which handles 6m+ req/mo for $5.</li>
<li><a href="https://news.ycombinator.com/item?id=22441289">Show HN: Profit Hunt - Get inspired by profitable online projects | Hacker News</a>.</li>
<li><a href="https://simplescraper.io/">Simplescraper — Scrape Websites and turn them into APIs</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19457709">So you want your app/website to work in China</a>.</li>
<li><a href="https://github.com/spaceuptech/space-cloud">space-cloud: Open source, high performance web service which provides instant Realtime APIs on the database of your choice.</a>.</li>
<li><a href="https://www.splunk.com/">Splunk: SIEM, AIOps, Application Management, Log Management, Machine Learning, and Compliance</a>.</li>
<li><a href="http://logo.squarespace.com/">Squarespace Logo</a>.</li>
<li><a href="http://blog.samaltman.com/startup-advice-briefly">Startup advice, briefly</a>.</li>
<li><a href="https://www.defmacro.org/2019/03/26/startup-checklist.html">Startup idea checklist | defmacro</a>.</li>
<li><a href="https://github.com/leonar15/startup-checklist">Startup Incorporation Checklist</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/9nibvw/striking_off_company_am_i_missing_anything">Striking off company - am I missing anything? : UKPersonalFinance</a>.</li>
<li><a href="https://www.firebase.com/docs/android/guide/structuring-data.html">Structuring JSON data in your Firebase database</a>.</li>
<li><a href="http://t.co/5WUoz5BwtT">Submit.co: Press coverage for your startup</a>.</li>
<li><a href="http://submit.co/">submit.co: Where to get press coverage for your startup</a>.</li>
<li><a href="http://swagger.io/">Swagger</a>: Represent REST API.</li>
<li><a href="https://tailwindui.com/">Tailwind UI</a>.</li>
<li><a href="http://taskjuggler.org/">TaskJuggler - A Free and Open Source Project Management Software - About TaskJuggler</a>.</li>
<li><a href="https://technically.dev/posts/what-your-developers-are-using.html">Technically: what your developers are using (stacks, tools, and beyond)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11964763">Telephony, SMS, and MMS APIs (Hacker News)</a>.</li>
<li><a href="http://textbelt.com/">TextBelt:</a> A free, open source API for outgoing texts..</li>
<li><a href="https://news.ycombinator.com/item?id=12448844">The Correct Way to Validate Email Addresses (Hacker News)</a>.</li>
<li><a href="https://medium.com/fluxx-studio-notes/the-first-rule-of-pricing-is-you-do-not-talk-about-pricing-1875caa39b89#.exvbm4vfa">The first rule of pricing is: you do not talk about pricing</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22608106">The good parts of AWS: a visual summary | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=9501892">The Psychology of Pricing: A Gigantic List of Strategies (HN comments)</a>.</li>
<li><a href="http://www.nickkolenda.com/psychological-pricing-strategies">The Psychology of Pricing: A Gigantic List of Strategies</a>.</li>
<li><a href="https://thehungryjpeg.com/aff/Madiha/">TheHungryJPEG.com (Premium Graphic Design Resources)</a>.</li>
<li><a href="http://blog.venanti.us/web-app-2015/">Things to Know When Making a Web Application in 2015</a>.</li>
<li><a href="https://news.ycombinator.com/item">TLDR Stock Options</a>.</li>
<li><a href="https://dev.to/sahilrajput/tools-for-developers-gkp">Tools for Developers (DEV Community)</a>.</li>
<li><a href="https://github.com/torodb/torodb">ToroDB</a>.</li>
<li><a href="https://wiki.hetzner.de/index.php/Traffic/en">Traffic/en – Hetzner DokuWiki (CDN)</a>.</li>
<li><a href="https://twitter.com/migueldeicaza/status/1314004192844021765">Twitter: Cheapest and reliable way of serving data over http</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24391612">Understanding OAuth2 and OpenID Connect | Hacker News</a>.</li>
<li><a href="https://unsplash.com/">Unsplash: Beautiful Free Images &amp; Pictures</a>.</li>
<li><a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/S3Torrent.html">Using BitTorrent with Amazon S3</a>.</li>
<li><a href="http://www.valvesoftware.com/company/Valve_Handbook_LowRes.pdf">Valve employee handbook</a>.</li>
<li><a href="https://www.waveapps.com/">Wave Financial: Financial Software for Small Businesses</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23378524">We ditched Google Analytics | Hacker News</a>.</li>
<li><a href="http://blog.workshape.io/we-use-rethinkdb-at-workshapeio/">We use RethinkDB at Workshape.io</a>.</li>
<li><a href="https://clicky.com/">Web Analytics in Real Time (Clicky)</a>.</li>
<li><a href="http://statcounter.com">Web Analytics Made Easy - Statcounter</a>.</li>
<li><a href="https://apify.com/">Web Scraping, Data Extraction and Automation · Apify</a>.</li>
<li><a href="https://www.quora.com/What-are-some-of-the-things-VCs-listen-for-when-hearing-pitches-that-instill-confidence-in-them-about-the-startup-founders-pitching/answer/Patrick-Mathieson">What are some of the things VCs listen for when hearing pitches that instill confidence in them about the startup founders pitching?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17875285">What does the GDPR actually mean for startups? (Hacker News)</a>.</li>
<li><a href="https://dev.to/allison_seboldt/what-hosting-do-you-use--5bmh">What hosting do you use? - DEV Community</a>.</li>
<li><a href="http://www.talkingquickly.co.uk/2015/04/what-id-tell-myself-about-startups/">What I'd tell myself about startups if I could go back 5 years</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/e1f0tn/what_is_the_best_payment_processor_for_a_sme/">What is the best &quot;payment processor&quot; for a SME e-commerce company in the UK?</a>.</li>
<li><a href="https://twitter.com/romanzolotarev/status/1054342116917329921?s=12">What is your favorite domain registrar? (Twitter)</a>.</li>
<li><a href="https://zerokspot.com/weblog/2020/02/29/mobile-app-subscription-pricing/">What's a good (mobile) app subscription price? - zerokspot.com</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/ehd14k/whats_the_best_financial_package_i_could_offer/">What's the best financial package I could offer our employees?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=13063842">What’s the Second Job of a Startup CEO? (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18713844">Writing copy for landing pages (Hacker News)</a>.</li>
<li><a href="http://www.ycombinator.com/documents/#sales">YC Sales agreement</a>.</li>
<li><a href="https://spin.atomicobject.com/2019/11/14/more-than-rest-for-api-success/">You Need More than REST for API Success</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Romania travel bookmarks</title>
<link>https://xenodium.com/romania-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/romania-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.abandonedamerica.us/abandoned-romania">Abandoned Romania</a>.</li>
<li><a href="http://bran-castle.com/">Bran Castle</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Productivity tips backlog</title>
<link>https://xenodium.com/productivity-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/productivity-tips-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://github.com/tonsky/AnyBar">AnyBar: OS X menubar status indicator (color dot)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/benvan/mercury">mercury (fuzzy tab search)</a>.</p>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Productivity bookmarks</title>
<link>https://xenodium.com/productivity-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/productivity-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://10fastfingers.com/">10 fast fingers</a> (improve typing skills).</li>
<li><a href="http://dayoneapp.com/">Day One Journal</a></li>
<li><a href="http://yanpritzker.com/2011/11/17/dotfiles-for-ultimate-productivity-in-bash-and-vim/">Dotfiles for insane productivity in bash, git, and vim</a>.</li>
<li><a href="https://twitter.com/EricaJoy/status/1235635291378999296">EricaJoy on Twitter: &quot;so folks, what are your #1 tools for remote work?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18179972">How to Get Things Done When You Don't Feel Like It (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=20780939">How to return to the flow faster (Hacker News)</a>.</li>
<li><a href="https://codejamming.org/2019/how-to-return-to-flow">How to return to the flow faster | Code Jamming</a>.</li>
<li><a href="http://maebert.github.io/jrnl/">jrnl</a>: Likely what I've been looking for journaling from command line.</li>
<li><a href="https://www.noisli.com/">Noisli - Improve Focus and Boost Productivity with Background Noise</a>.</li>
<li><a href="https://app.getpocket.com/">Pocket</a>.</li>
<li><a href="https://dev.to/karaluton/reflecting-on-one-year-of-remote-work-1nkp">Reflecting On One Year of Remote Work - DEV Community</a>.</li>
<li><a href="https://blog.todoist.com/2015/11/30/ultimate-guide-personal-productivity-methods/">The Ultimate Guide to Personal Productivity Methods</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22105229">Tricks to start working despite not feeling like it | Hacker News</a>.</li>
<li><a href="https://github.com/skwp/dotfiles">Yan's dot files</a>: For peeking.</li>
<li><a href="http://yanpritzker.com/2006/10/03/five-ways-to-get-insane-productivity-boosts/">Yan's productivity tips</a>: Also to try.</li>
<li><a href="https://www.zotero.org">Zotero</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Privacy bookmarks</title>
<link>https://xenodium.com/privacy-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/privacy-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.lastpass.com/">#1 Password Manager, Vault, &amp; Digital Wallet App (LastPass)</a>.</li>
<li><a href="https://blog.lopp.net/modest-privacy-protection-proposal/">A Modest Privacy Protection Proposal</a>.</li>
<li><a href="https://www.neustadt.fr/essays/against-a-user-hostile-web/">Against an Increasingly User-Hostile Web - Neustadt.fr</a>.</li>
<li><a href="https://restoreprivacy.com/google-alternatives/">Alternatives to Google Products (Restore Privacy)</a>.</li>
<li><a href="https://amiunique.org/fp">Am I unique?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17896692">An Intensive Introduction to Cryptography (Hacker News)</a>.</li>
<li><a href="https://github.com/yishilin14/asc-key-to-qr-code-gif">asc-key-to-qr-code-gif: Convert ASCII-armored PGP keys to animated QR code</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23521399">Ask HN: A way to adblock “we're using cookies” popups? | Hacker News</a>.</li>
<li><a href="https://github.com/Kickball/awesome-selfhosted">Awesome selfhosted (locally hosting and managing applications instead of renting from SaaS providers)</a>.</li>
<li><a href="https://www.bellingcat.com/resources/how-tos/2019/12/26/guide-to-using-reverse-image-search-for-investigations/">bellingcat - Guide To Using Reverse Image Search For Investigations - bellingcat</a>.</li>
<li><a href="https://nullprogram.com/blog/2018/09/06/">Brute Force Incognito Browsing « null program</a>.</li>
<li><a href="https://www.mullvad.net/en/guides/first-steps-towards-online-privacy/">Change your online habits - Guides | Mullvad VPN</a>.</li>
<li><a href="https://count.ly/">Countly | Product Analytics for Mobile, Web, Desktop and IoT</a>.</li>
<li><a href="https://crypt.ee">Cryptee (Private, Secure, Encrypted Documents &amp; Photos)</a>.</li>
<li><a href="https://cryptpad.fr/">CryptPad: Collaboration suite, encrypted and open-source</a>.</li>
<li><a href="https://dbp.io/essays/2013-06-29-hackers-replacement-for-gmail.html">dbp.io: A Hacker's Replacement for GMail</a>.</li>
<li><a href="https://nrempel.com/de-googling-my-life/">De-Googling My Life</a>.</li>
<li><a href="https://simpleoptout.com/">Deep links to opt-out of data sharing by 60+ companies – Simple Opt Out</a>.</li>
<li><a href="https://degoogle.jmoore.dev/">degoogle | A huge list of alternatives to Google products.</a>.</li>
<li><a href="http://digital-era.net/">Digital Era</a>.</li>
<li><a href="https://www.dnsleaktest.com">DNS leak test</a>.</li>
<li><a href="https://doesmysiteneedhttps.com/">Does my site need HTTPS?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18100243">DuckDuckGo Traffic (Hacker News)</a>.</li>
<li><a href="https://etherpad.org/">Etherpad (Open Source online editor)</a>.</li>
<li><a href="https://ethical.net/resources/">Ethical Alternatives &amp; Resources - ethical.net</a>.</li>
<li><a href="https://usefathom.com/">Fathom Analytics - Simple, Privacy-focused Web Analytics</a>.</li>
<li><a href="https://miguelmota.com/blog/getting-started-with-wireguard/">Getting Started with WireGuard » Miguel Mota | Software Developer</a>.</li>
<li><a href="https://github.com/AGWA/git-crypt">git-crypt: Transparent file encryption in git</a>.</li>
<li><a href="https://github.com/tycrek/degoogle">GitHub - tycrek/degoogle: Repo for the r/privacy &quot;degoogle&quot; megathread</a>.</li>
<li><a href="https://markosaric.com/firefox/">Give Firefox A Chance For A Faster, Calmer And Distraction-Free Internet</a>.</li>
<li><a href="https://www.computerworld.com/article/3339618/apple-ios/how-to-stay-as-private-as-possible-on-apples-ipad-and-iphone.html">How to stay as private as possible on Apple's iPad and iPhone | Computerworld</a>.</li>
<li><a href="https://www.ncsc.gov.uk/blog-post/three-random-words-or-thinkrandom-0">Ian M discusses what makes a good password (NCSC)</a>.</li>
<li><a href="https://prism-break.org/en/categories/ios/">iOS - Platforms - PRISM Break (more privacy tools)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17737148">K-anonymity (Hacker News)</a>.</li>
<li><a href="https://github.com/Kickball/awesome-selfhosted">Kickball/awesome-selfhosted: Free Software network services and web applications which can be hosted locally.</a>.</li>
<li><a href="https://www.kill-the-newsletter.com/">Kill the Newsletter!</a>.</li>
<li><a href="https://kolabnow.com/feature/calendar">Kolab (calendar)</a>.</li>
<li><a href="https://mailbox.org/en/">mailbox.org (email + calendar host)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18810035">Migrating from Google Analytics (Hacker News)</a>.</li>
<li><a href="https://github.com/mssun/passforios/wiki#importing-ascii-armor-encrypted-key">mssun/passforios Wiki</a>.</li>
<li><a href="https://www.mullvad.net/en/">Mullvad VPN</a>.</li>
<li><a href="http://adi.is/s/cpunk20/#21">New privacy tools</a>.</li>
<li><a href="https://riseup.net/en/security/message-security/openpgp/best-practices">OpenPGP Best Practices - riseup.net</a>.</li>
<li><a href="https://www.nytimes.com/wirecutter/reviews/our-favorite-ad-blockers-and-browser-extensions-to-protect-privacy/">Our Favorite Ad Blockers and Browser Extensions for Privacy</a>.</li>
<li><a href="https://panopticlick.eff.org">Panopticlick (Is your browser safe against tracking?)</a>.</li>
<li><a href="https://mhaffner.github.io/post/pi-hole-troubleshooting/">Pi-hole troubleshooting: An overview of my recent installation | Matthew Haffner</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19258717">Pi-Hole – A black hole for Internet advertisements (Hacker News)</a>.</li>
<li><a href="https://plausible.io/">Plausible · Simple, open-source web analytics</a>.</li>
<li><a href="https://www.privacytools.io/">Privacy Tools - Encryption Against Global Mass Surveillance</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27294703">Privacy – A curated list of services and alternatives that respect privacy</a>.</li>
<li><a href="https://keyserver.mattrude.com/guides/web-key-directory/">Publishing A Public Key via Web Key Directory (WKD) - OpenPGP Keyserver</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27707857">Purelymail – cheap, no-nonsense email | Hacker News</a>.</li>
<li><a href="https://www.qubes-os.org/">Qubes OS: A reasonably secure operating system</a>.</li>
<li><a href="https://www.runnaroo.com/">Runaroo (metasearch engine)</a>.</li>
<li><a href="https://www.runnaroo.com/">Runnaroo | A Better Private Search Engine</a>.</li>
<li><a href="https://searx.space/">Searx search engine instances</a>.</li>
<li><a href="https://abot.app/blog/elk-nginx-logs-setup">Setup ELK for NGINX logs with Elasticsearch, Logstash, and Kibana (analytics alternative)</a>.</li>
<li><a href="https://simpleanalytics.io">Simple Analytics - Simple, clean, and privacy-friendly analytics</a>.</li>
<li><a href="https://smallstep.com/blog/everything-pki.html">smallstep - Everything you should know about certificates and PKI but are too afraid to ask</a>.</li>
<li><a href="https://ssd.eff.org/">Surveillance Self-Defense | Tips, Tools and How-tos for Safer Online Communications</a>.</li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/temporary-containers/">Temporary Containers – Get this Extension for Firefox (en-US)</a>.</li>
<li><a href="https://thatoneprivacysite.net/">That One Privacy Site</a>.</li>
<li><a href="https://www.remembear.com">The easiest way to remember passwords | RememBear</a>.</li>
<li><a href="https://tineye.com/">TinEye Reverse Image Search</a>.</li>
<li><a href="https://riseup.net/en">Tools for people and groups working on liberatory social change (riseup.net)</a>.</li>
<li><a href="http://digital-era.net/tor-use-best-practices/">Tor use - best practices</a>.</li>
<li><a href="https://medium.com/@ahawkins/trying-to-secure-my-digital-life-b2e5a2876c12">Trying to Secure My Digital Life – Adam Hawkins – Medium</a>.</li>
<li><a href="https://twitter.com/namseoknation/status/1268306421197746179">twitter: YOUR RIGHTS!!! (this is a UK version, but i’m sure some things may apply!! )</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=28410807">uBlock Origin review | Hacker News</a>.</li>
<li><a href="https://www.reddit.com/r/VPN/">Virtual Private Networks (Reddit)</a>.</li>
<li><a href="https://webbkoll.dataskydd.net/en/">Webbkoll: How privacy-friendly is your site?</a>.</li>
<li><a href="https://whyprivacymatters.org/">Why Privacy Matters | Privacy is important. Here are some simple reasons why.</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Lifestyle/wellbeing/health bookmarks</title>
<link>https://xenodium.com/lifestyle-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/lifestyle-bookmarks</guid>
    <description><![CDATA[<ul>
<li>&quot;Do not spoil what you have by desiring what you have not; what you now have was once among the things you only hoped for.&quot; - Epicurus</li>
<li><a href="https://www.thesleepjudge.com/23-weird-plants-for-your-bedroom-that-will-help-you-sleep-like-a-baby/">23 Weird Plants For Your Bedroom That Will Help You Sleep Like A Baby</a>.</li>
<li><a href="http://www.theflowstatecollective.com/flow-habits/a-simple-guide-to-meditation">A simple guide to meditation</a>.</li>
<li><a href="https://twitter.com/farbodsaraf/status/1067980298040807424?s=12">Advice I needed when I was young</a>.</li>
<li><a href="http://www.anxietyculture.com/">Anxiety Culture</a>.</li>
<li><a href="https://anxietynomore.co.uk/">Anxiety No More (Support and Help for a natural anxiety cure)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18837334">Ask HN: How did you decide what problems to solve in your lifetime? | Hacker News</a>.</li>
<li><a href="https://betteretiquette.blogspot.com/">Better etiquette: Topical Etiquette Tips, Helpful Household Hints, International Travel Tips, Dine Like a Diplomat…</a></li>
<li><a href="https://en.wikipedia.org/wiki/Blue_Zone">Blue Zone: Where some claim people live much longer than average</a>.</li>
<li><a href="https://www.brainpickings.org/">Brain Pickings</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Caffeine-induced_anxiety_disorder">Caffeine-induced anxiety disorder - Wikipedia</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Calisthenics#Common_exercises">Calisthenics - Wikipedia</a>.</li>
<li><a href="http://camdez.com/blog/2010/01/15/lifehacking-expanded/">Cameron Desautel on lifehacking</a>.</li>
<li><a href="http://camdez.com/blog/categories/productivity/">Cameron Desautel on productivity</a>.</li>
<li><a href="https://harryrschwartz.com/2019/11/16/canadian-permanent-residency">Canadian Permanent Residency</a>.</li>
<li><a href="https://github.com/kdeldycke/awesome-falsehood">Curated list of falsehoods programmers believe in</a>.</li>
<li><a href="https://www.youtube.com/watch?v=j2C8MkY7Co8&amp;feature=youtu.be">Dr. Hamilton Demonstrates &quot;The Hold&quot; - How To Calm A Crying Baby (YouTube)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=23508581">Dream Homes from the Past Century | Hacker News</a>.</li>
<li><a href="https://www.recipes-news.co.nz/news/2019/11/6/game-changer-or-fame-gainer">Game Changer or Fame Gainer? — News &amp; Features</a>.</li>
<li><a href="https://betterhumans.coach.me/how-to-set-up-your-iphone-for-productivity-focus-and-your-own-longevity-bb27a68cc3d8">How to Configure Your iPhone to Work for You, Not Against You</a>.</li>
<li><a href="https://www.quora.com/How-do-I-get-six-pack-abs-in-one-year">How to get six pack abs in one year - Quora</a>.</li>
<li><a href="https://docs.google.com/document/d/1j4rj883slFvh1zZLGedqQFM0wqCrHlIEPE62K0LkKak/edit">ICEBREAKERS, via The Art of Noticing by Rob Walker</a>.</li>
<li><a href="https://www.quora.com/What-is-the-best-way-to-improve-life/answer/Jon-Brosio">Jon Brosio's answer to What is the best way to improve life? - Quora</a>.</li>
<li><a href="https://www.dezeen.com/2019/05/02/minimod-curucaca-mapa-prefab-house-brazil/">MAPA hides prefab Minimod Curucaca in Brazilian forest</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17632668">Melatonin: Much More Than You Wanted to Know (Hacker News)</a>.</li>
<li><a href="http://www.mindbodygreen.com/">Mind body green</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18844791">Most lives are lived by default (2012) | Hacker News</a>.</li>
<li><a href="https://www.mayoclinic.org/diseases-conditions/panic-attacks/symptoms-causes/syc-20376021">Panic attacks and panic disorder - Symptoms and causes - Mayo Clinic</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17679451">Periodic fasting starves cisplatin‐resistant cancers to death (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24050837">Planning for My Kidnapping | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17231806">Posing for photos (all about the squinch)</a>.</li>
<li><a href="http://www.nytimes.com/2015/01/11/fashion/no-37-big-wedding-or-small.html">Quiz: The 36 Questions That Lead to Love</a>.</li>
<li><a href="http://www.quora.com/What-methods-can-I-use-to-avoid-getting-so-tired-when-I-do-the-same-amount-of-a-work-as-my-peers-who-do-not-get-so-tired">Quora on increasing energy levels</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=27503597">Show HN: I made a community sourced fitness routine database | Hacker News</a>.</li>
<li><a href="https://www.cdc.gov/handwashing/show-me-the-science-hand-sanitizer.html">Show Me the Science – When &amp; How to Use Hand Sanitizer in Community Settings</a>.</li>
<li><a href="https://twitter.com/msdanifernandez/status/1330962637731971073">Side sleepers with neck problems ONLY (pillow thread)</a>.</li>
<li><a href="https://medium.com/s/story/six-years-with-a-distraction-free-iphone-8cf5eb4f97e3">Six Years With a Distraction-Free iPhone – Member Feature Stories – Medium</a>.</li>
<li><a href="https://medium.com/coach-me-app/top-100-habits-to-track-in-2018-4940bf459d5">The 101 Best Habits to Track in 2018 – Coach.me App – Medium</a>.</li>
<li><a href="http://www.mydomaine.com/best-indoor-plants-for-clean-air/slide7">The Best Indoor Plants to Clear the Air, Literally</a>.</li>
<li><a href="https://www.independent.co.uk/life-style/fall-asleep-two-minutes-how-to-military-secret-trick-a8520991.html">The military secret to falling asleep in two minutes (The Independent)</a>.</li>
<li><a href="https://medium.com/@JohnLeFevre/the-only-new-years-resolutions-you-ll-ever-need-9246aa419263">The Only New Year’s Resolutions You’ll Ever Need – John LeFevre – Medium</a>.</li>
<li><a href="https://joshldavis.com/2013/05/20/the-path-to-dijkstras-handwriting/">The Path to Dijkstra’s Handwriting</a>.</li>
<li><a href="http://articles.mercola.com/sites/articles/archive/2011/08/16/dirty-little-secret-orange-juice-is-artificially-flavored-to-taste-like-oranges.aspx">The Shocking Truth About Freshly Squeezed Orange Juice</a>.</li>
<li><a href="http://www.quora.com/How-does-it-feel-to-travel-alone">Travelling alone (Quora)</a>.</li>
<li><a href="https://english.emmaclit.com/2017/05/20/you-shouldve-asked/comment-page-9/">You should’ve asked | Emma</a>.</li>
<li><a href="http://www.zerowastehome.com/">Zero Waste Home</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Graphics bookmarks</title>
<link>https://xenodium.com/graphics-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/graphics-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://jnordberg.github.io/gif.js/">gif.js</a>.</li>
<li><a href="http://philogb.github.io/jit/static/v20/Jit/Examples/Icicle/example2.html">Icicles</a>: Data viz.</li>
<li><a href="https://twitter.com/valerybriz/status/1369449701641248769">inkpanther2 graphics or logo commissions</a>.</li>
<li><a href="https://www.reddit.com/r/cricut/comments/13b0qkg/list_of_best_websites_for_downloading_free_svgs/">List of best websites for downloading free SVGs</a>.</li>
<li><a href="http://mbostock.github.io/protovis/">Protoviz</a>: Data viz.</li>
<li><a href="http://www.inkscapeforum.com/viewtopic.php?f=22&amp;t=13126">Svg animation info</a>: Potentially useful for some ideas in mind.</li>
<li><a href="http://stackoverflow.com/questions/14804950/include-one-svg-inside-another">Svg within svg</a>: Potentially useful for some ideas in mind.</li>
<li><a href="https://www.reddit.com/r/cricutcrafting/wiki/svg/">where to find svgs</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Nexus Q bookmarks</title>
<link>https://xenodium.com/nexus-q-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/nexus-q-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://wiki.cyanogenmod.org/w/Install_CM_for_steelhead">How to Install CyanogenMod on the Google Nexus Q (&quot;steelhead&quot;)</a>.</li>
<li><a href="http://nexusq.wikidot.com/troubleshooting">Nexus Q troubleshooting</a>.</li>
<li><a href="http://forum.xda-developers.com/showthread.php?t%3D2408799">Unlocking-&gt;insecure boot-&gt;root-&gt;flash cm10 with amplifier support your Q without apk</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Golang bookmarks</title>
<link>https://xenodium.com/golang-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/golang-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://spf13.com/presentation/7-common-mistakes-in-go-2015/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+spf13+%28Steve+Francia%27s+Blog%29">7 Common mistakes in Go</a>.</li>
<li><a href="https://github.com/mingrammer/commonregex">A collection of common regular expressions for Go</a>.</li>
<li><a href="https://github.com/avelino/awesome-go">A curated list of awesome Go packages</a>.</li>
<li><a href="https://github.com/guardrailsio/awesome-golang-security">A curated list of awesome golang Security related resources</a>.</li>
<li><a href="https://iosexample.com/a-drawer-implement-on-swiftui/">A Drawer implement on SwiftUI</a>.</li>
<li><a href="https://github.com/montanaflynn/stats">A statistics package with common functions that are missing from the Golang standard library</a>.</li>
<li><a href="http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables">A whirlwind tour of Go’s runtime environment variables</a>.</li>
<li><a href="https://dev.to/shindakun/attempting-to-learn-go---now-sending-rest-requests-akp">Attempting to Learn Go - Now Sending GET/POST REST Requests</a>.</li>
<li><a href="https://stackoverflow.com/questions/59100973/python-grpc-equivalent-of-golangs-perrpccredentials">authentication - python gRPC equivalent of golang's PerRPCCredentials</a>.</li>
<li><a href="http://www.jerf.org/iri/post/2945">Avoiding Reflection (And Such) In Go</a>.</li>
<li><a href="https://github.com/iangudger/basicGoAPI">BasicGoAPI (ie. REST)</a>.</li>
<li><a href="https://chrislovecnm.com/golang/bazel/bazel-hello-world/">Bazel Golang Hello World (Kubernetes musings by chrislovecnm)</a>.</li>
<li><a href="http://beego.me/docs/intro/releases.md">Beego, platform for web apps</a>.</li>
<li><a href="https://gobuffalo.io/">Buffalo &amp; Rapid Web Development in Go</a>.</li>
<li><a href="https://www.youtube.com/watch?v=eTjNtNnVOGY">Building a RESTful API in Go Using Only the Standard Library (Episode 1)</a>.</li>
<li><a href="http://blog.wercker.com/2013/08/07/building-an-api-with-golang-rethinkdb-wercker.html">Building an API with Golang, RethinkDB and wercker</a>.</li>
<li><a href="https://dev.to/codehakase/building-small-containers-for-kubernetes-290j">Building Small Containers for Kubernetes (golang http)</a>.</li>
<li><a href="https://github.com/elliotchance/c2go">c2go: A tool for transpiling C to Go.</a>.</li>
<li><a href="https://godoc.org/golang.org/x/tools/cmd/vet">Command vet (reports suspicious constructs)</a>.</li>
<li><a href="http://www.kotancode.com/2015/09/10/complex-json-handling-in-go/">Complex json handling in Go</a>.</li>
<li><a href="https://github.com/adrianduke/configr">Configr: abstraction on top of configuration sources</a>.</li>
<li><a href="http://jen20.com/2015/02/06/configuring-emacs-for-go-part-1.html">Configuring emacs and evil mode for Go development (Part 1)</a>.</li>
<li><a href="https://www.scaledrone.com/blog/posts/creating-an-api-client-in-go">Creating an API Client in Go</a>.</li>
<li><a href="http://dave.cheney.net/2015/08/22/cross-compilation-with-go-1-5">Cross compilation with Go 1.5</a>.</li>
<li><a href="http://biasedbit.com/blog/golang-custom-transports/">Custom transports and timeouts</a>.</li>
<li><a href="https://medium.com/@deckarep/dancing-with-go-s-mutexes-92407ae927bf#.uixrkc790">Dancing with Go’s Mutexes</a>.</li>
<li><a href="https://medium.com/better-programming/debug-go-like-a-pro-213d4d74e940">Debug Go Like a Pro - Better Programming - Medium</a>.</li>
<li><a href="https://blog.gopheracademy.com/advent-2015/debugging-with-delve/">Debugging Go programs with Delve</a>.</li>
<li><a href="https://github.com/elcct/defaultproject">defaultproject (REST/web starter)</a>.</li>
<li><a href="https://blog.golang.org/defer-panic-and-recover">Defer, Panic, and Recover</a>.</li>
<li><a href="https://arenzana.org/2019/01/emacs-go-mode">Emacs Go Mode (Isma details his Emacs Golang setup)</a>.</li>
<li><a href="http://words.volant.is/articles/authentication-golang-web-applications/">End-user authentication for Go web applications</a>.</li>
<li><a href="https://entgo.io/">ent · An entity framework for Go</a>.</li>
<li><a href="https://blog.golang.org/error-handling-and-go">Error handling in Go</a>.</li>
<li><a href="http://www.darrencoxall.com/golang/executing-commands-in-go/">Executing commands in Go</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17765413">Exploring Error Handling Patterns in Go (Hacker News)</a>.</li>
<li><a href="http://blog.matttproud.com/2015/02/exploring-gos-runtime-how-process.html">Exploring Go's runtime</a>.</li>
<li><a href="https://hackernoon.com/face-recognition-with-go-676a555b8a7e">Face recognition with Go – Hacker Noon</a>.</li>
<li><a href="https://github.com/valyala/fasthttp">fasthttp: Fast HTTP implementation for Go</a>.</li>
<li><a href="https://github.com/gorilla/mux">GitHub - gorilla/mux: A powerful URL router and dispatcher for golang.</a>.</li>
<li><a href="https://github.com/montanaflynn/stats">GitHub - montanaflynn/stats: A well tested and comprehensive Golang statistics library package with no dependencies.</a>.</li>
<li><a href="https://github.com/ndabAP/vue-go-example">GitHub - ndabAP/vue-go-example: Vue.js and Go example project</a>.</li>
<li><a href="https://github.com/Nerzal/gocloak">GitHub - Nerzal/gocloak: golang keycloak client</a>.</li>
<li><a href="https://github.com/sethgrid/multibar">GitHub - sethgrid/multibar: Display multiple progress bars in Go (golang).</a>.</li>
<li><a href="https://peter.bourgon.org/go-best-practices-2016/">Go best practices, six years in</a>.</li>
<li><a href="https://gobyexample.com/">Go by Example</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D9399286">Go Challenge 3 HN comments</a>.</li>
<li><a href="https://github.com/golang/go/wiki/CodeReviewComments">Go Code Review Comments</a>.</li>
<li><a href="https://gotalks.googleplex.com/codelab/flag.article">Go command Line Flags</a>.</li>
<li><a href="http://blog.golang.org/pipelines">Go Concurrency Patterns: Pipelines and cancellation</a>.</li>
<li><a href="https://github.com/grpc/grpc-go/tree/master/examples/features/authentication">Go grpc authentication</a>.</li>
<li><a href="https://timr.co/go-interfaces-the-tricky-parts">Go interfaces, the tricky parts</a>.</li>
<li><a href="https://github.com/otium/ytdl">Go library for downloading YouTube videos</a>.</li>
<li><a href="https://github.com/alecthomas/gometalinter">Go Meta Linter</a>.</li>
<li><a href="http://www.gregosuri.com/2015/12/04/go-proverbs-illustrated/">Go Proverbs Illustrated</a>.</li>
<li><a href="https://blog.jpalardy.com/posts/go-slice-gotcha/">Go Slice Gotcha</a>.</li>
<li><a href="http://gohugo.io/templates/go-templates">Go Template Primer</a>.</li>
<li><a href="http://golang.rakyll.org/go-tool-flags/">Go tooling essentials (useful flags in tooling)</a>.</li>
<li><a href="https://www.youtube.com/watch?v=uBjoTxosSys">Go Tooling in Action - YouTube</a>.</li>
<li><a href="https://medium.com/go-walkthrough/go-walkthrough-encoding-json-package-9681d1d37a8f#.9rix3aqzg">Go Walkthrough: encoding/json package</a>.</li>
<li><a href="https://medium.com/go-walkthrough/go-walkthrough-fmt-55a14bbbfc53#.egmp9nwqv">Go Walkthrough: fmt (formatting strings)</a>.</li>
<li><a href="https://medium.com/@matzhouse/go-grpc-and-docker-c1fb2ec8e9f0">Go, gRPC and Docker</a>.</li>
<li><a href="http://go-bootstrap.io/">go-bootstrap to generate a lean and mean Go web project</a>.</li>
<li><a href="https://medium.com/@dgryski/go-fuzz-github-com-arolek-ase-3c74d5a3150c#.5ybv38lzm">go-fuzz github.com/arolek/ase tutorial</a>.</li>
<li><a href="https://github.com/cathalgarvey/go-minilock">Go-miniLock: The Minilock File Encryption System, Ported to Pure Go</a>.</li>
<li>go-rename.</li>
<li><a href="https://github.com/emicklei/go-restful">Go-restful</a>.</li>
<li><a href="https://github.com/jroimartin/gocui/blob/master/README.md">GOCUI - Go Console User Interface</a>.</li>
<li><a href="http://goji.io/">Goji: A web microframework for Golang</a>.</li>
<li><a href="https://github.com/luciotato/golang-notes/blob/master/OOP.md">Golang concepts from an OOP point of view</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12522652">Golang landmines</a>.</li>
<li><a href="http://golangtoolbox.com/">Golang toolbox (high quality Go packages)</a>.</li>
<li><a href="http://xahlee.info/golang/golang_index.html">Golang Tutorial (Xah Lee's)</a>.</li>
<li><a href="https://davidsbond.github.io/2019/06/14/creating-grpc-interceptors-in-go.html">Golang: Creating gRPC interceptors (David Bond)</a>.</li>
<li><a href="http://xahlee.info/golang/golang_rune.html">Golang: Rune</a>.</li>
<li><a href="https://www.youtube.com/playlist?list=PL2ntRZ1ySWBf-_z-gHCOR2N156Nw930Hm">GopherCon 2015 videos</a>.</li>
<li><a href="https://www.youtube.com/watch?v=5v2fqm_8jYI">GopherCon 2016: Jack Lindamood - Practical Advice for Go Library Authors (YouTube)</a>.</li>
<li><a href="https://www.youtube.com/watch?v=5v2fqm_8jYI">GopherCon 2016: Jack Lindamood - Practical Advice for Go Library Authors</a>.</li>
<li><a href="https://about.sourcegraph.com/go/gophercon-2018-how-to-write-a-parser-in-go/">GopherCon 2018 - How to Write a Parser in Go</a>.</li>
<li><a href="https://github.com/gopherjs/gopherjs">Gopherjs: A compiler from Go to JavaScript</a>.</li>
<li><a href="https://github.com/visualfc/goqt">GoQt: golang Qt bindings</a>.</li>
<li>gorepl-mode.</li>
<li><a href="https://github.com/securego/gosec">gosec - Golang Security Checker</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21603483">Go’s Features of Last Resort | Hacker News</a>.</li>
<li><a href="https://eli.thegreenplace.net/2020/graceful-shutdown-of-a-tcp-server-in-go/">Graceful shutdown of a TCP server in Go - Eli Bendersky's website</a>.</li>
<li><a href="https://github.com/levigross/grequests">GRequests: A Go &quot;clone&quot; of the great and famous Requests library</a>.</li>
<li><a href="https://grpc.io/docs/guides/auth/">gRPC authentication documentation</a>.</li>
<li><a href="https://github.com/apps/guardrails">GuardRails is a GitHub app that provides security feedback in your pull requests</a>.</li>
<li><a href="https://www.alexedwards.net/blog/how-to-hash-and-verify-passwords-with-argon2-in-go">How to Hash and Verify Passwords With Argon2 in Go - Alex Edwards</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=17061713">How to start a Go project in 2018 | Hacker News</a>.</li>
<li><a href="https://golang.org/doc/code.html">How to Write Go Code</a>.</li>
<li><a href="https://medium.com/pantomath/how-we-use-grpc-to-build-a-client-server-system-in-go-dd20045fa1c2">How we use gRPC to build a client/server system in Go (auth and TLS included)</a>.</li>
<li><a href="http://www.gohugo.io/">HUGO: a static website engine in Go</a>.</li>
<li><a href="http://nathanleclaire.com/blog/2015/10/10/interfaces-and-composition-for-effective-unit-testing-in-golang/">Interfaces and Composition for Effective Unit Testing in Golang</a>.</li>
<li><a href="https://github.com/kubernetes/kubernetes/blob/master/Godeps/Godeps.json">Kubernetes godeps</a>.</li>
<li><a href="https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html">Less is exponentially more (Rob Pike's Go reasoning)</a>.</li>
<li><a href="https://lets-go.alexedwards.net/">Let's Go! Learn to Build Professional Web Applications With Golang</a>.</li>
<li><a href="http://dave.cheney.net/2015/11/05/lets-talk-about-logging">Let's talk about logging</a>.</li>
<li><a href="http://www.alexedwards.net/blog/making-and-using-middleware">Making and Using HTTP Middleware in Go</a>.</li>
<li><a href="https://github.com/alexflint/go-restructure">Match regular expressions into struct fields</a>.</li>
<li><a href="http://bouk.co/blog/monkey-patching-in-go/">Monkey Patching in Go</a>.</li>
<li><a href="https://github.com/golang/go/wiki/PanicAndRecover">PanicAndRecover</a>.</li>
<li><a href="http://maciekmm.net/html-golang-stream-processing/">Parsing HTML with Go using stream processing</a>.</li>
<li><a href="https://www.sohamkamani.com/blog/2018/02/25/golang-password-authentication-and-storage/">Password authentication and storage in Go (Golang)</a>.</li>
<li><a href="https://www.amazon.com/Peaceful-Parent-Happy-Kids-Connecting/dp/0399160280/">Peaceful Parent, Happy Kids: How to Stop Yelling and Start Connecting</a>.</li>
<li><a href="https://peter.bourgon.org/go-best-practices-2016/">Peter Bourgon · Go best practices, six years in</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19218097">Practical Go: Real-world advice for writing maintainable Go programs (Hacker News)</a>.</li>
<li><a href="https://github.com/bradfitz/exp-httpclient/blob/master/problems.md">Problems with Go net/http Client API</a>.</li>
<li><a href="https://github.com/m3ng9i/ran">Ran: a simple static web server written in Go</a>.</li>
<li><a href="https://blog.gopheracademy.com/advent-2015/reducing-boilerplate-with-go-generate/">Reducing boilerplate with go generate</a>.</li>
<li><a href="https://research.swtch.com/interfaces">research!rsc: Go Data Structures: Interfaces</a>.</li>
<li><a href="https://www.youtube.com/watch?feature=youtu.be">RESTful Web API Basics in Go</a>.</li>
<li><a href="http://www.linkedin.com/pulse/restful-webservice-using-golang-sqlite-uttam-gandhi">Restful webservice using golang with sqlite</a>.</li>
<li><a href="http://revel.github.io/">Revel:</a> A high-productivity web framework for the Go language.</li>
<li><a href="https://github.com/bazelbuild/rules_go/blob/master/go/core.rst#go_binary">rules_go/core.rst at master · bazelbuild/rules_go</a>.</li>
<li><a href="https://golang.org/pkg/runtime/pprof/">runtime.pprof for profiling</a>.</li>
<li><a href="https://bitbucket.org/seanerussell/sashay">Sashay Go codegen</a>.</li>
<li><a href="https://syslog.ravelin.com/making-something-faster-56dd6b772b83">Seven steps to 100x faster Go</a>.</li>
<li><a href="https://github.com/grpc/grpc-go/issues/106">Simple password authentication example · Issue #106 · grpc/grpc-go</a>.</li>
<li><a href="https://github.com/dghubble/sling">Sling: Go REST client library for creating and sending API requests</a>.</li>
<li><a href="https://machiel.me/using-tags-in-go/">Small introduction to tags in Go</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=13213902">So you want to expose Go on the Internet (Hacker News)</a>.</li>
<li><a href="https://www.cockroachlabs.com/blog/rounding-implementations-in-go/">Survey of Rounding Implementations in Go | Cockroach Labs</a>.</li>
<li><a href="https://github.com/yvasiyarov/swagger">Swagger Go documentation generator</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D9716964">Ten useful techniques in Go (HN comments)</a>.</li>
<li><a href="http://arslan.io/ten-useful-techniques-in-go">Ten useful techniques in Go</a>.</li>
<li><a href="https://github.com/gizak/termui">termui, Go terminal dashboard</a>.</li>
<li><a href="https://dev.to/dannypsnl/testing-in-go-35ei">Testing in Go - DEV Community</a>.</li>
<li><a href="https://sourcegraph.com/blog/live/gopherconindia/112025389257">The 5 stages of learning Go</a>.</li>
<li><a href="https://dave.cheney.net/2014/03/25/the-empty-struct">The empty struct (Dave Cheney)</a>.</li>
<li><a href="http://golangcookbook.com/">The Go Cookbook</a>.</li>
<li><a href="http://go-talks.appspot.com/github.com/ChrisHines/talks/structured-logging/structured-logging.slide#1">The Hunt for a Logger Interface</a>.</li>
<li><a href="https://dave.cheney.net/2017/04/29/there-is-no-pass-by-reference-in-go">There is no pass-by-reference in Go | Dave Cheney</a>.</li>
<li><a href="http://openmymind.net/Things-I-Wish-Someone-Had-Told-Me-About-Go/">Things I wish someone told me about Go</a>.</li>
<li><a href="https://scripter.co/time-formatting-in-go/">Time formatting in Go ❚ A Scripter's Notes</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21225401">Uber Go Style Guide (Hacker News)</a>.</li>
<li><a href="http://divan.github.io/posts/go_concurrency_visualize/">Visualizing Concurrency in Go</a>.</li>
<li><a href="https://groups.google.com/forum/#!msg/golang-nuts/R7ryo7RdBPY/t7XFNGyRDQAJ">What's So Bad About Stdlib's Log Package? (Groups discussion)</a>.</li>
<li><a href="https://www.youtube.com/watch?v=YmbbmyxSlcg">Writing Unit Tests for your net/http Handlers</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>GitHub bookmarks</title>
<link>https://xenodium.com/github-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/github-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://help.github.com/articles/adding-a-cname-file-to-your-repository/">Adding a CNAME file to your repository</a>.</li>
<li><a href="https://help.github.com/articles/tips-for-configuring-a-cname-record-with-your-dns-provider/">Tips for configuring a CNAME record with your DNS provider</a>.</li>
<li><a href="https://help.github.com/categories/github-pages-basics/">Github pages basics</a>.</li>
<li><a href="http://stackoverflow.com/questions/23375422/how-to-setup-github-pages-to-redirect-dns-requests-from-subdomain-e-g-www-to">SO DNS response</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Courses bookmarks</title>
<link>https://xenodium.com/courses-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/courses-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.chesscademy.com">Chessacademy</a>.</li>
<li><a href="https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/about">Compilers (Stanford Lagunita)</a>.</li>
<li><a href="https://egghead.io/technologies/angular2">Egghead.io</a>.</li>
<li><a href="http://www.gravitycircuscentre.com/">Gravity Circus Centre</a>.</li>
<li><a href="http://idler.co.uk/shop/live-courses/">Idler courses</a>.</li>
<li><a href="https://www.coursera.org/learn/learning-how-to-learn?ranMID=40328&amp;ranEAID=4246lDpjhco&amp;ranSiteID=4246lDpjhco-7V8Bq5eW0eb.NabcjrH6FA&amp;siteID=4246lDpjhco-7V8Bq5eW0eb.NabcjrH6FA&amp;utm_content=10&amp;utm_medium=partners&amp;utm_source=linkshare&amp;utm_campaign=4246lDpjhco">Learning How to Learn: Powerful mental tools to help you master tough subjects (Coursera)</a>.</li>
<li><a href="http://lingua.ly/">lingua.ly</a>.</li>
<li><a href="https://www.coursera.org/learn/the-science-of-well-being">The Science of Well-Being (Coursera)</a>.</li>
<li><a href="http://tutsplus.com/">Tuts+ courses</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Reload inputrc</title>
<link>https://xenodium.com/reload-inputrc</link>
<guid isPermaLink="false">https://xenodium.com/reload-inputrc</guid>
    <description><![CDATA[<p>Reload .iputrc from bash prompt: C-x C-r. <a href="http://www.gnu.org/software/bash/manual/bashref.html#Miscellaneous-Commands">More at bashref manual</a>.</p>
]]></description>
    <pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Learning Emacs lisp</title>
<link>https://xenodium.com/learning-emacs-lisp</link>
<guid isPermaLink="false">https://xenodium.com/learning-emacs-lisp</guid>
    <description><![CDATA[<ul>
<li>Use nreverse and nconc to operate on lists in-place.</li>
<li>Set buffer local variables:</li>
</ul>
<pre><code class="language-{.commonlisp">(setq-local my-clever-var)
</code></pre>
<ul>
<li>Execute before saving buffer:</li>
</ul>
<pre><code class="language-{.commonlisp">(add-hook 'write-file-hooks
          (lambda ()
            (message &quot;about to save!&quot;)))
</code></pre>
<ul>
<li>Possibly use to start processes and send file content:</li>
</ul>
<pre><code class="language-{.commonlisp">(make-comint NAME PROGRAM &amp;optional STARTFILE &amp;rest SWITCHES)
</code></pre>
<ul>
<li>Creating markers:</li>
</ul>
<pre><code class="language-{.commonlisp">(setq my-marker (copy-marker (point)))
  #&lt;marker at 10251 in *ielm*&gt;

(marker-buffer my-marker)
  #&lt;buffer *ielm*&gt;

(marker-position my-marker)
  10251 (#o24013, #x280b, ?⠋)
</code></pre>
<ul>
<li>Get org heading at point:</li>
</ul>
<pre><code class="language-{.commonlisp">(org-get-heading 'no-tags 'no-todo)
</code></pre>
<ul>
<li>Remove string text properties. From manual:</li>
</ul>
<blockquote>
<p>(substring-no-properties STRING &amp;optional FROM TO)</p>
<p>Return a substring of STRING, without text properties. It starts at index FROM and ends before TO. TO may be nil or omitted; then the substring runs to the end of STRING. If FROM is nil or omitted, the substring starts at the beginning of STRING. If FROM or TO is negative, it counts from the end.</p>
</blockquote>
<ul>
<li>Skip org entry metadata/drawers:</li>
</ul>
<pre><code class="language-{.commonlisp">(org-end-of-meta-data-and-drawers)
</code></pre>
<ul>
<li>Random access to org entry using id (or CUSTOM_ID):</li>
</ul>
<pre><code class="language-{.commonlisp">(org-open-link-from-string &quot;[[#%exciting-custom-id]]&quot;)
</code></pre>
<ul>
<li>From <a href="http://endlessparentheses.com/debugging-emacs-lisp-part-1-earn-your-independence.html">Debugging Elisp Part 1: Earn your independence</a>:</li>
</ul>
<blockquote>
<ul>
<li>Go to where the function is defined.</li>
<li>Press C-u C-M-x. Edebug breakpoint for function.</li>
<li>Invoke function in question.</li>
<li>n/c will get you around.</li>
<li>q when done.</li>
</ul>
</blockquote>
<ul>
<li>Pretty printing objects:</li>
</ul>
<pre><code class="language-{.commonlisp">(let ((my-var (list &quot;val1&quot;
                    &quot;val2&quot;
                    &quot;val3&quot;)))
  (pp-to-string my-var))
</code></pre>
<ul>
<li>Search and/or replace in curent buffer:</li>
</ul>
<pre><code class="language-{.commonlisp">(re-search-forward &quot;needle&quot;
                   nil t)
(match-beginning 0) ;; Start location of match from last search.
(match-end 0) ;; End location of match from last search.
(replace-match &quot;love&quot;)

;; needle-in-haystack
</code></pre>
<ul>
<li>Restrict buffer editing to a region:</li>
</ul>
<pre><code class="language-{.commonlisp">(narrow-to-region (point)
                  (point-max))
</code></pre>
<ul>
<li>Restore restriction:</li>
</ul>
<pre><code class="language-{.commonlisp">(save-restriction (narrow-to-region (point)
                                    (point-max))
</code></pre>
<ul>
<li>Restore point, mark, and current buffer:</li>
</ul>
<pre><code class="language-{.commonlisp">(save-excursion (goto-char (point-max))
                (insert &quot;Hello elisp.&quot;))
</code></pre>
<ul>
<li>Concatenating strings:</li>
</ul>
<pre><code class="language-{.commonlisp">(concat &quot;Hello &quot; &quot;elisp &quot; &quot;world.&quot;)
</code></pre>
<ul>
<li>Grabbing thing at point:</li>
</ul>
<pre><code class="language-{.commonlisp">(thing-at-point 'word)
(thing-at-point 'symbol)
(thing-at-point 'line)
</code></pre>
<ul>
<li>Unit test with ert.</li>
<li>Basic iteration with dolist:</li>
</ul>
<pre><code class="language-{.commonlisp">(dolist (v '(&quot;a&quot; &quot;b&quot; &quot;c&quot;))
  (print v))
</code></pre>
<ul>
<li>Output to other buffer:</li>
</ul>
<pre><code class="language-{.commonlisp">(with-current-buffer (get-buffer-create &quot;*some buffer*&quot;)
  (princ '(some list to print)
         (current-buffer)))
</code></pre>
<ul>
<li>For a temporary buffer, use with-temp-buffer:</li>
</ul>
<pre><code class="language-{.commonlisp">(with-temp-buffer
  (insert &quot;abc&quot;)
  (point))
</code></pre>
<ul>
<li>Cons cells <a href="http://emacslife.com/read-lisp-tweak-emacs/beginner-2-understand-emacs-lisp.html#sec-4-4">bookmark</a>.</li>
<li>Check for substring:</li>
</ul>
<pre><code class="language-{.commonlisp">(string-match-p REGEXP STRING &amp;optional START)
</code></pre>
<ul>
<li>Matching substrings and accessing groups:</li>
</ul>
<pre><code class="language-{.commonlisp">(setq haystack &quot;Always click [[http://reddit.com/r/emacs][here]].&quot;)
(setq needle-re &quot;\\[\\[\\(.*\\)]\\[\\(.*\\)]]&quot;)
  &quot;\\[\\[\\(.*\\)]\\[\\(.*\\)]]&quot;

(string-match needle-re haystack)
  13 (#o15, #xd, ?\C-m)

(match-string 0 haystack)
  &quot;[[http://reddit.com/r/emacs][here]]&quot;

(match-string 1 haystack)
  &quot;http://reddit.com/r/emacs&quot;

(match-string 2 haystack)
  &quot;here&quot;
</code></pre>
<ul>
<li>Return argument unchanged (noop):</li>
</ul>
<pre><code class="language-{.commonlisp">(identity ARG)
</code></pre>
<ul>
<li>Org insert today's timestamp</li>
</ul>
<pre><code class="language-{.commonlisp">(org-insert-time-stamp (current-time))
</code></pre>
<ul>
<li><a href="http://ergoemacs.org/emacs/elisp_determine_OS_version.html">OS version in .emacs</a>: Determine OS in emacs lisp.</li>
<li>First element</li>
</ul>
<pre><code class="language-{.commonlisp">(car LIST)
</code></pre>
<ul>
<li>All but first element</li>
</ul>
<pre><code class="language-{.commonlisp">(cdr LIST)
</code></pre>
<ul>
<li>Add NEWELT to front of PLACE</li>
</ul>
<pre><code class="language-{.commonlisp">(push NEWELT PLACE)
</code></pre>
<ul>
<li>Invoke 'FUNCTION for each in SEQUENCE</li>
</ul>
<pre><code class="language-{.commonlisp">(mapcar FUNCTION SEQUENCE)
</code></pre>
<ul>
<li>Search/replace</li>
</ul>
<pre><code class="language-{.commonlisp">(while (search-forward &quot;Hello&quot;)
  (replace-match &quot;Bonjour&quot;))
</code></pre>
<ul>
<li>Save to kill ring = copy.</li>
<li>Point = cursor position.</li>
<li>Mark = a buffer position.</li>
<li>Kill = cut text.</li>
<li>Yank = paste.</li>
<li>Buffer:File = 1:1.</li>
<li>Window:Buffer = 1:1.</li>
<li>Frame:Window = 1:many.</li>
<li>Font lock = syntax highlighting.</li>
</ul>
]]></description>
    <pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Apple Watch bookmarks</title>
<link>https://xenodium.com/apple-watch-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/apple-watch-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://lionet.livejournal.com/137350.html">Swift, Apple Watch, and Dynamic Graphs</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 06 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>iOS bookmarks</title>
<link>https://xenodium.com/ios-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/ios-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://medium.com/ios-apprentice/11-insanely-great-ios-developers-sites-95686a523ea8">11 Insanely Great iOS Developers Sites</a>.</li>
<li><a href="https://medium.com/flawless-app-stories/30-great-ui-kits-for-ios-engineers-41b2732896b9">30 great UI Kits for iOS engineers – Flawless App Stories – Medium</a>.</li>
<li><a href="https://github.com/iosphere/ISHHoverBar">A floating UIToolBar replacement as seen in the iOS 10 Maps app</a>.</li>
<li><a href="http://phonegap-tips.com/articles/debugging-ios-phonegap-apps-with-safaris-web-inspector.html">Access mobile Safari via web inspector</a>.</li>
<li><a href="https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/DocumentPickerProgrammingGuide/AccessingDocuments/AccessingDocuments.html">Accessing Documents/Files (iOS)</a>.</li>
<li><a href="https://developer.apple.com/library/ios/technotes/tn2259/_index.html">Adding in-app purchase</a>.</li>
<li><a href="http://furbo.org/2015/05/11/an-import-ant-change-in-xcode/">An @import-ant Change in Xcode</a>.</li>
<li><a href="https://developer.apple.com/documentation/mapkit/mkgeojsondecoder">An object that decodes GeoJSON objects into MapKit types</a>.</li>
<li><a href="https://developer.apple.com/documentation/imageio/3333271-cganimateimageaturlwithblock">Animated Gifs with CGAnimateImageAtURLWithBlock</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/AppID.html">App IDs</a>.</li>
<li><a href="https://devimages.apple.com.edgekey.net/app-store/review/guidelines/App-Review-Guidelines-The-Comic-Book.pdf">App review guidelines (comic book)</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010810-CH1-SW1">Apple docs</a>.</li>
<li><a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJF">Apple's coding guidelines for Cocoa</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW3">Apple's Concepts in Objective-C programming</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/userexperience/Conceptual/MobileHIG/index.html#//apple_ref/doc/uid/TP40006556">Apple's mogile HIG guidelines</a>.</li>
<li><a href="https://developer.apple.com/library/ios/samplecode/PhotoScroller/Introduction/Intro.html">Apple's PhotoScroller</a>.</li>
<li><a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/AttributedStrings/AttributedStrings.pdf">Attributed String Programming Guide</a>.</li>
<li><a href="http://www.knowstack.com/autolayout-visual-format-language-objective-c-sample-code/">Autolayout Visual Format Language – Objective C Sample Code</a>.</li>
<li><a href="https://developer.apple.com/library/prerelease/ios//documentation/AVFoundation/Reference/AVCaptureSession_Class/index.html">AVCaptureSession</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureVideoPreviewLayer_Class/index.html">AVCaptureVideoPreviewLayer</a>.</li>
<li><a href="http://www.raywenderlich.com/22167/beginning-core-image-in-ios-6">Beginning Core Image in iOS 6</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/TestingYouriOSApp/TestingYouriOSApp.html#//apple_ref/doc/uid/TP40012582-CH8-SW1">Beta testing your app</a>.</li>
<li><a href="http://www.objc.io/issues/23-video/capturing-video/">Capturing video on iOS</a>.</li>
<li><a href="https://github.com/steventroughtonsmith/cartool">Cartool (Inspect car files)</a>.</li>
<li><a href="https://github.com/clayallsopp/CLAFluxDispatcher">CLAFluxDispatcher: A port of Facebook's Flux Dispatcher to Objective-C</a>.</li>
<li><a href="http://clang.llvm.org/docs/Block-ABI-Apple.html">Clang 3.7 documentation BLOCK IMPLEMENTATION SPECIFICATION</a>.</li>
<li><a href="https://github.com/luisobo/clean-architecture">Clean architecture for iOS</a>.</li>
<li><a href="https://www.cocoacontrols.com/">Cocoa controls</a>.</li>
<li><a href="http://cocoadocs.org/">Cocoadocs</a>.</li>
<li><a href="http://www.objc.io/issue-6/cocoapods-under-the-hood.html">Cocoapods under the hood</a>.</li>
<li><a href="http://cocoapods.org/">Cocoapods</a>.</li>
<li><a href="http://codepilot.cc">Code pilot</a>.</li>
<li><a href="https://www.codeschool.com/paths/ios">Code School iOS courses</a>.</li>
<li><a href="https://www.codeschool.com/learn/ios">Codeschool iOS</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Color_difference">Color difference</a>.</li>
<li><a href="http://componentkit.org/">ComponentKit is an Objective-C++ view framework for iOS that is heavily inspired by React</a>.</li>
<li><a href="http://componentkit.org/">ComponentKit</a>.</li>
<li><a href="https://github.com/ethanhuang13/NSAttributedStringBuilder">Composing NSAttributedString with SwiftUI-style syntax</a>.</li>
<li><a href="https://developer.apple.com/documentation/foundation/nsdata/3174960-compressed">Compressing data with Foundation APIs</a>.</li>
<li><a href="http://www.cakesolutions.net/teamblogs/2014/03/08/cmsamplebufferref-from-cgimageref">Create a CMSampleBufferRef from CGImageRef</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/CreatingiTunesConnectRecord.html">Creating iTunes Connect Record</a>.</li>
<li><a href="https://github.com/facebook/css-layout">css-layout: Facebook's layout transpiled to C, Java and C#</a>.</li>
<li><a href="https://developer.apple.com/documentation/security/password_autofill/customizing_password_autofill_rules">Customizing Password AutoFill Rules</a>.</li>
<li><a href="http://www.davemark.com/?p=1829">DaveLots of iOS resources</a>.</li>
<li><a href="https://itunes.apple.com/gb/course/developing-ios-7-apps-for/id733644550">Developing iOS 7 Apps for iPhone and iPad (Standford lectures)</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/UsingTextClasses/UsingTextClasses.html">Displaying Text Content in iOS</a>.</li>
<li><a href="https://cocoapods.org/pods/DJKFlipper">DJKFlipper</a>.</li>
<li><a href="http://www.effectiveobjectivec.com/">Effective Objective-C</a>.</li>
<li><a href="http://www.slideshare.net/j796160836/everything-about-bluetooth-40-central">Everything about bluetooth central (slideshare)</a>.</li>
<li><a href="http://spin.atomicobject.com/2016/01/25/ios-memory-leak-xcode/#.VqaGcF_w1AE.hackernews">Finding iOS memory leaks with Xcode's Instruments</a>.</li>
<li><a href="https://speakerdeck.com/sergeyzenchenko/flux-for-ios">Flux for iOS by Sergey Zenchenko</a>.</li>
<li><a href="https://github.com/techery/FLUX">FLUX implementation in Objective-C</a>.</li>
<li><a href="https://github.com/mattt/FormatterKit">FormatterKit: a collection of well-crafted NSFormatter subclasses for things like units of information, distance, and relative time intervals</a>.</li>
<li><a href="http://www.objc.io/issue-5/getting-to-know-textkit.html">Getting to know TextKit</a>.</li>
<li><a href="https://www.kairadiagne.com/2019/04/27/getting-up-to-speed-with-uicollectionviewlayout.html">Getting up to speed with UICollectionView layouts</a>.</li>
<li><a href="http://giorgiocalderolla.com/blog.html">Giorgio Calderolla</a>.</li>
<li><a href="https://github.com/WeTransfer/WeScan">GitHub - WeTransfer/WeScan: Document Scanning Made Easy for iOS</a>.</li>
<li><a href="http://www.emdentec.com/blog/2014/2/25/hacking-uinavigationbar">Hacking UINavigationBar</a>.</li>
<li><a href="https://realm.io/news/altconf-conrad-kramer-writing-iOS-sdk/">How (Not) to Write an iOS SDK</a>.</li>
<li><a href="http://goshdarnblocksyntax.com/">How do I declare a block in Objcetive-C?</a></li>
<li><a href="https://www.hackingwithswift.com/example-code/uikit/how-to-detect-dark-mode-in-ios">How to detect dark mode in iOS</a>.</li>
<li><a href="https://www.appcoda.com/files-app-integration/">How to Integrate Your App with Files App in iOS 11 | Swift Tutorial</a>.</li>
<li><a href="http://easynativeextensions.com/how-to-launch-your-app-from-the-ios-8-share-menu/">How to launch your app from the iOS 8 Share Menu – updated for iOS 8.4</a>.</li>
<li><a href="https://medium.com/flawless-app-stories/how-to-make-auto-layout-more-convenient-in-ios-df3b42fed37f">How to make Auto Layout more convenient in iOS</a>.</li>
<li><a href="http://levibostian.com/blog/create-cocoapod/">I created my first CocoaPods library!</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html">Icon Matrix</a>.</li>
<li><a href="http://www.raywenderlich.com/69855/image-processing-in-ios-part-1-raw-bitmap-modification">Image Processing in iOS Part 1: Raw Bitmap Modification</a>.</li>
<li><a href="http://www.raywenderlich.com/71151/image-processing-ios-part-2-core-graphics-core-image-gpuimage">Image Processing in iOS Part 2: Core Graphics, Core Image, and GPUImage</a>.</li>
<li><a href="http://nshipster.com/image-resizing/">Image resizing techniques</a>.</li>
<li><a href="https://github.com/indragiek/INDANCSClient">INDANCSClient: Objective-C Apple Notification Center Service Implementation (Bluetooth LE)</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-SW10">Info PList key reference</a>.</li>
<li><a href="http://injectionforxcode.com">Injection for Xcode</a>.</li>
<li><a href="https://www.cocoawithlove.com/blog/introducing-cwlviews.html">Introducing CwlViews</a>.</li>
<li><a href="http://www.colourphil.co.uk/lab_lch_colour_space.shtml">Introduction to color spaces</a>.</li>
<li><a href="https://developer.apple.com/videos/play/wwdc2016/413">Introduction to Xcode (Apple WWDC 2016)</a>.</li>
<li><a href="http://stackoverflow.com/questions/40904676/how-to-merge-two-video-with-transparency">ios - how to merge two video with transparency - Stack Overflow</a>.</li>
<li><a href="http://puzzles.design/">iOS 10 UI</a>.</li>
<li><a href="https://www.safaribooksonline.com/library/view/ios-6-programming/9781449342746/ch03s03.html">iOS 6 Programming Cookbook</a>.</li>
<li><a href="http://shop.oreilly.com/product/0636920044338.do">iOS 9 programming cookbook</a>.</li>
<li><a href="https://medium.com/ios-apprentice/the-valuable-toolset-for-ios-development-ba312d12577d">iOS Apprentice</a>.</li>
<li><a href="https://iosdev.tools/">iOS Dev Tools</a>.</li>
<li><a href="http://ios.devtools.me">iOS Dev Tools</a>.</li>
<li><a href="http://iosdevweekly.com">iOS dev weekly</a>.</li>
<li><a href="http://www.appcoda.com/ios-programming-101-send-email-iphone-app/">iOS Programming 101: How To Send Email in Your iPhone App</a>.</li>
<li><a href="http://www.bignerdranch.com/we-write/ios-programming.html">iOS Programming</a>.</li>
<li><a href="https://www.bignerdranch.com/we-write/ios-programming/">iOS Programming: The Big Nerd Ranch Guide (4th Edition)</a>.</li>
<li><a href="https://www.bignerdranch.com/we-write/ios-programming/">iOS Programming: The Big Nerd Ranch Guide</a>.</li>
<li><a href="https://github.com/stanislaw/iOS-Projects-Catalogue">iOS projects catalogues</a>.</li>
<li><a href="http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html">iOS ScrollView Example with Paging</a>.</li>
<li><a href="https://www.apple.com/business/site/docs/iOS_Security_Guide.pdf">iOS Security</a>.</li>
<li><a href="https://github.com/phonegap/ios-deploy">ios-deploy: Install and debug iOS apps without using Xcode</a>.</li>
<li><a href="http://ios-goodies.com">ios-goodies.com</a>.</li>
<li><a href="http://iosdevtips.co">iosdevtips.co</a>.</li>
<li><a href="https://github.com/boredzo/iso-8601-date-formatter">iso-8601-date-formatter: A Cocoa NSFormatter subclass converting to and from ISO-8601-formatted strings </a>.</li>
<li><a href="https://github.com/jessedc/JCTiledScrollView">JCTiledScrollView</a>.</li>
<li><a href="http://joppar.com/mobile-app-development-resources-guide/">joppar.com</a>.</li>
<li><a href="https://github.com/krzysztofzablocki/KZFileWatchers">KZFileWatchers (observer file changes)</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Lab_color_space">Lab color space</a>.</li>
<li><a href="https://github.com/JiriTrecak/Laurine">Laurine: Localization code generator</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingProfiles/MaintainingProfiles.html">Maintaining profiles</a>.</li>
<li><a href="http://khanlou.com/2016/02/many-controllers/">Many Controllers Make Light Work (Analytics)</a>.</li>
<li><a href="http://iphone.meer.li/designs/featured?page=3">Meerli</a>.</li>
<li><a href="https://www.mikeash.com/book.html">Mike Ash</a>.</li>
<li><a href="https://sarunw.com/posts/modality-changes-in-ios13/">Modality changes in iOS13 | Sarun</a>.</li>
<li><a href="https://github.com/2359media/ios-dev-guide/blob/master/iOS%20Topics%20and%20References.md">More aggregation of awesomeness on github</a>.</li>
<li><a href="https://github.com/muccy/MUKContentRedux">MUKContentRedux: provides a store for immutable data which can be updated only applying actions</a>.</li>
<li><a href="http://nshipster.com/xcode-plugins/">NSHipster's Xcode plugins post</a>.</li>
<li><a href="http://www.hpique.com/2013/12/nsnotificationcenter-part-2/">NSNotificationCenter part 2: Implementing the observer pattern with notifications</a>.</li>
<li><a href="http://nsscreencast.com/episodes">NSScreencasts</a>.</li>
<li><a href="https://github.com/objc-zen/objc-zen-book">Objc-C Zen book</a>.</li>
<li><a href="http://www.objc.io/">Objc.io</a>.</li>
<li><a href="http://oclint.org/">Objective-C linter</a>.</li>
<li><a href="http://www.amazon.co.uk/Objective-C-Programming-Ranch-Guide-Guides/dp/032194206X">Objective-C Programming: The Big Nerd Ranch Guide (Big Nerd Ranch Guides)</a>.</li>
<li><a href="http://www.osstatus.com/?utm_campaign=iOS%2BDev%2BWeekly&amp;utm_medium=email&amp;utm_source=iOS_Dev_Weekly_Issue_201">OSStatus: Lookup Apple API errors fast</a>.</li>
<li><a href="https://www.paintcodeapp.com/">PaintCode - Turn your drawings into Objective-C or Swift drawing code</a>.</li>
<li><a href="http://phatblat.com/2016/05/10/uisearchcontroller.html">phatblat's post on UISearchController</a>.</li>
<li><a href="https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches">Preserving Your App's UI Across Launches | Apple Developer Documentation</a>.</li>
<li><a href="http://sugartin.info/2011/10/13/sending-a-mail-useing-gmail/">Programatically send an email using CFNetwork and GMail</a>.</li>
<li><a href="https://github.com/mattneub/Programming-iOS-Book-Examples">Programming iOS Book examples</a>.</li>
<li><a href="https://tanaschita.com/posts/20191015-quick-guide-on-supporting-dark-mode-on-ios/">Quick guide on supporting Dark Mode on iOS</a>.</li>
<li><a href="http://www.raywenderlich.com/tutorials">Ray Wendelich</a>.</li>
<li><a href="https://realm.io/addons/">realm (mobile database), plus map view, search list view, and grid view</a>.</li>
<li><a href="https://medium.com/@alexdunn/replace-xcode-with-neovim-c81f89a50a23">Replace Xcode with Neovim</a>.</li>
<li><a href="https://github.com/ReSwift/ReSwift">ReSwift Redux-like implementation of the unidirectional data flow architecture in Swift</a>.</li>
<li><a href="http://revealapp.com">Reveal</a>.</li>
<li><a href="http://rypress.com/tutorials/objective-c/functions">Ry’s Objective-C Tutorial: Functions</a>.</li>
<li><a href="https://nalexn.github.io/save-your-next-app/">Save your next app from rebuilding from scratch - Alexey Naumov</a>.</li>
<li><a href="https://blog.alltheflow.com/scrollable-uistackview/">Scrollable UIStackView</a>.</li>
<li><a href="https://blog.frozenfirestudios.com/setting-up-a-cloudkit-project-ca9ac1883511">Setting up a CloudKit Project – Frozen Fire Studios</a>.</li>
<li><a href="https://blog.couchbase.com/sharing-data-ios-app-extensions-sync-capability/">Share data between iOS Apps &amp; App Extensions across devices</a>.</li>
<li><a href="https://github.com/ShareSDKPlatform/ShareSDK">ShareSDK is the most comprehensive Social SDK</a>.</li>
<li><a href="http://www.atomicbird.com/blog/sharing-with-app-extensions">Sharing data between iOS apps and app extensions</a>.</li>
<li><a href="https://github.com/facebook/Shimmer">Shimmer: Shimmer is an easy way to add a shimmering effect to any view in your app</a>.</li>
<li><a href="https://medium.com/xcblog/simctl-control-ios-simulators-from-command-line-78b9006a20dc">simctl: Control iOS Simulators from Command Line - XCBlog - Medium</a>.</li>
<li><a href="https://blog.goposse.com/simpleanimatingwithsnapkit-e38ed2980ac2#.n6gzo6syp">Simple Animation With SnapKit</a>.</li>
<li><a href="https://github.com/jessedc/SliceTool/blob/master/SliceTool.m">SliceTool</a>.</li>
<li><a href="http://www.cimgf.com/2011/03/01/subduing-catiledlayer/">Subduing CATiledLayer</a>.</li>
<li><a href="http://subjc.com">Subjective-C</a>.</li>
<li><a href="https://medium.com/apple-developer-academy-federico-ii/syncing-data-on-ios-devices-with-coredata-and-cloudkit-bed296fc26e0">Syncing data on iOS devices with CoreData and CloudKit</a>.</li>
<li><a href="http://www.invisionapp.com/tethr?utm_source=ios%20dev%20tools&amp;utm_medium=website&amp;utm_campaign=ios%20dev%20tools&amp;at=11lvzs&amp;ct=ios%20dev%20tools">TETHR</a>.</li>
<li><a href="http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html">The Complete Tutorial on iOS/iPhone Custom URL Schemes</a>.</li>
<li><a href="http://savvyapps.com/blog/ultimate-guide-choosing-objective-c-or-swift">The Ultimate Guide to Choosing Objective-C or Swift for Your Project</a>.</li>
<li><a href="https://github.com/jlamarche/Tile-Cutter">Tile-Cutter</a>.</li>
<li><a href="https://benoitpasquier.com/tools-tips-to-scale-ios-project-and-team/">Tools and tips to scale your iOS project along with your team</a>.</li>
<li><a href="https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html">Transitioning to ARC</a>.</li>
<li><a href="https://github.com/Ekhoo/Translucid">Translucid: Simple and light weight UIView that animate text with an image</a>.</li>
<li><a href="https://github.com/zh-wang/TwitterGifComposer">Twitter GIF composer</a>.</li>
<li><a href="http://masilotti.com/ui-testing-xcode-7/">UI Testing in Xcode 7</a>.</li>
<li><a href="https://developer.apple.com/documentation/uikit/uicollectionviewcompositionallayout">UICollectionViewCompositionalLayout - UIKit | Apple Developer Documentation</a>.</li>
<li><a href="http://stackoverflow.com/questions/14912938/uicolor-cmyk-and-lab-values">UIColor CMYK and Lab Values?</a>.</li>
<li><a href="https://twitter.com/twostraws/status/1135639902337478656">UIImage has a new initializer, UIImage(systemName:) that takes a string and returns one of over 1500 different system icons.</a>.</li>
<li><a href="https://github.com/PaulSolt/UIImage-Conversion">UIImage-Conversion</a>.</li>
<li><a href="https://spin.atomicobject.com/2020/03/23/uiscrollview-content-layout-guides/">UIScrollView with Content Layout Guides</a>.</li>
<li><a href="https://twitter.com/smileyborg/status/1115120700493144065">UITableView and UICollectionView: update your data model <strong>inside</strong> the batch updates block</a>.</li>
<li><a href="http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions">Ultimate guide to resolutions</a>.</li>
<li><a href="https://itunesconnect.apple.com/docs/UsingApplicationLoader.pdf">Using Application Loader</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html">Using Text Kit to Draw and Manage Text</a>.</li>
<li><a href="https://github.com/ColinEberhardt/VCTransitionsLibrary">VCTransitionsLibrary</a>.</li>
<li><a href="https://medium.com/@hacknicity/view-controller-presentation-changes-in-ios-13-ac8c901ebc4e">View Controller Presentation Changes in iOS 13 - Geoff Hackworth - Medium</a>.</li>
<li><a href="http://commandshift.co.uk/blog/2013/01/31/visual-format-language-for-autolayout/">Visual Format laguange for Auto Layout</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage.html">Visual Format Language (Apple reference)</a>.</li>
<li><a href="http://nsscreencast.com">Weekly bite-sized screencasts on iOS dev</a>.</li>
<li><a href="http://stackoverflow.com/questions/649454/what-is-the-best-way-to-average-two-colors-that-define-a-linear-gradient">What's the best way to average two colors that define a linear gradient?</a>.</li>
<li><a href="https://developer.apple.com/library/ios/qa/qa1713/_index.html">When to use App ID wildcards</a>.</li>
<li><a href="https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html">Working with blocks</a>.</li>
<li><a href="https://developer.apple.com/videos/wwdc/2012/">WWDC 2012 Xcode tips</a>.</li>
<li><a href="https://developer.apple.com/videos/wwdc/2014/">WWDC 2014</a>.</li>
<li><a href="https://github.com/ohoachuck/wwdc-downloader">WWDC 2015, 2014, 2013 and Tech-talks 2013 (videos and pdf downloader)</a>.</li>
<li><a href="https://developer.apple.com/reference/xctest">XCTest documentation</a>.</li>
<li><a href="https://github.com/KonradCLAPP/YawImageViewer">YawImageViewer</a>.</li>
<li><a href="http://bpoplauschi.wordpress.com">Yet another iOS Blog</a>.</li>
<li><a href="https://github.com/YouXianMing/Animations">YouXianMing's animation collection</a>.</li>
<li><a href="https://www.cloudcity.io/blog/2015/10/15/developing-ios-app-using-ble-standard/">Zero to BLE on iOS – Part Two</a>.</li>
<li><a href="https://github.com/zhhlmr/ZHPopupView">ZHPopupView</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Kerala travel bookmarks</title>
<link>https://xenodium.com/kerala-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/kerala-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li>Bagel Shop, 30 Pali Mala Road, off Carter Road, Bandra (W) (+91 22 2605-0178). Daily 9.00AM-10.00PM. Meal for two R500-R800.</li>
<li>Hotel Natraj, 22-24 City Station Road, Udaipur (near Bapu Bazaar), +91-294-2487488, +91-94147-57893,</li>
<li>Kala Ghoda Café,10 Ropewalk Lane, Kala Ghoda (+91 22 2263-3866). Daily 8.30AM-11.30PM. Meal for two R600.</li>
<li>Kochin (Fort Kochin) - old port town with Chinese, Portuguese, Dutch, British and Jewish heritage.</li>
<li>Munnar - hill station and centre of tea, coffee and spice growing. Great hiking and spectacular views.</li>
<li>Periyar Wildlife Sanctuary.</li>
<li>Suzette, Atlanta Building, Nariman Point (+91 22 2288-0055). Daily 9.00AM-11.00PM. Also at Bandra. Meal for two R600-R1,000.</li>
<li>Varkala - chilled out beach resort.</li>
<li>Yoga House, 53 Chimbai Road, behind St Andrew's Church, off Hill Road, Bandra (W)(+91 22 6554- 5001). Daily 7.00AM-10.30PM.</li>
</ul>
]]></description>
    <pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>India travel bookmarks</title>
<link>https://xenodium.com/india-travel-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/india-travel-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=13119986">A Guide to the Breads of India (Hacker News)</a>.</li>
<li>A route: blore - pune - mumbai - ahmedabad - mt abu - udaipur - jaipur - amritsar - chandigarh - jammu - srinagar - kargil - leh.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-bhangarh-fort-india-grounds">Abandoned Bhangarh Fort, India | Grounds View</a>.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-bhangarh-fort-india-temple">Abandoned Bhangarh Fort, India | Temple Detail</a>.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-bundi-palace-india-grand">Abandoned Bundi Palace, India | Grand Wedge</a>.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-cannon-factory-india-elephant">Abandoned Cannon Factory, India | Elephant Columns</a>.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-cannon-factory-india-interior">Abandoned Cannon Factory, India | Interior Room</a>.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-jahangir-mahal-palace-orchha">Abandoned Jahangir Mahal Palace, Orchha India | Lovely Symmetry</a>.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-laxminarayan-temple-orchha-india">Abandoned Laxminarayan Temple, Orchha India | Hallway View</a>.</li>
<li><a href="https://www.abandonedamerica.us/abandoned-raniji-ki-baori-stepwell">Abandoned Raniji Ki Baori Stepwell, Bundi India | Columns</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Akshardham_%28Delhi%29">Akshardham (Delhi)</a>.</li>
<li><a href="https://www.google.com/culturalinstitute/browse/?f.media_type=museumview&amp;q.8129907598665562501=139704082&amp;q.openid=media_type">Archeological survey of india sites</a>.</li>
<li><a href="https://duckduckgo.com/?q=belur+mysore&amp;t=ffab&amp;iax=images&amp;ia=images">Belur temple mysore</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/bhaja_caves">Bhaja caves, pune, maharashtra</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/bhang">Bhang</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/bodh_gaya">Bodh gaya</a>.</li>
<li><a href="http://joegoauk.blogspot.co.uk/2013/07/budbudyanchi-tali-bubbling-pond-at.html">Budbudyanchi tali (bubbling pond) at netravali, sanguem, goa</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/chand_baori">Chand baori (Wikipedia)</a>.</li>
<li><a href="http://www.amusingplanet.com/2012/10/chand-baori-step-well-in-rajasthan-india.html">Chand baori</a>.</li>
<li>Chandipur Beach.</li>
<li><a href="https://duckduckgo.com/?q=Chittorgarh&amp;t=ffab&amp;ia=images">Chittorgarh</a>.</li>
<li><a href="https://www.tripsavvy.com/how-to-travel-on-the-darjeeling-himalayan-railway-toy-train-1539631">Darjeeling Himalayan Railway Toy Train: Essential Guide</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Daulatabad,_Maharashtra">Daulatabad fort</a>.</li>
<li><a href="https://www.reddit.com/r/travel/comments/5cmc8e/girlfriend_and_i_traveled_around_asia_and_europe/">dawnoflife07's India trip/pictures</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Descent_of_the_Ganges_(Mahabalipuram)">Descent of the Ganges (Mahabalipuram)</a>.</li>
<li><a href="http://www.odditycentral.com/pics/dining-with-the-dead-at-indias-new-lucky-restaurant.html">Dining with the Dead at the New Lucky Restaurant</a>.</li>
<li><a href="http://www.bdlmuseum.org/">Dr. Bhau Daji Lad museum</a>.</li>
<li>Emergencies: +1-650-253-5555.</li>
<li>Gaya, Bihar.</li>
<li><a href="https://en.wikipedia.org/wiki/Gwalior">Gwalior</a>.</li>
<li><a href="https://duckduckgo.com/?q=halibid+temple&amp;t=ffab&amp;iax=images&amp;ia=images">Halibid temple</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Hampi">Hampi</a>.</li>
<li><a href="https://india.zeef.com/gautam.garg">India on zeef</a>.</li>
<li><a href="https://www.lonelyplanet.com/articles/india-best-step-wells-to-visit">India's most beautiful stepwells and how to visit them - Lonely Planet</a>.</li>
<li><a href="http://www.irctctourism.com/">IRCTC Tourism (A government of India enterprise)</a>.</li>
<li><a href="https://en.m.wikipedia.org/wiki/Jil_jil_jigarthanda">Jil jil jigarthanda</a>.</li>
<li><a href="https://duckduckgo.com/?q=Jodhpur&amp;t=ffsb&amp;ia=images">Jodhpur</a>.</li>
<li><a href="https://twitter.com/GiriShikhara/status/605754976959275011/photo/1">Kalyani/Pushkarini at Hulikere near Halebeedu,KA built by Hoysalas</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Karni_Mata">Karni Mata (rats temple)</a>.</li>
<li><a href="https://duckduckgo.com/?q=Khajuraho&amp;t=ffab&amp;ia=images">Khajuraho</a>.</li>
<li>Khandala.</li>
<li><a href="https://twitter.com/wrathofgnon/status/1268080568387817472">Khotachi Wadi</a>.</li>
<li><a href="https://duckduckgo.com/?q=kovalam+beach&amp;t=ffab&amp;iax=1&amp;ia=images">Kovalam beach</a>.</li>
<li>Lonavala.</li>
<li>Mahabaleshwar.</li>
<li><a href="https://en.wikipedia.org/wiki/Mahabalipuram">Mahabalipuram</a>.</li>
<li><a href="https://www.lonelyplanet.com/india/himachal-pradesh/manali">Manali travel | India, Asia - Lonely Planet</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Manali,_Himachal_Pradesh">Manali, Himachal Pradesh</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Manali,_Himachal_Pradesh">Manali</a>.</li>
<li>Mumbai - Bademita: chicken tikka.</li>
<li>Mumbai - Bagdadi restaurant.</li>
<li>Mumbai - Banaganga lake (Banganga cross lane).</li>
<li>Mumbai - Bhel puri (find in stalls).</li>
<li>Mumbai - Cafe Britannia (Kumtha St or Adi Murzaban Path with Shahid Bhaghat Singh Rd).</li>
<li>Mumbai - Crawford market: revivat Indian thali.</li>
<li>Mumbai - <a href="http://www.lonelyplanet.com/india/mumbai-bombay/travel-tips-and-articles/eat-mumbai-make-the-most-of-indias-foodie-capital">Eat Mumbai – make the most of India's foodie capital</a>.</li>
<li>Mumbai - Elephanta caves.</li>
<li>Mumbai - <a href="http://www.finelychopped.net/2011/09/colours-of-bandras-pali-market-lallu.html">Pali Market</a>.</li>
<li>Mumbai - The times of India: masala dosa.</li>
<li>Mumbai - University of Mumbai.</li>
<li>Mumbai - Vada pav (find in stalls).</li>
<li>Mumbai - Victoria station: chai.</li>
<li>Mumbai- <a href="http://www.theguardian.com/travel/2012/mar/01/10-best-street-food-mumbai-india">10 of the best food in Mumbai</a>.</li>
<li><a href="http://hippie-inheels.com/india-travel-bucket-list/">My India travel Bucket List</a>.</li>
<li>Nagpur.</li>
<li><a href="https://www.tripadvisor.co.uk/Restaurant_Review-g297630-d5326840-Reviews-New_Taj_Mahal_Cafe-Mangalore_Dakshina_Kannada_District_Karnataka.html">New Taj Mahal cafe, Mangalore Buns (banana)</a>.</li>
<li><a href="https://duckduckgo.com/?q=Orchha&amp;t=ffab&amp;ia=images">Orchha</a>.</li>
<li>Panchgani.</li>
<li><a href="https://en.wikipedia.org/wiki/pandavleni_caves">Pandavleni caves, nashik, maharashtra</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/havelock_island">Radhanagar beach</a>.</li>
<li><a href="https://en.m.wikipedia.org/wiki/Rishikesh">Rishikesh</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Sabarmati_Ashram">Sabarmati Ashram</a>.</li>
<li><a href="http://satyagrahabali.org/Satyagraha_brochure_email_English.pdf">Satyagraha Ashram</a> (founded by Gandhi).</li>
<li><a href="https://www.lonelyplanet.com/india/himachal-pradesh/shimla">Shimla (forest/trees) - Lonely Planet</a>.</li>
<li><a href="https://www.quora.com/What-are-the-best-places-in-Pune-for-couples-to-spend-whole-day">Things to do in Pune (Quora)</a>.</li>
<li><a href="https://www.lonelyplanet.com/india/uttarakhand-uttaranchal">Uttarakhand travel | India, Asia - Lonely Planet</a>.</li>
<li>Varanasi.</li>
<li><a href="https://twitter.com/archpics/status/1016803768413949952">Vijaya Nagara, India Centuries-old temples and statues surround Hampi, in southwest India, making up what’s left of the once-powerful city.</a>.</li>
<li><a href="https://duckduckgo.com/?q%3dvipassana%2bpagoda&amp;iax%3d1&amp;ia%3dimages">Vipassana pagoda</a>.</li>
<li><a href="http://ajantaali.blogspot.com/">Welcome Ajanta, India (Shishu's site)</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Western_Ghats">Western Ghats</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Git bookmarks</title>
<link>https://xenodium.com/git-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/git-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://citizen428.net/10-common-git-problems-and-how-to-fix-them-e8d809299f08">10 Common Git Problems and How to Fix Them – citizen428.blog</a>.</li>
<li><a href="http://wildlyinaccurate.com/a-hackers-guide-to-git">a hackers guide to git</a></li>
<li><a href="https://blog.scottnonnenberg.com/better-git-configuration/">Better Git configuration | Scott Nonnenberg</a>.</li>
<li><a href="http://nakkaya.com/2009/09/24/git-delete-last-commit/">delete last commit</a></li>
<li><a href="https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/">Get up to speed with partial clone and shallow clone - The GitHub Blog</a>.</li>
<li><a href="http://jr0cket.co.uk/slides/getting-started-with-git.html#/">Getting Started with Git &amp; Github</a>.</li>
<li><a href="https://easyengine.io/tutorials/git/git-resolve-merge-conflicts/">Git - Quickest Way to Resolve Most Merge Conflicts</a>.</li>
<li><a href="https://commonflow.org/">Git Common-Flow</a>.</li>
<li><a href="http://www.git-tower.com/learn/?utm_source=tower+blog&amp;utm_medium=sidebar&amp;utm_campaign=learn-git">git course</a>: another git online tutorial, by git-tower folks.</li>
<li><a href="https://jwiegley.github.io/git-from-the-bottom-up/">Git from the Bottom Up</a>.</li>
<li><a href="https://codewords.recurse.com/issues/two/git-from-the-inside-out">Git from the inside out</a>.</li>
<li><a href="https://ochronus.com/git-tips-from-the-trenches/">git from the trenches</a>.</li>
<li><a href="https://spin.atomicobject.com/2019/01/10/git-merging-vs-rebasing/?utm_source=feedblitz&amp;utm_medium=FeedBlitzRss&amp;utm_campaign=atomicspin">Git Merging vs. Git Rebasing: The Beginner's Guide</a>.</li>
<li><a href="http://caspervonb.com/tools/git-recipes-for-the-common-mistakes-and-mishaps/">git recipes for common mistakes and mishaps</a>.</li>
<li><a href="https://www.kevinkuszyk.com/2018/12/10/git-tips-6-using-git-with-multiple-email-addresses/">Git Tips #6 - Using Git with Multiple Email Addresses</a>.</li>
<li><a href="https://github.com/k88hudson/git-flight-rules">GitHub - k88hudson/git-flight-rules: Flight rules for git</a>.</li>
<li><a href="https://github.com/susam/gitpr">GitHub - susam/gitpr: A quick reference guide on fork and pull request workflow</a>.</li>
<li><a href="https://about.gitlab.com/2015/02/17/gitlab-annex-solves-the-problem-of-versioning-large-binaries-with-git/">GitLab Annex solves the problem of versioning large binaries with git</a>.</li>
<li><a href="https://www.moxio.com/blog/43/ignoring-bulk-change-commits-with-git-blame">Ignoring bulk change commits with git blame - Moxio</a>.</li>
<li><a href="https://git.wiki.kernel.org/index.php/git_faq">kernel's git faq</a>.</li>
<li><a href="http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html">model git commit message</a></li>
<li><a href="https://github.com/blog/2042-git-2-5-including-multiple-worktrees-and-triangular-workflows">Multiple worktrees and triangular workflows (multiple branches checked out)</a>.</li>
<li><a href="http://ndpsoftware.com/git-cheatsheet.html">ndp software's git cheatsheet</a></li>
<li><a href="https://ohshitgit.com/">Oh, shit, git!</a>.</li>
<li><a href="https://harryrschwartz.com/2020/06/11/renaming-your-default-git-branch">Renaming Your Default Git Branch (Harry R. Schwartz)</a>.</li>
<li><a href="http://git-scm.com/blog/2010/03/08/rerere.html">rerere: reuse recorded resolution</a>.</li>
<li><a href="http://www.matheuslima.com/things-you-didnt-know-about-git">things you didn't know about git</a>.</li>
<li><a href="https://twitter.com/dmartincy/status/1188604333430104064">TIL about git-subline-merge</a>.</li>
<li><a href="https://www.sbf5.com/~cduan/technical/git/">Understanding Git Conceptually</a>.</li>
<li><a href="https://upcase.com/mastering-git">Upcase's mastering Git course</a>.</li>
<li><a href="https://willschenk.com/articles/2020/using_askgit/">Using Askgit (sql interface to your git repository)</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Language learning bookmarks</title>
<link>https://xenodium.com/language-learning-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/language-learning-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.hackingchinese.com/about/practical-guide-to-learning-mandarin/">Hacking Chinese: A Practical Guide to Learning Mandarin (Hacking Chinese)</a>.</li>
<li>HN's comments on <a href="https://news.ycombinator.com/item?id%3d8806678">learning laguages</a>.</li>
<li><a href="https://www.michelthomas.com/how-it-works.php">How it Works - Language Learning with The Michel Thomas Method</a>.</li>
<li><a href="http://fourhourworkweek.com/2007/11/07/how-to-learn-but-not-master-any-language-in-1-hour-plus-a-favor/">How to learn (But Not Master) Any Language in 1 Hour (Plus: A Favor)</a>.</li>
<li><a href="https://reader.manabi.io/">Manabi Reader – Learn Japanese by Reading on iOS</a>.</li>
<li><a href="https://woodypianoshack.com/">Welcome - Woody Piano Shack</a>.</li>
</ul>
]]></description>
    <pubDate>Wed, 04 Mar 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Git conflict resolution déjà vu?</title>
<link>https://xenodium.com/git-conflict-resolution-deja-vu</link>
<guid isPermaLink="false">https://xenodium.com/git-conflict-resolution-deja-vu</guid>
    <description><![CDATA[<p>use git <a href="http://git-scm.com/blog/2010/03/08/rerere.html">rerere</a>. here's a <a href="https://medium.com/@porteneuve/fix-conflicts-only-once-with-git-rerere-7d116b2cec67">post</a>.</p>
]]></description>
    <pubDate>Wed, 18 Feb 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Graphics design tools bookmarks</title>
<link>https://xenodium.com/graphics-design-tools-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/graphics-design-tools-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/nixcraft/status/1413395599534088194">Alternatives to Adobe products on Linux, macOS and Windows</a>.</li>
<li><a href="http://www.aseprite.org/">Aseprite</a>.</li>
<li><a href="https://github.com/LisaDziuba/Awesome-Design-Tools/">Awesome-Design-Tools: The best design tools for everything</a>.</li>
<li><a href="http://leaverou.github.io/contrast-ratio">Contrast ratio</a>.</li>
<li><a href="https://designcode.io">Design+code</a>.</li>
<li><a href="https://www.animatron.com/">HTML5 animations</a>.</li>
<li><a href="http://blog.mengto.com/quick-ios-prototyping-flinto/">Ios prototyping with flinto</a>.</li>
<li><a href="https://krita.org/">Krita</a>.</li>
<li><a href="https://www.getleonardo.com/">Leonardo</a>.</li>
<li><a href="https://makeappicon.com/">MakeAppIcon - Generate app icons of all sizes with a click!</a>.</li>
<li><a href="https://www.madewithmischief.com/">Mischief</a>.</li>
<li><a href="http://mypaint.intilinux.com/">Mypaint</a>.</li>
<li><a href="https://natron.inria.fr/">Natron</a>.</li>
<li><a href="https://www.getormr.com/features/">Ormr</a>.</li>
<li><a href="https://screen.guru">Screen Guru - Take clean screenshot of any websites</a>.</li>
<li><a href="http://bohemiancoding.com/sketch/">Sketch for Mac</a>.</li>
<li><a href="http://www.sketchup.com/">Sketchup</a>.</li>
<li><a href="http://www.tvpaint.com">TVPaint</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 17 Jan 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs key bindings and maps</title>
<link>https://xenodium.com/emacs-key-bindings-and-maps</link>
<guid isPermaLink="false">https://xenodium.com/emacs-key-bindings-and-maps</guid>
    <description><![CDATA[<h2>based on <a href="http://www.masteringemacs.org/article/mastering-key-bindings-emacs">masteringemacs.org</a>.</h2>
<h2>bonus tip</h2>
<p>prefix key, followed by c-h, lists keys in prefix.</p>
<h2>keymap</h2>
<p>maps key to action.</p>
<h2>keymap found in buffer and most major modes.</h2>
<h2>keys</h2>
<ul>
<li>undefined: self explanatory.</li>
<li>prefix key: ie. c-x (part of complete key).</li>
<li>complete key: complete input executes associated command.</li>
</ul>
<h2>mapping</h2>
<ul>
<li>(define-key keymap key def): add to current buffer map.</li>
<li>(local-set-key key command): add to active buffer (no map option).</li>
<li>(local-unset-key key)</li>
<li>(global-set-key key command): add to global keymap (all buffers).</li>
<li>(global-unset-key key)</li>
</ul>
<h2>key codes</h2>
<ul>
<li>kbd: macro transaltes human-readable key to emacs readable.</li>
<li>function and navigation keys must be surrounded by &lt;&gt;.</li>
<li>example: (kbd &quot;c-c p&quot;) or (kbd &quot;&lt;f8&gt;&quot;) of (kbd &quot;&lt;down&gt;&quot;).</li>
</ul>
<h2>remapping</h2>
<ul>
<li>use remap to replace mapping (ie. kill-line with my/kill-line).</li>
<li>(define-key keymap [remap original-function] 'my-own-function).</li>
</ul>
<h2>reserved keys</h2>
<ul>
<li>&quot;c-c ?&quot; generally reserved for you, but third party packages use it.</li>
<li>function keys (ie. f1-f12).</li>
<li>hyper and super (ancient).</li>
</ul>
<h2>lookup order</h2>
<ul>
<li>in a nutshell: minor mode keys, local keys, global keys.</li>
<li>full order:
<ol>
<li>overriding-terminal-local-map: terminal-specific key binds.</li>
<li>overriding-local-map: override all other local keymaps (avoid if possible).</li>
<li>char property at point: useful for yasnippet.</li>
<li>emulation-mode-map-alists: advanced multi-mode keymap.</li>
<li>minor-mode-overriding-map-alist: minor modes in major modes.</li>
<li>minor-mode-map-alist: as previous (preferred for minor modes) &lt;—–</li>
<li>current-local-map: buffers current local map.</li>
<li>current-global-map: last place to look (ie. global).</li>
</ol>
</li>
</ul>
<h2>mode hooks</h2>
<ul>
<li>(local-set-key (kbd &quot;c-c q&quot;) 'my-awesome-method)) in hook-method.</li>
<li>for key-chord-define, use current-local-map.</li>
</ul>
]]></description>
    <pubDate>Thu, 23 Apr 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Video backlog</title>
<link>https://xenodium.com/online-video-backlog</link>
<guid isPermaLink="false">https://xenodium.com/online-video-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=wBraurRo_bg">Frank Ostaseski: &quot;Inviting the Wisdom of Death into Life&quot;</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=to72IJzQT5k&amp;t=5s">Adam Curtis HyperNormalisation HD - YouTube</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=17210164">YouTube’s top creators are burning out (Hacker News)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/playlist?list=PL94E35692EB9D36F3">Donald Knuth Lectures - YouTube</a>.</p>
<p>[TODO]{.todo .TODO} Rashomon by Akira Kurosawa.</p>
<p>[TODO]{.todo .TODO} <a href="https://vimeo.com/97903574">Seeing spaces</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=HHYs78uIx3M">An exclusive seminar with Julian Assange</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=LrObZ_HZZUc">The (Secret) City of London, Part 1: History</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=z1ROpIKZe-c">The (Secret) City of London, Part 2: History</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=kXBJLH2xrBM">The UK Gold</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=Jio7DK15Q1E&amp;feature=youtu.be">Terra Plana - Learning the skill of barefoot running</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=Zwx1PaWbD4U">The Science of Compassion ॐ Mata Amritanandamayi ॐ Documentary</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/playlist?list=PLZdCLR02grLrEwKaZv-5QbUzK0zGKOOcr">Rich Hickey Talks (clojure)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://egghead.io/lessons/javascript-redux-the-single-immutable-state-tree">Redux: The Single Immutable State Tree screencast</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://channel9.msdn.com/Shows/Going+Deep/Anders-Hejlsberg-and-Lars-Bak-TypeScript-JavaScript-and-Dart">Anders Hejlsberg and Lars Bak: TypeScript, JavaScript, and Dart</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.slowhustle.com/how-to-travel-the-slow-hustle-way-insights-from-50-episodes/">How To Travel… The Slow Hustle Way</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?time_continue%3D1&amp;v%3DnUjgKoOYxos">2015-12-10 Emacs Chat - John Wiegley</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://emacsnyc.org/2015/03/02/how-i-use-org-capture-and-stuff.html">How To Order Salads From Inside Emacs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://emacsnyc.org/2014/04/07/an-introduction-to-emacs-lisp.html">An introduction to Emacs Lisp</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://vimeo.com/139910837?ref%3Dtw-share">12 Challenging Steps to Being a Better Interviewer – Cate Huston at The Lead Developer 2015</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3D8o46HH-TfNY">Born Rich: Children Of The Insanely Wealthy</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3DFtieBc3KptU&amp;feature%3Dyoutu.be&amp;a">Emacs for writers</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3dbkdt9bfh5gs">Frugal fire 002: justin mccurry (rootofgood)</a>.</p>
<p>[TODO]{.todo .TODO} Graham Hancock – The War on Consciousness.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.nfb.ca/film/griefwalker?utm_content%3dbuffer24b02&amp;utm_medium%3dsocial&amp;utm_source%3dtwitter.com&amp;utm_campaign%3dbuffer">Griefwalker</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3DSwkjqGd8NC4">How to win the loser's game</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/playlist?list%3DPLBDA2E52FB1EF80C9">John Green's &quot;Crash Course History&quot; videos</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3DunX4FQqM6vI">Matthieu Ricard Leads a Meditation on Altruistic Love and Compassion</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3DjUlWDxhSlt8">Matthieu Ricard: &quot;Altruism&quot; | Talks at Google</a>.</p>
<p>[TODO]{.todo .TODO} Nick Hanauer – Rich People Don’t Create Jobs.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3DcsyL9EC0S0c">Programming is terrible — Lessons learned from a life wasted</a>.</p>
<p>[TODO]{.todo .TODO} Rupert Sheldrake – The Science of Delusion.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3DVXTpTRuPiPQ">Surya Namaskar stretches</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://audio-video.gnu.org/video/misc/2015-01__gnu_guix__the_emacs_of_distros.webm">The Emacs of distros</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v%3D17jymDn0W6U&amp;sns%3Dem">The Known Universe by AMNH</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.youtube.com/watch?v=ttLgyKk7yMA">Juliet Schor Iris Nights: Re-Thinking Materialism</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://archive.org/details/The.Internets.Own.Boy.The.Story.of.Aaron.Swartz.2014.WEBRiP.XViD.AC3LEGi0N">The Internets own boy</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.youtube.com/watch?v%3DFw8BV4VFOwM">BBC's secret of levitation</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://vimeo.com/15351476">Hold Fast</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.youtube.com/watch?v=8crol-ydfmi">This is water, commencement speech</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.youtube.com/watch?v=dkyjvv7huzw">This is water</a>.</p>
]]></description>
    <pubDate>Tue, 30 Dec 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Flight-booking bookmarks</title>
<link>https://xenodium.com/flight-booking-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/flight-booking-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.azair.com/">Azair: Budget air tickets from low-cost airlines</a>.</li>
<li><a href="http://flights.google.com/">Google Flights</a>.</li>
<li><a href="https://matrix.itasoftware.com">Matrix - ITA Software by Google</a>.</li>
<li><a href="https://www.travelzoo.com/uk/">Travelzoo: Travel &amp; entertainment deals: hotels, holidays, cruises, restaurants, shows</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 12 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Frugal bookmarks</title>
<link>https://xenodium.com/frugal-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/frugal-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.acornishmum.com/9-great-frugal-blogs-in-the-uk/">9 Great Frugal Blogs in The UK - A Cornish Mum</a>.</li>
<li><a href="https://www.reddit.com/r/UKFrugal/comments/ha28n9/any_tips_for_buying_cheap_red_wine/">Any tips for buying Cheap Red Wine? : UKFrugal</a>.</li>
<li><a href="https://mobile.asda.com/">Asda Mobile | Pay as you go SIM (Order your free SIM)</a>.</li>
<li><a href="https://www.getrichslowly.org/best-cheap-coffee/">Beating the latte factor: My quest for the best cheap coffee</a>.</li>
<li><a href="https://www.biggreensmile.com/departments/dishwashing.aspx?deptid=DISHES">Big green smile (eco bulk buys)</a>.</li>
<li><a href="https://www.broadband.co.uk">Broadband.co.uk Dedicated to finding the best broadband for you</a>.</li>
<li><a href="https://www.reddit.com/r/BuyItForLife/">Buy it for life: Durable, Quality, Practical (Reddit)</a>.</li>
<li><a href="http://www.pricegrabber.com/">Check online store ratings and save money with deals at PriceGrabber.com</a>.</li>
<li><a href="https://frugalmoneyman.com/2018/03/23/emergency-fund-before-yolo/">Emergency Fund Before YOLO - Frugal Money Man</a>.</li>
<li><a href="https://www.reddit.com/r/FreeEBOOKS">FreeEBOOKS (subreddit)</a>.</li>
<li><a href="https://frugalfun4boys.com/">Frugal Fun For Boys and Girls - Learning, Play, STEM Activities, and Thing to Do! (home experiments for kids)</a>.</li>
<li><a href="https://www.frugalqueeninfrance.com/">Frugal Queen in France</a>.</li>
<li><a href="https://m.aliexpress.com/">Global Online Shopping for Apparel, Phones, Computers, Electronics, Fashion and more on Aliexpress</a>.</li>
<li><a href="https://www.telegraph.co.uk/gardening/problem-solving/adopt-wayward-plant/">How to Adopt a Wayward Plant (The Telegraph)</a>.</li>
<li><a href="https://www.getrichslowly.org/best-quality-for-less/">How to find the best quality for less, but it for life, (Get Rich Slowly)</a>.</li>
<li><a href="https://ethical.net/ethical/homemade-sustainable-cleaning-products/">How to Make Your Own Sustainable Cleaning Products (ethical.net)</a>.</li>
<li><a href="https://cookingonabootstrap.com/2015/11/12/how-to-shop-on-a-budget/">How To Shop On A Budget – from A Girl Called Jack (Jack Monroe)</a>.</li>
<li><a href="https://iforcemarketzone.com">iForce marketzone</a>.</li>
<li><a href="https://m.youtube.com/watch">Keeping your house cooled (video)</a>.</li>
<li><a href="https://meanqueen-lifeaftermoney.blogspot.com/p/my-money-saving-tips.html">Life After Money: My money saving tips</a>.</li>
<li><a href="https://www.molecountrystores.co.uk">Mole Country Stores: Agricultural and Rural Retailer (clothing)</a>.</li>
<li><a href="https://thehumblepenny.com/">The Humble Penny (Create Financial Joy)</a>.</li>
<li><a href="https://www.twotogether-railcard.co.uk/">Two together railcard</a>.</li>
<li><a href="https://www.reddit.com/r/UKFrugal/comments/ctgzl6/ukfrugal_health_and_beauty_list/">UKFrugal: Health and Beauty list : UKFrugal</a>.</li>
<li><a href="https://www.choosefi.com/want-to-buy-it-for-life-consider-this/">Want To Buy It For Life? (lots of item suggestions)</a>.</li>
<li><a href="https://www.reddit.com/r/UKPersonalFinance/comments/ekavj5/what_are_the_best_bits_about_lidl/">What are the best bits about lidl? : UKPersonalFinance</a>.</li>
<li><a href="https://www.quora.com/What-should-you-not-say-when-buying-a-car">What should you not say when buying a car? - Quora</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 18 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Charities bookmarks</title>
<link>https://xenodium.com/charities-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/charities-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://uk.whogivesacrap.org">Toilet paper that builds toilets (Who Gives A Crap UK)</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 18 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Origami bookmarks</title>
<link>https://xenodium.com/origami-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/origami-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.youtube.com/watch?v%3DlA5v3podPwo&amp;feature%3Dem-subs_digest">Origami - How to make a WASTEBASKET</a>.</li>
<li><a href="https://www.origami-fun.com/">Origami That's Fun And Easy</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 18 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Movie backlog</title>
<link>https://xenodium.com/movie-backlog</link>
<guid isPermaLink="false">https://xenodium.com/movie-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/title/81748580">Watch The Åre Murders | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/title/81663325">Watch SAKAMOTO DAYS | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0089603/">Mishima: A Life in Four Chapters (1985) - IMDB</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt14039582/">Drive My Car (2021) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt6334354/">The Suicide Squad (2021) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://old.reddit.com/r/Cyberpunk/comments/1e5vauh/movies_that_feel_like_youre_watching_an/">Movies that feel like you're watching an adaptation of the Cyberpunk RPG?</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://x.com/davidcinema/status/1853817051040673997">Movies that get better with more viewings</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.reddit.com/r/movies/comments/1gvzbi1/zhang_yimou_chinas_greatest_director_part_2/">Zhang Yimou: China's Greatest Director | Part 2 </a>.</p>
<p>[TODO]{.todo .TODO} Take your pill.</p>
<p>[TODO]{.todo .TODO} <a href="https://bsky.app/profile/jaafar.bsky.social/post/3ldfrkposdk22">A handful of choices, but Hundreds of Beavers caught my attention</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.metacritic.com">https://www.metacritic.com</a></p>
<p>[TODO]{.todo .TODO} Chalk line.</p>
<p>[TODO]{.todo .TODO} <a href="https://trace.moe/">Anime Scene Search Engine - trace.moe</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://poorlydrawnlines.com/">Poorly Drawn Lines</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.rottentomatoes.com/m/vhyes">VHYes (2019) - Rotten Tomatoes</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.m.wikipedia.org/wiki/The_Sandman_(comic_book)">The Sandman (comic book) - Wikipedia</a></p>
<p>[TODO]{.todo .TODO} <a href="https://m.imdb.com/title/tt1751634/">The Sandman (TV Series 2021– ) - IMDb</a></p>
<p>[TODO]{.todo .TODO} Korean <a href="https://www.reddit.com/r/squidgame/comments/pwjyum/god_bless_squid_game">films/shows to watch</a></p>
<p>[TODO]{.todo .TODO} Gemini man.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.rottentomatoes.com/m/tigertail">Tigertail (2020) - Rotten Tomatoes</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.rottentomatoes.com/m/buffaloed">Buffaloed (2019) - Rotten Tomatoes</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.rottentomatoes.com/m/12_hour_shift">12 Hour Shift (2020) - Rotten Tomatoes</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/ddoniolvalcroze/status/1347367344239042563">What's your favorite Kurosawa film?</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/81347666">Korean Pork Belly Rhapsody | Netflix</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/80202946">Back to Life | Netflix</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://editorial.rottentomatoes.com/guide/the-best-movies-of-2020/">The Best Movies of 2020 – Best New Films of the Year</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.amazon.co.uk/If-Something-Happens-Lauren-Nieuwland">if something happens</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://docs.google.com/spreadsheets/d/1TrLhiplUxXgqe0Cc7T4MdibZVKF4yeLZ1ptHzkz6d48/edit#gid=256281926">The Essentials Movie Recs - Google Sheets</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt1239426/">Hipsters (2008) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt1217565/">Den radio (2008) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0415481/">Alyosha Popovich i Tugarin Zmey (2004) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0062759/">Brilliantovaya ruka (1969) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0079944/">Stalker (1979) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0069293/">Solaris (1972) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt3689910/">Miss Hokusai (2015) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt2106476/">The Hunt (2012) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/video/vi3155205401">Attack the Block: Trailer #2</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt6499752/">Upgrade (2018) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.rottentomatoes.com/m/the_way_back">The Way Back (2011) - Rotten Tomatoes</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0488085/">Big Nothing (2006) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt2937898/">A Most Violent Year (2014) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt4364194/">The Peanut Butter Falcon (2019) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt1372301/">Technotise - Edit i ja (2009) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt1176416/">Tetsuo: The Bullet Man (2009) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/video/vi165218585">Sleep Dealer</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0353014/">Sky Blue</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0338337/">Paycheck (2003) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0339579/">Returner (2002) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0284978/">Cypher (2002) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0091419/">The Little Shop of Horrors (1986) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/81302258">To the Lake</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0050613/">Throne of Blood (1957) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt9170108/">Raised by Wolves (TV Series 2020– ) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt1675434/">Untouchable (2011) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt1605783/">Midnight in Paris (2011) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0401711/">Paris, je t'aime (2006) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Alice-in-Paris/dp/B077JDNP5Y">Watch Alice in Paris | Prime Video</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt9170638/">Plan Coeur (TV Series 2018– ) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/ericajoy/status/1307432451304644609">what good shows are streaming rn?</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://decider.com/movie/first-cow/">First Cow | Where to Stream and Watch | Decider</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.rollingstone.com/movies/movie-reviews/she-dies-tomorrow-movie-review-1034272/">'She Dies Tomorrow' Movie Review: A Person-to-Person Paranoia Pandemic</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.theringer.com/2020/7/14/21323785/palm-springs-the-years-most-fun-movie-plus-introducing-the-connect-shea-serrano-jason-concepcion">‘Palm Springs,’ 2020’s Most Fun Movie</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://eu.usatoday.com/story/entertainment/movies/2020/05/09/spaceship-earth-why-crazy-hulu-doc-must-watch-quarantine-viewing/3102031001/">'Spaceship Earth': Why crazy new doc is must-watch quarantine viewing</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://eu.freep.com/story/entertainment/movies/julie-hinds/2016/08/25/dont-breathe-horror-film-detroit/89304296/">'Don't Breathe' is latest movie to use Detroit as its scary setting</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt11394188/">Spaceship Earth (2020) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://zerokspot.com/reviews/">Reviews - zerokspot.com</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2015/08/07/tsp2013-only-lovers-left-alive/">TSP2013: Only Lovers Left Alive – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2015/07/25/tsp2008-burn-after-reading/">TSP2008: Burn After Reading – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2015/07/31/tsp2009-the-limits-of-control/">TSP2009: The Limits of Control – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2015/07/11/tsp2002-adaptation/">TSP2002: Adaptation. – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2015/08/08/tsp2014-trainwreck/">TSP2015: Trainwreck – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/alixabeth/status/1290264151361761285">If you could wave a wand and instantly have more episodes of one TV series that has already concluded, which series would you pick?</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Advisors_Alliance">The Advisors Alliance - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.flixist.com/the-300-coda-my-top-50-movies-of-2018-and-my-top-40-first-time-watches-of-older-films/amp/">The 300 Coda: My Top 50 Movies of 2018 and My Top 40</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Green_Room_(film)">Green Room (film) - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/07/09/relic-is-a-masterclass-in-independent-horror/">'Relic' is a Masterclass in Independent Horror | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0387898/">Hidden (Caché) (2005) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2020/06/10/otb1-tokyo-story/">OTB#1: Tokyo Story – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/81008221">Into the Night | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt8101850/">Undone (TV Series 2019– ) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/05/20/quarantine-staff-picks-part-7/">Quarantine Staff Picks: Part 7 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/05/14/quarantine-staff-picks-part-6/">Quarantine Staff Picks: Part 6 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/05/07/quarantine-staff-picks-part-5-wolf-stalker-loaded-weapon/">Quarantine Staff Picks: Part 5 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/04/30/quarantine-staff-picks-part-4-the-player-my-friend-dahmer-gone-with-the-wind/">Quarantine Staff Picks: Part 4 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/04/23/quarantine-staff-picks-part-3/">Quarantine Staff Picks: Part 3 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/04/16/quarantine-staff-picks-part-2-once-upon-a-time-in-the-west-first-love-blue-ruin/">Quarantine Staff Picks: Part 2 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/04/08/quarantine-staff-picks-part-1/">Quarantine Staff Picks: Part 1 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/2020/05/28/quarantine-staff-picks-part-8-little-women-blood-and-wine/">Quarantine Staff Picks: Part 8 | MovieBabble</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.hustwit.com/about">Gary Hustwit (filmography)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=23445245">Helvetica, a documentary on typography</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/FILMSHAWTY/status/1266029625626497031">twitter: black documentaries that assist in understanding racism, prejudice, police brutality, and more</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://moviebabble.com/">MovieBabble - The Casual Way to Discuss Movies</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://bitdepth.org/">bitdepth</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt7282468/">Burning (2018) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.rottentomatoes.com/m/american_honey">American Honey (2016) - Rotten Tomatoes</a>.</p>
<p>[TODO]{.todo .TODO} Undone.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Wire">The Wire - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Ajin:_Demi-Human">Ajin: Demi-Human - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} Halt and Catch Fire.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.essence.com/entertainment/a-beginners-guide-afrofuturism/">A Beginner's Guide To Afrofuturism: 7 Titles To Watch And Read</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://wiki.sunbeam.city/doku.php">Sunbeam city wiki: Solarpunk</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/ShamanOfThe/status/1250056585281523713">Goldmund on Twitter: Watched Fight Club, thought about it, and realized why …</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/chancethedev/status/1247619377735675904">Chance on Twitter: Post your favorite movie.</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/03/22/nflx2019-january-4th-lionheart/">NFLX2019 January 4th: Lionheart – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/03/22/nflx2019-january-18th-soni/">NFLX2019 January 18th: Soni – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2020/01/04/nflx2019-december-31st-ghost-stories/">NFLX2019 December 31st: Ghost Stories – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/11/22/nflx2019-november-15th-klaus/">NFLX2019 November 15th: Klaus – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/10/18/nflx2019-october-18th-seventeen/">NFLX2019 October 18th: Seventeen – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/08/24/nflx2019-august-2nd-otherhood/">NFLX2019 August 2nd: Otherhood – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/05/31/nflx2019-may-30th-chopsticks/">NFLX2019 May 30th: Chopsticks – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/05/25/nflx2019-may-24th-the-perfection/">NFLX2019 May 24th: The Perfection – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://lars.ingebrigtsen.no/2019/08/23/nflx2019-july-31st-the-red-sea-diving-resort/">NFLX2019 July 31st: The Red Sea Diving Resort – Random Thoughts</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/video/vi2416359961">Paris is Us</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.bfi.org.uk/films-tv-people/sightandsoundpoll2012/directors">Directors’ top 100 | BFI</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/It_Follows">It Follows - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.tasteofcinema.com/2016/the-20-best-cyberpunk-movies-of-all-time/">The 20 Best Cyberpunk Movies of All Time</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/80232926">Ragnarok | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.neondystopia.com/">Home – Neon Dystopia</a>.</p>
<p>[TODO]{.todo .TODO} Patriot (Amazon)</p>
<p>[TODO]{.todo .TODO} The Expanse (Amazon)</p>
<p>[TODO]{.todo .TODO} The Boys (Amazon)</p>
<p>[TODO]{.todo .TODO} The Last Kingdom (Netflix)</p>
<p>[TODO]{.todo .TODO} The Witcher (Netflix)</p>
<p>[TODO]{.todo .TODO} Travelers (Netflix)</p>
<p>[TODO]{.todo .TODO} If I Only Hadn’t Met You (Netflix)</p>
<p>[TODO]{.todo .TODO} Peaky Blinders (Netflix)</p>
<p>[TODO]{.todo .TODO} Catch-22 (Hulu)</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/American_Factory">American Factory - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/80221644">October Faction | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/81016857">Transfers | Netflix</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/Title/81082327">Ad Vitam | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/81000509">On Children | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/80200596">Perfume | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/81037848">The Gift | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/80995039">Ares | Netflix Official Site</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.m.wikipedia.org/wiki/Demon_Slayer:_Kimetsu_no_Yaiba">Demon Slayer: Kimetsu no Yaiba - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Yuri_on_Ice">Yuri on Ice</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/alicegoldfuss/status/1196527679127732224">Twitter: &quot;Has anyone here seen Parasite?&quot;</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt2334879/">White House Down (2013) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt2179136/">American Sniper (2014) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} Hannibal Burress, Hasan Minhaj, Neal Brennan, Dave Chappelle.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Insider_(film)">The Insider (film) - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/alicegoldfuss/status/1166139660822663168">I need recommendations for shows/movies (preferably on Netflix)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/gp/product/B000PE0H0E/">Taste of Tea</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://japanology.tv/">Japanology Episodes List</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www3.nhk.or.jp/nhkworld/en/tv/japanologyplus/">Japanology Plus - TV | NHK WORLD-JAPAN Live &amp; Programs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.newyorker.com/culture/on-television/with-the-netflix-series-our-planet-david-attenborough-delivers-an-urgent-message">David Attenborough's Our Planet</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Infernal_Affairs">Infernal Affairs - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/VictoriaAveyard/status/1106965397729767424">Victoria Aveyard on Twitter: &quot;when your roommate asks for a Marvel watch list with commentary… &quot;</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/title/80240715?trkid=13710079&amp;MSG_TITLE=80240715&amp;lnktrk=EMP&amp;g=34314DADF578FF8FA7BD72C94F6C8ED9645514B1&amp;lkid=W2W_ROW_2_MDP_2">ROMA</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt5715874/">The Killing of a Sacred Deer (2017)</a>.</p>
<p>[TODO]{.todo .TODO} Private Life.</p>
<p>[TODO]{.todo .TODO} You Were Never Really Here.</p>
<p>[TODO]{.todo .TODO} Sorry to Bother You.</p>
<p>[TODO]{.todo .TODO} Game Night.</p>
<p>[TODO]{.todo .TODO} Support the Girls.</p>
<p>[TODO]{.todo .TODO} Steven Yeun, Burning.</p>
<p>[TODO]{.todo .TODO} A Simple Favor.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=18271167">Ask HN: Mind blowing documentaries?</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.theyshootpictures.com/21stcentury.htm">The 21st Century’s Most Acclaimed Films (including films from 2000)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Koyaanisqatsi">Koyaanisqatsi</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt4000670/">Mifune: The Last Samurai (2015) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt1322313/">Sunshine Superman (2014) - IMDb</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/80100869">Under the Sun (Netflix)</a>: &quot;Under the Sun keeps forcing us to ponder why we watch representations of real life and what we think we’re learning about reality in the process&quot;.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.netflix.com/gb/title/80107737">Peter and the Farm (Netflix)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Lessons_of_Darkness">Lessons of Darkness - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Story_of_Stuff">The story of stuff</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.imdb.com/title/tt0120894/?ref_=nm_flmg_act_42">Immortality</a>.</p>
<p>[TODO]{.todo .TODO} Ichi the killer.</p>
<p>[TODO]{.todo .TODO} Audition.</p>
<p>[TODO]{.todo .TODO} The Happiness of the Katakuris.</p>
<p>[TODO]{.todo .TODO} Agitator.</p>
<p>[TODO]{.todo .TODO} Gozu.</p>
<p>[TODO]{.todo .TODO} Outrage.</p>
<p>[TODO]{.todo .TODO} Minbo.</p>
<p>[TODO]{.todo .TODO} Blues harp.</p>
<p>[TODO]{.todo .TODO} Goyokin.</p>
<p>[TODO]{.todo .TODO} The hidden blade.</p>
<p>[TODO]{.todo .TODO} Wild Tales.</p>
<p>[TODO]{.todo .TODO} The Road.</p>
<p>[TODO]{.todo .TODO} Moon.</p>
<p>[TODO]{.todo .TODO} Who am I.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.openculture.com/2010/07/tarkovksy.html">Tarkovsky films</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Snowpiercer">Snowpiercer</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Kubo_and_the_Two_Strings">Kubo and the two strings</a>.</p>
<p>[TODO]{.todo .TODO} Spotlight.</p>
<p>[TODO]{.todo .TODO} Creed.</p>
<p>[TODO]{.todo .TODO} Innocence of memories.</p>
<p>[TODO]{.todo .TODO} The revenant.</p>
<p>[TODO]{.todo .TODO} Big short.</p>
<p>[TODO]{.todo .TODO} Pressure Cooker.</p>
<p>[TODO]{.todo .TODO} Bob and David.</p>
<p>[TODO]{.todo .TODO} Akira kurosawa director.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.imdb.com/title/tt0042192/">All About Eve</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.imdb.com/title/tt2321549/">Babadook</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Death_to_Smoochy">Death to Smoochy</a>.</p>
<p>[TODO]{.todo .TODO} Enter the void, by gaspar noe.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.imdb.com/title/tt1671513/">Four horsemen</a>.</p>
<p>[TODO]{.todo .TODO} Hirokazu koreeda director.</p>
<p>[TODO]{.todo .TODO} Naomi kawaze director.</p>
<p>[TODO]{.todo .TODO} Nostalghia.</p>
<p>[TODO]{.todo .TODO} Sion sono director.</p>
<p>[TODO]{.todo .TODO} Solyaris</p>
<p>[TODO]{.todo .TODO} Stalker</p>
<p>[TODO]{.todo .TODO} Takashi kitano director.</p>
<p>[TODO]{.todo .TODO} Takashi miike director.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.theconnection.tv/">The connection</a>.</p>
<p>[TODO]{.todo .TODO} The mirror</p>
<p>[TODO]{.todo .TODO} <a href="http://www.imdb.com/title/tt0078269/?ref_%3Dfn_al_tt_1">The Silent Partner</a>.</p>
<p>[TODO]{.todo .TODO} Uncle boonmee who can recall his past lives, by apichatpong weerasethakul.</p>
<p>[TODO]{.todo .TODO} Waking life, by rickard linklater.</p>
<p>[TODO]{.todo .TODO} <a href="http://xaharts.org/movie/best_movies.html">Xah Lee's movie list</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://m.imdb.com/title/tt2543312/">Halt and Catch Fire (TV Series 2014–2017) - IMDb</a>.</p>
<p>[DONE]{.done .DONE} Twinsters.</p>
<p>[DONE]{.done .DONE} Mindhunter (Netflix)</p>
<p>[DONE]{.done .DONE} Altered Carbon (Netflix)</p>
<p>OBSOLETE Narcos (Netflix)</p>
<p>[DONE]{.done .DONE} The Marvelous Mrs. Maisel (Amazon)</p>
<p>[DONE]{.done .DONE} Sneaky Pete (Amazon)</p>
<p>[DONE]{.done .DONE} Ozark (Netflix)</p>
<p>[DONE]{.done .DONE} Midnight Diner: Tokyo Stories (Netflix)</p>
<p>[DONE]{.done .DONE} Dark (Netflix)</p>
<p>[DONE]{.done .DONE} <a href="https://www.netflix.com/gb/title/80097140">Altered Carbon | Netflix Official Site</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.reddit.com/r/UKPersonalFinance/comments/b4jwo6/the_men_who_made_us_spend_a_really_amazing_3_part/">The Men Who Made Us Spend - a really amazing 3 part documentary from the BBC on spending and consumerism</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://en.wikipedia.org/wiki/Annihilation_(film)">Annihilation (film) - Wikipedia</a>.</p>
<p>[DONE]{.done .DONE} 13 Assasins &lt;2018-12-27 Thu&gt;.</p>
<p>[DONE]{.done .DONE} 7 Samurai &lt;2018-12-27 Thu&gt;.</p>
<p>[DONE]{.done .DONE} <a href="https://www.imdb.com/title/tt6839788/">Dogs of Berlin (TV Series 2018– ) - IMDb</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.netflix.com/title/80209379?trkid=13710079&amp;MSG_TITLE=80209379&amp;lnktrk=EMP&amp;g=E58636EBA68F4FFCE4B16798136D42876455394E&amp;lkid=W2W_ROW_2_MDP_1">Tidying Up with Marie Kondo</a>.</p>
<p>[DONE]{.done .DONE} The True cost.</p>
<p>[DONE]{.done .DONE} <a href="http://www.awaketheyoganandamovie.com/">Awake, the life of yogananda</a>.</p>
<p>[DONE]{.done .DONE} <a href="http://www.imdb.com/title/tt2562232/">Birdman</a>.</p>
<p>[DONE]{.done .DONE} <a href="http://www.imdb.com/title/tt1065073/">Boyhood</a>.</p>
<p>[DONE]{.done .DONE} She A Chinese.</p>
<p>[DONE]{.done .DONE} <a href="http://www.imdb.com/title/tt0243655/">Wet Hot American Summer</a>.</p>
]]></description>
    <pubDate>Tue, 30 Dec 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Microservices bookmarks</title>
<link>https://xenodium.com/microservices-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/microservices-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://datawire.io/creating-a-microservice-answer-these-10-questions-first/">Creating a Microservice? Answer these 10 Questions First</a>.</li>
<li><a href="http://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html">How we ended up with microservices</a>.</li>
<li><a href="https://httpie.org/">HTTPie – command line HTTP client</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 29 Dec 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Books backlog</title>
<link>https://xenodium.com/books-backlog</link>
<guid isPermaLink="false">https://xenodium.com/books-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://indieweb.social/@fgbjr/112761146059418752">Frank Bennett: &quot;20 books that have had an impact on who you are. …&quot; - Indiewe…</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://books.apple.com/us/book/id1551005489">‎Swift Secrets on Apple Books</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Island-Aldous-Huxley/dp/0099477777">Island: Amazon.co.uk: Aldous Huxley: 9780099477778: Books</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Hieroglyph-Stories-Visions-Better-Future-ebook/dp/B00H7LUR3K">Amazon.com: Hieroglyph: Stories and Visions for a Better Future eBook</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Meredith-Silicon-David-Oliver-Doswell/dp/B088T2ZZG5">Meredith: The Future of Silicon Valley (fiction)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Working-Public-Making-Maintenance-Software-ebook/dp/B08BDGXVK9/ref=sr_1_1">Working in Public: The Making and Maintenance of Open Source Software eBook</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/No-More-Mr-Nice-Guy/dp/0762415339">No More Mr Nice Guy: A Proven Plan for Getting What You Want</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/AllegedlyMiri/status/1301302388939259905">Thread on Wask Factory (more titles)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Wasp_Factory">The Wasp Factory - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/mariskreizman/status/1305922866433724416">Book recommendation thread by Maris Kreizman</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/dp/B0898YGR58">Extreme Privacy: What It Takes to Disappear: Bazzell, Michael: 9798643343707</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.theatlantic.com/health/archive/2011/10/you-are-not-so-smart-why-we-cant-tell-good-wine-from-bad/247240/">'You Are Not So Smart': Why We Can't Tell Good Wine From Bad - The Atlantic</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://stephaniekelton.com/book/">The Deficit Myth - Stephanie Kelton</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://muratbuffalo.blogspot.com/2020/06/some-book-recommendations.html">Metadata: Forty book recommendations</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/list/show/89580.Solarpunk">Solarpunk (62 books)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://theanarchistlibrary.org/library/p-m-bolo-bolo">Bolo’bolo | The Anarchist Library</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://archive.org/details/velvetmonkeywren00muir/page/260">The velvet monkey wrench : Muir, John, 1918-</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/list/show/131328.Solarpunk_Community_Discord_List">Solarpunk Community Discord List (108 books)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Launch-Internet-Millionaires-Anything-Paperback/dp/B00N4E4HQC/ref=sr_1_1">Launch: An Internet Millionaire's Secret Formula to Sell Almost anything online</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Psychology-Money-Timeless-lessons-happiness/dp/0857197681/">The Psychology of Money: The Psychology of Money: Timeless lessons on wealth, greed, and happiness</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://thequilltolive.com/recommendations-2/">Recommendations | The Quill to Live</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://fumbling.it/posts/my-2020-reading-list/">My 2020 Reading List · FumbLing</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/book/show/37903770-norse-mythology">Norse Mythology by Neil Gaiman</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/book/show/18216145-auto">Auto by David Wailing</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=22573204">Ask HN: Book recommendations for understanding financial systems? | Hacker News</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Andromeda_(novel)">Andromeda (novel) - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://medium.com/solarpunks/solarpunk-a-reference-guide-8bcf18871965">SOLARPUNK : A REFERENCE GUIDE - Solarpunks - Medium</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Final_Circle_of_Paradise">The Final Circle of Paradise - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/mariskreizman/status/1193898883153354752">Here's a visual of my 35 favorite books of the decade.</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=22559493">Cyberpunk: Then and Now | Hacker News</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Accelerate-Software-Performing-Technology-Organizations/dp/1942788339/ref=sr_1_1">Accelerate: The Science of Lean Software and Devops</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://hackernewsbooks.com/book/drive-the-surprising-truth-about-what-motivates-us/f10867f03ab0e2c362b3450119170a5a">Drive: The Surprising Truth About What Motivates Us | Hacker News Books</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Pachinko_(novel)">Pachinko (novel) - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/twostraws/status/1205416072058490880">Paul Hudson on Twitter: Can you recommend some manga?</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/dan_abramov/status/1190762799338790913">Dan Abramov: Please point me to a book about programming that isn't boring</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/gp/registry/wishlist/28JXH54TPGED7">John's Amazon wishlist</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Super-Thinking-Upgrade-Reasoning-Decisions-ebook/dp/B07FRXC3KN/ref=sr_1_2">Super Thinking: Upgrade Your Reasoning and Make Better Decisions with Mental Models</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/s?k=Giulia+Enders">Gut: the inside story of our body's most under-rated organ</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/evansandhoefner/status/1048426752404410368">Evan Sandhoefner on Twitter: Which books/papers/talks/etc have blown your mind / changed your worldview significantly?</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Joy-Demand-Discovering-Happiness-Within/dp/0062378872/ref=sr_1_1">JOY ON DEMAND: The Art of Discovering the Happiness Within</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Minute-Meditation-Expanded-Quiet-Change/dp/0399173420/ref=sr_1_2">8 Minute Meditation Expanded : Quiet Your Mind. Change Your Life</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Mindfulness-Plain-English-20th-Anniversary/dp/0861719069/ref=sr_1_1">Mindfulness in Plain English: 20th Anniversary Edition: Amazon.co.uk</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/bettina_bosch/status/1164430628852572161">Bettina Bauer: What is your favorite Science Fiction novel? (twitter)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Altered-Traits-Science-Reveals-Meditation/dp/0399184384">Altered Traits: Science Reveals How Meditation Changes Your Mind, Brain, and Body</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Junk-Food-Japan-Addictive-Kurobuta/dp/1472919920">Junk Food Japan: Addictive Food from Kurobuta</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=20332455">Ask HN: Recommend one book I need to read this summer?</a>.</p>
<p>[TODO]{.todo .TODO} I am a cat (Soseki Natsume).</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Thinking-Systems-Primer-Diana-Wright/dp/184407725X">Thinking in Systems: A Primer: Amazon.co.uk: Diana Wright, Donella H. Meadows: 9781844077250: Books</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.lisperati.com/casting-spels-emacs/html/casting-spels-emacs-1.html">Casting SPELs in Lisp (Emacs edition)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://landoflisp.com/">Land of lisp</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/book/show/558738.Juggling_for_the_Complete_Klutz">Juggling for the Complete Klutz by John Cassidy</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Positioning-Battle-Your-Al-Ries-ebook/">Positioning: The Battle for Your Mind</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Snow_Crash">Snow Crash - Wikipedia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.powells.com/book/-9781119404507">The Little Book of Common Sense Investing, Updated and Revised</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Little-LISPer-Third-Daniel-Friedman/dp/0023397632">The Little LISPer, Third Edition: 9780023397639: Computer Science Books @ Amazon.com</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Anatomy-Peace-Resolving-Heart-Conflict/dp/1626564310">The Anatomy of Peace: Resolving the Heart of Conflict</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://superfastthebook.com/">Superfast Lead at speed</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://ofone.co/">A company of one</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/book/show/27220736-shoe-dog">Shoe Dog: A Memoir by the Creator of NIKE</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://twitter.com/thegooddeath/status/1077325245940289537?s=12">Caitlin Doughty's top 8 books from 2018</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Global-Economy-Youve-Never-Seen-ebook/dp/B07GVT67HB/ref=tmm_kin_swatch_0?_encoding=UTF8&amp;qid=1545746296&amp;sr=8-1">Global Economy as you've never seen it</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Replay-Ken-Grimwood/dp/068816112X">Replay</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Siddhartha-Novel-Hermann-Hesse/dp/0553208845">Siddhartha: A Novel</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/Out_(novel)">Out (novel) by Natsuo Kirino</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.pitt.edu/~dash/japantales.html">Folklore, Folktales, and Fairy Tales from Japan: A Digital Library</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/book/show/15811545-a-tale-for-the-time-being">A Tale for the Time Being by Ruth Ozeki</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/dp/0571171044/ref=rdr_ext_tmb">Kitchen by Banan Yashimoto</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Overspent-American-Want-What-Dont/dp/0060977582/ref=sr_1_3/136-0317326-4068376?ie=UTF8&amp;qid=1538250472&amp;sr=8-3&amp;keywords=juliet+schor&amp;dpID=51%252BdTsv9XUL&amp;preST=_SY291_BO1,204,203,200_QL40_&amp;dpSrc=srch">The Overspent American: Why We Want What We Don't Need Paperback</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/book/show/13540802-enough">Enough by Patrick Rhone</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://hotair.tech/about/">Hot Air has a nice selection</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain-Driven Design: Tackling Complexity in the Heart of Software 1st Edition</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Seeing-like-State-Certain-Condition/dp/0300078153">Seeing like a State: How Certain Schemes to Improve the Human Condition Have Failed Paperback</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Conquest-Abundance-Abstraction-versus-Richness/dp/0226245349">Conquest of Abundance: A Tale of Abstraction versus the Richness of Being 2nd Edition</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://books.google.co.uk/books?id=a6sRdYLlmqIC&amp;pg=PA6&amp;lpg=PA6&amp;redir_esc=y">The Wisdom of No Escape: And the Path of Loving-Kindness</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Anatomy-Peace-Resolving-Heart-Conflict/dp/1626564310">The Anatomy of Peace: Resolving the Heart of Conflict</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Millionaire_Next_Door">The Millionaire Next Door</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.co.uk/Refactoring-Improving-Existing-Addison-Wesley-Technology-ebook/dp/B007WTFWJ6/ref=sr_1_1?s=digital-text&amp;ie=UTF8&amp;qid=1515533074&amp;sr=1-1&amp;keywords=refactoring+fowler">Refactoring: Improving the Design of Existing Code</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=12896313">Touched by the Goddess: On Ramanujan (Hacker News)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.amazon.com/Kundalini-Untold-Story-Himalayan/dp/0994002793">Kundalini – An Untold Story: A Himalayan Mystic's Insight into the Power of Kundalini and Chakra Sadhana</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://news.ycombinator.com/item?id=12365693">Show HN: Top books mentioned in comments on Hacker News</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/The_Prime_of_Miss_Jean_Brodie_%2528novel%2529">The Prime of Miss Jean Brodie (novel)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/book/show/53849.Plan_B">Plan B</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/Deskbound-Standing-Up-Sitting-World/dp/1628600586">Deskbound</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/The-Way-Wanderlust-Writing-Travelers/dp/1609521056">The Way of Wanderlust: The Best Travel Writing of Don George (Travelers' Tales)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.m.wikipedia.org/wiki/We_%28novel%29">We (novel)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://ramiro.org/vis/hn-most-linked-books/">Top Books on Amazon Based on Links in Hacker News Comments (Hacker News)</a>.</p>
<p>[TODO]{.todo .TODO} I'm OK, You're OK (Thomas A. Harris).</p>
<p>[TODO]{.todo .TODO} Mistakes Were Made (but not by me) (Tavris/Aronson).</p>
<p>[TODO]{.todo .TODO} Crucial Conversations (Patterson, Kelly…).</p>
<p>[TODO]{.todo .TODO} When Prophecy Fails (Festinger).</p>
<p>[TODO]{.todo .TODO} Influence (Robert Cialdini).</p>
<p>[TODO]{.todo .TODO} The Seven Day Weekend (Ricardo Semler).</p>
<p>[TODO]{.todo .TODO} Elements of Style (various).</p>
<p>[TODO]{.todo .TODO} The Man Who Sold the Eiffel Tower (various).</p>
<p>[TODO]{.todo .TODO} How to talk to anyone (Leil Lowndes).</p>
<p>[TODO]{.todo .TODO} <a href="http://www.gutenberg.org/ebooks/1091?msg=welcome_stranger">On Heroes, Hero-Worship, and the Heroic in History by Thomas Carlyle</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/Light-Asia-Sir-Edwin-Arnold/dp/1491290447/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1451846351&amp;sr=1-1&amp;keywords=the+light+of+asia+by+sir+edwin+arnold">Edwin Sir Arnold's The Light of Asia</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/Song-Celestial-Bhagavad-Gita-From-Mahabharata/dp/1848301596">Edwin Sir Arnold's The Song Celestial or Bhagavad-Gita</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/great-curries-india-camellia-panjabi/dp/1904920357">50 great curries of india</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/gp/product/034549802X?ie%3DUTF8&amp;tag%3Doffsitoftimfe-20&amp;linkCode%3Das2&amp;camp%3D1789&amp;creative%3D390957&amp;creativeASIN%3D034549802X">8 Week to optimum health</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/Guide-Good-Life-Ancient-Stoic/dp/0195374614">A Guide to the Good Life: The Ancient Art of Stoic Joy</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.co.uk/Building-Microservices-Sam-Newman/dp/1491950358/ref%3Dsr_1_1?ie%3DUTF8&amp;qid%3D1442603949&amp;sr%3D8-1&amp;keywords%3Dbuilding%2Bmicroservices">Building Microservices</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://ocw.mit.edu/ans7870/21f/21f.027/opium_wars_01/ow1_essay.pdf">First Opium War essay</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/full-catastrophe-living-wisdom-illness/dp/0739358588">Full catastrophe living</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.goodreads.com/">goodreads.com</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/gp/product/0061121088?ie%3DUTF8&amp;tag%3Doffsitoftimfe-20&amp;linkCode%3Das2&amp;camp%3D1789&amp;creative%3D390957&amp;creativeASIN%3D0061121088">Leaving Microsoft to Change the world</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/gp/product/0140442103?ie%3DUTF8&amp;tag%3Doffsitoftimfe-20&amp;linkCode%3Das2&amp;camp%3D1789&amp;creative%3D390957&amp;creativeASIN%3D0140442103">Letters from a stoic</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.goodreads.com/review/list/266149-michael?page=1&amp;shelf=2014_read&amp;view=covers">Michael's bookshelf</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.brainpickings.org/2014/12/29/neil-degrasse-tyson-reading-list/">Neil degrasse tyson's reading list</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://en.wikipedia.org/wiki/On_the_Road">On the Road, by Jack Kerouac</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://librivox.org/search?primary_key=0&amp;search_category=title&amp;search_page=1&amp;search_form=get_results">Public domain audio books</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.co.uk/gp/product/1840001585/sr=8-1/qid=1419902519/ref=olp_product_details?ie=utf8&amp;me=&amp;qid=1419902519&amp;sr=8-1">Royal horticultural society's organic Gardening</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.salmanrushdie.com/books/">Salman Rushdie books</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.com/Technopoly-The-Surrender-Culture-Technology/dp/0679745408">Technopoly: The Surrender of Culture to Technology</a>.</p>
<p>[TODO]{.todo .TODO} The Songlines, Bruce Chatwin.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.co.uk/Walkers-Guide-Outdoor-Clues-Signs/dp/1444780085">The Walker's Guide to Outdoor Clues and Signs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.co.uk/Thing-Explainer-Complicated-Stuff-Simple/dp/1473620910">Thing Explainer: Complicated Stuff in Simple Words</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.co.uk/madhur-jaffreys-ultimate-curry-bible/dp/0091874157/ref=sr_1_3?ie=utf8&amp;qid=1419973767&amp;sr=8-3&amp;keywords=madhur+jaffrey+curry">Ultimate curry bible</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.co.uk/gp/product/1840001585/sr=8-1/qid=1419902519/ref=olp_product_details?ie=utf8&amp;me=&amp;qid=1419902519&amp;sr=8-1">Veg patch</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://www.amazon.co.uk/JavaScript-Developer-ECMAScript-OdeToCode-Programming-ebook/dp/B018D12X0C">What Every JavaScript Developer Should Know About ECMAScript 2015</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://camdez.com/blog/2016/01/02/2016-reading-list/">Cameron Desautels's 2016 reading list</a>.</p>
<p>[TODO]{.todo .TODO} Thinking Fast and Slow (Kahneman).</p>
<p>[DONE]{.done .DONE} <a href="https://www.goodreads.com/book/show/28209634-autonomous">Autonomous by Annalee Newitz</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.goodreads.com/book/show/12924261-this-book-is-full-of-spiders">This Book Is Full of Spiders by David Wong</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://www.amazon.com/Why-We-Sleep-Unlocking-Dreams/dp/1501144316">Why we sleep</a> (<a href="https://twitter.com/uberstuber/status/1138291707231887361?s=12">twitter outline</a>).</p>
<p>[DONE]{.done .DONE} <a href="http://www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202/">Flow: The Psychology of Optimal Experience</a>.</p>
<p>[DONE]{.done .DONE} <a href="http://www.harukimurakami.com/library/">Haruki Murakami</a>.</p>
<p>[DONE]{.done .DONE} <a href="http://www.amazon.com/gp/product/0812992180?ie%3DUTF8&amp;tag%3Doffsitoftimfe-20&amp;linkCode%3Das2&amp;camp%3D1789&amp;creative%3D390957&amp;creativeASIN%3D0812992180">Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel</a>.</p>
]]></description>
    <pubDate>Tue, 30 Dec 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Gardening bookmarks</title>
<link>https://xenodium.com/gardening-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/gardening-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://mastergardeners.org/warm-cool-veg-charts">Recommended times to plant vegetables in Santa Clara County</a>.</li>
<li><a href="https://www.reddit.com/r/IAmA/comments/gc9agk/were_the_selftaught_development_team_behind_the_1/">We're the self-taught development team behind the #1 gardening app.</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 29 Dec 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs tips backlog</title>
<link>https://xenodium.com/emacs-tips-backlog</link>
<guid isPermaLink="false">https://xenodium.com/emacs-tips-backlog</guid>
    <description><![CDATA[<p>[TODO]{.todo .TODO} <a href="https://github.com/mrkkrp/typit">Typit: typing game for Emacs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/Wilfred/pyimport">pyimports</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://sriramkswamy.github.io/dotemacs/">Sriram Krishnaswamy's init</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://williambert.online/2014/02/using-a-node-repl-with-emacs/">Using a Node repl in Emacs with nvm and npm</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/afainer/arview">arview</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/PythonNut/company-flx">company-flx: fuzzy matching to company</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://melpa.org/?utm_source=dlvr.it&amp;utm_medium=twitter#/go-guru">Integration of the Go 'guru' analysis tool into Emacs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/company-mode/company-statistics">company-mode/company-statistics: Sort completion candidates by previous completion choices</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.youtube.com/watch?v=mtliRYQd0j4&amp;feature=youtu.be">Rewrite git history with Emacs, magit and git rebase</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/trezona-lecomte/coverage">Code coverage highlighting for Emacs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://elpa.gnu.org/packages/tramp-theme.html">tramp-theme</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/alexmurray/cstyle">cstyle</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/sigma/dotemacs/blob/master/lisp/config/go-config.el">A go Emacs config</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://clubctrl.com/org/prog/howto.html">Try out ox-twbs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://ergoemacs.org/emacs/function-frequency.html">Emacs Lisp function frequency</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://emacs.stackexchange.com/questions/7908/how-to-make-yasnippet-and-company-work-nicer">How to make yasnippet and company work nicer? (Stack Exchange)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/nekop/yasnippet-java-mode/blob/master/java-snippets.el">yasnippet-java-mode/java-snippets.el</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/Lindydancer/font-lock-studio">font-lock-studio</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/jorgenschaefer/emacs-buttercup">buttercup</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/niku/markdown-preview-eww">markdown-preview-eww</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://puntoblogspot.blogspot.co.uk/2016/01/til-ediff-revision.html?m=1">ediff-revision and magit-find-file to compare branches</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/Gnouc/flycheck-checkbashisms/blob/master/README.md">Flycheck linter for sh using checkbashisms</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://draketo.de/light/english/free-software/el-kanban-org-table">El Kanban Org: parse org-mode todo-states to use org-tables as Kanban tables</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://qiita.com/fujimisakari/items/a6ff082f0e8eddc09511">Emacs iOS development (qiita)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://blog.fujimisakari.com/Emacs%25E3%2581%25A6%25E3%2582%2599iOS%25E9%2596%258B%25E7%2599%25BA-objective-c-%25E3%2581%2599%25E3%2582%258B%25E3%2581%259F%25E3%2582%2581%25E3%2581%25AE%25E7%2592%25B0%25E5%25A2%2583%25E6%25A7%258B%25E7%25AF%2589/">Emacs iOS development (fujimisakari)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://orgmode.org/worg/org-tutorials/encrypting-files.html">encrypting org files</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/flycheck/flycheck-pos-tip">flycheck-pos-tip</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://tiborsimko.org/emacs-epydoc-snippets.html">Writing Python Docstrings with Emacs</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/To1ne/temacco/commit/6a084365ae137db2cdd035b7533847880d8c6cac">Try Completion for Objective-C (Github diff)</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/steckerhalter/emacs-fasd">Emacs fasd support</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/benma/visual-regexp.el">visual-regexp</a>.</p>
<p>[TODO]{.todo .TODO} <a href="http://emacsredux.com/blog/2014/05/16/opening-large-files/">Open large files</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/nathankot/company-sourcekit">company-sourcekit</a> (Swift completion): <a href="https://github.com/wiruzx/dotfiles/blob/master/.emacs#L24">sample config</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/dakrone/emacs-java-imports">emacs-java-imports</a>.</p>
<p>[TODO]{.todo .TODO} append-to-buffer.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/wavexx/python-x.el">python-x: extras for interactive evaluation</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/emacsmirror/outlined-elisp-mode">outlined-elisp-mode</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/tj64/outline-magic">outlien-magic</a>.</p>
<p>[TODO]{.todo .TODO} Gutter and linum+ config (see <a href="https://github.com/zvlex/dotfiles">zvlex/dotfiles</a>).</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/emacsfodder/kurecolor">kurecolor</a>: Editing color.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.gnu.org/software/emacs/manual/html_node/autotype/Autoinserting.html">auto-insert-mode</a>.</p>
<p>[TODO]{.todo .TODO} Buffer local cursor color: <a href="https://github.com/skk-dev/ddskk/blob/master/readmes/readme.ccc.org">ccc</a>.</p>
<p>[TODO]{.todo .TODO} clang indexing tool: <a href="http://ffevotte.github.io/clang-tags/">clang-tags</a>.</p>
<p>[TODO]{.todo .TODO} Create custom theme: Trường's <a href="http://truongtx.me/2013/03/31/color-theming-in-emacs-24/">post</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/Fuco1/dired-hacks">dired-hacks</a>.</p>
<p>[TODO]{.todo .TODO} gtd emacs workflow: Charles cave's <a href="http://members.optusnet.com.au/~charles57/gtd/gtd_workflow.html">notes</a>.</p>
<p>[DONE]{.done .DONE} emacs-index-search (lookup subject in Emacs manual).</p>
<p>[DONE]{.done .DONE} info-apropos (lookup subject in all manuals).</p>
<p>[TODO]{.todo .TODO} Jumping around tips: <a href="http://zerokspot.com/weblog/2015/01/07/jumping-around-in-emacs/">zerokspot</a>.</p>
<p>[TODO]{.todo .TODO} Mac OS clipboard support (from terminal): <a href="https://github.com/jkp/pbcopy.el">pbcopy</a>.</p>
<p>OBSOLETE <a href="https://github.com/m0smith/malabar-mode">Malabar mode</a>: For Java.</p>
<p>[TODO]{.todo .TODO} Melpa recipe format:<a href="https://github.com/milkypostman/melpa#recipe-format">format</a>.</p>
<p>OBSOLETE Naturaldocs for javascript: <a href="http://naiquevin.github.io/naturaldocs-for-javascript-in-emacs.html">Vineet's post</a>.</p>
<p>[TODO]{.todo .TODO} Org protocol: see irreal's <a href="http://irreal.org/blog/?p=3594">post</a> and oremacs's <a href="http://oremacs.com/2015/01/07/org-protocol-1/">part 1</a> and <a href="http://oremacs.com/2015/01/08/org-protocol-2/">part 2</a>.</p>
<p>[TODO]{.todo .TODO} org-multiple-keymap. More at <a href="https://github.com/myuhe/org-multiple-keymap.el">org-multiple-keymap.el</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/yjwen/org-reveal/tree/stable">org-reveal</a>: Export org to reveal.js.</p>
<p>[TODO]{.todo .TODO} Practice touch/speed typing: <a href="https://github.com/hagleitn/speed-type">speedtype</a>.</p>
<p>[TODO]{.todo .TODO} private configuration: <a href="https://github.com/cheunghy/private">private</a>.</p>
<p>[TODO]{.todo .TODO} project management for C/C++: <a href="https://github.com/lefterisjp/malinka">malinka</a>.</p>
<p>[TODO]{.todo .TODO} Project templates: <a href="https://github.com/chrisbarrett/skeletor.el">skeletor</a>.</p>
<p>[TODO]{.todo .TODO} Rewrite git logs. See <a href="http://shingofukuyama.github.io/emacs-magit-reword-commit-messages/">emacs magit tutorial | rewrite older commit</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Selective-Display.html">Selective display</a>: Hide lines longer than.</p>
<p>[TODO]{.todo .TODO} shell-command-on-region: Print inline with C-u M-|.</p>
<p>[TODO]{.todo .TODO} shell-command: Print output inline with C-u M-!.</p>
<p>[TODO]{.todo .TODO} Simplify media file transformations: <a href="https://github.com/abo-abo/make-it-so">make-it-so</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/mineo/yatemplate">yatemplate</a>.</p>
<p>[TODO]{.todo .TODO} <a href="https://github.com/fujimisakari/emacs-helm-xcdoc">emacs-helm-xcdoc</a>.</p>
<p>OBSOLETE <a href="https://github.com/facetframer/orgnav">Drill down org files using orgnav (helm-based)</a>.</p>
<p>OBSOLETE <a href="https://github.com/prettier/prettier-emacs">Prettier emacs</a>. (use <a href="https://github.com/purcell/reformatter.el">reformatter.el</a>.)</p>
<p>OBSOLETE <a href="http://amitp.blogspot.co.uk/search/label/emacs">Spaceline walkthrough</a>.</p>
<p>OBSOLETE Try out emacs Android debug (see this <a href="http://gregorygrubbs.com/development/tips-on-android-development-using-emacs/">post</a>).</p>
<p>OBSOLETE <a href="https://github.com/syohex/emacs-quickrun">quickrun.el</a>.</p>
<p>OBSOLETE <a href="https://github.com/zakame/emacs-for-javascript">Emacs for JavaScript</a>.</p>
<p>OBSOLETE <a href="https://github.com/iced/go-gopath/blob/master/README.md">go-gopath</a>.</p>
<p>OBSOLETE <a href="https://github.com/alezost/shift-number.el">shift-number.el</a>.</p>
<p>OBSOLETE <a href="https://github.com/xuchunyang/DevDocs.el"><a href="https://github.com/xuchunyang/DevDocs.el">https://github.com/xuchunyang/DevDocs.el</a></a>.</p>
<p>OBSOLETE <a href="https://github.com/jasonm23/emacs-select-themes/blob/master/select-themes.el">select-themes</a>.</p>
<p>OBSOLETE <a href="https://github.com/bmag/helm-purpose">Emacs purpose</a>.</p>
<p>OBSOLETE <a href="http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/">Why are you changing gc-cons-threshold?</a>.</p>
<p>OBSOLETE <a href="https://github.com/nivekuil/corral">Corral</a>.</p>
<p>OBSOLETE <a href="https://github.com/nicklanasa/xcode-mode/blob/master/README.md">xcode-mode</a>.</p>
<p>OBSOLETE <a href="https://github.com/yuutayamada/commenter">commenter</a>.</p>
<p>OBSOLETE <a href="https://github.com/ustun/emacs-helpers-for-js/blob/master/uojs.el">Emacs JavaScript helpers</a>.</p>
<p>OBSOLETE <a href="https://github.com/lujun9972/yahoo-weather-mode">yahoo-weather-mode</a>.</p>
<p>OBSOLETE <a href="https://github.com/peteyy/.emacs.d/blob/master/settings/language-javascript.el">Peek at peteyy's Javascript config</a>.</p>
<p>OBSOLETE <a href="https://github.com/trotzig/import-js">import-js</a>.</p>
<p>OBSOLETE <a href="https://github.com/CodyReichert/es6-snippets">ES6 yasnippets</a>.</p>
<p>OBSOLETE <a href="https://github.com/swank-js/swank-js">swank-js</a>.</p>
<p>OBSOLETE <a href="https://github.com/ananthakumaran/tide">TypeScript Interactive Development Environment for Emacs</a>.</p>
<p>[DONE]{.done .DONE} Try out <a href="https://github.com/jacobdufault/cquery/blob/master/emacs/cquery.el">cquery</a>, <a href="https://github.com/emacs-lsp/lsp-mode">emacs-lsp</a>, and <a href="https://github.com/tigersoldier/company-lsp">company-lsp</a>.</p>
<p>[DONE]{.done .DONE} (setq projectile-use-git-grep t). &lt;2018-12-27 Thu&gt;</p>
<p>[DONE]{.done .DONE} <a href="https://www.reddit.com/r/emacs/comments/46lv2q/is_there_any_easy_way_to_make_org_files_password/">Is there any easy way to make .org files password protected? (Reddit)</a>.</p>
<p>[DONE]{.done .DONE} use-package binding to different maps</p>
<pre><code class="language-{.commonlisp">(use-package term
  :bind
  (:map
   term-mode-map
   (&quot;M-p&quot; . term-send-up)
   (&quot;M-n&quot; . term-send-down)
   :map term-raw-map
   (&quot;M-o&quot; . other-window)
   (&quot;M-p&quot; . term-send-up)
   (&quot;M-n&quot; . term-send-down)))
</code></pre>
<p>[DONE]{.done .DONE} <a href="https://github.com/syohex/emacs-qrencode/blob/master/README.md">Emacs qrencode</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/Fuco1/smartparens">Smartparens</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://gist.github.com/syohex/626af66ba3650252b0a2">Hash region</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/syohex/emacs-helm-ispell">helm-ispell</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/HKey/dired-atool">Pack/unpack files with atool on dired</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/Alexander-Miller/company-shell">company-shell</a>.</p>
<p>[DONE]{.done .DONE} artbollocks-mode and writegood. More at Sacha's <a href="http://sachachua.com/blog/2011/12/emacs-artbollocks-mode-el-and-writing-more-clearly/">post</a>.</p>
<p>[DONE]{.done .DONE} comint-prompt-read-only for making shell prompts read-only.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/kelvinh/org-page">org-page</a>: Static blog.</p>
<p>[DONE]{.done .DONE} <a href="https://www.reddit.com/r/emacs/comments/43b42y/i_just_realized_emacs_has_a_fast_infix_calculator/">I just realized Emacs has a fast infix calculator that's not calc or quick-calc… (Reddit)</a>.</p>
<p>[DONE]{.done .DONE} <a href="http://promberger.info/linux/2010/02/16/how-to-get-emacs-key-bindings-in-ubuntu/">How to get emacs key bindings in Ubuntu</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/calvinwyoung/org-autolist">org-autolist</a>.</p>
<p>[DONE]{.done .DONE} Move up by parens: More at the <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Moving-by-Parens.html">manual</a>.</p>
<p>[DONE]{.done .DONE} sunrise-sunset.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/abo-abo/ace-window">ace-window</a>.</p>
<p>[DONE]{.done .DONE} Checkdoc.</p>
<p>[DONE]{.done .DONE} Choose magit repo c-u c-x g (magit-status).</p>
<p>[DONE]{.done .DONE} continue comment blocks: m-j (indent-new-comment-line).</p>
<p>[DONE]{.done .DONE} Debug expanded elisp macros: See Wisdom and Wonder's <a href="http://www.wisdomandwonder.com/link/9316/how-to-debug-expanded-elisp-macros">post</a>.</p>
<p>[DONE]{.done .DONE} delete-duplicate-lines</p>
<p>[DONE]{.done .DONE} Describe bindings: C-h b lists all bindings.</p>
<p>[DONE]{.done .DONE} Disable furniture</p>
<pre><code class="language-{.commonlisp">(menu-bar-mode -1)
(toggle-scroll-bar -1)
(tool-bar-mode -1)
</code></pre>
<p>[DONE]{.done .DONE} <a href="https://github.com/silex/elmacro">elmacro</a> shows keyboard as emacs lisp.</p>
<p>[DONE]{.done .DONE} yasnippet mirrors with transformations more at <a href="https://capitaomorte.github.io/yasnippet/snippet-development.html#sec-3-6">snippet development</a>.</p>
<p>For example:</p>
<pre><code class="language-{.bash">- (${1:id})${2:foo}
{
    return $2;
}

- (void)set${2:$(capitalize yas-text)}:($1)avalue
{
    [$2 autorelease];
    $2 = [avalue retain];
}
$0
</code></pre>
<p>[DONE]{.done .DONE} Emacs regex: <a href="http://ergoemacs.org/emacs/emacs_regex.html">Emacs: text pattern matching (regex) tutorial</a>.</p>
<p>[DONE]{.done .DONE} export ascii art: <a href="http://www.lysator.liu.se/~tab/artist/">artist mode</a> + <a href="http://ditaa.sourceforge.net">ditaa</a> for uml. demo <a href="https://www.youtube.com/watch?v=ciux87xo8fc">video</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/abo-abo/lispy">lispy</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/dandavison/minimal">minimal</a>: minimalist appearance.</p>
<p>[DONE]{.done .DONE} Narrowing regions</p>
<ul>
<li>c-x n n (narrow-to-region).</li>
<li>c-x n w (Widen).</li>
</ul>
<p>[DONE]{.done .DONE} <a href="https://www.gnu.org/software/emacs/manual/nxml-mode.html">nxml-mode</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/jonnay/emagicians-starter-kit/blob/master/themes/org-beautify-theme.org">org-beautify-theme</a>: a sub-theme to make org-mode more beautiful.</p>
<p>[DONE]{.done .DONE} Recursive query/replace</p>
<ul>
<li>M-x find-dired RET.</li>
<li>Navigate to location, RET.</li>
<li>Add find argument (omit for all files), RET.</li>
<li>t (select all).</li>
<li>Q (query-replace).</li>
<li>Enter search/replace terms.</li>
<li>y/n for each match.</li>
<li>C-x s ! (save all).</li>
</ul>
<p>[DONE]{.done .DONE} Repeat last command: C-x z (and just z threreafter).</p>
<p>[DONE]{.done .DONE} Replace char with a newline</p>
<ul>
<li>M-x replace-string RET ; RET C-q C-j.</li>
<li>C-q (quoted-insert).</li>
<li>C-j (newline).</li>
</ul>
<p>[DONE]{.done .DONE} <a href="https://github.com/bruce-connor/smart-mode-line">smart-mode-line</a>, <a href="http://pages.sachachua.com/.emacs.d/sacha.html">sacha's sample usage</a>.</p>
<p>[DONE]{.done .DONE} Toggling key bingings: <a href="http://oremacs.com/2014/12/25/ode-to-toggle/">ode to the toggle</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/damiencassou/unify-opening">unify-opening</a></p>
<p>[DONE]{.done .DONE} use-package: <a href="http://www.lunaryorn.com/2015/01/06/my-emacs-configuration-with-use-package.html">lunaryorn</a>.</p>
<p>[DONE]{.done .DONE} <a href="https://github.com/aaronbieber/sunshine.el">sunshine.el</a>.</p>
<p>[DONE]{.done .DONE} youtube-dl: <a href="http://oremacs.com/2015/01/05/youtube-dl/">or emacs</a>.</p>
]]></description>
    <pubDate>Wed, 03 Dec 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Installing Emacs 24.4 on Linux</title>
<link>https://xenodium.com/installing-emacs--on-linux</link>
<guid isPermaLink="false">https://xenodium.com/installing-emacs--on-linux</guid>
    <description><![CDATA[<pre><code class="language-{.bash">sudo apt-get install texinfo build-essential xorg-dev libgtk-3-dev libjpeg-dev libncurses5-dev libgif-dev libtiff-dev libm17n-dev libpng12-dev librsvg2-dev libotf-dev
</code></pre>
]]></description>
    <pubDate>Wed, 09 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Installing Emacs 24.4 on Mac OS X</title>
<link>https://xenodium.com/installing-emacs-24-4-on-mac-os-x</link>
<guid isPermaLink="false">https://xenodium.com/installing-emacs-24-4-on-mac-os-x</guid>
    <description><![CDATA[<p>See Yamamoto's Mac OS X <a href="https://github.com/railwaycat/emacs-mac-port">port</a>. To install:</p>
<pre><code class="language-{.bash">$ brew tap railwaycat/emacsmacport
$ brew install emacs-mac
</code></pre>
]]></description>
    <pubDate>Wed, 09 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Xcode6 tips</title>
<link>https://xenodium.com/xcode6-tips</link>
<guid isPermaLink="false">https://xenodium.com/xcode6-tips</guid>
    <description><![CDATA[<p>From Ray Wenderlich's <a href="http://www.raywenderlich.com/85999/xcode-6-tips-tricks-tech-talk-video">tech talk</a> And <a href="http://www.raywenderlich.com/72021/supercharging-xcode-efficiency">supercharging Your Xcode Efficiency (by Jack Wu)</a>.</p>
<h2>Shortcuts</h2>
<ul>
<li>⌘⇧o Fuzzy file search.</li>
<li>⌘⌥j Fuzzy file search (showing in Xcode project hierarchy).</li>
<li>⌘⇧j Show file in Xcode project hierarchy.</li>
<li>⌘⌥0 Show/hide utility area (right panel).</li>
<li>⌘0 Show/hide navigation area (left panel).</li>
<li>⇧⌘Y Show/hide debug area (bottom panel).</li>
<li>Ctrli Indent selection.</li>
<li>⌘\ Toggle breakpoint on line.</li>
<li>⌘/ Toggle comment.</li>
<li>⌘[1-8] Select tabs on left panel.</li>
<li>Ctrl[1-x] Select top file navigation menu items.</li>
</ul>
<h2>Xcode features</h2>
<ul>
<li>Snippets.</li>
<li>Templates.</li>
<li>View debugging.</li>
<li>Simctl (send files to simulator).</li>
</ul>
<h2>Plugins of interest</h2>
<ul>
<li>Fuzzy autocomplete.</li>
<li>Uncrustify for indentation.</li>
<li>xcs code switch expansion.</li>
<li>Org and order (for properties).</li>
</ul>
]]></description>
    <pubDate>Sun, 02 Nov 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Simple ssh tunnel</title>
<link>https://xenodium.com/simple-ssh-tunnel</link>
<guid isPermaLink="false">https://xenodium.com/simple-ssh-tunnel</guid>
    <description><![CDATA[<p>Via <a href="https://twitter.com/climagic/status/674688454526136320?refsrc%3Demail&amp;s%3D11">@climagic</a>, connections to tcp localhost:9909 will be made to 192.168.1.1:80 via SSH tunnel to home.</p>
<pre><code class="language-{.bash">ssh -L 9909:192.168.1.1:80 home
</code></pre>
]]></description>
    <pubDate>Sat, 12 Dec 2015 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>gpg/pgp bookmarks</title>
<link>https://xenodium.com/gpgpgp-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/gpgpgp-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://gpgtools.tenderapp.com/kb/gpg-keychain-faq/backup-or-transfer-your-keys">Backup or transfer your keys / GPG Keychain FAQ / Knowledge Base - GPGTools Support</a>.</li>
<li><a href="https://alexcabal.com/creating-the-perfect-gpg-keypair">Creating the perfect GPG keypair - Alex Cabal</a>.</li>
<li><a href="https://github.com/kensanata/ggg">Gmail, Gnus and GPG guide</a>.</li>
<li><a href="https://emacsist.github.io/2019/01/01/gnupg2%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/">GnuPG2 snippets - emacsist</a>.</li>
<li><a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf">NIST Special Publication: Recommendation for Key Management</a>.</li>
<li><a href="https://riseup.net/en/security/message-security/openpgp/best-practices">OpenPGP Best Practices - riseup.net</a>.</li>
<li><a href="https://medium.com/@ahawkins/securing-my-digital-life-gpg-yubikey-ssh-on-macos-5f115cb01266">Securing My Digital Life: GPG, Yubikey, &amp; SSH on macOS</a>.</li>
<li><a href="https://www.gnupg.org/gph/en/manual.html">The GNU Privacy handbook</a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 20 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Raspberry Pi bookmarks</title>
<link>https://xenodium.com/raspberry-pi-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/raspberry-pi-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://youtu.be/UtLyX72-688">Raspberry Pi 5: Getting Started - YouTubee</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 04 Feb 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs lisp bookmarks</title>
<link>https://xenodium.com/emacs-lisp-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/emacs-lisp-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://twitter.com/kaushalmodi/status/1059873868175826946?s=12">(setq search-whitespace-regexp &quot;.*?&quot;) isearch &quot;abc ghi&quot; matches &quot;abcdefghi&quot;</a>.</li>
<li><a href="https://github.com/kinghom/elisp-guide">A quick guide to Emacs Lisp programming</a>.</li>
<li><a href="https://github.com/alphapapa/unpackaged.el#font-compare">A snippet to try out fonts</a>.</li>
<li>Abo abo's <a href="https://github.com/abo-abo/elisp-guide">Emacs Lisp Guide</a>.</li>
<li><a href="http://www.wilfred.me.uk/blog/2015/03/19/adding-a-new-language-to-emacs/">Adding A New Language to Emacs (ie. writing a new major mode)</a>.</li>
<li><a href="https://github.com/alphapapa/emacs-package-dev-handbook">alphapapa's The Emacs Package Developer’s Handbook</a>.</li>
<li><a href="https://nullprogram.com/blog/2019/03/10/">An Async / Await Library for Emacs Lisp « null program</a>.</li>
<li><a href="http://harryrschwartz.com/2014/04/08/an-introduction-to-emacs-lisp.html">An introduction to emacs lisp</a>.</li>
<li><a href="https://elpa.gnu.org/packages/path-iterator.html">An iterator for traversing a directory path</a>.</li>
<li><a href="https://www.badykov.com/emacs/2020/05/05/async-company-mode-backend/">Async autocompletion in Emacs – Kraken of Thought</a>.</li>
<li><a href="http://caiorss.github.io/Emacs-Elisp-Programming/Elisp_Snippets.html">Caio Rordrigues's Elisp Snippets</a>.</li>
<li><a href="https://github.com/caiorss/Emacs-Elisp-Programming">Caio's Emacs - Programming and Customization</a>.</li>
<li><a href="https://rosettacode.org/wiki/Category:Emacs_Lisp">Category:Emacs Lisp - Rosetta Code</a>.</li>
<li><a href="https://tech.tonyballantyne.com/emacs/lisp-loops/">Common Lisp Loops – Tony Ballantyne Tech</a>.</li>
<li><a href="https://tech.tonyballantyne.com/emacs/date-and-time/">Date and Time – Tony Ballantyne Tech</a>.</li>
<li><a href="http://www.emacswiki.org/emacs/ElDoc">eldoc-mode</a>.</li>
<li><a href="https://github.com/alphapapa/elexandria/blob/a22b12f3472baa617545d2f247ea41f5ef70a488/elexandria.el#L103">elexandria/elexandria.el's with-file-buffer macro</a>.</li>
<li><a href="https://github.com/alhassy/ElispCheatSheet">ElispCheatSheet: Quick reference to the core language of Emacs —Editor MACroS.</a>.</li>
<li><a href="https://github.com/caiorss/Emacs-Elisp-Programming">Emacs - Elisp Programming and Customization</a>.</li>
<li><a href="https://caiorss.github.io/Emacs-Elisp-Programming/Elisp_Programming.html">Emacs Elisp Programming guide</a>.</li>
<li><a href="https://github.com/chrisdone/elisp-guide/blob/master/README.md">Emacs Lisp Guide, chrisdone/elisp-guide · GitHub</a>.</li>
<li><a href="https://github.com/larsmagne/emacs-sqlite3">Emacs sqlite binding of Emacs Lisp inspired by mruby-sqlite3</a>.</li>
<li><a href="http://www.emacswiki.org/emacs/EmacsSymbolNotation">Emacs symbol notation</a>.</li>
<li><a href="https://github.com/skeeto/emacs-bencode">emacs-bencode: Bencode package for Emacs Lisp (encoding losely structured data)</a>.</li>
<li><a href="http://newartisans.com/2016/01/pattern-matching-with-pcase/">Emacs: Pattern Matching with pcase</a>.</li>
<li><a href="https://curiousprogrammer.wordpress.com/2009/06/08/error-handling-in-emacs-lisp/">Error Handling in Emacs Lisp</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/9auzla/example_showing_how_useful_the_ampleregexps/">Example showing how useful the ample-regexps package is : emacs</a>.</li>
<li><a href="http://www.emacswiki.org/emacs/find-library.el">find-library</a>.</li>
<li><a href="https://github.com/functionreturnfunction/format-table">format-table: Parse and reformat tabular data in emacs (Looks great for converting between org, json, and other RDBMS)</a>.</li>
<li><a href="https://github.com/alphapapa/ts.el">GitHub - alphapapa/ts.el: Emacs date-time library</a>.</li>
<li><a href="https://github.com/brandelune/nipel">GitHub - brandelune/nipel: New Introduction to Programming in Emacs Lisp</a>.</li>
<li><a href="https://github.com/Lindydancer/face-explorer">GitHub - Lindydancer/face-explorer: Library and tools for faces and text properties</a>.</li>
<li><a href="https://github.com/p3r7/awesome-elisp">GitHub - p3r7/awesome-elisp: A curated list of emacs-lisp development resources</a>.</li>
<li><a href="https://github.com/Wilfred/ht.el">GitHub - Wilfred/ht.el: The missing hash table library for Emacs</a>.</li>
<li><a href="https://github.com/xuchunyang/elisp-demos/">GitHub - xuchunyang/elisp-demos: Demonstrate Emacs Lisp APIs</a>.</li>
<li><a href="http://ruzkuku.com/texts/emacs-style.html">Good Style in modern Emacs Packages</a>.</li>
<li><a href="https://harryrschwartz.com/2014/04/08/an-introduction-to-emacs-lisp.html">Harry R. Schwartz's An Introduction to Emacs Lisp</a>.</li>
<li><a href="https://yoo2080.wordpress.com/2013/09/22/how-to-choose-emacs-lisp-package-namespace-prefix">How to choose Emacs Lisp package namespace prefix</a>.</li>
<li><a href="http://nullprogram.com/blog/2013/02/06/">How to Make an Emacs Minor Mode</a>.</li>
<li><a href="http://emacslife.com/how-to-read-emacs-lisp.html">How to read emacs lisp</a>.</li>
<li><a href="https://yoo2080.wordpress.com/2014/07/20/it-is-not-hard-to-edit-lisp-code/">It's not hard to edit Lisp code</a>.</li>
<li><a href="https://github.com/hypernumbers/learn_elisp_the_hard_way/blob/master/contents/why-did-I-write-this-book.rst">Learn elisp the hard way</a>.</li>
<li><a href="https://bzg.fr/en/learn-emacs-lisp-in-15-minutes/">Learn Emacs Lisp in 15 minutes - Bastien Guerry</a>.</li>
<li><a href="http://bzg.fr/learn-emacs-lisp-in-15-minutes.html">Learn emacs lisp in 15 minutes</a>.</li>
<li><a href="http://thewanderingcoder.com/2015/01/emacs-org-mode-links-and-exported-html/">Links and exported HTML</a>.</li>
<li><a href="https://yoo2080.wordpress.com/2013/08/07/living-with-emacs-lisp">Living with Emacs Lisp</a>.</li>
<li><a href="http://www.gigamonkeys.com/book/loop-for-black-belts.html">LOOP for Black Belts</a>.</li>
<li><a href="http://mbork.pl/2018-12-03_looking-back-p">Marcin Borkowski: 2018-12-03 looking-back-p</a>.</li>
<li><a href="http://mbork.pl/2019-03-25_Using_benchmark_to_measure_speed_of_Elisp_code">Marcin Borkowski: 2019-03-25 Using benchmark to measure speed of Elisp code</a>.</li>
<li><a href="http://www.nongnu.org/emacs-tiny-tools/elisp-coding/">Nongnu elisp guidelines</a>.</li>
<li><a href="http://newartisans.com/2016/01/pattern-matching-with-pcase/">Pattern matching with pcase</a>.</li>
<li><a href="https://tech.tonyballantyne.com/emacs/pattern-matching-pcase/">Pattern Matching: pcase – Tony Ballantyne Tech</a>.</li>
<li><a href="http://emacslife.com/how-to-read-emacs-lisp.html">Read Lisp, Tweak Emacs</a>.</li>
<li><a href="https://joelmccracken.github.io/entries/reading-writing-data-in-emacs-batch-via-stdin-stdout/">Reading from stdin and writing to stdout with Emacs batch</a>.</li>
<li><a href="http://thewanderingcoder.com/2015/02/refactoring-beginning-emacs-lisp-i-adding-tests/">Refactoring “Beginning Emacs Lisp”: I: Adding Tests</a>.</li>
<li><a href="https://gist.github.com/equwal/89b1ef5ac8d4d737cfd37f66e9ba4895">Selecting and trying out different fonts in Emacs</a>.</li>
<li><a href="https://github.com/purcell/elisp-slime-nav">Slime-style navigation for Emacs Lisp</a>.</li>
<li><a href="https://hungyi.net/posts/split-list-into-batches-elisp/">Split a List Into Batches Using Emacs Lisp - Hung-Yi’s Journal</a>.</li>
<li><a href="https://zck.me/testing-buffer-modifying-emacs-code">Testing Emacs code that modifies buffers</a>.</li>
<li><a href="http://nic.ferrier.me.uk/blog/2012_07/tips-and-tricks-for-emacslisp">Tips on Emacs Lisp programming</a>.</li>
<li><a href="http://endlessparentheses.com/understanding-letf-and-how-it-replaces-flet.html">Understanding letf and how it replaces flet · Endless Parentheses</a>.</li>
<li><a href="https://github.com/larsmagne/vpt.el/blob/master/vpt.el">Variable Pitch Tables</a>.</li>
<li><a href="https://github.com/larsmagne/vpt.el">vpt.el: An Emacs package to display tabular data with variable pitch fonts</a>.</li>
<li><a href="https://github.com/larsmagne/watch-directory.el/blob/master/watch-directory.el">Watch a directory using elisp (larsmagne)</a>.</li>
<li><a href="https://github.com/larsmagne/watch-directory.el/blob/master/watch-directory.el">watch-directory.el watches a directory for new files</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/43nh3h/whats_the_best_practice_to_write_emacslispat_2016/">What's the best practice to write emacs-lisp (at 2016)? (Reddit)</a>.</li>
<li><a href="https://emacs.stackexchange.com/questions/2868/whats-wrong-with-find-file-noselect">What's wrong with `find-file-noselect`? (Emacs Stack Exchange)</a>.</li>
<li><a href="http://wikemacs.org/wiki/Emacs_Lisp_Cookbook">Wikemacs's Emacs Lisp Cookbook</a>.</li>
<li><a href="https://with-emacs.com/posts/tutorials/almost-all-you-need-to-know-about-variables/">with-emacs · (Almost) All You Need to Know About Variables</a>.</li>
<li><a href="https://qiita.com/itiut@github/items/d917eafd6ab255629346">with-suppressed-message macro</a>.</li>
<li><a href="https://www.youtube.com/watch?v=XjKtkEMUYGc&amp;feature=youtu.be">Writing a Spotify Client</a>.</li>
<li><a href="https://iloveemacs.wordpress.com/2016/02/27/writing-web-apps-in-emacs-lisp/">Writing Web apps in Emacs Lisp (simple-httpd)</a>.</li>
<li><a href="http://ergoemacs.org/emacs/elisp_symbol.html">Xah Lee's Emacs Lisp Symbol (tutorial)</a>.</li>
<li><a href="http://ergoemacs.org/emacs/elisp_common_functions.html">Xah's Common Emacs Lisp Functions</a>.</li>
<li><a href="http://ergoemacs.org/emacs/elisp_idioms_batch.html">Xah's Emacs Lisp idioms for Text Processing in Batch Style</a>.</li>
<li><a href="http://ergoemacs.org/emacs/elisp.html">Xah's Emacs Lisp Tutorial</a>.</li>
<li><a href="https://github.com/bddean/xml-plus">XML utilities for Emacs lisp</a>.</li>
<li><a href="https://github.com/xuchunyang/elisp-demos/blob/master/elisp-demos.org">Xu Chunyang's Elisp demos/examples/snippets </a>.</li>
</ul>
]]></description>
    <pubDate>Sat, 20 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Alzheimer bookmarks</title>
<link>https://xenodium.com/alzheimer-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/alzheimer-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://indieweb.social/@cindyweinstein@mastodon.world/112485121178707057">#NYC #Alzheimer's Association hybrid event (in-person and Zoom)</a>.</li>
<li><a href="https://dta.com.au/">Dementia Training Australia (DTA), Free online courses and resources</a>.</li>
<li><a href="https://www.cnn.com/2024/05/16/health/video/gupta-alzheimers-reversed-patient-digvid">Woman claims Alzheimer’s symptoms were reversed after five years | CNN</a>.</li>
</ul>
]]></description>
    <pubDate>Tue, 04 Feb 2025 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Emacs bookmarks</title>
<link>https://xenodium.com/emacs-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/emacs-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://christiantietze.de/posts/2021/06/emacs-center-window-on-current-monitor/">Multi-Monitor Compatible Code to Center Emacs Frames on Screen • Christian Tietze</a>.</li>
<li><a href="https://karthinks.com/software/bridging-islands-in-emacs-1/">Bridging Islands in Emacs: re-builder and query-replace-regexp | Karthinks</a>.</li>
<li><a href="https://www.fosskers.ca/en/blog/contributing-to-emacs">Colin Woodbury - Contributing to Emacs</a>.</li>
<li><a href="https://medium.com/@jrmjrm/configuring-emacs-and-eglot-to-work-with-astro-language-server-9408eb709ab0">Configuring Emacs and Eglot to work with Astro language server | by Jayaram |…</a>.</li>
<li><a href="https://willschenk.com/articles/2020/tramp_tricks/">Emacs Tramp tricks</a>.</li>
<li><a href="https://philjackson.github.io//emacs/shell/2021/07/26/export-an-environment-variable-to-emacs/">Export an environment variable to Emacs | Snippets and other bits</a>.</li>
<li><a href="https://github.com/federicotdn/verb">GitHub - federicotdn/verb: HTTP client for Emacs</a> (alternative to restclient).</li>
<li><a href="https://www.fsf.org/licensing/assigning.html">How to Assign Copyright — Free Software Foundation</a>.</li>
<li><a href="https://ruzkuku.com/texts/lesser-known.html#m-x-find-library-mode-local-ret-2004">Lesser known functionalities in core Emacs (see setq-mode-local)</a>.</li>
<li><a href="https://ruzkuku.com/texts/lesser-known.html">Lesser known functionalities in core Emacs</a>.</li>
<li><a href="https://www.ovistoica.com/blog/2024-7-05-modern-emacs-typescript-web-tsx-config">Modern Emacs Typescript Web (React) Config with lsp-mode, treesitter, tailwin…</a>.</li>
<li><a href="https://www.ovistoica.com/blog/2024-7-05-modern-emacs-typescript-web-tsx-config">Modern Emacs Typescript Web (React) Config with lsp-mode, treesitter, tailwind…</a>.</li>
<li><a href="https://philjackson.github.io/emacs/mu4e/email/2021/08/30/save-all-mu4e-attachments/">Save all mu4e attachments | Snippets and other bits</a>.</li>
<li><a href="https://www.rahuljuliato.com/posts/emacs-docker-podman">Using Emacs for Container Development: Configuring Emacs for Podman and Docker</a>.</li>
</ul>
<p>][Christian Tietze: Emacs: center window on current monitor]].</p>
<ul>
<li><a href="https://github.com/junjiemars/.emacs.d/blob/master/config/gud-cdb.el">.emacs.d/gud-cdb.el (supports lldb)</a>.</li>
<li><a href="https://github.com/junjiemars/.emacs.d/blob/master/config/gud-lldb.el">.emacs.d<em>gud-lldb.el at master · junjiemars</em>.emacs.d · GitHub</a>.</li>
<li><a href="https://emacsthemes.com/">A GNU Emacs Themes Gallery (great for previewing)</a>.</li>
<li><a href="http://irreal.org/blog/?p=5378">A Reminder About Macro Counters</a>.</li>
<li><a href="https://spin.atomicobject.com/2016/05/27/write-emacs-package/">A Simple Guide to Writing &amp; Publishing Emacs Packages</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/ggnekq/a_very_minimal_but_elegant_emacs_i_think/">A very minimal but elegant emacs (I think) : emacs</a>.</li>
<li><a href="http://blog.aaronbieber.com">Aaron Bieber's blog</a>.</li>
<li><a href="http://www.jesshamrick.com/2012/09/10/absolute-beginners-guide-to-emacs/">Absolute Beginner's Guide to Emacs</a>.</li>
<li><a href="https://scripter.co/accessing-devdocs-from-emacs/">Accessing Devdocs from Emacs</a>.</li>
<li><a href="https://blog.d46.us/advanced-emacs-startup">Advanced Techniques for Reducing Emacs Startup Time</a>.</li>
<li><a href="https://github.com/baohaojun/ajoke">Ajoke</a>.</li>
<li><a href="https://amitp.blogspot.com/2019/07/emacs-mode-line-simplified.html">Amit's Thoughts: Emacs mode line simplified</a>.</li>
<li><a href="http://www.masteringemacs.org/article/introduction-magit-emacs-mode-git">An introduction to Magit, an Emacs mode for Git</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/htfwfa/andrea_corallo_gccemacs_update_10_july_16_2020/">Andrea Corallo: gccemacs Update 10 (July 16, 2020)</a>.</li>
<li><a href="http://m00natic.github.io/emacs/emacs-wiki.html">Andrey's Opionated Emacs Guide</a>.</li>
<li><a href="http://danmidwood.com/content/2014/11/21/animated-paredit.html">Animated guide to paredit</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/ehzxhn/any_packagesolution_to_fix_cursor_13_from_top_of/">Any package/solution to fix cursor 1/3 from top of buffer? (ie. alternatives to centered-cursor-mode)</a>.</li>
<li><a href="http://blog.binchen.org/posts/aspell-0-60-8-will-have-direct-support-for-camelcase-words.html">Aspell 0.60.8 will have direct support for camelCase words (Update Emacs flyspell setup)</a>.</li>
<li><a href="https://vxlabs.com/2018/03/30/asynchronous-rsync-with-emacs-dired-and-tramp/">Asynchronous rsync with Emacs, dired and tramp. – vxlabs</a>.</li>
<li><a href="https://oracleyue.github.io/2018/05/13/emacs-setup-md/">Automator to open files in Emacs clients by double-clicks</a>.</li>
<li><a href="https://github.com/emacs-tw/awesome-emacs/blob/master/README.org">Awesome Emacs</a>.</li>
<li><a href="https://github.com/manateelazycat/aweshell">Awesome shell extension eshell with wonderful features</a>.</li>
<li><a href="https://github.com/bzg/emacs-training">Bastien's Emacs training</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/3r9fic/best_practicestip_for_companymode_andor_yasnippet/">Best practices/tip for Companymode and/or YASnippet</a>.</li>
<li><a href="https://github.com/walseb/blimp/blob/master/readme.org">Blimp - Bustling Image Manipulation Package (Emacs)</a>.</li>
<li><a href="https://lars.ingebrigtsen.no/2020/08/02/emacs-on-macos-for-linux-peeps/">Building Emacs on Macos for Linux Peeps – Random Thoughts</a>.</li>
<li><a href="https://beepb00p.xyz/pkm-search.html">Building personal search infrastructure for your knowledge and code | beepb00p</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/969wlv/c_integration_rtags_vs_emacsc=query_vs_ironymode/">C++ Integration: rtags vs emacs-cquery vs irony-mode (Reddit)</a>.</li>
<li><a href="http://cachestocaches.com/2015/8/c-completion-emacs/">C/C++ Completion in Emacs</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/66pq04/cant_get_tern_mode_to_work_properly/">Can't get Tern mode to work properly (Reddit)</a>.</li>
<li><a href="http://irreal.org/blog/?p=7207">Capturing Code Snippets</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/9dg13i/cclsnavigate_semantic_navigat=ion_for_cc/">ccls-navigate: semantic navigation for C/C++/ObjC </a>.</li>
<li><a href="https://github.com/MaskRay/ccls">ccls: C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting</a>.</li>
<li><a href="https://two-wrongs.com/centered-cursor-mode-in-vanilla-emacs">Centered Cursor Mode in Vanilla Emacs</a>.</li>
<li><a href="https://github.com/redguardtoo/emacs.d/issues/827">Chen Bin's councel/ctags/etags config</a>.</li>
<li><a href="https://ddavis.fyi/blog/2018-07-07-emacs-cpp-ide/">Clangd based Emacs C++ IDE (Doug Davis)</a>.</li>
<li><a href="https://twitter.com/magit_emacs/status/1284245544160952320">Colors in emacs -nw (use ~/.Xresources)</a>.</li>
<li><a href="https://people.gnome.org/~federico/blog/compilation-notifications-in-emacs.html">Compilation notifications in Emacs - Federico's Blog</a>.</li>
<li><a href="https://medium.com/@suvratapte/configuring-emacs-from-scratch-intro-3157bed9d040">Configuring Emacs from Scratch — Intro - Suvrat Apte - Medium</a>.</li>
<li><a href="http://codewinds.com/blog/2015-04-02-emacs-flycheck-eslint-jsx.html">Configuring emacs to use eslint and babel with flycheck for javascript and React.js JSX</a>.</li>
<li><a href="http://mbork.pl/Content_AND_Presentation">Content AND Presentation</a>.</li>
<li><a href="https://github.com/redguardtoo/counsel-etags#ctags-setup">counsel-etags: Fast, energy-saving, and powerful code navigation solution</a>.</li>
<li><a href="https://erick.navarro.io/blog/creating-an-emacs-formatter-the-easy-way/">Creating an emacs formatter the easy way</a>.</li>
<li><a href="https://lars.ingebrigtsen.no/2018/11/12/cropping-images-in-emacs/">Cropping Images in Emacs (Lars Ingebrigtsen)</a>.</li>
<li><a href="https://emacs.zeef.com/ehartc">Curated list of packages by Ernst de Hart</a>.</li>
<li><a href="https://gist.github.com/maciejsmolinski/ea09a7b6dfabe70fac040915bc266b5e">Custom REPL snippet</a>.</li>
<li><a href="http://emacs-fu.blogspot.co.uk/2011/08/customizing-mode-line.html">Customizing emacs mode line</a>.</li>
<li><a href="https://zhangda.wordpress.com/">Da's recipes on Emacs, IT, and more (Da Zhang's web notes)</a>.</li>
<li><a href="http://www.modernemacs.com/post/major-mode-part-1/">Deep diving into a major mode - Part 1 | Modern Emacs</a> (handy for writing a REPL).</li>
<li><a href="http://www.modernemacs.com/post/major-mode-part-2/">Deep diving into a major mode - Part 2 (IDE Features) | Modern Emacs</a>.</li>
<li><a href="https://gonewest818.github.io/2020/02/dimmer.el-20200227.1712">dimmer.el (highlights active window)</a>.</li>
<li><a href="http://irreal.org/blog/?p=5380">Directory-Local Variables</a>.</li>
<li><a href="https://github.com/Silex/docker.el/blob/master/README.md">docker.el: Emacs integration for Docker</a>.</li>
<li><a href="https://scripter.co/do-ediff-as-i-mean/">Ediff DWIM function by scripter.co</a>.</li>
<li><a href="https://emacsnotes.wordpress.com/2018/05/14/editing-html-textareas-with-emacs-bye-bye-its-all-text-hello-textern/">Editing HTML Textareas with Emacs: Bye, bye “It’s All Text! “, Hello “Textern&quot;</a>.</li>
<li><a href="https://gleek.github.io/blog/2017/04/11/editing-remote-code-with-emacs/">Editing remote code with Emacs (tramp tips) - Umar Ahmad</a>.</li>
<li><a href="https://lgfang.github.io/mynotes/emacs/emacs-xml.html#sec-5">Editing XML in Emacs</a>.</li>
<li><a href="http://www.masteringemacs.org/articles/2011/01/14/effective-editing-movement/">Effective editing I:Movement</a></li>
<li><a href="http://ergoemacs.org/emacs/effective_emacs.html">Effective emacs tips</a>: From ergoemacs.</li>
<li><a href="https://sites.google.com/site/steveyegge2/effective-emacs">Effective emacs</a>: Steve Yegge's effective emacs tips.</li>
<li><a href="https://ddavis.io/posts/eglot-cpp-ide/">Eglot based Emacs C++ IDE with clangd (ddavis.io)</a>.</li>
<li><a href="https://github.com/sp1ff/elfeed-score/blob/master/README.org">elfeed-score: brings Gnus-style scoring to Elfeed</a>.</li>
<li><a href="https://realpython.com/blog/python/emacs-the-best-python-editor/?utm_content=buffer661a4&amp;utm_medium=social&amp;utm_source=twitter.com&amp;utm_campaign=buffer">Emacs - the Best Python Editor?</a>.</li>
<li><a href="https://qiita.com/advent-calendar/2019/emacs">Emacs Advent Calendar 2019 - Qiita</a>.</li>
<li><a href="https://twitter.com/sanityinc/status/1182877775746588672">Emacs and macOS Catalina issues (twitter)</a>.</li>
<li><a href="https://www.mortens.dev/blog/emacs-and-the-language-server-protocol/">Emacs and the Language Server Protocol - Morten's Dev</a>.</li>
<li><a href="https://joshwolfe.ca/post/emacs-for-csharp/">Emacs as a C# development environment - Josh Wolfe</a>.</li>
<li><a href="https://forums.unrealengine.com/showthread.php?52891-Emacs-as-my-UE4-IDE-with-intellisense">Emacs as my UE4 IDE with intellisense</a>.</li>
<li><a href="https://lars.ingebrigtsen.no/2016/06/28/emacs-can-haz-fancy-meme/">EMACS CAN HAZ FANCY MEME – Random Thoughts</a>.</li>
<li><a href="http://www.swaroopch.com/2013/10/17/emacs-configuration-tutorial">Emacs configuration</a>: Simplify package management with cask.</li>
<li><a href="http://emacsfodder.github.io/">Emacs Fodder</a>.</li>
<li><a href="https://sites.google.com/site/drielsma/xcodeplusemacs">Emacs for Cocoa development</a>.</li>
<li><a href="https://github.com/pierre-lecocq/emacs4developers">Emacs for developers</a>.</li>
<li><a href="https://patrickskiba.com/emacs/2019/09/07/emacs-for-react-dev.html">Emacs for the React developer (Patrick Skiba)</a>.</li>
<li><a href="https://patrickskiba.com/emacs/2019/09/07/emacs-for-react-dev.html">Emacs for the React developer | Patrick Skiba</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/ca6q7v/emacs_for_web_dev_rjsx_webmode_tide_js2etc/">Emacs for Web/Javascript Dev: rjsx, web-mode, tide, js2…..etc?</a>.</li>
<li><a href="http://roupam.github.io/">Emacs for Xcode+ios Development</a>.</li>
<li><a href="https://punchagan.muse-amuse.in/blog/emacs-frame-as-a-pop-up-input/">Emacs frame as a pop-up input - Noetic Nought</a>.</li>
<li><a href="https://huytd.github.io/emacs-from-scratch.html">Emacs from scratch (huytd)</a>.</li>
<li><a href="https://www.redbubble.com/shop/emacs">Emacs Gifts &amp; Merchandise | Redbubble</a>.</li>
<li><a href="https://arenzana.org/2019/12/emacs-go-mode-revisited/">Emacs Go Mode – Revisited – arenzana.org</a>.</li>
<li><a href="http://www.reddit.com/r/emacs/comments/1rck3u/what_do_you_use_to_navigate_code">Emacs goodies</a>: Emacs post with tips for navigating code.</li>
<li><a href="http://emacshorrors.com">Emacs horrors</a>.</li>
<li><a href="https://sachachua.com/blog/2021/04/emacs-hydra-allow-completion-when-i-can-t-remember-the-command-name/">Emacs Hydra: Allow completion when I can't remember the command name</a>.</li>
<li><a href="https://github.com/redguardtoo/mastering-emacs-in-one-year-guide/blob/master/guide-en.org">Emacs in one year</a>: Someone's emacs experience over a year.</li>
<li><a href="http://emacs.sexy/">Emacs is sexy</a>.</li>
<li><a href="http://irreal.org/blog/">Emacs Keybindings for Mac OS X</a>.</li>
<li><a href="https://gist.github.com/avendael/7028579">Emacs keybindings for vimium</a>.</li>
<li><a href="http://overtone.github.io/emacs-live/">Emacs live</a>.</li>
<li><a href="https://phst.eu/emacs-modules">Emacs modules (Philipp’s documents)</a>.</li>
<li><a href="http://www.emacswiki.org/emacs/EmacsNiftyTricks">Emacs Nifty tricks</a>: Another source of emacs goodness.</li>
<li><a href="http://emacsnyc.org/videos.html">Emacs NYC videos</a>.</li>
<li><a href="https://gitea.petton.fr/DamienCassou/khardel">Emacs package integrating khard, a console cardav client</a>.</li>
<li><a href="http://emacsredux.com/">Emacs redux</a>.</li>
<li><a href="http://emacsrocks.com">Emacs rocks</a>.</li>
<li><a href="https://ubolonton.github.io/emacs-module-rs/0.8.0/">Emacs Rust module</a>.</li>
<li><a href="https://alexn.org/wiki/emacs.html">Emacs Setup (macOS) - Alexandru Nedelcu</a>.</li>
<li><a href="https://gist.github.com/rangeoshun/67cb17392c523579bc6cbd758b2315c1">Emacs snippet: Typescript with CSS in JS, JSX and graphql highlighing.</a>.</li>
<li><a href="http://bzg.fr/emacs-strip-tease.html">Emacs striptease (removing furniture)</a>.</li>
<li><a href="https://willschenk.com/articles/2020/tramp_tricks/">Emacs Tramp tricks (including docker snippet)</a>.</li>
<li><a href="https://forums.freebsd.org/threads/emacs-tramp-very-slow-on-connection.64498/">Emacs Tramp very slow on connection (The FreeBSD Forums)</a>.</li>
<li><a href="http://planet.emacsen.org/">Emacs workshop</a>.</li>
<li><a href="http://lavnir.be/wp/">Emacs | less</a>.</li>
<li><a href="https://realpython.com/emacs-the-best-python-editor/">Emacs – The Best Python Editor? – Real Python</a>.</li>
<li><a href="https://idiocy.org/emacs-fonts-and-fontsets.html">Emacs, fonts and fontsets</a>.</li>
<li><a href="https://jherrlin.github.io/posts/emacs-gnupg-and-pass/">Emacs, GnuPG and Pass | jherrlin</a>.</li>
<li><a href="https://github.com/mathiasdahl/emacs-launcher">emacs-launcher: A launcher for programs, files, folders, web pages and other, using Emacs (supersedes anything-launcher)</a>.</li>
<li><a href="https://github.com/emacs-lsp/dap-mode#swift">emacs-lsp/dap-mode: Debug Adapter Protocol for Emacs (Swift included)</a>.</li>
<li><a href="https://github.com/emacs-lsp/lsp-ivy/tree/78c1429c62c19006058b89d462657e1448d1e595">emacs-lsp/lsp-ivy: ivy workspace symbols offered by lsp-mode</a>.</li>
<li><a href="https://github.com/shshkn/emacs.d/blob/master/docs/nativecomp.md">emacs.d/nativecomp.md (gccemacs)</a>.</li>
<li><a href="https://www.alexgallego.org/emacs/productivity/2016/01/16/emacs-no-modeline.html">Emacs: No modeline</a>.</li>
<li><a href="https://realpython.com/emacs-the-best-python-editor/">Emacs: The Best Python Editor? – Real Python</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/hhbcg7/emacsclient_eval_with_command_line_arguments/">Emacsclient –eval with command line arguments? : emacs</a>.</li>
<li><a href="http://emacslife.com/">Emacslife</a>.</li>
<li><a href="https://github.com/cireu/emacsql-sqlite3">emacsql-sqlite3: Yet another EmacSQL backend for SQLite</a>.</li>
<li><a href="https://www.emacswiki.org/emacs/CreatingYourOwnCompileErrorRegexp">EmacsWiki: Creating Your Own Compile Error Regexp</a>.</li>
<li><a href="https://www.emacswiki.org/emacs/EshellForLoop">EmacsWiki: Eshell For Loop</a>.</li>
<li><a href="https://github.com/jonnay/emagicians-starter-kit">Emagicians starter kit</a>.</li>
<li><a href="https://github.com/m-parashar/emax64">emax64: 64-bit Emacs for Windows with ImageMagick 7</a>.</li>
<li><a href="http://endlessparentheses.com">Endless parenthesis</a>.</li>
<li><a href="http://www.skybert.net/emacs/java/">Enterprise Java Development in Emacs</a>.</li>
<li><a href="https://ambrevar.xyz/emacs-eshell/">Eshell as a main shell</a>.</li>
<li><a href="https://github.com/kaihaosw/eshell-prompt-extras/blob/master/README.md">eshell-prompt-extras: Display extra information and color for your eshell prompt</a>.</li>
<li><a href="http://www.misshula.org/category/tutorials.html">Evan Misshula (lots of great tutorials)</a>.</li>
<li><a href="http://edkolev.github.io/posts/2017-09-10-travis-for-emacs-packages.html">Evgeni Kolev Blog - Travis CI integration for emacs packages</a>.</li>
<li><a href="http://mitchfincher.blogspot.co.uk/2017/03/example-of-syntax-highlighting-with.html">Example of Syntax Highlighting</a>.</li>
<li><a href="https://francismurillo.github.io/2017-04-15-Exploring-Emacs-chart-Library/">Exploring Emacs chart Library (chart-bar-quickie)</a>.</li>
<li><a href="https://twitter.com/maciejsmolinski/status/1269886224774451200">extend #emacs to run an interactive REPL process</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/973418/feedbuilderel_an_rss_and_atom=_generator/">feed-builder.el: An RSS (and Atom?) generator : emacs</a>.</li>
<li><a href="http://irreal.org/blog/?p=7359">Find Commits Affecting a Function (Irreal)</a>.</li>
<li><a href="https://github.com/d11wtq/fiplr">Fiplr</a>: An Emacs Fuzzy Find in Project Package.</li>
<li><a href="https://gist.github.com/dive/f64c645a9086afce8e5dd2590071dbf9">Fix Emacs permissions on macOS Catalina</a>.</li>
<li><a href="https://github.com/lewang/flx">Flx for emacs</a>: Sublime-style searching for emacs.</li>
<li><a href="https://manuel-uberti.github.io//emacs/2019/07/18/reformatter/">Format XML like a pro</a>.</li>
<li><a href="https://juanjoalvarez.net/es/detail/2014/sep/19/vim-emacsevil-chaotic-migration-guide/">From Vim to Emacs+Evil chaotic migration guide</a>.</li>
<li><a href="http://fukuyama.co">Fukuyama's Emacs/iOS</a>.</li>
<li><a href="https://gist.github.com/mikroskeem/0a5c909c1880408adf732ceba6d3f9ab#gistcomment-3294346">gccemacs on OSX (mikroskeem's gist)</a>.</li>
<li><a href="https://gitlab.com/koral/gcmh">GCMH - the Garbage Collector Magic Hack</a>.</li>
<li><a href="https://blog.hoetzel.info/post/eshell-notifications">Get desktop notifications from Emacs shell commands ·</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/e8cm8x/get_stackoverflow_answers_with_completion_without/">Get Stackoverflow answers with completion (without Helm) : emacs</a>.</li>
<li><a href="https://github.com/GhostText/GhostText/blob/master/README.md">GhostText: Use Emacs to write in your browser</a>.</li>
<li><a href="http://whatworks4me.wordpress.com/2011/04/13/view-git-diffs-in-emacs-using-ediff/">Git diffs using Emacs ediff</a>.</li>
<li><a href="https://github.com/akirak/git-identity.el">git-identity.el: Manage multiple Git identities from inside Emacs</a>.</li>
<li><a href="https://github.com/alphapapa/yequake">GitHub - alphapapa/yequake: Drop-down Emacs frames, like Yakuake (modal emacs frames)</a>.</li>
<li><a href="https://github.com/AndreaCrotti/yasnippet-snippets">GitHub - AndreaCrotti/yasnippet-snippets: a collection of yasnippet</a>.</li>
<li><a href="https://github.com/bastibe/annotate.el">GitHub - bastibe/annotate.el: Annotate.el</a>.</li>
<li><a href="https://github.com/bzg/emacs-training">GitHub - bzg/emacs-training: Emacs training</a>.</li>
<li><a href="https://github.com/CeleritasCelery/company-async-files">GitHub - CeleritasCelery/company-async-files: company-files with an async banckend</a>.</li>
<li><a href="https://github.com/chuntaro/epaint">GitHub - chuntaro/epaint: A simple paint tool for Emacs</a>.</li>
<li><a href="https://github.com/dieggsy/esh-autosuggest">GitHub - dieggsy/esh-autosuggest: Fish-like autosuggestions in eshell.</a>.</li>
<li><a href="https://github.com/emacs-jp/dmacro">GitHub - emacs-jp/dmacro: Repeated detection and execution of key operationw</a>.</li>
<li><a href="https://github.com/gexplorer/simple-modeline">GitHub - gexplorer/simple-modeline: A simple mode-line for Emacs.</a>.</li>
<li><a href="https://github.com/joaotavora/eglot">GitHub - joaotavora/eglot: A client for Language Server Protocol servers</a>.</li>
<li><a href="https://github.com/mmontone/template-overlays">GitHub - mmontone/template-overlays: Emacs overlays for template files</a>.</li>
<li><a href="https://github.com/p3r7/space-theming">GitHub - p3r7/space-theming: A port of Spacemacs theming layer to vanilla Emacs</a>.</li>
<li><a href="https://github.com/politza/pdf-tools">GitHub - politza/pdf-tools: Emacs support library for PDF files.</a>.</li>
<li><a href="https://github.com/rougier/elegant-emacs">GitHub - rougier/elegant-emacs: A very minimal but elegant emacs (I think)</a>.</li>
<li><a href="https://github.com/sebastiencs/company-box">GitHub - sebastiencs/company-box: A company front-end with icons</a>.</li>
<li><a href="https://github.com/takaxp/moom">GitHub - takaxp/moom: A Moom port to Emacs - Make your dominant hand FREE from your mouse (easily move frames)</a>.</li>
<li><a href="https://github.com/wbolster/emacs-direnv">GitHub - wbolster/emacs-direnv: direnv integration for emacs</a>.</li>
<li><a href="https://github.com/xuchunyang/another-emacs-server">GitHub - xuchunyang/another-emacs-server: An Emacs server built on HTTP and JSON</a>.</li>
<li><a href="https://github.com/yyoncho/dap-mode/">GitHub - yyoncho/dap-mode: Debug Adapter Protocol for Emacs (Java/Python)</a>.</li>
<li><a href="https://github.com/zk-phi/electric-case">GitHub - zk-phi/electric-case: automatic foo-bar to fooBar and foo_bar</a>.</li>
<li><a href="https://github.com/stapelberg/configfiles/blob/master/.github/workflows/emacs.yml">Github continuous integration for your Emacs init (yml config)</a>.</li>
<li><a href="https://github.com/rememberYou/.emacs.d/blob/b00402c2b51d0435ca8b0267ef71f5fa3558d41a/config.org#gnuplot">gnuplot Emacs config</a>.</li>
<li><a href="https://github.com/benma/go-dlv.el">Go Delve - Debug Go programs interactively with the GUD</a>.</li>
<li><a href="https://www.bytedude.com/gpg-in-emacs/">GPG In Emacs | Bytedude</a>.</li>
<li><a href="http://doc.rix.si/org/fsem.html">Hardcore Freestyle Emacs</a>.</li>
<li><a href="https://github.com/bbatsov/projectile">Helm Projectile</a>: Is awesome for finding files in emacs.</li>
<li><a href="https://www.emacswiki.org/emacs/HelpPlus">Help Plus: Enhancing Emacs help functions</a>.</li>
<li><a href="https://github.com/jekor/hidepw">hidepw - an Emacs minor mode for hiding passwords</a>.</li>
<li><a href="https://hotair.tech/blog/goodbye-vscode">Hot Air - Goodbye VSCode, Hello Emacs (Again) has handy JavaScript tips</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/efsg0t/how_i_enqueue_online_videos_in_mpv_with_emacs/">How I enqueue online videos in mpv with Emacs : emacs</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/f3ed3r/how_is_doom_emacs_so_damn_fast/">How is Doom Emacs so damn fast? : emacs</a>.</li>
<li><a href="https://github.com/hlissner/doom-emacs/wiki/FAQ#how-is-dooms-startup-so-fast">How is Doom’s startup so fast?</a></li>
<li><a href="http://blog.yitang.uk/2015/09/24/how-to-create-a-screencast-gif-in-emacs/">How to Create a Screencast GIF in Emacs</a>.</li>
<li><a href="https://nullprogram.com/blog/2013/02/06/">How to Make an Emacs Minor Mode</a>.</li>
<li><a href="https://yoo2080.wordpress.com/2011/12/01/how-to-run-a-new-instance-of-emacs-from-within-emacs-2/">How to run a new instance of emacs from within emacs | Yoo Box</a>.</li>
<li><a href="https://sixty-north.com/blog/series/how-to-write-company-mode-backends.html">How to write company-mode backends</a>.</li>
<li><a href="http://tim.hibal.org/blog/how-we-wrote-a-textbook">How We Wrote a Textbook &amp; (Tim Wheeler)</a>.</li>
<li><a href="http://www.howardism.org/Technical/Emacs/piper-presentation-transcript.html">Howard Abrams's Death to the Shell presentation</a>.</li>
<li><a href="https://github.com/howardabrams/dot-files/blob/master/emacs-eshell.org">Howard Abrams's eshell config</a>.</li>
<li><a href="https://github.com/chrisbarrett/swift-mode">hrisbarrett/swift-mode</a>.</li>
<li><a href="https://github.com/iamleeg/swift-mode">iamleeg/swift-mode</a>.</li>
<li><a href="https://vxlabs.com/2019/08/25/format-flowed-with-long-lines/">Improve the plaintext email experience through format=flowed with long lines. - vxlabs (mu4e)</a>.</li>
<li><a href="https://github.com/mkcms/interactive-align">interactive-align: Interactively align by regular expression in emacs</a>.</li>
<li><a href="http://skybert.net/emacs/investigating-emacs-cpu-usage/">investigating Emacs CPU usage</a>.</li>
<li><a href="http://ivanmalison.github.io/dotfiles/#go">Ivan Malison's Go config </a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/57fnar/ivy_completion_at_point_in_an_overlay/">Ivy completion at point in an overlay : emacs</a>.</li>
<li><a href="https://writequit.org/denver-emacs/presentations/2017-04-11-ivy.html">Ivy, Counsel and Swiper (writequit.org)</a>.</li>
<li><a href="https://github.com/Yevgnen/ivy-rich/">ivy-rich: An ivy wrapper providing additional customizations </a>.</li>
<li><a href="https://github.com/squiter/ivy-youtube">ivy-youtube: Search for an Youtube video inside Emacs with Ivy</a>.</li>
<li><a href="https://github.com/skeeto/javadoc-lookup">javadoc-lookup</a>.</li>
<li><a href="http://blog.binchen.org/posts/javascript-code-navigation-in-counsel-etags.html">Javascript code navigation in counsel-etags (Chen's blog)</a>.</li>
<li><a href="http://truongtx.me/2014/02/23/set-up-javascript-development-environment-in-emacs/">Javascript development environment</a>.</li>
<li><a href="https://github.com/jcs-elpa/parse-it">jcs-elpa/parse-it: Basic Parser in Emacs Lisp (Swift and ObjC included)</a>.</li>
<li><a href="http://www.xiangji.me/">JI Xiang</a>.</li>
<li><a href="https://gitlab.com/jjzmajic/handle">jjzmajic / handle: A handle for major-mode generic functions.</a>.</li>
<li><a href="https://hackr.io/tutorials/learn-emacs">Learn Emacs - 2019 Most Recommended Emacs Tutorials | Hackr.io</a>.</li>
<li><a href="https://github.com/rememberYou/.emacs.d/blob/b00402c2b51d0435ca8b0267ef71f5fa3558d41a/config.org#ledger">Ledger Emacs config</a>.</li>
<li><a href="http://www.lunaryorn.com/">Lunarsite</a>.</li>
<li><a href="https://spin.atomicobject.com/2019/12/12/fixing-emacs-macos-catalina/">macOS Catalina: Fixing Emacs After an Upgrade</a>.</li>
<li><a href="https://magit.vc/manual/magit/Wip-Modes.html">Magit User Manual: Wip Modes</a>.</li>
<li><a href="https://github.com/legoscia/messages-are-flowing">Make it easier to send &quot;flowed&quot; email messages from Emacs (mu4e)</a>.</li>
<li><a href="http://www.lunaryorn.com/posts/make-your-emacs-mode-line-more-useful.html">Make your Emacs Mode Line more useful - Sebastian Wiesner</a>.</li>
<li><a href="http://zeekat.nl/articles/making-emacs-work-for-me.html">Making Emacs work for me</a>.</li>
<li><a href="https://ebzzry.io/en/emacs-dired/">Managing Directories with Emacs (dired)</a>.</li>
<li><a href="http://mbork.pl/2019-03-18_Free_Emacs_key_bindings">Marcin Borkowski: 2019-03-18 Free Emacs key bindings</a>.</li>
<li><a href="http://mbork.pl/2019-07-08_Pausing_an_Emacs_keyboard_macro">Marcin Borkowski: 2019-07-08 Pausing an Emacs keyboard macro</a>.</li>
<li><a href="http://mbork.pl/2015-07-04_C-x_4_bindings">Marcin Borkowski: C-x 4 bindings</a>.</li>
<li><a href="https://github.com/elpa-host/marquee-header">Marquee header (scrolling text header/notification)</a>.</li>
<li><a href="http://www.masteringemacs.org">Mastering Emacs</a>.</li>
<li><a href="https://github.com/mopemope/meghanada-emacs">Meghanada-Mode: A Better Java Development Environment for Emacs</a>.</li>
<li><a href="https://lars.ingebrigtsen.no/2017/10/15/meme-x-giffy/">meme x giffy – Random Thoughts</a>.</li>
<li><a href="https://two-wrongs.com/migrating-away-from-use-package.html">Migrating Away From Use-Package</a>.</li>
<li><a href="http://truongtx.me/2013/03/10/emacs-setting-up-perfect-environment-for-cc-programming">More emacs C++ goodness</a>: More emacs dev environment tips.</li>
<li><a href="https://groups.google.com/forum/m/#!topic/mu-discuss/JqHEGycEyKI">mu4e &amp; xwidget / webkit snippet</a>.</li>
<li><a href="http://www.macs.hw.ac.uk/~rs46/posts/2014-11-16-mu4e-signatures.html">Multiple Email Signatures with mu4e</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/e79l6c/my_companyposframe_configuration_displaying/">My company-posframe configuration displaying backend names</a>.</li>
<li><a href="http://www.lunaryorn.com/2015/01/06/my-emacs-configuration-with-use-package.html">My Emacs Configuration with use-package</a>.</li>
<li><a href="https://gridsome.netlify.com/blog/2018/11/18/my-emacs-development-workflow/">My emacs development workflow</a>.</li>
<li><a href="http://www.pygopar.com/my-java-android-and-eclim-setup/">My Java, Android and Eclim Setup</a>.</li>
<li><a href="https://admiralakber.github.io/2018/09/20/myos-email/">myOS / email - Building the perfect email setup (Emacs/notmuch/mbsync)</a>.</li>
<li><a href="https://joelmccracken.github.io/entries/name-emacs-daemons-with-the-daemon-equals-option/">Name Emacs Daemons With the '–daemon=' Option</a>.</li>
<li><a href="https://github.com/DamienCassou/navigel">navigel: Emacs library to facilitate the creation of tabulated-list based UIs</a>.</li>
<li><a href="http://bbbscarter.wordpress.com/category/coding/emacs/">Nerdgasms's Emacs tips</a>.</li>
<li><a href="https://github.com/codesuki/bazel-mode">Neri Marschik's bazel-mode: Basic Bazel support for Emacs</a>.</li>
<li><a href="http://was.tl/projects/nimble/">Nimble (markdown replacement)</a>.</li>
<li><a href="http://angelic-sedition.github.io/">Nocturnal Artifice</a>.</li>
<li><a href="https://github.com/danielmartin/ns-playgrounds">ns-playgrounds: Execute Swift and Objective C code snippets in Emacs (Extended org babel support)</a>.</li>
<li><a href="https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/">Nuclear weapon multi-editing via Ivy and Ag · Samuel Barreto</a>.</li>
<li><a href="http://renard.github.io/o-blog-v2/">o-blog</a>.</li>
<li><a href="https://github.com/al-skobelev/objc-yassnippets/tree/master/objc-mode">Objective-C snippets #1</a>.</li>
<li><a href="https://github.com/altschuler/yas-objc">Objective-C snippets #2</a>.</li>
<li><a href="https://github.com/al-skobelev/objc-yassnippets">Objective-C snippets #3</a>.</li>
<li><a href="https://github.com/bodil/ohai-emacs">Ohai Emacs</a>.</li>
<li><a href="https://gitlab.liu.se/davby02/olc">olc: Open Location Code support for Emacs</a>.</li>
<li><a href="http://oremacs.com/">Or Emacs</a>.</li>
<li><a href="https://karl-voit.at/orgmode/">Organize Your Life With Org-Mode</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/c0bg27/outlookstyle_html_replies_with_mu4e/">Outlook-style HTML replies with mu4e</a>.</li>
<li><a href="https://patrickskiba.com/unix/tools/2019/09/18/password-management-with-pass.html">Password Management with Pass and Emacs (Patrick Skiba)</a>.</li>
<li><a href="https://peach-melpa.org/">PeachMelpa (Browse Emacs themes from MELPA)</a>.</li>
<li><a href="https://stuff.mit.edu/iap/2007/emacs/emacs-slides-1.pdf">Phil Sung's Emacs slides</a>.</li>
<li><a href="http://www.philandstuff.com/">Philip Potter Emacs blog</a>.</li>
<li><a href="https://github.com/jcaw/porthole">Porthole: RPC servers for Emacs</a>.</li>
<li><a href="https://yiufung.net/post/anki-org/">Power up Anki with Emacs, Org mode, anki-editor and more</a>.</li>
<li><a href="https://github.com/bbatsov/prelude">Prelude emacs distribution</a>.</li>
<li><a href="https://github.com/raxod502/prescient.el/blob/master/README.md">prescient.el: simple but effective sorting and filtering for Emacs (ivy and company).</a>.</li>
<li><a href="http://www.howardism.org/Technical/Emacs/eshell-present.html">Presenting the Eshell</a>.</li>
<li><a href="https://www.projectile.mx/en/latest/projects/">Projects - Projectile: The Project Interaction Library for Emacs</a>.</li>
<li><a href="http://punchagan.muse-amuse.in/posts/index.html">Punchagan's blog</a>.</li>
<li><a href="https://github.com/purcell/emacs.d/blob/4c81c50ba77d165df8008dd5905f8c49102793d4/lisp/init-site-lisp.el#L7-L22">Purcell's way to add downloaded repos to load-path</a>.</li>
<li><a href="http://justinhj.github.io/2018/10/24/radix-trees-dash-and-company-mode.html">Radix trees, Dash and Company mode</a>.</li>
<li><a href="https://github.com/syl20bnr/spacemacs/blob/master/layers/%2Bframeworks/react/README.org">React contribution layer for Spacemacs</a>.</li>
<li><a href="http://emacslife.com/how-to-read-emacs-lisp.html">Read Lisp, Tweak Emacs: How to read Emacs Lisp so that you can customize Emacs</a>.</li>
<li><a href="http://draketo.de/light/english/free-software/read-your-python-module-documentation-emacs">Read your python module documentation from Emacs</a>.</li>
<li><a href="http://pragmaticemacs.com/category/elfeed/">Read your RSS feeds in emacs with elfeed</a>.</li>
<li><a href="https://github.com/purcell/reformatter.el/blob/master/README.md">reformatter.el: Define commands which run reformatters on the current Emacs buffer</a>.</li>
<li><a href="https://emacsredux.com/blog/2013/09/25/removing-key-bindings-from-minor-mode-keymaps/">Removing/Altering Key Bindings from Minor Mode Keymaps · Emacs Redux</a>.</li>
<li><a href="https://github.com/brown/bazel-mode">Robert Brown's bazel-mode: GNU Emacs mode for editing Bazel BUILD files</a>.</li>
<li><a href="https://github.com/rougier/svg-lib">rougier/svg-lib: Emacs SVG libraries for creatings tags, icons and bars</a>.</li>
<li><a href="https://github.com/Andersbakken/rtags/commit/ad3026cdd1d6c1e0a2728fb4992addcb76605487">rtags: Implement 'rename with multiple cursors'</a>.</li>
<li><a href="http://rubikitch.com/">Rubikitch</a>.</li>
<li><a href="http://sachachua.com">Sachua Chua</a>.</li>
<li><a href="http://sakito.jp/emacs/emacsobjectivec.html">Sakito's Emacs Objective-C</a>.</li>
<li><a href="http://lahtela.me/blog/2020/05/21/setting-up-emacs-for-qt-development.html">Setting up Emacs for Qt (C++) development - LSP</a>.</li>
<li><a href="https://lars.ingebrigtsen.no/2019/08/26/setting-up-gpg-for-emacs/">Setting up GPG for Emacs (Random Thoughts)</a>.</li>
<li><a href="https://superuser.com/questions/432160/slow-tramp-mode-in-emacs">Slow TRAMP mode in Emacs (Super User)</a>.</li>
<li><a href="https://ebzzry.io/en/emacs-pairs/">Smartparens: Emacs and Pairs article</a>.</li>
<li><a href="http://stackoverflow.com/questions/673554/how-can-i-refactor-c-source-code-using-emacs">SO: How can I refactor C++ source code using emacs?</a>.</li>
<li><a href="http://psung.blogspot.co.uk/2010/03/some-emacs-macro-tricks.html">Some Emacs macro tricks</a>.</li>
<li><a href="https://www.baty.net/2019/spaceline-for-emacs/">Spaceline for Emacs (Jack Baty's weblog)</a>.</li>
<li><a href="https://www.draketo.de/english/emacs/staying-sane-drudge-work">Staying sane with Emacs (when facing drudge work) (Zwillingssterns Weltenwald)</a>.</li>
<li><a href="https://vxlabs.com/2016/04/11/step-by-step-guide-to-c-navigation-and-completion-with-emacs-and-the-clang-based-rtags/">Step-by-step guide to C++ navigation and completion with Emacs and the Clang-based rtags</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/370k9p/stock_emacs_tips/">Stock Emacs tips (Reddit)</a>.</li>
<li><a href="http://pragmaticemacs.com/emacs/super-spotlight-search-with-counsel/">Super spotlight search with ivy/counsel (Pragmatic Emacs)</a>.</li>
<li><a href="https://github.com/danielmartin/swift-helpful">swift-helpful: A Self-Documenting Emacs Programming Environment for Swift</a>.</li>
<li><a href="https://www.wisdomandwonder.com/article/10474/techne-emacs-friendly-keyboard-operations-keys">Techne (Emacs Friendly Keyboard): Operations Keys | Wisdom and Wonder</a>.</li>
<li><a href="http://www.wilfred.me.uk/blog/2018/01/06/the-emacs-guru-guide-to-key-bindings/">The Emacs Guru Guide to Key Bindings – Wilfred Hughes::Blog</a>.</li>
<li><a href="https://github.com/alphapapa/emacs-package-dev-handbook">The Emacs Package Developer's Handbook</a>.</li>
<li><a href="http://batsov.com/articles/2011/11/30/the-ultimate-collection-of-emacs-resources/">The Ultimate Collection of Emacs Resources</a>.</li>
<li><a href="https://github.com/thierryvolpiatto/emacs-tv-config/blob/master/mu4e-config.el">thierryvolpiatto's mu4e config </a>.</li>
<li><a href="https://github.com/ananthakumaran/tide">Tide: TypeScript Interactive Development Environment for Emacs</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/audffp/tip_how_to_use_a_stable_and_fast_environment_to/">TIP: How to use a stable and fast environment to develop in C++ : emacs</a>.</li>
<li><a href="https://emacs.stackexchange.com/questions/16489/tramp-is-unbearably-slow-osx-ssh">TRAMP is unbearably slow (OSX, ssh) - Emacs Stack Exchange</a>.</li>
<li><a href="https://stackoverflow.com/a/16408592">Tramp: Open file via SSH and Sudo with Emacs - Stack Overflow</a>.</li>
<li><a href="http://truongtx.me/categories.html#emacs-ref">Trần Xuân Trường's Emacs posts</a>.</li>
<li><a href="https://github.com/MetroWind/dotfiles-mac/blob/6c5af32349edb2764876ed6c1392fe5fc5a6f6ca/emacs/files/.emacs-pkgs/tsmanip.el">tsmanip.el manipulate timestamps/dates anywhere like org shift up/down</a>.</li>
<li><a href="http://tuhdo.github.io/c-ide.html">Tuhdo's C/C++ dev on Emacs</a>.</li>
<li><a href="https://tuhdo.github.io/emacs-tutor3.html">Tuhdo's Emacs Mini Manual (PART 3) - CUSTOMIZING AND EXTENDING EMACS</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/hztv4a/tutorial_for_building_gccemacs_on_macos_catalina/">Tutorial for building gccemacs on MacOS catalina</a>.</li>
<li><a href="http://tv.uvigo.es/gl/serial/513.html">Universidad de Vigo's Emacs course</a>.</li>
<li><a href="https://karl-voit.at/2018/07/08/emacs-key-bindings/">UOMF: My Emacs Key Binding Strategy</a>.</li>
<li><a href="https://www.johndcook.com/blog/2018/01/27/emacs-features-that-use-regular-expressions/">Uses of regular expressions in Emacs (John D. Cook)</a>.</li>
<li><a href="https://www.johndcook.com/blog/2018/01/27/emacs-features-that-use-regular-expressions/">Uses of regular expressions in Emacs</a>.</li>
<li><a href="http://dance.computer.dance/posts/2015/04/using-ctags-on-modern-javascript.html">Using ctags on modern Javascript (handy for Emacs)</a>.</li>
<li><a href="http://www.pygopar.com/using-emacs-and-eclim-for-android-development/">Using Emacs and Eclim for Android Development</a>.</li>
<li><a href="https://lispcookbook.github.io/cl-cookbook/emacs-ide.html">Using Emacs as an IDE (The Common Lisp Cookbook)</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/fojc1y/using_viewmode_for_modal_navigation/">Using view-mode for modal navigation : emacs</a>.</li>
<li><a href="https://github.com/DamienCassou/vdirel">vdirel vdir (calendars and contacts) for Emacs</a>.</li>
<li><a href="https://vedang.me/tinylog/emacs-28-native-comp-ubuntu-20-04/">Vedang Manerikar | Compiling and Running Emacs 28 from the native-comp</a>.</li>
<li><a href="http://pragmaticemacs.com/emacs/view-and-annotate-pdfs-in-emacs-with-pdf-tools/">View and annotate PDFs in Emacs with PDF-tools (Pragmatic Emacs)</a>.</li>
<li><a href="https://www.reddit.com/r/emacs/comments/eeyhdz/weekly_tipstricketc_thread/">Weekly tips/trick/etc/ thread : multiple-cursors-mode using helm/counsel</a>.</li>
<li><a href="http://emacs.stackexchange.com/questions/2571/what-emacs-communities-exist">What Emacs communities exist?</a></li>
<li><a href="http://whattheemacsd.com/">What the Emacsd</a>.</li>
<li><a href="https://github.com/yanghaoxie/which-key-posframe">which-key-posframe: Let emacs-which-key use posframe to show its popup.</a>.</li>
<li><a href="http://wikemacs.org/wiki/TRAMP">WikEmacs - TRAMP</a>.</li>
<li><a href="http://www.wisdomandwonder.com/">Wisdom and Wonder</a>.</li>
<li><a href="https://emacs.stackexchange.com/questions/22306/working-with-tramp-mode-on-slow-connection-emacs-does-network-trip-when-i-start/22307">Working with tramp mode on slow connection</a>.</li>
<li><a href="https://github.com/company-mode/company-mode/wiki/Writing-backends">Writing company backends</a>.</li>
<li><a href="https://joaotavora.github.io/yasnippet/snippet-development.html">Writing yasnippets</a>.</li>
<li><a href="http://ergoemacs.org/emacs/emacs_list_and_set_font.html">Xah Lee's Emacs: Set Font</a>.</li>
<li><a href="http://www.xref.sk/xrefactory/main.html">Xrefactory: A C/C++ Refactoring Browser for Emacs and XEmacs</a>.</li>
<li><a href="https://github.com/Kungsgeten/yankpad">yankpad: Paste yasnippets from an org-mode file</a>.</li>
<li><a href="https://github.com/zegal/yasobjc">Yasnippet generator for Cocoa iphone SDK</a>.</li>
<li><a href="https://github.com/zk-phi/git-complete">Yet another completion engine powered by git grep</a>.</li>
<li><a href="https://plomlompom.com/guides/emacs.html">Yet another introduction to Emacs</a>.</li>
<li><a href="http://emacs.readthedocs.io/en/latest/">Yi Tang's road to emacs documentation on readthedocs.io</a>.</li>
<li><a href="https://github.com/yurikhan/yk-color">yk-color: Elisp library for linear RGB color manipulation</a>.</li>
<li><a href="https://yoo2080.wordpress.com/category/emacs/">Yoo Box's Emacs category</a>.</li>
<li><a href="http://ericscrosson.wordpress.com">Zen in the Art of Emacs</a>.</li>
<li><a href="http://akrl.sdf.org/">‎The Emacs Garbage Collection Magic Hack</a>.</li>
</ul>
]]></description>
    <pubDate>Fri, 19 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Resetting gnome-terminal preferences</title>
<link>https://xenodium.com/resetting-gnome-terminal-preferences</link>
<guid isPermaLink="false">https://xenodium.com/resetting-gnome-terminal-preferences</guid>
    <description><![CDATA[<h2>Resetting preferences</h2>
<pre><code class="language-{.bash">gconftool --recursive-unset /apps/gnome-terminal
</code></pre>
<h2>Want 256 colors?</h2>
<p>Edit .bash_profile</p>
<pre><code class="language-{.bash">export TERM=&quot;screen-256color&quot;
</code></pre>
<h2>Ensure .bash_profile is loaded</h2>
<p>From gnome-terminal window:</p>
<blockquote>
<p>gnome-terminal Edit Profiles… Edit Title and Command X Run command as login shell</p>
</blockquote>
<h2>Solarized</h2>
<p>Bonus: See <a href="http://codefork.com/blog/index.php/2011/11/27/getting-the-solarized-theme-to-work-in-emacs">post</a> to get solarized on gnome-terminal.</p>
]]></description>
    <pubDate>Thu, 11 Sep 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>C++ bookmarks</title>
<link>https://xenodium.com/cpp-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/cpp-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://nickdesaulniers.github.io/blog/2015/07/23/additional-c-slash-c-plus-plus-tooling/">Additional C/C++ Tooling</a>.</li>
<li><a href="https://leanpub.com/cppbestpractices/c/release_799">C++ Best Practices</a>.</li>
<li><a href="https://github.com/isocpp/CppCoreGuidelines">C++ Core Guidelines</a>.</li>
<li><a href="http://cppreference.com">cppreference.com</a>.</li>
<li><a href="https://github.com/romkatv/gitstatus/blob/master/docs/listdir.md">Fast directory listing</a>.</li>
<li><a href="https://github.com/Dobiasd/FunctionalPlus">FunctionalPlus: helps you write concise and readable C++ code</a>.</li>
<li><a href="https://github.com/mozilla/rr">GitHub - mozilla/rr: Record and Replay Framework (debugging)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24361469">Modern C | Hacker News</a>.</li>
<li><a href="http://www.murrayc.com/permalink/2015/12/05/modern-c-variadic-template-parameters-and-tuples/">Modern C++: Variadic template parameters and tuples</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=35758898">My favorite C compiler flags during development | Hacker News</a>.</li>
<li><a href="http://www.artima.com/cppsource/top_cpp_aha_moments.html">My Most Important C++ Aha! Moments…Ever</a>.</li>
<li><a href="http://www.amazon.co.uk/Programming-Principles-Practice-Using-C/dp/0321992784">Programming: Principles and Practice Using C++ Paperback</a>.</li>
<li><a href="https://samthursfield.wordpress.com/2015/10/20/some-cmake-tips/">Some CMake tips</a>.</li>
<li><a href="http://vitiy.info/Slides/MeetingCPP2015/MeetingCPP2015Complexity.pdf">The ways to avoid complexity in modern C++</a>.</li>
</ul>
]]></description>
    <pubDate>Thu, 09 Oct 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Java bookmarks</title>
<link>https://xenodium.com/java-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/java-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://github.com/cxxr/better-java">Better Java</a>.</li>
<li><a href="http://www.nurkiewicz.com/2014/11/executorservice-10-tips-and-tricks.html?m=1">ExecutorService - 10 tips and tricks</a>.</li>
<li><a href="http://www.odi.ch/prog/design/newbies.php#21">Java anti-patterns</a>.</li>
<li><a href="http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html">Java Generics FAQs</a>.</li>
<li><a href="https://code.google.com/p/lanterna/">Lanterna</a>, a text GUI (a la ncurses) written in Java.</li>
<li><a href="https://github.com/winterbe/java8-tutorial">Modern Java - A Guide to Java 8</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Browser bookmarks</title>
<link>https://xenodium.com/browser-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/browser-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://www.dillo.org">Dillo</a>.</li>
<li><a href="https://fingers.today/tech/firefox-app-mode">Firefox: no window borders or other decoration</a>.</li>
<li><a href="http://www.netsurf-browser.org/">NetSurf</a>.</li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/single-file/">SingleFile | Save a page as a single HTML file</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Node bookmarks</title>
<link>https://xenodium.com/node-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/node-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="http://blog.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/">How to use npm as a Build Tool</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>JavaScript bookmarks</title>
<link>https://xenodium.com/javascript-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/javascript-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://medium.com/@serbanmihai/javascript-es6-cheatsheet-map-weakmap-1339b7b80c13">#javascript ES6 cheatsheet — Map &amp; WeakMap – Mihai Serban – Medium</a>.</li>
<li><a href="https://github.com/ivopetkov/responsively-lazy">A better way to lazy load responsive images</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=9822975">Airbnb JavaScript Style Guide</a>.</li>
<li><a href="http://rrees.me/2015/06/04/overview-of-javascript-reactive-frameworks/">An overview of JavaScript reactive frameworks</a>.</li>
<li><a href="https://babeljs.io/">Babel Javascript compiler</a>.</li>
<li><a href="http://www.helloerik.com/the-subtle-magic-behind-why-the-bootstrap-3-grid-works">Bootstrap 3 grid</a>.</li>
<li><a href="https://developers.google.com/web/tools/chrome-devtools">Chrome DevTools</a>.</li>
<li><a href="https://slides.com/concise/js/fullscreen#/">Concise JavaScript intro</a>.</li>
<li><a href="https://github.com/cure53/DOMPurify">DOMPurify: a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG</a>.</li>
<li><a href="http://esprima.org/">ECMAScript parsing infrastructure for multipurpose analysis</a>.</li>
<li><a href="http://eloquentjavascript.net">Eloquent JavaScript (Book)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id%3D10638113">ES6 Overview in Bullet Points (Hacker News)</a>.</li>
<li><a href="https://github.com/bevacqua/es6">ES6 Overview in Bullet Points</a>.</li>
<li><a href="https://github.com/DrkSephy/es6-cheatsheet">ES6-cheatsheet</a>.</li>
<li><a href="https://github.com/ericelliott/essential-javascript-links">Essential JavaScript Links</a>.</li>
<li><a href="https://changelog.com/essential-reading-list-for-getting-started-with-service-workers/">Essential Reading List for Getting Started With Service Workers</a>.</li>
<li><a href="http://exploringjs.com/">Exploring ES6: Upgrade to the next version of JavaScript (Book)</a>.</li>
<li><a href="http://famous.org/">Famous Javascript library for animations &amp; interfaces</a>.</li>
<li><a href="http://yoksel.github.io/flex-cheatsheet/">Flexbox Cheatsheet</a>.</li>
<li><a href="http://www.frontendhandbook.com/">Front-End Developer Handbook</a>.</li>
<li><a href="https://dev.to/leandrotk_/functional-programming-principles-in-javascript-26g7">Functional Programming Principles in Javascript - DEV Community</a>.</li>
<li><a href="http://www.sencha.com/blog/hidden-gems-in-chrome-developer-tools/">Hidden gems in Chrome Developer Tools</a>.</li>
<li><a href="http://robotlolita.me/2015/11/15/how-do-promises-work.html">How do promises work</a>.</li>
<li><a href="http://facebook.github.io/immutable-js/">Immutable collections for JavaScript</a>.</li>
<li><a href="http://www.pocketjavascript.com/blog/2015/11/23/introducing-pokedex-org">Introducing Pokedex.org: a progressive webapp for Pokémon fans</a>.</li>
<li><a href="https://blog.famous.org/introducing-the-famous-framework/">Introducing the Famous framework</a>.</li>
<li><a href="https://dev.to/banesag/javascript-data-structures-part-1-4eb5">JavaScript: Data Structures (Part 1) - DEV Community</a>.</li>
<li><a href="http://xahlee.info/js/javascript_iterator.html">JavaScript: Iterator (ES2015)</a>.</li>
<li><a href="https://js.coach">js.coach (Opinionated catalog of open source JS packages)</a>.</li>
<li><a href="https://github.com/facebook/jscodeshift">jscodeshift, a toolkit for running codemods over multiple JS files</a>.</li>
<li><a href="http://jscs.info/">JSCS linter</a>.</li>
<li><a href="https://developer.mozilla.org/en-US/Learn">Learning the Web (mozilla.org)</a>.</li>
<li><a href="http://www.nateberkopec.com/2015/10/07/frontend-performance-chrome-timeline.html">Ludicrously Fast Page Loads - A Guide for Full-Stack Devs</a>.</li>
<li><a href="http://www.mancy-re.pl/">Mancy: JavaScript REPL application based on Electron and React</a>.</li>
<li><a href="http://www.larryullman.com/books/modern-javascript-develop-and-design/table-of-contents/">Modern JavaScript: Develop and Design (book)</a>.</li>
<li><a href="http://courses.angularclass.com/courses/modern-javascript">Modern Javascript: ​Learning the foundational concepts and build tools for modern web applications</a>.</li>
<li><a href="https://medium.com/javascript-scene/must-see-javascript-dev-tools-that-put-other-dev-tools-to-shame-aca6d3e3d925#.bcntoj3kq">Must See JavaScript Dev Tools That Put Other Dev Tools to Shame</a>.</li>
<li><a href="http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html">new vs Object.create</a>.</li>
<li><a href="https://medium.com/@goatslacker/no-you-dont-need-semicolons-148d936b9cf2#.s5839x3mt">No, you don’t need semicolons (Medium)</a>.</li>
<li><a href="https://github.com/uber/npm-shrinkwrap">npm-shrinkwrap</a>.</li>
<li><a href="https://www.pagedmedia.org/paged-js/">Paged.js – Paged Media (book/blog publishing)</a>.</li>
<li><a href="https://github.com/arscan/pleaserotate.js">pleaserotate.js</a></li>
<li><a href="http://pathgather.github.io/please-wait/">PleaseWait.js</a></li>
<li><a href="https://dev.to/kozakrisz/react---es6-tricks-in-classes-33je">React - ES6 tricks in Classes - DEV Community</a>.</li>
<li><a href="https://egghead.io/lessons/javascript-redux-the-single-immutable-state-tree">Redux: The Single Immutable State Tree</a>.</li>
<li><a href="https://www.youtube.com/watch?v=3LKMwkuK0ZE&amp;feature=youtu.be">RxJS 5 Thinking Reactively | Ben Lesh - YouTube</a>.</li>
<li><a href="https://medium.com/@benlesh/rxjs-observable-interop-with-promises-and-async-await-bebb05306875">RxJS Observable interop with Promises and Async-Await</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=13031492">Show HN: A visual guide to the most popular CSS properties (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12954540">Show HN: JavaScript books, free online (Hacker News)</a>.</li>
<li><a href="http://snapsvg.io/">Snap.svg: the JavaScript SVG library for the modern web</a>.</li>
<li><a href="http://reactkungfu.com/2015/07/the-hitchhikers-guide-to-modern-javascript-tooling/">The Hitchhiker's Guide to Modern JavaScript Tooling</a>.</li>
<li><a href="https://github.com/focusaurus/data/blob/0aa94a91181d3a85b148375d24adca4a166c4be0/posts/problog/2015/10/tools-for-cleaning-up-messy-javascript.md">Tools for cleaning up messy Javascript</a>.</li>
<li><a href="http://blog.kewah.com/2015/tools-to-keep-a-consistent-coding-style-in-javascript/">Tools to keep a consistent coding style in JavaScript</a>.</li>
<li><a href="http://jonobr1.github.io/two.js">Two.js is a two-dimensional drawing api geared towards modern web browsers</a>.</li>
<li><a href="http://vorlonjs.com/">Vorlon.JS: remotely debugging and testing your JavaScript</a>.</li>
<li><a href="http://bjorn.tipling.com/state-and-regular-expressions-in-javascript">What you should know about JavaScript regular expressions</a>.</li>
<li><a href="http://blog.keithcirkel.co.uk/why-we-should-stop-using-grunt/">Why we should stop using Grunt &amp; Gulp</a>.</li>
<li><a href="http://xahlee.info/js/js.html">Xah Lee's JavaScript in Depth</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>HTML bookmarks</title>
<link>https://xenodium.com/html-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/html-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://hacks.mozilla.org/2016/08/a-few-html-tips/">A few HTML tips (Mozilla)</a>.</li>
<li><a href="https://github.com/lyoshenka/awesome-motherfucking-website">awesome-motherfucking-website: An awesome list of websites about minimal web design and copious swearing</a>.</li>
<li><a href="http://bettermotherfuckingwebsite.com/">Better Motherfucking Website</a>.</li>
<li><a href="http://mo.github.io/2015/10/19/chrome-devtools.html">Chrome Devtools Tips &amp; Tricks</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=10416062">Chrome Devtools Tips and Tricks (Hacker News)</a>.</li>
<li><a href="http://blog.chromium.org/2014/06/web-fundamentals-and-web-starter-kit.html">Chromium's web fundamentals and Web Starter Kit</a>.</li>
<li><a href="https://ishadeed.com/article/css-grid-area/">CSS Grid Areas</a>.</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Layout_cookbook">CSS Layout cookbook - CSS: Cascading Style Sheets (MDN)</a>.</li>
<li><a href="https://www.pandastrike.com/posts/20151015-rest-vs-relay">Facebook Relay: An Evil And/Or Incompetent Attack On REST</a>.</li>
<li><a href="https://htmlhead.dev/">HEAD - A free guide to &lt;head&gt; elements</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21119553">HEAD – A guide to &lt;head&gt; elements (Hacker News)</a>.</li>
<li><a href="http://blog.ustunozgur.com/javascript/programming/books/videos/2015/06/17/how_to_be_a_great_javascript_software_developer.html">How to Become a Great JavaScript Developer</a>.</li>
<li><a href="http://www.fse.guru/how-to-pick-a-frontend-web-framework">How To Pick a Frontend Web Framework</a>.</li>
<li><a href="https://markodenic.com/html-tips/">HTML Tips (2020) - Marko Denic - Web Developer</a>.</li>
<li><a href="https://developer.mozilla.org/en-US/Learn">Learning the Web (mozilla.org)</a>.</li>
<li><a href="https://motherfuckingwebsite.com/">Motherfucking Website</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=26952557">My Current HTML Boilerplate | Hacker News</a>.</li>
<li><a href="https://perfectmotherfuckingwebsite.com/">Perfect Motherfucking Website</a>.</li>
<li><a href="https://philipwalton.github.io/solved-by-flexbox/">Solved by Flexbox</a>.</li>
<li><a href="https://thebestmotherfucking.website/">The Best Motherfucking Website</a>.</li>
<li><a href="https://ultimatemotherfuckingwebsite.com/">Ultimate Motherfucking Website</a>.</li>
<li><a href="http://wave.webaim.org/report#/">WAVE Report (web accessiblity evaluation tool)</a>.</li>
<li><a href="https://jgthms.com/web-design-in-4-minutes">Web Design in 4 minutes</a>.</li>
<li><a href="https://gist.github.com/paulirish/5d52fb081b3570c81e3a">What forces a layout / reflow</a>.</li>
<li><a href="https://medium.com/yemeksepeti-teknoloji/what-ive-learned-from-working-with-html5-video-over-a-month-485c5d5c2045">What I’ve Learned From Working With HTML5 Video Over A Month</a>.</li>
<li><a href="https://bradleytaunt.com/2019/06/08/html-like-1999">Write HTML Like It's 1999</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Networking bookmarks</title>
<link>https://xenodium.com/networking-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/networking-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://news.ycombinator.com/item?id=27650775">Ask HN: Good books/courses to learn networking essentials for web development</a>.</li>
<li><a href="http://cr.yp.to/djbdns/tools.html">Command-line tools to look up DNS information</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21794270">Stanford CS 144: Introduction to Computer Networking | Hacker News</a>.</li>
</ul>
]]></description>
    <pubDate>Mon, 14 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Python bookmarks</title>
<link>https://xenodium.com/python-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/python-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://docs.python.org/3/tutorial/venv.html">12. Virtual Environments and Packages — Python 3.7.4 documentation (pipenv)</a>.</li>
<li><a href="https://github.com/mkaz/termgraph">A python command-line tool which draws basic graphs/charts in the terminal</a>.</li>
<li><a href="http://mkaz.com/2014/07/26/python-argparse-cookbook/">Argparse cookbook</a>: For simple python scripts.</li>
<li><a href="https://linuxhint.com/best_50_python_books/">Best 50 Python Books for Programmers with All Skill Sets</a>.</li>
<li><a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html">Code Like a Pythonista: Idiomatic Python</a>.</li>
<li><a href="https://github.com/pudo/dataset">Dataset: databases for lazy people</a>.</li>
<li><a href="http://www.diveintopython3.net/">Dive Into Python 3 book</a>.</li>
<li><a href="http://www.diveintopython.net/">Dive Into Python book</a>.</li>
<li><a href="https://github.com/asciimoo/drawille/">Drawille</a>: Python drawing in ascii/unicode braille characters.</li>
<li><a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html">Pandas visualization</a>.</li>
<li><a href="https://www.python.org/dev/peps/pep-0020/">PEP 20 – The Zen of Python</a>.</li>
<li><a href="https://pypi.python.org/pypi/pudb">Pudb</a>: A tui python debugger.</li>
<li><a href="http://pycoders.com/">Pycoders weekly mailing list</a>.</li>
<li><a href="https://books.google.co.uk/books?id=9_AXCmGDiz8C&amp;hl=en&amp;redir_esc=y">Python Algorithms book</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11240729">Python patterns, Take One (Hacker News)</a>.</li>
<li><a href="https://taoofmac.com/space/blog/2013/08/11/2300">Python patterns, Take One</a>.</li>
<li><a href="https://www.airpair.com/python/posts/python-tips-and-traps">Python Tips and Traps</a>.</li>
<li><a href="http://irreal.org/blog/?p=3860">Python tools for Emacs</a>.</li>
<li><a href="http://tech.blog.aknin.name/tag/internals/page/2/">Python’s Innards: Hello, ceval.c!</a>.</li>
<li><a href="https://twitter.com/python_tip/status/1111349676106833920">Read Excel sheet with Python/Pandas (Twitter)</a>.</li>
<li><a href="http://www.johndcook.com/blog/python_regex/">Regular expressions in Python and Perl</a>.</li>
<li><a href="https://www.johndcook.com/blog/2019/01/24/reversing-an-md5-hash/">Reversing an MD5 hash (python)</a>.</li>
<li><a href="https://github.com/deanmalmgren/textract">Textract</a>: Python util extracting text from a handful of document types.</li>
<li><a href="https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods">The definitive guide on how to use static, class or abstract methods in Python</a>.</li>
<li><a href="https://julien.danjou.info/books/the-hacker-guide-to-python">The Hacker's guide to python</a>.</li>
<li><a href="http://docs.quantifiedcode.com/python-anti-patterns/">The Little Book of Python Anti-Patterns</a>.</li>
<li><a href="http://blog.instavest.com/three-useful-python-libraries-for-startups">Three Useful Python Libraries for Startups</a>.</li>
<li><a href="http://effbot.org/zone/python-with-statement.htm">Understanding Python's &quot;with&quot; statement</a>.</li>
<li><a href="https://github.com/gorakhargosh/watchdog">Watchdog</a> (monitor filesystem in python).</li>
</ul>
]]></description>
    <pubDate>Sun, 13 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Development bookmarks</title>
<link>https://xenodium.com/development-bookmarks</link>
<guid isPermaLink="false">https://xenodium.com/development-bookmarks</guid>
    <description><![CDATA[<ul>
<li><a href="https://www.redblobgames.com/grids/hexagons/">Hexagonal Grids</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=25803288">Big O Notation – Explained as easily as possible | Hacker News</a>.</li>
<li><a href="https://dev.to/humblecoder00/comprehensive-big-o-notation-guide-in-plain-english-using-javascript-3n6m">Comprehensive Big O Notation Guide in Plain English, using Javascript</a>.</li>
<li><a href="https://justsimply.dev/">Just Simply | Stop saying how simple things are in our docs</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=25698707">Show HN: DevBooks – Help Developers find indy books | Hacker News</a>.</li>
<li><a href="https://codecatalog.org/2021/09/04/well-documented-code.html">Writing Well-Documented Code - Learn from Examples - Code Catalog</a>.</li>
<li><a href="http://norvig.com/lispy.html">(How to Write a (Lisp) Interpreter (in Python)): parse, tokenize, read from tokens, environments, eval, and repl </a>.</li>
<li><a href="https://amplitude.com/blog/12-signs-youre-working-in-a-feature-factory-3-years-later">12 Signs You’re Working in a Feature Factory - 3 Years Later</a>.</li>
<li><a href="http://www.exceptionnotfound.net/fundamental-laws-of-software-development/">15 Fundamental Laws of Software Development</a>.</li>
<li><a href="https://guifroes.com/2018/03/23/3-books-that-will-take-you-to-the-next-level/">3 books that will take you to the next level – Gui Froes</a>.</li>
<li><a href="https://quickleft.com/blog/8-tips-get-started-existing-codebase/">8 Tips To Get Started In An Existing Codebase</a>.</li>
<li><a href="http://sahandsaba.com/nine-anti-patterns-every-programmer-should-be-aware-of-with-examples.html">9 Anti-Patterns</a>.</li>
<li><a href="https://gist.github.com/andymatuschak/d5f0a8730ad601bcccae97e8398e25b2">A composable pattern for pure state machines with effects</a>.</li>
<li><a href="https://increment.com/programming-languages/crash-course-in-compilers/">A crash course in compilers – Increment: Programming Languages</a>.</li>
<li><a href="https://www.coursera.org/learn/algorithms-part1#syllabus">Algorithms, Part I - Princeton University (Coursera)</a>.</li>
<li><a href="http://www.cs.bsu.edu/homepages/pvg/misc/uml/">All the UML you need to know</a>.</li>
<li><a href="https://skerritt.blog/big-o/">All You Need to Know About Big O Notation {Python Examples}</a>.</li>
<li><a href="https://nicoleorchard.com/blog/compilers">An intro to compilers</a>.</li>
<li><a href="https://apprenticealf.wordpress.com/">Apprentice Alf’s Blog: Everything you ever wanted to know about DRM and ebooks</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21919465">Ask HN: How do I choose the right resource to learn CS fundamentals?</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12702651">Ask HN: What is your favorite YouTube channel for developers? (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=11005003">Ask HN: What's the most elegant piece of code you've seen? (Hacker News)</a>.</li>
<li><a href="https://floooh.github.io/2020/08/23/sokol-bindgen.html">Automatic Language Bindings (via clang -ast-dump)</a>.</li>
<li><a href="https://github.com/sindresorhus/awesome/blob/master/readme.md">Awesome lists of everything (Github)</a>.</li>
<li><a href="https://www.expeditedssl.com/aws-in-plain-english">AWS in plain English</a>.</li>
<li><a href="http://robertmuth.blogspot.it/2012/08/better-bash-scripting-in-15-minutes.html">Better Bash scripting in 15 Minutes</a>.</li>
<li><a href="https://wincent.com/blog/optimization">Beware of cute optimizations bearing gifts (building fuzzy search) · wincent.com</a>.</li>
<li><a href="https://dev.to/metcoder95/big-o-notation-beginners-guide-1h38">Big-O Notation: Beginners Guide - DEV Community</a>.</li>
<li><a href="https://speakerdeck.com/bbatsov/knighitie-koito-vsieki-proghramist-triabva-da-prochietie">Bozhidar Batsov's presentation (lots of great books listed)</a>.</li>
<li><a href="https://www.murrayc.com/permalink/2018/12/07/brain-refactored">Brain, refactored: lots of wonderful dev learning references (Murray's Blog)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18821475">Bytecode compilers and interpreters (Hacker News)</a>.</li>
<li><a href="https://refactoring.com/catalog">Catalog of Refactorings</a>.</li>
<li><a href="http://arturoherrero.com/clean-code/">Clean code</a>.</li>
<li><a href="http://kevinlondon.com/2015/05/05/code-review-best-practices.html">Code review best practices</a>.</li>
<li><a href="https://dev.to/vonheikemen/code-style-rules-that-are-actually-useful-3igf">Code style rules that are actually useful (DEV Community)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=12687711">Command line interface best practices (Hacker News)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19010492">Confessions of an Abstraction Hater (Hacker News)</a>.</li>
<li><a href="https://games.greggman.com/game/imgui-future/">Could ImGUI be the future of GUIs?</a>.</li>
<li><a href="http://www.cs.usfca.edu/~galles/visualization/Algorithms.html">Data structure visualization</a>.</li>
<li><a href="https://github.com/rxin/db-readings">Database readings</a>.</li>
<li><a href="http://mollyrocket.com/casey/stream_0028.html">Designing and evaluating reusable components</a>: Talk by Casey Muratori.</li>
<li><a href="http://doc.qt.digia.com/qq/qq13-apis.html">Designing Qt-Style C++ APIs</a>.</li>
<li><a href="https://twitter.com/ermmears/status/1118929832103034881">Diverse podcasts in @ermmears's tweet comments</a>.</li>
<li><a href="http://www.amazon.co.uk/Domain-driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&amp;qid=1444472442&amp;sr=8-1&amp;keywords=domain+driven+design">Domain-driven design: Tackling Complexity in the Heart of Software (Book)</a>.</li>
<li><a href="https://www.youtube.com/playlist?list=PL94E35692EB9D36F3">Donald Knuth Lectures - YouTube</a>.</li>
<li><a href="http://s9w.io/font_compare">Font compare</a>.</li>
<li><a href="https://github.com/fdiskyou/Zines">GitHub - fdiskyou/Zines: hacking Zines mirror for the lulz and nostalgy</a>.</li>
<li><a href="https://github.com/kilimchoi/engineering-blogs">GitHub - kilimchoi/engineering-blogs: A curated list of engineering blogs</a>.</li>
<li><a href="https://google-styleguide.googlecode.com/svn/trunk/shell.xml">Google shell style guide</a>.</li>
<li><a href="http://hackershelf.com/browse/?popular=1">Hacker shelf: Free software dev books</a>.</li>
<li><a href="http://oedb.org/ilibrarian/hacking-knowledge/">Hacking knowlege</a>.</li>
<li><a href="https://slack.engineering/happiness-is-a-freshly-organized-codebase-7ffa6590a70d">Happiness is… a freshly organized codebase - Several People Are Coding (aka feature-driven org)</a>.</li>
<li><a href="https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/">Heap Exploitation Part 1: Understanding the Glibc Heap Implementation | Azeria Labs</a>.</li>
<li><a href="http://blog.triplebyte.com/how-to-pass-a-programming-interview">How to pass a programming interview</a>.</li>
<li><a href="https://paragonie.com/blog/2015/09/how-to-safely-implement-cryptography-in-any-application">How to Safely Implement Cryptography Features in Any Application</a>.</li>
<li><a href="http://staff.polito.it/silvano.rivoira/HowToWriteYourOwnCompiler.htm">How to write your own compiler</a>.</li>
<li><a href="http://jeremymikkola.com/posts/2019_03_19_rules_for_autocomplete.html">Jeremy Mikkola - Rules for Autocomplete</a>.</li>
<li><a href="http://joeduffyblog.com/2016/02/07/the-error-model/">Joe Duffy - The Error Model</a>.</li>
<li><a href="https://www.libhunt.com">LibHunt - Find The Software You Need</a>.</li>
<li><a href="https://github.com/lfit/itpol/blob/master/linux-workstation-security.md">Linux workstation security checklist</a>.</li>
<li><a href="http://newartisans.com/2011/04/letter-to-the-fsf/">Lost in Technopolis</a>.</li>
<li><a href="http://robertheaton.com/2015/08/31/migrating-bajillions-of-database-records-at-stripe/">Migrating bajillions of database records at Stripe</a>.</li>
<li><a href="https://www.quora.com/How-does-Login-with-Facebook-option-work-on-third-party-websites">OAuth diagram/explanation (Quora)</a>.</li>
<li><a href="https://getpolarized.io/2019/01/08/top-pdfs-of-2018-hackernews.html">Over 500 Top PDFs posted to Hacker News in 2018</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=18772873">Please do not attempt to simplify this code: favors completeness, boilerplate, and documentation in the name of stability and long term maintenance (Hacker News)</a>.</li>
<li><a href="https://quickleft.com/blog/readme-love-quick-easy-tips/">README Love: Quick and easy tips</a>.</li>
<li><a href="http://www.amazon.co.uk/Refactoring-Improving-Design-Existing-Technology/dp/0201485672/ref=sr_1_1?ie=UTF8&amp;qid=1444472751&amp;sr=8-1&amp;keywords=refactoring+improving+the+design+of+existing+code">Refactoring: Improving the design of existing code (Book)</a>.</li>
<li><a href="https://twitter.com/sarahmei/status/783340259073335296">Sarah Mei on livable coebases</a>.</li>
<li><a href="https://semver.org/">Semantic Versioning 2.0.0 (Semantic Versioning)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24777640">Show HN: I wrote a book on writing good developer resumes | Hacker News</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=22335738">Signs you’re working in a feature factory | Hacker News</a>.</li>
<li><a href="https://bourgeois.me/rest/">Some REST best practices</a>.</li>
<li><a href="http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/">Structure and Interpretation of Computer Programs</a> (videos).</li>
<li><a href="http://www.norvig.com/21-days.html">Teach Yourself Programming in Ten Years</a>.</li>
<li><a href="http://technosophos.com/2018/07/04/be-nice-and-write-stable-code.html">TechnoSophos: Be Nice And Write Stable Code (versioning scheme)</a>.</li>
<li><a href="https://github.com/jlevy/the-art-of-command-line">The art of command line</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=14020796">The Debugging Mindset (Hacker News)</a>.</li>
<li><a href="http://journal.stuffwithstuff.com/2015/09/08/the-hardest-program-ive-ever-written">The Hardest Program I've Ever Written (a code formatter)</a>.</li>
<li><a href="https://speakerdeck.com/bbatsov/knighitie-koito-vsieki-proghramist-triabva-da-prochietie">The passionate programmer</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=21603920">Things I’ve learned in 20 years of programming | Hacker News</a>.</li>
<li><a href="https://github.com/jbranchaud/til">TIL: today I learned</a>.</li>
<li><a href="http://robots.thoughtbot.com/a-tmux-crash-course">Tmux crash course</a>: By Josh Clayton.</li>
<li><a href="https://medium.com/@johanstn/initiating-ui-engineering-conversations-946906b4c710#.9vkrt6xzi">UI Engineering Questions</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=24518682">Use long flags when scripting (2013) | Hacker News</a>.</li>
<li><a href="http://www.comp.nus.edu.sg/~stevenha/visualization/">VisuAlgo.net</a>: Visualising data structures and algorithms through animation.</li>
<li><a href="https://twitter.com/kwyntastic/status/1281639369359544322">When management tells you to build a specific thing (junior vs mid vs senior eng)</a>.</li>
<li><a href="https://wizardzines.com/">Wizard zines (programming by Julia Evans)</a>.</li>
<li><a href="https://news.ycombinator.com/item?id=19487848">WTF Is Big O Notation? (Hacker News)</a>.</li>
<li><a href="https://yourcalendricalfallacyis.com/">Your calendrical fallacy is thinking…</a>.</li>
</ul>
]]></description>
    <pubDate>Sun, 13 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Paswordless ssh with authorized keys</title>
<link>https://xenodium.com/passwordless-ssh-with-authorized-keys</link>
<guid isPermaLink="false">https://xenodium.com/passwordless-ssh-with-authorized-keys</guid>
    <description><![CDATA[<h2>On local host</h2>
<pre><code class="language-{.bash">ssh-keygen
cat ~/.ssh/id_dsa.pub | ssh user@remotehost 'cat &gt;&gt; ~/.ssh/authorized_keys'
</code></pre>
<h2>On remote host</h2>
<pre><code class="language-{.bash">chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
</code></pre>
<p>UPDATE: <a href="https://stuff-things.net/2020/01/24/not-stupid-ssh-tricks-automatic-ssh-add">Add &quot;AddKeysToAgent yes&quot; to .ssh/config and enter password only once</a>.</p>
]]></description>
    <pubDate>Sun, 13 Jul 2014 00:00:00 GMT</pubDate>
  </item>

  <item>
    <title>Some python idioms</title>
<link>https://xenodium.com/some-python-idioms</link>
<guid isPermaLink="false">https://xenodium.com/some-python-idioms</guid>
    <description><![CDATA[<ul>
<li>Prefer double quotes if escaping single quotes.</li>
<li>Prefer string interpolation over join. Eg. &quot;'%s'&quot; % member_default.</li>
<li>Prefer double underscore for privates.</li>
<li>Prefer with statement to implicitly close file.</li>
</ul>
<pre><code class="language-python">with open(path, 'r') as text_file:
    text = text_file.read()
</code></pre>
<ul>
<li>Prefer list comprehensions to filter.</li>
<li>Prefer using separate modules over classes if only using for separation.</li>
<li>Keep in mind: &quot;eafp vs lbyl&quot; (ie. just let it throw).</li>
<li>Prefer exceptions over assertions.</li>
<li>Throw ValueError for wrong input.</li>
<li>Return explicit False if remaining case is always false.</li>
</ul>
<p>[^1]: Been using powder milk since lockdown, end-result's been tasty.</p>
<p>[^2]: The app's been fairly stable, but who knows… please backup your org file before feeding it to the lion.</p>
<p>[^3]: The app's been fairly stable, but who knows… please backup your org file before feeding it to the lion.</p>
<p>[^4]: The app's been fairly stable, but who knows… please backup your org file before feeding it to the lion.</p>
<p>[^5]: Yes, this post was written in <a href="https://orgmode.org/">org mode</a>.</p>
<p>[^6]: Been using powder milk since lockdown, end-result's been tasty.</p>
<p>[^7]: Only tried raw honey so far.</p>
<p>[^8]: Can likely use ground cardamom. I enjoy the scents while crushing.</p>
]]></description>
    <pubDate>Mon, 04 Nov 2013 00:00:00 GMT</pubDate>
  </item>

</channel>
</rss>