<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://jkl.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jkl.dev/" rel="alternate" type="text/html" /><updated>2026-05-13T22:46:55+00:00</updated><id>https://jkl.dev/feed.xml</id><title type="html">jkl is typing…</title><subtitle>yet another blog on the internet</subtitle><entry><title type="html">google.com/ncr - stop google geolocating automatically</title><link href="https://jkl.dev/snippet/2026/05/13/google-ncr.html" rel="alternate" type="text/html" title="google.com/ncr - stop google geolocating automatically" /><published>2026-05-13T02:53:53+00:00</published><updated>2026-05-13T02:53:53+00:00</updated><id>https://jkl.dev/snippet/2026/05/13/google-ncr</id><content type="html" xml:base="https://jkl.dev/snippet/2026/05/13/google-ncr.html"><![CDATA[<p>GeoIP databases - which map IP addresses to geographic locations around the world - occasionally get it wrong, since VPN exit nodes, CDN edges, and shared infrastructure can move around. When GeoIP databases get out of sync with reality, you might end up somewhere you don’t expect by typing google.com and getting google.ca, or somewhere else.</p>

<p>To inhibit the geolocation behavior, you can visit <a href="https://www.google.com/ncr">google.com/ncr</a> - which stands for <strong>No Country Redirect</strong>.  Loading it once sets a cookie (which persists until you clear cookies) that tells Google to stop geolocating and serve google.com no matter where you are.</p>

<p><em>(In my experience, Youtube in Canada is nicer. Nobody will blame you if you take a day or two to <a href="https://support.google.com/websearch/workflow/9308722">report incorrect GeoIP data to Google</a></em> 😉)</p>]]></content><author><name></name></author><category term="snippet" /><category term="networking" /><summary type="html"><![CDATA[GeoIP databases - which map IP addresses to geographic locations around the world - occasionally get it wrong, since VPN exit nodes, CDN edges, and shared infrastructure can move around. When GeoIP databases get out of sync with reality, you might end up somewhere you don’t expect by typing google.com and getting google.ca, or somewhere else.]]></summary></entry><entry><title type="html">tinyfugue on an m-series mac</title><link href="https://jkl.dev/snippet/2026/03/26/tinyfugue-on-m-series-mac.html" rel="alternate" type="text/html" title="tinyfugue on an m-series mac" /><published>2026-03-26T00:55:50+00:00</published><updated>2026-03-26T00:55:50+00:00</updated><id>https://jkl.dev/snippet/2026/03/26/tinyfugue-on-m-series-mac</id><content type="html" xml:base="https://jkl.dev/snippet/2026/03/26/tinyfugue-on-m-series-mac.html"><![CDATA[<p>If you want to get tinyfugue running on your M-series Mac, and don’t want to use <a href="https://github.com/ingwarsw/tinyfugue">tinyfugue - rebirth</a>, you can get Ken Keys’ original-recipe <a href="https://tinyfugue.sourceforge.net/#source">tinyfugue</a> to compile by doing the following:</p>

<ul>
  <li>
    <p>install PCRE, e.g. for homebrew  <code class="language-plaintext highlighter-rouge">brew install pcre</code></p>
  </li>
  <li>
    <p>Put this patch in src/main.c just below #include “process.h”:</p>
  </li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#ifndef PCRE_INFO_OPTIONS
#define PCRE_INFO_OPTIONS 0
#endif

#include &lt;pcre.h&gt;
int pcre_info(const pcre *code, int *optptr, int *firstcharptr) {
    if (optptr)
        pcre_fullinfo(code, NULL, PCRE_INFO_OPTIONS, optptr);
    if (firstcharptr)
        *firstcharptr = -1;  // not directly supported anymore
    return 0;
}
</code></pre></div></div>

<ul>
  <li>
    <p>At the top of src/malloc.c, add: <code class="language-plaintext highlighter-rouge">#include &lt;stdlib.h&gt;</code></p>
  </li>
  <li>
    <p>Build with the following steps:</p>
  </li>
</ul>

<p><code class="language-plaintext highlighter-rouge">export CFLAGS="-std=c89 -Wno-implicit-function-declaration -I/opt/homebrew/opt/pcre/include"</code></p>

<p><code class="language-plaintext highlighter-rouge">export LDFLAGS="-L/opt/homebrew/opt/pcre/lib"</code></p>

<p><code class="language-plaintext highlighter-rouge">./configure</code></p>

<p><code class="language-plaintext highlighter-rouge">make LIBS="/opt/homebrew/opt/pcre/lib/libpcre.dylib -lz -ltermcap"</code></p>

<p>Binary and library locations will be at the bottom of the output.</p>]]></content><author><name></name></author><category term="snippet" /><category term="macos" /><summary type="html"><![CDATA[If you want to get tinyfugue running on your M-series Mac, and don’t want to use tinyfugue - rebirth, you can get Ken Keys’ original-recipe tinyfugue to compile by doing the following:]]></summary></entry><entry><title type="html">new machine setup</title><link href="https://jkl.dev/snippet/2026/03/10/new-machine-setup.html" rel="alternate" type="text/html" title="new machine setup" /><published>2026-03-10T09:55:50+00:00</published><updated>2026-03-10T09:55:50+00:00</updated><id>https://jkl.dev/snippet/2026/03/10/new-machine-setup</id><content type="html" xml:base="https://jkl.dev/snippet/2026/03/10/new-machine-setup.html"><![CDATA[<p>Whether it’s from regular lifecycling or a hardware issue, it is important to have a way to get yourself back up and running after a machine change. I used to use an Ansible playbook to do this, but I found the solution to be too clunky.</p>

<p>The method I settled on leverages <a href="https://www.gnu.org/software/stow/">GNU Stow</a> along with a <a href="https://gitlab.com/press5/setup">Git repository</a> to hold my dotfiles and other ancillary files.</p>

<p>If I’m setting up a new Mac, I start with <code class="language-plaintext highlighter-rouge">scripts/mac.sh</code>; it:</p>

<ul>
  <li>sets a bunch of preferences via <code class="language-plaintext highlighter-rouge">defaults write</code></li>
  <li>checks for and installs xcode (if it doesn’t exist)</li>
  <li>gets the setup repository (if it doesn’t exist)</li>
  <li>installs <a href="https://ohmyz.sh">Oh My ZSH</a></li>
  <li>installs or updates <a href="https://brew.sh">Brew</a></li>
  <li>configures vim to my liking</li>
  <li>brew installs the fonts and software I use</li>
  <li>runs <code class="language-plaintext highlighter-rouge">stow .</code> in the setup directory to symlink some of <code class="language-plaintext highlighter-rouge">setup</code>’s content</li>
  <li>uses <code class="language-plaintext highlighter-rouge">say</code> to let me know the setup is done</li>
</ul>

<p>Since I don’t want <em>all</em> of the content in <code class="language-plaintext highlighter-rouge">setup/</code> to be symlinked, I use <code class="language-plaintext highlighter-rouge">.stow-local-ignore</code> to tell Stow what to skip when symlinking.</p>]]></content><author><name></name></author><category term="snippet" /><category term="macos" /><category term="dotfiles" /><category term="devops" /><summary type="html"><![CDATA[Whether it’s from regular lifecycling or a hardware issue, it is important to have a way to get yourself back up and running after a machine change. I used to use an Ansible playbook to do this, but I found the solution to be too clunky.]]></summary></entry><entry><title type="html">some useful git aliases</title><link href="https://jkl.dev/snippet/2025/08/06/some-useful-git-aliases.html" rel="alternate" type="text/html" title="some useful git aliases" /><published>2025-08-06T00:05:55+00:00</published><updated>2025-08-06T00:05:55+00:00</updated><id>https://jkl.dev/snippet/2025/08/06/some-useful-git-aliases</id><content type="html" xml:base="https://jkl.dev/snippet/2025/08/06/some-useful-git-aliases.html"><![CDATA[<p>Here’s a handy set of aliases for <code class="language-plaintext highlighter-rouge">.gitconfig</code> that can make working with many repos with different trunk names easier.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[alias]
  tru = "!git checkout `git ftr`"
  ftr = "!git symbolic-ref refs/remotes/origin/HEAD|sed 's@^refs/remotes/origin/@@'"

</code></pre></div></div>

<p>When <code class="language-plaintext highlighter-rouge">git tru</code> is used, <code class="language-plaintext highlighter-rouge">ftr</code> gets the name of the ref for <code class="language-plaintext highlighter-rouge">HEAD</code> and strips everything but that name off, before passing it to <code class="language-plaintext highlighter-rouge">git checkout</code>.</p>]]></content><author><name></name></author><category term="snippet" /><category term="git" /><category term="cli" /><summary type="html"><![CDATA[Here’s a handy set of aliases for .gitconfig that can make working with many repos with different trunk names easier.]]></summary></entry><entry><title type="html">using applescript to set a system voice</title><link href="https://jkl.dev/snippet/2024/11/27/set-macos-voice-applescript.html" rel="alternate" type="text/html" title="using applescript to set a system voice" /><published>2024-11-27T00:05:55+00:00</published><updated>2024-11-27T00:05:55+00:00</updated><id>https://jkl.dev/snippet/2024/11/27/set-macos-voice-applescript</id><content type="html" xml:base="https://jkl.dev/snippet/2024/11/27/set-macos-voice-applescript.html"><![CDATA[<p>Provided you have granted Script Editor access under Accessibility, this snippet will let you set a system voice. Edit <code class="language-plaintext highlighter-rouge">Moira (Enhanced)</code> to your preference.</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"System Settings"</span><span class="w">
    </span><span class="nb">activate</span><span class="w">
    </span><span class="c1">-- set moira as the system voice</span><span class="w">
    </span><span class="nb">delay</span><span class="w"> </span><span class="mi">1</span><span class="w">
    </span><span class="nv">reveal</span><span class="w"> </span><span class="nv">anchor</span><span class="w"> </span><span class="s2">"AX_SPOKEN_VOICE"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">pane</span><span class="w"> </span><span class="na">id</span><span class="w"> </span><span class="s2">"com.apple.Accessibility-Settings.extension"</span><span class="w">
    </span><span class="nb">delay</span><span class="w"> </span><span class="mi">1</span><span class="w">
    </span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"System Events"</span><span class="w">
        </span><span class="nv">click</span><span class="w"> </span><span class="nv">pop</span><span class="w"> </span><span class="nv">up</span><span class="w"> </span><span class="nb">button</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nb">scroll</span><span class="w"> </span><span class="nv">area</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">splitter</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="na">window</span><span class="w"> </span><span class="s2">"Spoken Content"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="nv">process</span><span class="w"> </span><span class="s2">"System Settings"</span><span class="w">
        </span><span class="nb">delay</span><span class="w"> </span><span class="mf">0.75</span><span class="w">
        </span><span class="nv">click</span><span class="w"> </span><span class="na">menu</span><span class="w"> </span><span class="nb">item</span><span class="w"> </span><span class="s2">"Moira (Enhanced)"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="na">menu</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">pop</span><span class="w"> </span><span class="nv">up</span><span class="w"> </span><span class="nb">button</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nb">scroll</span><span class="w"> </span><span class="nv">area</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">splitter</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="na">window</span><span class="w"> </span><span class="s2">"Spoken Content"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="nv">process</span><span class="w"> </span><span class="s2">"System Settings"</span><span class="w">
    </span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
    </span><span class="nb">close</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span></code></pre></div></div>]]></content><author><name></name></author><category term="snippet" /><category term="macos" /><category term="applescript" /><category term="accessibility" /><summary type="html"><![CDATA[Provided you have granted Script Editor access under Accessibility, this snippet will let you set a system voice. Edit Moira (Enhanced) to your preference.]]></summary></entry><entry><title type="html">multipart zip on macos</title><link href="https://jkl.dev/blog/2024/05/10/multipart-zip-on-macos.html" rel="alternate" type="text/html" title="multipart zip on macos" /><published>2024-05-10T00:14:00+00:00</published><updated>2024-05-10T00:14:00+00:00</updated><id>https://jkl.dev/blog/2024/05/10/multipart-zip-on-macos</id><content type="html" xml:base="https://jkl.dev/blog/2024/05/10/multipart-zip-on-macos.html"><![CDATA[<p>I don’t often have to work with multi-part zips, but when I do, I always have to look up how to deal with them. By sticking this little pearl of wisdom on my blog, it’ll be easier to find!</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># got a multipart zip?
# (.zip, .z01, .z02 etc.)
# unsplit them:
zip -s0 split-archive.zip -O whole-archive.zip
# now you can unzip like normal
unzip whole-archive.zip

# need to make a multipart zip?
zip -s50m  archive.zip -O split-archive.zip
</code></pre></div></div>]]></content><author><name></name></author><category term="blog" /><category term="macos" /><category term="cli" /><category term="zip" /><summary type="html"><![CDATA[I don’t often have to work with multi-part zips, but when I do, I always have to look up how to deal with them. By sticking this little pearl of wisdom on my blog, it’ll be easier to find!]]></summary></entry><entry><title type="html">hello world!</title><link href="https://jkl.dev/blog/2024/05/09/hello-world.html" rel="alternate" type="text/html" title="hello world!" /><published>2024-05-09T15:00:00+00:00</published><updated>2024-05-09T15:00:00+00:00</updated><id>https://jkl.dev/blog/2024/05/09/hello-world</id><content type="html" xml:base="https://jkl.dev/blog/2024/05/09/hello-world.html"><![CDATA[<p>This is my blog. I’m not sure how often I’m going to be posting for a start, since I’m still learning jekyll and playing around with the look and feel.</p>]]></content><author><name></name></author><category term="blog" /><category term="jekyll" /><summary type="html"><![CDATA[This is my blog. I’m not sure how often I’m going to be posting for a start, since I’m still learning jekyll and playing around with the look and feel.]]></summary></entry></feed>