<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog on g.p. anders</title>
    <link>https://a731295c.gpanders-com.pages.dev/blog/</link>
    <description>Recent content in Blog on g.p. anders</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <managingEditor>contact@gpanders.com (Gregory Anders)</managingEditor>
    <webMaster>contact@gpanders.com (Gregory Anders)</webMaster>
    <copyright>Content on this site is licensed CC BY-SA 4.0</copyright>
    <lastBuildDate>Wed, 26 Mar 2025 10:20:00 -0500</lastBuildDate>
    <atom:link href="https://a731295c.gpanders-com.pages.dev/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>What&#39;s New in Neovim 0.11</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/whats-new-in-neovim-0-11/</link>
      <pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/whats-new-in-neovim-0-11/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/neovim/neovim/releases/tag/stable&#34;&gt;Neovim 0.11&lt;/a&gt; was just released. As in &lt;a href=&#34;https://gpanders.com/blog/whats-new-in-neovim-0-7/&#34;&gt;previous&lt;/a&gt; &lt;a href=&#34;https://gpanders.com/blog/whats-new-in-neovim-0.10/&#34;&gt;installments&lt;/a&gt; in this series, let&amp;rsquo;s talk a bit about some of the big highlights! As always, the full list of changes can be found in the &lt;a href=&#34;https://neovim.io/doc/user/news-0.11.html&#34;&gt;release notes&lt;/a&gt; (use &lt;code&gt;:h news&lt;/code&gt; to read inside of Neovim).&lt;/p&gt;&#xA;&lt;h2 id=&#34;table-of-contents&#34;&gt;&#xA;  &lt;a href=&#34;#table-of-contents&#34;&gt;Table of Contents&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#breaking-changes&#34;&gt;Breaking Changes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#lsp&#34;&gt;LSP&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#simpler-lsp-setup-and-configuration&#34;&gt;Simpler LSP setup and configuration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#builtin-auto-completion&#34;&gt;Builtin auto-completion&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#improved-hover-documentation&#34;&gt;Improved hover documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#putting-it-all-together&#34;&gt;Putting it all together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#diagnostics&#34;&gt;Diagnostics&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#virtual-text-handler-changed-from-opt-out-to-opt-in&#34;&gt;Virtual text handler changed from opt-out to opt-in&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#virtual-lines&#34;&gt;Virtual lines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#defaults&#34;&gt;Defaults&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#more-default-mappings&#34;&gt;More default mappings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#terminal&#34;&gt;Terminal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#miscellaneous&#34;&gt;Miscellaneous&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;breaking-changes&#34;&gt;&#xA;  &lt;a href=&#34;#breaking-changes&#34;&gt;Breaking Changes&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;We make a concerted effort to avoid breaking changes. We want the upgrade path between versions to be smooth and simple, but occasionally breaking changes are necessary (often times, a breaking change is a bug fix, or there is no way to introduce a transition path between old and new behavior). The full list of breaking changes can be found in the &lt;a href=&#34;https://neovim.io/doc/user/news-0.11.html&#34;&gt;release notes&lt;/a&gt; (&lt;code&gt;:h news-breaking&lt;/code&gt;). Plugin authors are especially encouraged to carefully read this section, as many of the changes have to do with &amp;ldquo;lower level&amp;rdquo; APIs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ghostty Is Native—So What?</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/ghostty-is-native-so-what/</link>
      <pubDate>Fri, 20 Dec 2024 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/ghostty-is-native-so-what/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/ghostty&#34;&gt;Ghostty&lt;/a&gt; is a new terminal emulator by Mitchell Hashimoto. While a&#xA;lot has been said about Ghostty&amp;rsquo;s &lt;a href=&#34;https://www.youtube.com/watch?v=cPaGkEesw20&amp;amp;t=3015s&#34;&gt;performance&lt;/a&gt;, less&#xA;discussed is its native platform&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; integration which is, in my opinion, its&#xA;most distinctive and underrated feature.&lt;/p&gt;&#xA;&lt;p&gt;Despite being listed as a key motivating factor in Mitchell&amp;rsquo;s original&#xA;&lt;a href=&#34;https://mitchellh.com/writing/ghostty-and-useful-zig-patterns&#34;&gt;introduction&lt;/a&gt;, online discussions about Ghostty rarely mention its&#xA;native integration, and when they do many commenters remain skeptical over its&#xA;importance or don&amp;rsquo;t understand what that means. So I want to briefly describe&#xA;some of the ways that Ghostty takes advantage of native OS integration so you&#xA;can see for yourself what makes it stand out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What&#39;s New in Neovim 0.10</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/whats-new-in-neovim-0.10/</link>
      <pubDate>Thu, 16 May 2024 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/whats-new-in-neovim-0.10/</guid>
      <description>&lt;p&gt;Neovim 0.10 was the longest release cycle since the heady days of the 0.5&#xA;release. There are a ton of new features in this release (as well as some&#xA;breaking changes), so be sure to check the full &lt;a href=&#34;https://neovim.io/doc/user/news-0.10.html&#34;&gt;release notes&lt;/a&gt;. You can&#xA;view the release notes directly in Nvim with &lt;code&gt;:h news&lt;/code&gt;. The news file includes&#xA;information on new features, deprecations, and breaking changes. I especially&#xA;urge plugin authors to read this file carefully.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making ijq Fast</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/making-ijq-fast/</link>
      <pubDate>Sat, 13 Apr 2024 13:14:07 -0500</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/making-ijq-fast/</guid>
      <description>&lt;p&gt;I recently received an &lt;a href=&#34;https://todo.sr.ht/~gpanders/ijq/10&#34;&gt;issue report&lt;/a&gt; that &lt;a href=&#34;https://codeberg.org/gpanders/ijq/&#34;&gt;ijq&lt;/a&gt; was performing slowly.&#xA;The issue claimed that, when used on a large (16 MB) JSON file, ijq was &amp;ldquo;too&#xA;slow to be usable&amp;rdquo;. I downloaded the test file which was (helpfully) provided&#xA;in the issue and tried it myself. Even using the most charitable definition, I&#xA;agree that this classifies as &amp;ldquo;unusably slow&amp;rdquo;. Note that in this screen&#xA;recording I am displaying my key presses to show just how unresponsive&#xA;ijq is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>State of the Terminal</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/state-of-the-terminal/</link>
      <pubDate>Tue, 12 Mar 2024 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/state-of-the-terminal/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a companion article to &lt;a href=&#34;https://www.youtube.com/watch?v=N7QX9XlLljM&#34;&gt;my talk&lt;/a&gt; at Neovimconf 2023&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I have been using Vim/Neovim as my full time text editor for close to 10 years.&#xA;I&amp;rsquo;ve spent a lot of time in the terminal and have become very aware of the&#xA;many flaws and idiosyncrasies of this bizarre platform. But I also think it&#xA;gets a lot of things right! And I&amp;rsquo;m not alone in this belief: terminal based&#xA;tools are still widely popular even in the presence of many alternatives&#xA;(the StackOverflow developer survey shows that Neovim is the &amp;ldquo;most loved&amp;rdquo;&#xA;editor &lt;a href=&#34;https://survey.stackoverflow.co/2021/#section-most-loved-dreaded-and-wanted-collaboration-tools&#34;&gt;3&lt;/a&gt; &lt;a href=&#34;https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-integrated-development-environment&#34;&gt;years&lt;/a&gt; &lt;a href=&#34;https://survey.stackoverflow.co/2023/#section-admired-and-desired-integrated-development-environment&#34;&gt;in&lt;/a&gt; a row).&lt;/p&gt;</description>
    </item>
    <item>
      <title>What&#39;s New in Neovim 0.7</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/whats-new-in-neovim-0-7/</link>
      <pubDate>Fri, 15 Apr 2022 07:14:00 -0600</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/whats-new-in-neovim-0-7/</guid>
      <description>&lt;p&gt;Neovim 0.7 was just released, bringing with it lots of new features (and of&#xA;course plenty of bug fixes). You can find the full release notes&#xA;&lt;a href=&#34;https://github.com/neovim/neovim/releases/tag/v0.7.0&#34;&gt;here&lt;/a&gt;, but in this post I&amp;rsquo;ll cover just a few of the new&#xA;additions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;table-of-contents&#34;&gt;&#xA;  &lt;a href=&#34;#table-of-contents&#34;&gt;Table of Contents&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#lua-everywhere&#34;&gt;Lua everywhere!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#distinguishing-modifier-keys&#34;&gt;Distinguishing modifier keys&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#global-statusline&#34;&gt;Global statusline&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#filetypelua&#34;&gt;filetype.lua&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#client-server-communication&#34;&gt;Client-server communication&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#looking-ahead-to-08&#34;&gt;Looking ahead to 0.8&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;lua-everywhere&#34;&gt;&#xA;  &lt;a href=&#34;#lua-everywhere&#34;&gt;Lua everywhere!&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Neovim 0.5 saw the introduction of Lua as a first-class citizen in the Neovim&#xA;ecosystem: Lua could now be used in the user&amp;rsquo;s init file, plugins,&#xA;colorschemes, ftplugins, etc. Basically, anywhere that you could use a &lt;code&gt;.vim&lt;/code&gt;&#xA;file, you could now use &lt;code&gt;.lua&lt;/code&gt; instead.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring Mach-O, Part 4</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-4/</link>
      <pubDate>Sun, 16 Jan 2022 19:13:53 -0700</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-4/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 4 of a 4 part series exploring the structure of the Mach-O file&#xA;format. Here are links to &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-1/&#34;&gt;part 1&lt;/a&gt;, &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-2/&#34;&gt;part 2&lt;/a&gt;, and &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-3/&#34;&gt;part 3&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;When we started this series we didn&amp;rsquo;t know anything about Mach-O other than&#xA;some vague idea that it&amp;rsquo;s a binary file format used by macOS. By now, we have a&#xA;much better understanding of how Mach-O is laid out and how the operating&#xA;system uses the information in a Mach-O file to run a program.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring Mach-O, Part 3</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-3/</link>
      <pubDate>Sun, 16 Jan 2022 19:13:51 -0700</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-3/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 3 of a 4 part series exploring the structure of the Mach-O file&#xA;format. Here are links to &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-1/&#34;&gt;part 1&lt;/a&gt;, &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-2/&#34;&gt;part 2&lt;/a&gt;, and &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-4/&#34;&gt;part 4&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;We left off with a basic parser that is able to parse the Mach-O header from&#xA;our file. Now that the bones of our parser are fleshed out, it should be fairly&#xA;straightforward to parse the rest of the file.&lt;/p&gt;&#xA;&lt;h2 id=&#34;load-commands&#34;&gt;&#xA;  &lt;a href=&#34;#load-commands&#34;&gt;Load commands&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s take a look at our header again:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring Mach-O, Part 2</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-2/</link>
      <pubDate>Sun, 16 Jan 2022 19:13:50 -0700</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-2/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 2 of a 4 part series exploring the structure of the Mach-O file&#xA;format. Here are links to &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-1/&#34;&gt;part 1&lt;/a&gt;, &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-3/&#34;&gt;part 3&lt;/a&gt;, and &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-4/&#34;&gt;part 4&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Last time, we created our own tiny Mach-O executable. This program doesn&amp;rsquo;t do&#xA;anything useful, it&amp;rsquo;s simply the smallest executable we can use to examine what&#xA;the Mach-O file format looks like.&lt;/p&gt;&#xA;&lt;p&gt;From here on, we&amp;rsquo;ll write our own primitive parser to examine the contents of&#xA;our program. I&amp;rsquo;m going to write my Mach-O parser in Zig. Why Zig? Mostly&#xA;because I really like it and I find it&amp;rsquo;s quite easy to get simple things like&#xA;this up and running. It&amp;rsquo;s also particularly well suited to tasks like this&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring Mach-O, Part 1</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-1/</link>
      <pubDate>Sun, 16 Jan 2022 19:13:49 -0700</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-1/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 1 of a 4 part series exploring the structure of the Mach-O file&#xA;format. Here are links to &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-2/&#34;&gt;part 2&lt;/a&gt;, &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-3/&#34;&gt;part 3&lt;/a&gt;, and &lt;a href=&#34;https://a731295c.gpanders-com.pages.dev/blog/exploring-mach-o-part-4/&#34;&gt;part 4&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I recently read a great article from &lt;a href=&#34;https://fasterthanli.me/series/making-our-own-executable-packer/part-1&#34;&gt;Amos over at&#xA;fasterthanli.me&lt;/a&gt; that explored the ELF format for Linux&#xA;executables. Digging into these kinds of topics in a deep and thorough way has&#xA;always been super interesting to me, not to mention educational. So, I thought&#xA;I&amp;rsquo;d take a stab at doing something similar for Mach-O, the object file format&#xA;used by macOS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The definitive guide to using tmux-256color on macOS</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/the-definitive-guide-to-using-tmux-256color-on-macos/</link>
      <pubDate>Wed, 14 Apr 2021 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/the-definitive-guide-to-using-tmux-256color-on-macos/</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: macOS 14 (Sonoma) updated its bundled ncurses version to&#xA;6.0. This version ships with a &lt;code&gt;tmux-256color&lt;/code&gt; entry by default, so&#xA;the workaround below is no longer needed.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;macOS ships with an old and very out-of-date version of ncurses (5.7). This&#xA;version does not contain a terminfo entry for &lt;code&gt;tmux-256color&lt;/code&gt;, the preferred&#xA;&lt;code&gt;TERM&lt;/code&gt; value when using &lt;code&gt;tmux&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you installed &lt;code&gt;tmux&lt;/code&gt; via Homebrew or MacPorts, then you will also have a&#xA;newer version of ncurses (6.X) present on your system installed by your package&#xA;manager. This is the version of ncurses that &lt;code&gt;tmux&lt;/code&gt; itself was built against,&#xA;which is why you can use&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Zettelkasten</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/the-zettelkasten/</link>
      <pubDate>Mon, 25 May 2020 15:43:50 -0600</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/the-zettelkasten/</guid>
      <description>&lt;p&gt;I have always been a bit of a nerd about note taking and knowledge management&#xA;systems. I read David Allen&amp;rsquo;s &lt;a href=&#34;https://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0143126563&#34;&gt;Getting Things Done&lt;/a&gt; with relish, and I&amp;rsquo;ve&#xA;obsessively experimented with every iteration of note taking apps and tools&#xA;mankind has created. Trello, Todolist, Evernote, Bullet Journal, you name it.&lt;/p&gt;&#xA;&lt;p&gt;I think my obsession in this area is mostly driven by the combination of my&#xA;love of useless trivia and my immense capacity for forgetfulness, a perfect&#xA;recipe if ever there was one for developing the habit of writing things down.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing ijq, an Interactive jq Tool</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/introducing-ijq/</link>
      <pubDate>Sat, 23 May 2020 19:07:09 -0600</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/introducing-ijq/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re unfamiliar with the tool &lt;a href=&#34;https://stedolan.github.io/jq/&#34;&gt;jq&lt;/a&gt;, it describes itself as the &amp;ldquo;sed for&#xA;JSON&amp;rdquo;. It&amp;rsquo;s a powerful command line tool that lets you do complex parsing and&#xA;manipulation of JSON documents and is extremely useful for testing APIs or&#xA;analysing JSON datasets.&lt;/p&gt;&#xA;&lt;p&gt;One challenge with jq, however, is finding just the right filter. The query&#xA;language that jq uses is not always obvious, so typically you&amp;rsquo;ll spend a bit&#xA;of time getting it just right to select the data you need.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing Dotfiles With Git</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/managing-dotfiles-with-git/</link>
      <pubDate>Fri, 01 May 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/managing-dotfiles-with-git/</guid>
      <description>&lt;p&gt;Managing so-called &amp;ldquo;dotfiles&amp;rdquo; (config files starting with a &lt;code&gt;.&lt;/code&gt; in your home&#xA;directory) in git is a fairly common practice. There are many write-ups on&#xA;this topic already, but I wanted to share my own workflow as well as some&#xA;potentially useful tips and tricks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Site Search With Hugo</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/building-site-search-with-hugo/</link>
      <pubDate>Fri, 17 Apr 2020 13:08:49 -0600</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/building-site-search-with-hugo/</guid>
      <description>&lt;p&gt;Search is a handy feature you might want on your Hugo static site.&#xA;Hugo does not have any built-in way to provide a search function, but they do offer some &lt;a href=&#34;https://gohugo.io/tools/search/&#34;&gt;suggestions&lt;/a&gt; on how to do it yourself.&lt;/p&gt;&#xA;&lt;p&gt;The difficulty with implementing a search function is that it usually requires some kind of server side logic, which is obviously missing when using a static site like Hugo.&#xA;So any search implementation must be done entirely on the client side.&#xA;One of the &lt;a href=&#34;https://gist.github.com/eddiewebb/735feb48f50f0ddd65ae5606a1cb41ae&#34;&gt;options Hugo suggests&lt;/a&gt; offers an implementation using jQuery and Fuse.js.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Books for Beginner Economists</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/books-for-beginner-economists/</link>
      <pubDate>Thu, 16 Apr 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/books-for-beginner-economists/</guid>
      <description>&lt;p&gt;I am not an economist by any definition of the word: I haven&amp;rsquo;t taken a formal&#xA;economics class since high school. But in the last few years I&amp;rsquo;ve read a few&#xA;books that have introduced me to the wonderful, fascinating world of economics,&#xA;which I now consider one of my favorite subjects.&lt;/p&gt;&#xA;&lt;p&gt;Two books that provide a good grasp on foundational economics are &lt;a href=&#34;https://www.amazon.com/Naked-Economics-Undressing-Dismal-Science/dp/0393356493&#34;&gt;&lt;em&gt;Naked&#xA;Economics&lt;/em&gt;&lt;/a&gt; by Charles Wheelan and &lt;a href=&#34;https://www.penguinrandomhouse.com/books/75341/the-undercover-economist-by-tim-harford/&#34;&gt;&lt;em&gt;Undercover&#xA;Economist&lt;/em&gt;&lt;/a&gt; by Tim Harford. Both books offer a&#xA;&amp;ldquo;qualitative&amp;rdquo; introduction to economic concepts: no equations, formulas, or&#xA;scary math. Both answer fundamental questions about human behavior using tools&#xA;of economics and provide a framework for answering other questions using&#xA;economics.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating Your Own Git Server</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/creating-your-own-git-server/</link>
      <pubDate>Wed, 18 Mar 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/creating-your-own-git-server/</guid>
      <description>&lt;p&gt;Ever considered setting up and running your very own git server? It&amp;rsquo;s actually&#xA;quite easy! In this post, I&amp;rsquo;ll outline the steps I took to set up my own so&#xA;that you can give it a try yourself. But first, why might you even want to go&#xA;through the trouble of setting up your own server?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Caching LDAP Queries in Mutt</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/caching-ldap-queries-in-mutt/</link>
      <pubDate>Wed, 11 Mar 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/caching-ldap-queries-in-mutt/</guid>
      <description>&lt;p&gt;You can use the &lt;a href=&#34;https://www.spinnaker.de/lbdb/&#34;&gt;&lt;code&gt;lbdb&lt;/code&gt;&lt;/a&gt; tool to query an LDAP&#xA;server within Mutt using the &lt;code&gt;query_command&lt;/code&gt; setting. Setting up &lt;code&gt;lbdb&lt;/code&gt; is out&#xA;of scope for this article, although you can find plenty of documentation and&#xA;examples online (&lt;a href=&#34;https://annvix.com/using_openldap_as_an_address_book&#34;&gt;here&lt;/a&gt; and &lt;a href=&#34;https://bradomyn.wordpress.com/2016/01/07/muttldap/&#34;&gt;here&lt;/a&gt;, for instance). One drawback to this&#xA;approach, however, is that everytime you want to look up a recipient in Mutt&#xA;you have to query your LDAP server, which can be quite slow.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git Plumbing</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/git-plumbing/</link>
      <pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/git-plumbing/</guid>
      <description>&lt;h3 id=&#34;porcelain-and-plumbing&#34;&gt;&#xA;  &lt;a href=&#34;#porcelain-and-plumbing&#34;&gt;Porcelain and Plumbing&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;h3 id=&#34;git-commit&#34;&gt;&#xA;  &lt;a href=&#34;#git-commit&#34;&gt;git commit&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;Plain English&lt;/strong&gt;: Create a new tree object from the current index and create a&#xA;new commit object from that tree. The commit object combines a commit message,&#xA;parent, date, author, committer, and the tree. Update the ref pointed to by&#xA;HEAD with the hash of the new commit object.&lt;/p&gt;&#xA;&lt;h4 id=&#34;plumbing&#34;&gt;&#xA;  &lt;a href=&#34;#plumbing&#34;&gt;Plumbing&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&lt;p&gt;Once files are in the index (using &lt;code&gt;git add&lt;/code&gt; or &lt;code&gt;git update-index&lt;/code&gt;) use &lt;code&gt;git write-tree&lt;/code&gt; to create a new tree object:&lt;/p&gt;</description>
    </item>
    <item>
      <title>You Don&#39;t Want a Tax Refund</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/you-dont-want-a-tax-refund/</link>
      <pubDate>Thu, 13 Feb 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/you-dont-want-a-tax-refund/</guid>
      <description>&lt;p&gt;Tax time is approaching and this year, like every year, it is common to hear&#xA;people excited about receiving their tax return discussing the exciting&#xA;purchases they plan on making with this perceived windfall.&lt;/p&gt;&#xA;&lt;p&gt;I want to challenge this conventional wisdom by stating a true but unpopular&#xA;fact: getting a tax return is not necessarily a good thing and, in most cases,&#xA;is actually the least desirable financial outcome one can achieve.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Xilinx Vitis for Embedded Hardware Acceleration</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/vitis-for-embedded-hardware-acceleration/</link>
      <pubDate>Wed, 12 Feb 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/vitis-for-embedded-hardware-acceleration/</guid>
      <description>&lt;p&gt;Xilinx recently released their new Vitis tool, which aims to ease the process&#xA;of accelerating high-level algorithms in applications in an FPGA. It is an&#xA;ambitious tool with a lot of potential. This guide will help you get started.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Archive the Internet</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/archive-the-internet/</link>
      <pubDate>Fri, 07 Feb 2020 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/archive-the-internet/</guid>
      <description>&lt;p&gt;As the Internet continues to grow and age, we are seeing more and more of a&#xA;phenomenon called &amp;ldquo;link rot&amp;rdquo;. Link rot is the all-too-familiar experience of&#xA;returning to a bookmark or link only to find that it&amp;rsquo;s no longer maintained,&#xA;been taken down, or even changed to something else. What can we do about this?&lt;/p&gt;</description>
    </item>
    <item>
      <title>2019 Reading Review</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/2019-reading-review/</link>
      <pubDate>Sat, 28 Dec 2019 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/2019-reading-review/</guid>
      <description>&lt;p&gt;In 2019, I read 27 books. This was less than last year&amp;rsquo;s 40 and is not an&#xA;overly impressive quantity for any serious reader, yet I&amp;rsquo;m happy with both the&#xA;amount and the content that I read this year. Below, I&amp;rsquo;ll give a brief summary&#xA;of my favorites.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Evaluating Markdown Code Blocks in Vim</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/evaluating-markdown-code-blocks-in-vim/</link>
      <pubDate>Mon, 12 Aug 2019 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/evaluating-markdown-code-blocks-in-vim/</guid>
      <description>&lt;p&gt;When writing Markdown it is common to have code blocks within your document&#xA;that look something like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;This is a code block:&#xA;```bash&#xA;echo &amp;quot;Hello, world!&amp;quot;&#xA;```&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;One of the great features of Emacs&amp;rsquo; &lt;a href=&#34;https://orgmode.org/&#34;&gt;Org mode&lt;/a&gt; is its&#xA;ability to evaluate blocks of code from within the editing environment. I&#xA;always appreciated this feature about Org mode which got me to thinking about&#xA;implementing something similar in Vim.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Write Your Own Man Pages</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/write-your-own-man-pages/</link>
      <pubDate>Mon, 29 Jul 2019 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/write-your-own-man-pages/</guid>
      <description>&lt;p&gt;This post was inspired by the tool &lt;a href=&#34;https://github.com/sinclairtarget/um&#34;&gt;um&lt;/a&gt;.&#xA;I decided to try my hand at making my own lightweight implementation using just&#xA;a shell function. I decided to name my tool &lt;code&gt;ual&lt;/code&gt; as a nod to the fact that it&#xA;complements &lt;code&gt;man&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tutorial: Booting Linux on the ZCU102</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/booting-linux-zcu102/</link>
      <pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/booting-linux-zcu102/</guid>
      <description>&lt;p&gt;This post contains a step-by-step walk through on booting Linux on Xilinx&amp;rsquo;s&#xA;ZCU102 MPSoC evaluation board.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Birthday Problem</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/the-birthday-problem/</link>
      <pubDate>Mon, 07 Dec 2015 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/the-birthday-problem/</guid>
      <description>&lt;p&gt;The &amp;ldquo;Birthday Problem&amp;rdquo; is a classic in introductory probability theory, and it&#xA;never fails to impress the newly initiated. The problem goes like this:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;How many people do you need to have in one room for the probability that at&#xA;least 2 people in that room share a birthday to be 50%?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The answer may surprise you. Before we get to the answer though, let&amp;rsquo;s go real&#xA;briefly into the math behind it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Make Your Mac Clean Itself</title>
      <link>https://a731295c.gpanders-com.pages.dev/blog/make-your-mac-clean-itself/</link>
      <pubDate>Wed, 11 Nov 2015 00:00:00 +0000</pubDate><author>contact@gpanders.com (Gregory Anders)</author>
      <guid>https://a731295c.gpanders-com.pages.dev/blog/make-your-mac-clean-itself/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update (6/18/2019):&lt;/strong&gt; Since writing this post I have released a tool called&#xA;&lt;a href=&#34;https://codeberg.org/gpanders/pushbroom&#34;&gt;pushbroom&lt;/a&gt; that should make all of this&#xA;easier and a bit more robust.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
