<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>vogt.world</title><link>https://www.vogt.world/</link><description>Recent content on vogt.world</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Aug 2026 19:07:29 -0500</lastBuildDate><atom:link href="https://www.vogt.world/index.xml" rel="self" type="application/rss+xml"/><item><title>One-hundred things</title><link>https://www.vogt.world/one-hundred-important-things/</link><pubDate>Thu, 06 Aug 2026 19:07:29 -0500</pubDate><guid>https://www.vogt.world/one-hundred-important-things/</guid><description>&lt;p&gt;In any organization or company, there are one-hundred things. Now, at any given moment, ten of those things are very important, thirty of those things are somewhat important, fifty are maybe a little nebulous as to their import. And then the last ten are largely inconsequential for the time being.&lt;/p&gt;
&lt;p&gt;You really only need consensus on the top ten. You need functional disagreement and maybe a little friction on the next thirty. You need general knowledge of the fifty in the middle, as they range from good-to-know to I-don&amp;rsquo;t-know. But it&amp;rsquo;s okay to have the disagreements on those too. For the last ten, at least one person should be a fucking nutcase about at least one of those bottom ten things. But everybody else can have an indifferent opinion on those bottom ten.&lt;/p&gt;</description></item><item><title>Log</title><link>https://www.vogt.world/log/</link><pubDate>Sun, 02 Aug 2026 09:50:00 +0000</pubDate><guid>https://www.vogt.world/log/</guid><description>&lt;p&gt;Facebook Marketplace first introduce the &amp;ldquo;ask if this is available&amp;rdquo; pre-filled message. Now they&amp;rsquo;ve introduced a setting so that listings can have AI respond to messages about availability. This feels like Product Manager KPI fraud&amp;hellip;&lt;/p&gt;
&lt;div class="ts"&gt;08/02/2026 09:50AM&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;The year is 2026 and if you&amp;rsquo;re writing something online, your goal is no longer to write something well. Your goal is to write something that doesn&amp;rsquo;t have any AI tells in it. I don&amp;rsquo;t care if you for real use the phrase &amp;ldquo;[thing] is real.&amp;rdquo; Your goal is to NOT sound like AI.&lt;/p&gt;</description></item><item><title>Honk the horn</title><link>https://www.vogt.world/honk-the-horn/</link><pubDate>Thu, 23 Jul 2026 07:00:00 -0700</pubDate><guid>https://www.vogt.world/honk-the-horn/</guid><description>&lt;p&gt;I&amp;rsquo;ve often heard from engineers that it&amp;rsquo;s not our job to write code, it&amp;rsquo;s our job to solve business problems. When working for a company, I suppose that&amp;rsquo;s strictly true. But it&amp;rsquo;s also okay to like the many parts of your job that are involved in that goal, or are orthogonal to it.&lt;/p&gt;
&lt;p&gt;Once I heard someone even say it&amp;rsquo;s not your job to &amp;ldquo;solve business problems&amp;rdquo;, it&amp;rsquo;s to &amp;ldquo;write code that satisfies requirements.&amp;rdquo; Oddly enough, I&amp;rsquo;ve heard the exact opposite of this from other engineers; throw any requirements overboard if you know better. Again, I suppose these are true, but, largely pedantic.&lt;/p&gt;</description></item><item><title>Best practices are relative</title><link>https://www.vogt.world/best-practices/</link><pubDate>Fri, 17 Jul 2026 08:00:00 -0700</pubDate><guid>https://www.vogt.world/best-practices/</guid><description>&lt;p&gt;Maybe I&amp;rsquo;m just obtuse, but whenever I read an article from a company, or programmer, or really anyone talking about &amp;ldquo;best practices&amp;rdquo;, it always seems like the examples are either obvious, and therefore un-illustrative of best-practices, or non-specific, and difficult to tell if the best-practices actually solve for the problem.&lt;/p&gt;
&lt;p&gt;Best practices seem to range across three general categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Common: Practices to prevent mistakes that are very human, and very common, regardless of how experienced or &amp;ldquo;good&amp;rdquo; you are.&lt;/li&gt;
&lt;li&gt;Training Wheels: Practices to prevent mistakes for the lowest common denominator, and not very common, but are good ideas for you if you are the lowest common denominator, or adjacent to them.&lt;/li&gt;
&lt;li&gt;Checking: Practices that prevent mistakes that are some combination of rare in probability, easy to imagine, hard to do, but dire in their consequences.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first category (Common) is the good one. The second one (Training Wheels) is the okay one, but it&amp;rsquo;s a hard sell. No one wants to be told that they&amp;rsquo;re the reason the rule exists, and everyone is generally trying to not be the rule.&lt;/p&gt;</description></item><item><title>About</title><link>https://www.vogt.world/about/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/about/</guid><description>&lt;p&gt;I&amp;rsquo;m Ben Vogt and I&amp;rsquo;m a software engineer living in Chicago, IL. This site is where I write about programming and things I&amp;rsquo;ve &lt;a href="https://www.vogt.world/designing-and-building-a-couch/"&gt;built&lt;/a&gt;. Emails addressed to &lt;a href="mailto:benjvogt@gmail.com"&gt;benjvogt@gmail.com&lt;/a&gt; are always welcome (though I would greatly appreciate it if you would write them by hand, not using generative AI.) My GitHub profile is &lt;a href="https://github.com/vogtb"&gt;github.com/vogtb&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>2026-06-13-cat-shelf</title><link>https://www.vogt.world/2026-06-13-cat-shelf/</link><pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2026-06-13-cat-shelf/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2026-06-13-cat-shelf/2026-06-13-cat-shelf.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2026-06-07-door-county</title><link>https://www.vogt.world/2026-06-07-door-county/</link><pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2026-06-07-door-county/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2026-06-07-door-county/2026-06-07-door-county.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2026-05-23-back-in-chicago</title><link>https://www.vogt.world/2026-05-23-back-in-chicago/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2026-05-23-back-in-chicago/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2026-05-23-back-in-chicago/2026-05-23-back-in-chicago.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2026-03-20-surf</title><link>https://www.vogt.world/2026-03-20-surf/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2026-03-20-surf/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2026-03-20-surf/2026-03-20-surf.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2026-03-13-east-facing</title><link>https://www.vogt.world/2026-03-13-east-facing/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2026-03-13-east-facing/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2026-03-13-east-facing/2026-03-13-east-facing.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>A code to code by</title><link>https://www.vogt.world/code-to-code-by/</link><pubDate>Wed, 04 Mar 2026 18:00:00 -0700</pubDate><guid>https://www.vogt.world/code-to-code-by/</guid><description>&lt;p&gt;At Replo, I was trying to get a handle on how to explain what we should and shouldn&amp;rsquo;t do. We had a really solid, very extensive, and well-written Notion section of our best practices for code, support process, and RFC, but it was, well, almost too verbose. I was trying to figure out a succinct way to say &amp;ldquo;here&amp;rsquo;s a rule that lets us work with fewer rules&amp;rdquo; or rather &amp;ldquo;here&amp;rsquo;s a couple of rules that helps me not have to post about what we do/don&amp;rsquo;t do on Slack.&amp;rdquo;&lt;/p&gt;</description></item><item><title>2026-02-27-cal-coast</title><link>https://www.vogt.world/2026-02-27-cal-coast/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2026-02-27-cal-coast/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2026-02-27-cal-coast/2026-02-27-cal-coast.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Glade: cross-platform GUI library in Typescript that uses WebGPU</title><link>https://www.vogt.world/glade-typescript-gui-webgpu/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://www.vogt.world/glade-typescript-gui-webgpu/</guid><description>&lt;p&gt;&lt;a href="https://glade.graphics"&gt;Glade&lt;/a&gt; is a cross-platform GUI library for Typescript that uses WebGPU to render apps at &amp;gt;60fps, for browsers and native macOS.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="x-platform-demos.png" alt="Glade side-by-side demo" loading="lazy" /&gt;
 &lt;figcaption&gt;Glade running side-by-side on native macOS (left) and in browser (right)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Glade is basically a library for writing cross-platform graphical applications with TypeScript and JavaScript. It includes an application framework and component library (text, inputs, flexbox layouts, etc.), all drawn using WebGPU. For browsers, it renders to a canvas element. For native macOS, it renders to a &lt;a href="https://www.glfw.org/"&gt;GLFW&lt;/a&gt; window via Google&amp;rsquo;s &lt;a href="https://github.com/google/dawn/"&gt;Dawn&lt;/a&gt; WebGPU implementation.&lt;/p&gt;</description></item><item><title>82ef1073</title><link>https://www.vogt.world/82ef1073/</link><pubDate>Sat, 27 Dec 2025 20:55:03 +0000</pubDate><guid>https://www.vogt.world/82ef1073/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/82ef1073/82ef1073.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>4e26df16b297</title><link>https://www.vogt.world/4e26df16b297/</link><pubDate>Sat, 27 Dec 2025 20:34:16 +0000</pubDate><guid>https://www.vogt.world/4e26df16b297/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/4e26df16b297/4e26df16b297.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>a2ecdab5</title><link>https://www.vogt.world/a2ecdab5/</link><pubDate>Sat, 27 Dec 2025 20:12:51 +0000</pubDate><guid>https://www.vogt.world/a2ecdab5/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/a2ecdab5/a2ecdab5.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Bun GL Part 2: Glade, a cross-platform WebGL library</title><link>https://www.vogt.world/bun-gl-part-2-glade-poc-bun-gui/</link><pubDate>Fri, 05 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/bun-gl-part-2-glade-poc-bun-gui/</guid><description>&lt;p&gt;A couple days ago I made a simple &lt;a href="https://www.vogt.world/bun-gl-part-1-bun-gui-via-ffi"&gt;POC of using Bun and OpenGL to create a native GUI application&lt;/a&gt;. I decided to go a little further and write a small cross-platform library so you can write fill OpenGL/WebGL apps including keyboard/mouse events.&lt;/p&gt;
&lt;video controls loop width="1920" height="884" poster="demo-side-by-side.png"&gt;
 &lt;source src="glade-events-demo-1080.mp4" type="video/mp4"&gt;
 Demo of events pass-through.
&lt;/video&gt;
&lt;p&gt;I called it Glade, and you can see it on GitHub: &lt;a href="https://github.com/vogtb/glade-poc"&gt;github.com/vogtb/glade-poc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Glade is a backronym for GL-assisted drawing environment, which seemed like a fun name for not-super-serious project.)&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Bun GL Part 1: Using OpenGL via Bun's FFI</title><link>https://www.vogt.world/bun-gl-part-1-bun-gui-via-ffi/</link><pubDate>Wed, 03 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/bun-gl-part-1-bun-gui-via-ffi/</guid><description>&lt;p&gt;&lt;a href="https://github.com/vogtb/bun-gui"&gt;This is a minimal example&lt;/a&gt; of using &lt;a href="https://bun.com/docs/runtime/ffi#ffi"&gt;Bun&amp;rsquo;s FFI module&lt;/a&gt; to render a GUI using &lt;a href="https://www.glfw.org/"&gt;GLFW&lt;/a&gt; and &lt;a href="https://www.opengl.org/"&gt;OpenGL2&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="bun-ffi-gui.png" alt="Bun FFI GUI example" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;I&amp;rsquo;ve been keeping an eye on BunJS for a while now because if its &lt;a href="https://bun.com/docs/bundler/executables"&gt;ability to compile to single file executables.&lt;/a&gt; Given Bun&amp;rsquo;s recent acquisition, I though it&amp;rsquo;d be interesting to explore the possibilities of writing GUIs using typescript without the DOM. This is a very basic example of using C bindings to do that.&lt;/p&gt;</description></item><item><title>Zig GUI from scratch (part 2)</title><link>https://www.vogt.world/zig-gui-from-scratch-part-2/</link><pubDate>Tue, 18 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/zig-gui-from-scratch-part-2/</guid><description>&lt;p&gt;Some things seem like a good idea, but really aren&amp;rsquo;t. And even if you know it&amp;rsquo;s not a good idea, you can&amp;rsquo;t help but think, well, it&amp;rsquo;ll be fun at least. Or maybe it&amp;rsquo;s just me when I had the idea to use WebGPU + Dawn for this project.&lt;/p&gt;
&lt;details&gt;
 &lt;summary&gt;
 Previously: Zig GUI from scratch (part 1)
 &lt;/summary&gt;
 &lt;p&gt;
 &lt;a href="https://www.vogt.world/zig-gui-from-scratch-part-2/"&gt;Zig GUI from scratch (part 1)&lt;/a&gt;: In Part 1, we started building a cross-platform desktop GUI app from scratch in Zig, targeting WASM, macOS, Linux, and Windows, and using OpenGL/WebGL and SDL2 for native windowing. It's some of the boring stuff like app structure, but also some of the more interesting parts of Zig, like comptime imports. We also planned out and partly implement the platform-specific modules that all use the same implicit interface, split across app, platform, graphics, and js modules. Also (not to list everything here) we worked on the the JS system call layer for wasm, using a modified version of &lt;a href="https://github.com/mitchellh/zig-js"&gt;mitchellh's zig-js&lt;/a&gt; extended to serialize arbitrary JSON so complex types like vertex arrays can cross the wasm-JS boundary. In the end, we've got a basic "hello canvas color" rendering on both web and native! Also had a little digression on using code gen for OpenGL bindings.
 &lt;/p&gt;</description></item><item><title>ape-no-fire-ape</title><link>https://www.vogt.world/ape-no-fire-ape/</link><pubDate>Tue, 04 Nov 2025 20:49:42 +0000</pubDate><guid>https://www.vogt.world/ape-no-fire-ape/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/ape-no-fire-ape/ape-no-fire-ape.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>ben_4121</title><link>https://www.vogt.world/ben_4121/</link><pubDate>Wed, 15 Oct 2025 16:42:41 +0000</pubDate><guid>https://www.vogt.world/ben_4121/</guid><description>&lt;figure&gt;
 &lt;img src="ben_4121.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>ben_4181</title><link>https://www.vogt.world/ben_4181/</link><pubDate>Thu, 09 Oct 2025 22:48:38 +0000</pubDate><guid>https://www.vogt.world/ben_4181/</guid><description>&lt;figure&gt;
 &lt;img src="ben_4181.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>IMG_8050</title><link>https://www.vogt.world/img_8050/</link><pubDate>Mon, 06 Oct 2025 19:10:33 +0000</pubDate><guid>https://www.vogt.world/img_8050/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/IMG_8050/IMG_8050.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>80ea3fd</title><link>https://www.vogt.world/80ea3fd/</link><pubDate>Sat, 20 Sep 2025 20:51:35 +0000</pubDate><guid>https://www.vogt.world/80ea3fd/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/80ea3fd/80ea3fd.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>A spreadsheet in Go</title><link>https://www.vogt.world/spreadsheet-in-go/</link><pubDate>Thu, 18 Sep 2025 00:00:00 -0700</pubDate><guid>https://www.vogt.world/spreadsheet-in-go/</guid><description>&lt;p&gt;As a way to get back into a language, I like to build spreadsheet engines. I&amp;rsquo;ve gotten pretty good at it, even if I&amp;rsquo;m always missing some little feature. There&amp;rsquo;s always something that doesn&amp;rsquo;t make the cut, like formats, array-format ranges, or multi-dimensional arrays. But it&amp;rsquo;s fun, and interesting, and it&amp;rsquo;s a neat way to brush up on a programming language, in this case, Go.&lt;/p&gt;
&lt;p&gt;You can read the source code here. &lt;a href="https://github.com/vogtb/go-spreadsheet"&gt;github.com/vogtb/go-spreadsheet&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Project constant.ts files are bad</title><link>https://www.vogt.world/constants-files-are-bad/</link><pubDate>Tue, 02 Sep 2025 12:13:09 -0700</pubDate><guid>https://www.vogt.world/constants-files-are-bad/</guid><description>&lt;p&gt;The pattern of using a &lt;code&gt;constants.ts&lt;/code&gt; is not a good one. The fact that a
variable or some block of code is constant tells me nothing about its use. Is
it configuration? Is it an environmental variable? Is it a magic number? Based
on the name of the file, I couldn&amp;rsquo;t guess; it could be all of these or none
of these.&lt;/p&gt;
&lt;p&gt;We should name files after what they do. &lt;code&gt;queue.ts&lt;/code&gt;, &lt;code&gt;config.ts&lt;/code&gt;, &lt;code&gt;env.ts&lt;/code&gt;, &lt;code&gt;main.ts&lt;/code&gt;, &lt;code&gt;build.ts&lt;/code&gt;, &lt;code&gt;Toolbar.tsx&lt;/code&gt; all give me a pretty good idea as to what I&amp;rsquo;ll find in the file.&lt;/p&gt;</description></item><item><title>2025-07-19-9a7f26d</title><link>https://www.vogt.world/2025-07-19-9a7f26d/</link><pubDate>Sat, 19 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-07-19-9a7f26d/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-07-19-9a7f26d/2025-07-19-9a7f26d.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-07-09-bf8h1e8</title><link>https://www.vogt.world/2025-07-09-bf8h1e8/</link><pubDate>Wed, 09 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-07-09-bf8h1e8/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-07-09-bf8h1e8/2025-07-09-bf8h1e8.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-06-30-cat-desk</title><link>https://www.vogt.world/2025-06-30-cat-desk/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-06-30-cat-desk/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-06-30-cat-desk/2025-06-30-cat-desk.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-06-13-a+b+alk</title><link>https://www.vogt.world/2025-06-13-a+b+alk/</link><pubDate>Fri, 13 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-06-13-a+b+alk/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-06-13-a&amp;#43;b&amp;#43;alk/2025-06-13-a&amp;#43;b&amp;#43;alk.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-06-13-golden-gate</title><link>https://www.vogt.world/2025-06-13-golden-gate/</link><pubDate>Fri, 13 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-06-13-golden-gate/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-06-13-golden-gate/2025-06-13-golden-gate.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-06-13-golden-gate-park</title><link>https://www.vogt.world/2025-06-13-golden-gate-park/</link><pubDate>Fri, 13 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-06-13-golden-gate-park/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-06-13-golden-gate-park/2025-06-13-golden-gate-park.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-06-13-seagull-alk</title><link>https://www.vogt.world/2025-06-13-seagull-alk/</link><pubDate>Fri, 13 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-06-13-seagull-alk/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-06-13-seagull-alk/2025-06-13-seagull-alk.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-06-13-sf</title><link>https://www.vogt.world/2025-06-13-sf/</link><pubDate>Fri, 13 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-06-13-sf/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-06-13-sf/2025-06-13-sf.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Spreadsheets and similar tools</title><link>https://www.vogt.world/spreadsheets-and-other-things/</link><pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/spreadsheets-and-other-things/</guid><description>&lt;p&gt;This is a review of all relevant spreadsheet-like products, services, tools, and
technologies, as well as blogs, articles, news, and notes related to
spreadsheets. I started this back in 2017, and I haven&amp;rsquo;t updated to it in a
year or two, but it&amp;rsquo;s fairly complete. Since I&amp;rsquo;ve shared it with friends
and colleagues working on spreadsheet-like interfaces, I thought I&amp;rsquo;d share it
here as well. Never know who may find it useful.&lt;/p&gt;</description></item><item><title>IMG_5665</title><link>https://www.vogt.world/img_5665/</link><pubDate>Mon, 28 Apr 2025 00:19:35 +0000</pubDate><guid>https://www.vogt.world/img_5665/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/IMG_5665/IMG_5665.gif" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Building a music making app with Swift (part 2 of N)</title><link>https://www.vogt.world/building-a-music-making-app-with-swift-part-2/</link><pubDate>Sat, 05 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/building-a-music-making-app-with-swift-part-2/</guid><description>&lt;p&gt;A while ago I wrote &lt;a href="https://www.vogt.world/building-a-music-making-app-with-swift-part-1/"&gt;&amp;ldquo;Building a music making app with Swift (part 1 of N)&amp;rdquo;&lt;/a&gt;
and never really followed up. I&amp;rsquo;ve been chipping away at it every now and then
when the mood strikes. So here&amp;rsquo;s a couple updates on it.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://www.vogt.world/building-a-music-making-app-with-swift-part-2/auto-clipart-and-more-complete-layout.png" alt="A somewhat complete version" loading="lazy" /&gt;
 &lt;figcaption&gt;A work in progress.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="expanded-idea-with-a-better-layout"&gt;Expanded idea with a better layout&lt;/h2&gt;
&lt;p&gt;Scope-creep is real. But honestly, for a project like this, it&amp;rsquo;s only a problem
if I&amp;rsquo;m not having fun. So with that in mind, I wanted to expand this app a bit.
There are a lot (&lt;em&gt;A LOT&lt;/em&gt;) of sampling iOS apps, or sequencing apps on the
Apple App Store, but I thought it would be neat to combine some of the best
ideas from them to create this sort of app that lets you switch between
sampling, sequencing, and instrument creation modes in a couple of simple
screens.&lt;/p&gt;</description></item><item><title>2025-03-08-ag</title><link>https://www.vogt.world/2025-03-08-ag/</link><pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-03-08-ag/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-03-08-ag/2025-03-08-ag.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-03-08-ajl</title><link>https://www.vogt.world/2025-03-08-ajl/</link><pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-03-08-ajl/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-03-08-ajl/2025-03-08-ajl.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-03-08-ct8</title><link>https://www.vogt.world/2025-03-08-ct8/</link><pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-03-08-ct8/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-03-08-ct8/2025-03-08-ct8.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-03-08-hb</title><link>https://www.vogt.world/2025-03-08-hb/</link><pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-03-08-hb/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-03-08-hb/2025-03-08-hb.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-09-feeder</title><link>https://www.vogt.world/2025-02-09-feeder/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-09-feeder/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-09-feeder/2025-02-09-feeder.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-09-h</title><link>https://www.vogt.world/2025-02-09-h/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-09-h/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-09-h/2025-02-09-h.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-09-m</title><link>https://www.vogt.world/2025-02-09-m/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-09-m/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-09-m/2025-02-09-m.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-09-p</title><link>https://www.vogt.world/2025-02-09-p/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-09-p/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-09-p/2025-02-09-p.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-07-lesser-golf-finch</title><link>https://www.vogt.world/2025-02-07-lesser-golf-finch/</link><pubDate>Fri, 07 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-07-lesser-golf-finch/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-07-lesser-golf-finch/2025-02-07-lesser-golf-finch.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-07-us</title><link>https://www.vogt.world/2025-02-07-us/</link><pubDate>Fri, 07 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-07-us/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-07-us/2025-02-07-us.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-06-says-phoebe</title><link>https://www.vogt.world/2025-02-06-says-phoebe/</link><pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-06-says-phoebe/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-06-says-phoebe/2025-02-06-says-phoebe.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-06-says-phoebe-2</title><link>https://www.vogt.world/2025-02-06-says-phoebe-2/</link><pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-06-says-phoebe-2/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-06-says-phoebe-2/2025-02-06-says-phoebe-2.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-06-the-birder</title><link>https://www.vogt.world/2025-02-06-the-birder/</link><pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-06-the-birder/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-06-the-birder/2025-02-06-the-birder.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-06-tory-pines-rock</title><link>https://www.vogt.world/2025-02-06-tory-pines-rock/</link><pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-06-tory-pines-rock/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-06-tory-pines-rock/2025-02-06-tory-pines-rock.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-05-nick</title><link>https://www.vogt.world/2025-02-05-nick/</link><pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-05-nick/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-05-nick/2025-02-05-nick.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2025-02-05-swim-area</title><link>https://www.vogt.world/2025-02-05-swim-area/</link><pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2025-02-05-swim-area/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2025-02-05-swim-area/2025-02-05-swim-area.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-11-27-crestline</title><link>https://www.vogt.world/2024-11-27-crestline/</link><pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-11-27-crestline/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-11-27-crestline/2024-11-27-crestline.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-11-16-cdf5aa</title><link>https://www.vogt.world/2024-11-16-cdf5aa/</link><pubDate>Sat, 16 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-11-16-cdf5aa/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-11-16-cdf5aa/2024-11-16-cdf5aa.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-10-31-fence</title><link>https://www.vogt.world/2024-10-31-fence/</link><pubDate>Thu, 31 Oct 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-10-31-fence/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-10-31-fence/2024-10-31-fence.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Zig GUI from scratch (part 1)</title><link>https://www.vogt.world/zig-gui-from-scratch-part-1/</link><pubDate>Sun, 27 Oct 2024 10:24:06 -0700</pubDate><guid>https://www.vogt.world/zig-gui-from-scratch-part-1/</guid><description>&lt;p&gt;This is the first of hopefully many posts as I work on building a cross-platform desktop GUI
application using Zig. I&amp;rsquo;m probably going to open-source this at some point, but in the mean time
it&amp;rsquo;s fun and interesting to write about. Hopefully I can share the details, reasoning, and
things I&amp;rsquo;ve learned along the way.&lt;/p&gt;
&lt;p&gt;These posts are going to be informal and unceremonious, and I&amp;rsquo;m not going to ask pardon for it; the
goal here is to write something, and keep the updates flowing, rather than make them perfect.&lt;/p&gt;</description></item><item><title>2024-10-19-cat-curtain</title><link>https://www.vogt.world/2024-10-19-cat-curtain/</link><pubDate>Sat, 19 Oct 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-10-19-cat-curtain/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-10-19-cat-curtain/2024-10-19-cat-curtain.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-10-07-switzer-canyon</title><link>https://www.vogt.world/2024-10-07-switzer-canyon/</link><pubDate>Mon, 07 Oct 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-10-07-switzer-canyon/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-10-07-switzer-canyon/2024-10-07-switzer-canyon.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-09-27-green-beetle</title><link>https://www.vogt.world/2024-09-27-green-beetle/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-09-27-green-beetle/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-09-27-green-beetle/2024-09-27-green-beetle.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-09-05-new-neighbor</title><link>https://www.vogt.world/2024-09-05-new-neighbor/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-09-05-new-neighbor/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-09-05-new-neighbor/2024-09-05-new-neighbor.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>56004bec</title><link>https://www.vogt.world/56004bec/</link><pubDate>Tue, 03 Sep 2024 13:28:36 +0000</pubDate><guid>https://www.vogt.world/56004bec/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/56004bec/56004bec.gif" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-09-02-cowles-mountain</title><link>https://www.vogt.world/2024-09-02-cowles-mountain/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-09-02-cowles-mountain/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-09-02-cowles-mountain/2024-09-02-cowles-mountain.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-08-28-pelican-sunset</title><link>https://www.vogt.world/2024-08-28-pelican-sunset/</link><pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-08-28-pelican-sunset/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-08-28-pelican-sunset/2024-08-28-pelican-sunset.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-08-11-4d5cc8e</title><link>https://www.vogt.world/2024-08-11-4d5cc8e/</link><pubDate>Sun, 11 Aug 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-08-11-4d5cc8e/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-08-11-4d5cc8e/2024-08-11-4d5cc8e.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-08-11-9f4a14f</title><link>https://www.vogt.world/2024-08-11-9f4a14f/</link><pubDate>Sun, 11 Aug 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-08-11-9f4a14f/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-08-11-9f4a14f/2024-08-11-9f4a14f.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Quick tree-sitter grammars</title><link>https://www.vogt.world/quick-calc-tree-sitter/</link><pubDate>Sun, 28 Jul 2024 11:22:44 -0500</pubDate><guid>https://www.vogt.world/quick-calc-tree-sitter/</guid><description>&lt;p&gt;&lt;em&gt;Quick&lt;/em&gt; is a formula language that I wrote a couple years back for a spreadsheet product called
PT1. &lt;a href="https://github.com/tree-sitter/tree-sitter"&gt;Tree-sitter&lt;/a&gt; is really great at this sort of
thing, and, &lt;em&gt;much&lt;/em&gt; easier than Antlr,
&lt;a href="https://www.vogt.world/f7-spreadsheet-engine"&gt;which I&amp;rsquo;ve used in the past to build formula-like parsers&lt;/a&gt;. The basic
code is one where you can execute simple calculation-like blocks, but not define
vars. Was trying to stay simple here. Depending on the context, we used different implementations
of functions, like when aggregating with &lt;code&gt;sum()&lt;/code&gt; vs adding scalars with &lt;code&gt;sum()&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>annies-canyon</title><link>https://www.vogt.world/annies-canyon/</link><pubDate>Wed, 10 Jul 2024 14:08:22 +0000</pubDate><guid>https://www.vogt.world/annies-canyon/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/annies-canyon/annies-canyon.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>welcome-utah</title><link>https://www.vogt.world/welcome-utah/</link><pubDate>Fri, 28 Jun 2024 04:03:41 +0000</pubDate><guid>https://www.vogt.world/welcome-utah/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/welcome-utah/welcome-utah.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>alcatraz-seaguls</title><link>https://www.vogt.world/alcatraz-seaguls/</link><pubDate>Wed, 19 Jun 2024 15:23:37 +0000</pubDate><guid>https://www.vogt.world/alcatraz-seaguls/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/alcatraz-seaguls/alcatraz-seaguls.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>alcatraz-seaguls-moon</title><link>https://www.vogt.world/alcatraz-seaguls-moon/</link><pubDate>Wed, 19 Jun 2024 15:16:50 +0000</pubDate><guid>https://www.vogt.world/alcatraz-seaguls-moon/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/alcatraz-seaguls-moon/alcatraz-seaguls-moon.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>alcatraz-seagul-fireplace</title><link>https://www.vogt.world/alcatraz-seagul-fireplace/</link><pubDate>Wed, 19 Jun 2024 15:14:38 +0000</pubDate><guid>https://www.vogt.world/alcatraz-seagul-fireplace/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/alcatraz-seagul-fireplace/alcatraz-seagul-fireplace.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>sf-from-alcatraz-4ef8db</title><link>https://www.vogt.world/sf-from-alcatraz-4ef8db/</link><pubDate>Wed, 19 Jun 2024 15:12:49 +0000</pubDate><guid>https://www.vogt.world/sf-from-alcatraz-4ef8db/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/sf-from-alcatraz-4ef8db/sf-from-alcatraz-4ef8db.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>alcatraz-seagul</title><link>https://www.vogt.world/alcatraz-seagul/</link><pubDate>Wed, 19 Jun 2024 08:42:30 +0000</pubDate><guid>https://www.vogt.world/alcatraz-seagul/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/alcatraz-seagul/alcatraz-seagul.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>440-n-wells-e869c0</title><link>https://www.vogt.world/440-n-wells-e869c0/</link><pubDate>Wed, 12 Jun 2024 21:10:16 +0000</pubDate><guid>https://www.vogt.world/440-n-wells-e869c0/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/440-n-wells-e869c0/440-n-wells-e869c0.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-04-19-bloom</title><link>https://www.vogt.world/2024-04-19-bloom/</link><pubDate>Fri, 19 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-04-19-bloom/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-04-19-bloom/2024-04-19-bloom.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-04-12-break</title><link>https://www.vogt.world/2024-04-12-break/</link><pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-04-12-break/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-04-12-break/2024-04-12-break.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-04-03-mx</title><link>https://www.vogt.world/2024-04-03-mx/</link><pubDate>Wed, 03 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-04-03-mx/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-04-03-mx/2024-04-03-mx.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-04-02-chichen-itza</title><link>https://www.vogt.world/2024-04-02-chichen-itza/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-04-02-chichen-itza/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-04-02-chichen-itza/2024-04-02-chichen-itza.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-04-02-fl-tr</title><link>https://www.vogt.world/2024-04-02-fl-tr/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-04-02-fl-tr/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-04-02-fl-tr/2024-04-02-fl-tr.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-03-24-cat-brick</title><link>https://www.vogt.world/2024-03-24-cat-brick/</link><pubDate>Sun, 24 Mar 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-03-24-cat-brick/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-03-24-cat-brick/2024-03-24-cat-brick.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-03-09-moss</title><link>https://www.vogt.world/2024-03-09-moss/</link><pubDate>Sat, 09 Mar 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-03-09-moss/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-03-09-moss/2024-03-09-moss.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>440-n-wells-5ffd46</title><link>https://www.vogt.world/440-n-wells-5ffd46/</link><pubDate>Wed, 28 Feb 2024 01:50:07 +0000</pubDate><guid>https://www.vogt.world/440-n-wells-5ffd46/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/440-n-wells-5ffd46/440-n-wells-5ffd46.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>duck-b-2024-02-26</title><link>https://www.vogt.world/duck-b-2024-02-26/</link><pubDate>Mon, 26 Feb 2024 15:11:16 +0000</pubDate><guid>https://www.vogt.world/duck-b-2024-02-26/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/duck-b-2024-02-26/duck-b-2024-02-26.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>duck-a-2024-02-26</title><link>https://www.vogt.world/duck-a-2024-02-26/</link><pubDate>Mon, 26 Feb 2024 03:34:28 +0000</pubDate><guid>https://www.vogt.world/duck-a-2024-02-26/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/duck-a-2024-02-26/duck-a-2024-02-26.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>sf-99cd56</title><link>https://www.vogt.world/sf-99cd56/</link><pubDate>Sat, 17 Feb 2024 19:54:18 +0000</pubDate><guid>https://www.vogt.world/sf-99cd56/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/sf-99cd56/sf-99cd56.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>sketching-529e48</title><link>https://www.vogt.world/sketching-529e48/</link><pubDate>Fri, 26 Jan 2024 14:17:54 +0000</pubDate><guid>https://www.vogt.world/sketching-529e48/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/sketching-529e48/sketching-529e48.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>sketching-0fe4da8</title><link>https://www.vogt.world/sketching-0fe4da8/</link><pubDate>Thu, 25 Jan 2024 14:30:35 +0000</pubDate><guid>https://www.vogt.world/sketching-0fe4da8/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/sketching-0fe4da8/sketching-0fe4da8.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-01-20-uptown</title><link>https://www.vogt.world/2024-01-20-uptown/</link><pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-01-20-uptown/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-01-20-uptown/2024-01-20-uptown.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2024-01-01-new-year</title><link>https://www.vogt.world/2024-01-01-new-year/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2024-01-01-new-year/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2024-01-01-new-year/2024-01-01-new-year.gif" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-12-23-IMG_2369</title><link>https://www.vogt.world/2023-12-23-img_2369/</link><pubDate>Sat, 23 Dec 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-12-23-img_2369/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-12-23-IMG_2369/2023-12-23-IMG_2369.gif" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-12-09-IMG_2271</title><link>https://www.vogt.world/2023-12-09-img_2271/</link><pubDate>Sat, 09 Dec 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-12-09-img_2271/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-12-09-IMG_2271/2023-12-09-IMG_2271.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-11-27-winter-leaves</title><link>https://www.vogt.world/2023-11-27-winter-leaves/</link><pubDate>Mon, 27 Nov 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-11-27-winter-leaves/</guid><description>&lt;hr&gt;
&lt;p&gt;title: &amp;ldquo;2023-11-27-winter-leaves&amp;rdquo;
description: &amp;ldquo;2023-11-27-winter-leaves&amp;rdquo;
date: &amp;ldquo;2023-11-27&amp;rdquo;
image: &amp;ldquo;2023-11-27-winter-leaves.jpg&amp;rdquo;
thumb: &amp;ldquo;2023-11-27-winter-leaves_thumbnail.jpg&amp;rdquo;
kinds: [&amp;ldquo;photos&amp;rdquo;, &amp;ldquo;jpg&amp;rdquo;]
type: &amp;ldquo;photo&amp;rdquo;
layout: &amp;ldquo;index&amp;rdquo;&lt;/p&gt;
&lt;hr&gt;
&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-11-27-winter-leaves/2023-11-27-winter-leaves.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-11-18-cat-radiator</title><link>https://www.vogt.world/2023-11-18-cat-radiator/</link><pubDate>Sat, 18 Nov 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-11-18-cat-radiator/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-11-18-cat-radiator/2023-11-18-cat-radiator.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-10-08-ohare</title><link>https://www.vogt.world/2023-10-08-ohare/</link><pubDate>Sun, 08 Oct 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-10-08-ohare/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-10-08-ohare/2023-10-08-ohare.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-10-05-the-generationals</title><link>https://www.vogt.world/2023-10-05-the-generationals/</link><pubDate>Thu, 05 Oct 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-10-05-the-generationals/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-10-05-the-generationals/2023-10-05-the-generationals.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-09-23-garfield-park-conservatory-night</title><link>https://www.vogt.world/2023-09-23-garfield-park-conservatory-night/</link><pubDate>Sat, 23 Sep 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-09-23-garfield-park-conservatory-night/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-09-23-garfield-park-conservatory-night/2023-09-23-garfield-park-conservatory-night.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-08-07-acadia</title><link>https://www.vogt.world/2023-08-07-acadia/</link><pubDate>Mon, 07 Aug 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-08-07-acadia/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-08-07-acadia/2023-08-07-acadia.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-08-07-acadia-lookout</title><link>https://www.vogt.world/2023-08-07-acadia-lookout/</link><pubDate>Mon, 07 Aug 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-08-07-acadia-lookout/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-08-07-acadia-lookout/2023-08-07-acadia-lookout.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-08-06-acadia</title><link>https://www.vogt.world/2023-08-06-acadia/</link><pubDate>Sun, 06 Aug 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-08-06-acadia/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-08-06-acadia/2023-08-06-acadia.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-08-06-acadia-rock</title><link>https://www.vogt.world/2023-08-06-acadia-rock/</link><pubDate>Sun, 06 Aug 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-08-06-acadia-rock/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-08-06-acadia-rock/2023-08-06-acadia-rock.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-07-13-rock-island-boat-house</title><link>https://www.vogt.world/2023-07-13-rock-island-boat-house/</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-07-13-rock-island-boat-house/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-07-13-rock-island-boat-house/2023-07-13-rock-island-boat-house.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-07-13-rock-island-sunset</title><link>https://www.vogt.world/2023-07-13-rock-island-sunset/</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-07-13-rock-island-sunset/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-07-13-rock-island-sunset/2023-07-13-rock-island-sunset.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-07-13-sunset</title><link>https://www.vogt.world/2023-07-13-sunset/</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-07-13-sunset/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-07-13-sunset/2023-07-13-sunset.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Building a music making app with Swift (part 1 of N)</title><link>https://www.vogt.world/building-a-music-making-app-with-swift-part-1/</link><pubDate>Sun, 09 Jul 2023 10:19:01 -0500</pubDate><guid>https://www.vogt.world/building-a-music-making-app-with-swift-part-1/</guid><description>&lt;p&gt;Here are some scatter thoughts on building a little music making app with Swift.
I went from design to prototype in about a 10 hours of work, and maybe another
20 to get it to something a little more polished.&lt;/p&gt;
&lt;h1 id="physical-pads-sequencers-and-samplers"&gt;Physical pads, sequencers, and samplers&lt;/h1&gt;
&lt;p&gt;I started by designing the app with Figma. I wasn&amp;rsquo;t really planning on building
it at first, I just wanted to design something for fun. Looking at physical
synths, portable DAWs, sequencers, or samplers, it&amp;rsquo;s fun to find the patterns
and see what physical constraints are useful and could be fun to adopt for the
screen.&lt;/p&gt;</description></item><item><title>2023-06-30-the-mountain-goats</title><link>https://www.vogt.world/2023-06-30-the-mountain-goats/</link><pubDate>Fri, 30 Jun 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-06-30-the-mountain-goats/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-06-30-the-mountain-goats/2023-06-30-the-mountain-goats.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Status update - May 2023</title><link>https://www.vogt.world/status-update-may-2023/</link><pubDate>Mon, 05 Jun 2023 14:54:42 -0500</pubDate><guid>https://www.vogt.world/status-update-may-2023/</guid><description>&lt;p&gt;Smaller prototypes, SQLite WASM, and more.&lt;/p&gt;
&lt;h2 id="single-file-tools"&gt;Single-file tools&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been trying to make smaller things lately. I have a habit of getting ahold
of a fun idea, then making it not fun by biting off more than I can chew.
Sometimes that&amp;rsquo;s good. It&amp;rsquo;s fun to find that something is easier than I thought.
Or maybe as hard as I thought but still possible. Other times it&amp;rsquo;s just a bummer
to leave something unfinished because it was just too big.&lt;/p&gt;</description></item><item><title>Single-file application</title><link>https://www.vogt.world/single-file-application/</link><pubDate>Wed, 31 May 2023 14:31:49 -0500</pubDate><guid>https://www.vogt.world/single-file-application/</guid><description>&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; → Compile JS and CSS assets into a single .html file that can save
itself, and you&amp;rsquo;ve got yourself a little portable application.&lt;/p&gt;
&lt;h2 id="small-tools"&gt;Small tools&lt;/h2&gt;
&lt;p&gt;I like writing little tools. Tools to help me do my job, tools to remember
things, tools to track things, record things, update things, send reminders,
send emails, save files.&lt;/p&gt;
&lt;p&gt;Apple&amp;rsquo;s Shortcuts app is really good for this. Or at least some of these things.
But they don&amp;rsquo;t plug it into any of the real useful parts of iOS. Can I create an
entry in the &amp;ldquo;Share Sheet&amp;rdquo; to automatically email an article I&amp;rsquo;m reading to
myself? Yes. Can I create an app to toggle notifications for one app and one app
only? No. There&amp;rsquo;s room for improvement there.&lt;/p&gt;</description></item><item><title>2023-05-29-nylon-stitching</title><link>https://www.vogt.world/2023-05-29-nylon-stitching/</link><pubDate>Mon, 29 May 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-05-29-nylon-stitching/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-05-29-nylon-stitching/2023-05-29-nylon-stitching.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-05-27-confluence-great-blue</title><link>https://www.vogt.world/2023-05-27-confluence-great-blue/</link><pubDate>Sat, 27 May 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-05-27-confluence-great-blue/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-05-27-confluence-great-blue/2023-05-27-confluence-great-blue.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-05-27-confluence-with-rocks</title><link>https://www.vogt.world/2023-05-27-confluence-with-rocks/</link><pubDate>Sat, 27 May 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-05-27-confluence-with-rocks/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-05-27-confluence-with-rocks/2023-05-27-confluence-with-rocks.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2023-05-13-alice-lake-michigan</title><link>https://www.vogt.world/2023-05-13-alice-lake-michigan/</link><pubDate>Sat, 13 May 2023 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2023-05-13-alice-lake-michigan/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2023-05-13-alice-lake-michigan/2023-05-13-alice-lake-michigan.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Status update - April 2023</title><link>https://www.vogt.world/status-update-april-2023/</link><pubDate>Tue, 09 May 2023 13:49:44 -0500</pubDate><guid>https://www.vogt.world/status-update-april-2023/</guid><description>&lt;p&gt;Been working with gVisor, WASM, Next and more. Trying to do more
one-day-projects in my free time, but they usually end up taking a week. So
maybe next month I&amp;rsquo;ll try doing more one-hour projects, and I&amp;rsquo;ll end up with
something that actually takes a day.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="static-git-repo-site-generator"&gt;Static git repo site generator&lt;/h2&gt;
&lt;p&gt;Built a little
&lt;a href="https://git.vogt.world/gshr/log.html"&gt;static git repo site generator&lt;/a&gt;. You can
&lt;a href="https://www.vogt.world/writing/git-static-host-repo/"&gt;read more about it here&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="gvisor-runsc"&gt;gVisor, runsc&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been working on some projects that involve researching virtualization
techniques. &lt;a href="https://gvisor.dev"&gt;gVisor&lt;/a&gt; has been one of the main ones. It&amp;rsquo;s
surprising that right off the bat I&amp;rsquo;m seeing better numbers when compared to
containerd/QEMU when testing locally. A simple nodejs test gives me a really low
cold-start time using runsc.&lt;/p&gt;</description></item><item><title>Git static site generator tool</title><link>https://www.vogt.world/git-static-host-repo/</link><pubDate>Fri, 07 Apr 2023 13:31:49 -0500</pubDate><guid>https://www.vogt.world/git-static-host-repo/</guid><description>&lt;p&gt;&lt;em&gt;gshr&lt;/em&gt; is a simple static html site generator for multiple git repos.&lt;a href="#0"&gt;[0]&lt;/a&gt; I
wrote it as a fun little project because I haven&amp;rsquo;t written Go in a while. You
can browse the full code inside the gshr-generated site itself at &lt;a target="_blank" href="https://git.vogt.world/gshr/log.html"&gt;git.vogt.world&lt;/a&gt; but I&amp;rsquo;ve also got it up on GitHub at &lt;a href="https://github.com/vogtb/gshr"&gt;vogtb/gshr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a screenshot.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://www.vogt.world/posts/git-static-host-repo/gshr-screenshot.png" alt="Screenshot of &amp;lsquo;gshr&amp;rsquo; showing the commit log page" loading="lazy" /&gt;
 &lt;figcaption&gt;Screenshot of &amp;#39;gshr&amp;#39; showing the commit log page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It produces a single output directory for multiple repos, with&amp;hellip;&lt;/p&gt;</description></item><item><title>Excel pivot cache madness</title><link>https://www.vogt.world/excel-pivot-cache-madness/</link><pubDate>Tue, 24 Jan 2023 13:11:42 -0600</pubDate><guid>https://www.vogt.world/excel-pivot-cache-madness/</guid><description>&lt;p&gt;This is exactly the sort of thing I don&amp;rsquo;t like about Excel; an archaic, 2003 / 2007 &amp;ldquo;gotcha&amp;rdquo; that is
common, baffling, and a pain.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://support.microsoft.com/en-us/office/unshare-a-data-cache-between-pivottable-reports-87188806-0c24-4d17-b2f7-9e3a4a05542b"&gt;tl;dr Excel shares a hidden cache between pivot tables so changes to one pivot table can affect others&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The problem goes like this.&lt;/p&gt;
&lt;p&gt;If I create a table, enter a bunch of data, and create a pivot table off the initial table, then
Excel silently creates a pivot cache to optimize any analysis for the pivot table. So far so good,
right? Well, not really.&lt;/p&gt;</description></item><item><title>SQLite notes</title><link>https://www.vogt.world/sqlite-notes/</link><pubDate>Sun, 22 Jan 2023 11:09:17 -0600</pubDate><guid>https://www.vogt.world/sqlite-notes/</guid><description>&lt;p&gt;Notes, links, snippets, thoughts, and more on sqlite.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Extensions (&lt;a href="https://www.sqlite.org/loadext.html"&gt;https://www.sqlite.org/loadext.html&lt;/a&gt;) are the catch-all way of doing sqlite
customization. There&amp;rsquo;s a guy named Ricardo who wrote about how to use Rust for extensions:
&lt;a href="https://ricardoanderegg.com/posts/extending-sqlite-with-rust/"&gt;https://ricardoanderegg.com/posts/extending-sqlite-with-rust/&lt;/a&gt;. Another person on StackOverflow
outlines how you can build a custom version of sqlite that contains the extensions:
&lt;a href="https://stackoverflow.com/questions/30898113/how-to-compile-an-extension-into-sqlite"&gt;https://stackoverflow.com/questions/30898113/how-to-compile-an-extension-into-sqlite&lt;/a&gt;. Some useful
extensions that others have created at here &lt;a href="https://antonz.org/sqlean/"&gt;https://antonz.org/sqlean/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When writing custom functions that need access to more data than a simple argument, you can use
&lt;a href="https://www.sqlite.org/c3ref/get_auxdata.html"&gt;https://www.sqlite.org/c3ref/get_auxdata.html&lt;/a&gt;. For example, if you&amp;rsquo;re using a regex in a function,
you don&amp;rsquo;t want to compile that on each function invocation, so you can do it once, and store it
using the auxiliary data setter/getter. But you could also probably use information from the
argument to lookup values on your own. For example, if the regex has the same hash or checksum as
the last time you used it, just save it to a thread-local.&lt;/p&gt;</description></item><item><title>Postgres notes</title><link>https://www.vogt.world/postgres-notes/</link><pubDate>Thu, 19 Jan 2023 11:10:00 -0600</pubDate><guid>https://www.vogt.world/postgres-notes/</guid><description>&lt;p&gt;Some notes on Postgres. Sort of a part of a personal wiki I&amp;rsquo;m working on.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Run v8 inside PG for triggers, etc: &lt;a href="https://plv8.github.io"&gt;https://plv8.github.io&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The pipelining feature is neat:
&lt;a href="https://www.postgresql.org/docs/devel/libpq-pipeline-mode.html"&gt;https://www.postgresql.org/docs/devel/libpq-pipeline-mode.html&lt;/a&gt;. Really helpful
when you&amp;rsquo;re using a write-only pattern with multiple statements that need to be
sequential.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The function &lt;code&gt;unnest&lt;/code&gt; will unnest arrays &lt;em&gt;all the way down&lt;/em&gt;, which can be
confusing when you&amp;rsquo;re using custom types like
&lt;code&gt;create type element_id as (st int4, mid int8, cap int8);&lt;/code&gt;. Just something to
know.&lt;/p&gt;</description></item><item><title>Makefile notes</title><link>https://www.vogt.world/makefile-notes/</link><pubDate>Thu, 27 Oct 2022 15:38:00 -0500</pubDate><guid>https://www.vogt.world/makefile-notes/</guid><description>&lt;p&gt;Here&amp;rsquo;s some working notes on how I keep Makefiles. This isn&amp;rsquo;t so much a tutorial as it is a set of
patterns that make sense to me for monorepo projects, or even just large projects.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There&amp;rsquo;s a subtle difference between variables and prerequisite expansion. It expands variables in
the order it finds them, targets and prerequisites immediately, but rules are deferred. So you can&amp;rsquo;t
do things like using variables as prerequisite names, or grouping variable dependencies into
variables, unless you want to explicitly define orders of those dependencies.&lt;/p&gt;</description></item><item><title>2022-10-13-arches-park-near-balanced-rock</title><link>https://www.vogt.world/2022-10-13-arches-park-near-balanced-rock/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-arches-park-near-balanced-rock/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-arches-park-near-balanced-rock/2022-10-13-arches-park-near-balanced-rock.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-beneath-pine-tree-arch</title><link>https://www.vogt.world/2022-10-13-beneath-pine-tree-arch/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-beneath-pine-tree-arch/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-beneath-pine-tree-arch/2022-10-13-beneath-pine-tree-arch.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-colorado-river</title><link>https://www.vogt.world/2022-10-13-colorado-river/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-colorado-river/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-colorado-river/2022-10-13-colorado-river.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-crow</title><link>https://www.vogt.world/2022-10-13-crow/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-crow/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-crow/2022-10-13-crow.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-dead-horse-state-park</title><link>https://www.vogt.world/2022-10-13-dead-horse-state-park/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-dead-horse-state-park/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-dead-horse-state-park/2022-10-13-dead-horse-state-park.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-delicate-arch</title><link>https://www.vogt.world/2022-10-13-delicate-arch/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-delicate-arch/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-delicate-arch/2022-10-13-delicate-arch.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-devils-backbone-highway</title><link>https://www.vogt.world/2022-10-13-devils-backbone-highway/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-devils-backbone-highway/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-devils-backbone-highway/2022-10-13-devils-backbone-highway.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-goat</title><link>https://www.vogt.world/2022-10-13-goat/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-goat/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-goat/2022-10-13-goat.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-lizard</title><link>https://www.vogt.world/2022-10-13-lizard/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-lizard/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-lizard/2022-10-13-lizard.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-more-canyon-lands</title><link>https://www.vogt.world/2022-10-13-more-canyon-lands/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-more-canyon-lands/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-more-canyon-lands/2022-10-13-more-canyon-lands.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-sandstone</title><link>https://www.vogt.world/2022-10-13-sandstone/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-sandstone/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-sandstone/2022-10-13-sandstone.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-self</title><link>https://www.vogt.world/2022-10-13-self/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-self/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-self/2022-10-13-self.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-the-narrows</title><link>https://www.vogt.world/2022-10-13-the-narrows/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-the-narrows/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-the-narrows/2022-10-13-the-narrows.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-13-zion</title><link>https://www.vogt.world/2022-10-13-zion/</link><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-13-zion/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-13-zion/2022-10-13-zion.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-10-10-computer-brain</title><link>https://www.vogt.world/2022-10-10-computer-brain/</link><pubDate>Mon, 10 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-10-10-computer-brain/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-10-10-computer-brain/2022-10-10-computer-brain.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-08-01-mushroom</title><link>https://www.vogt.world/2022-08-01-mushroom/</link><pubDate>Mon, 01 Aug 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-08-01-mushroom/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-08-01-mushroom/2022-08-01-mushroom.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-08-01-porch-coffee</title><link>https://www.vogt.world/2022-08-01-porch-coffee/</link><pubDate>Mon, 01 Aug 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-08-01-porch-coffee/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-08-01-porch-coffee/2022-08-01-porch-coffee.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-07-27-corner-cat</title><link>https://www.vogt.world/2022-07-27-corner-cat/</link><pubDate>Wed, 27 Jul 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-07-27-corner-cat/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-07-27-corner-cat/2022-07-27-corner-cat.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Docs, tests, design, and RFCs</title><link>https://www.vogt.world/docs-tests-designs-rfcs/</link><pubDate>Sat, 18 Jun 2022 10:07:29 -0500</pubDate><guid>https://www.vogt.world/docs-tests-designs-rfcs/</guid><description>&lt;p&gt;I&amp;rsquo;ve noticed a trend lately of a lot of languages or ideologies following the line of thought that
if something is in your code, it should affect how your program runs, or it&amp;rsquo;s not important.
Sometimes it affects the way your program compiles. For instance, in Go you can&amp;rsquo;t compile if you
have an unused import. But you can compile with an unused constant.&lt;/p&gt;
&lt;p&gt;This sort of absolutism leads to a narrow definition of programming, or maybe even code. By limiting
how expressive you can be with a program, sure, you&amp;rsquo;re limiting errors and bugs, but you&amp;rsquo;re also
limiting what you can do with a program, and, more importantly, you&amp;rsquo;re eliminating what you can
communicate to another human being with a program.&lt;/p&gt;</description></item><item><title>F7 spreadsheet engine</title><link>https://www.vogt.world/f7-spreadsheet-engine/</link><pubDate>Mon, 06 Jun 2022 10:19:53 -0500</pubDate><guid>https://www.vogt.world/f7-spreadsheet-engine/</guid><description>&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; I&amp;rsquo;m open-sourcing a rough version of a spreadsheet engine that can execute formulas
like &lt;code&gt;=(SUM(A1:A9) / COUNT(A1:A9)) * MAX(Sheet2!B1:B)&lt;/code&gt; in a spreadsheet-like object in Java or
Typescript. See &lt;a href="https://github.com/vogtb/f7"&gt;https://github.com/vogtb/f7&lt;/a&gt; for more info. This is just a brain-dump from what I
remember about building it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Way back in 2017 I got the bright idea to build a spreadsheet engine in Javascript. I thought to
myself, sure, someone has done this before, by why not try it myself? I used a modified
YACC-generated parser to start with, and put a couple of formulas on it, then a couple more, until I
had &lt;a href="https://github.com/vogtb/spreadsheet"&gt;something that mostly worked,&lt;/a&gt; but was pretty rough. I
really didn&amp;rsquo;t have a full sense of the many intricacies of spreadsheets, let alone parsers, lexers,
or compilers, so my implementation was, of course, a bit of a mess.&lt;/p&gt;</description></item><item><title>2022-06-01-blue-line</title><link>https://www.vogt.world/2022-06-01-blue-line/</link><pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-06-01-blue-line/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-06-01-blue-line/2022-06-01-blue-line.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Quick XLSX automation</title><link>https://www.vogt.world/quick-xlsx-automation/</link><pubDate>Sun, 29 May 2022 08:00:45 -0500</pubDate><guid>https://www.vogt.world/quick-xlsx-automation/</guid><description>&lt;p&gt;There are a bunch of commercial spreadsheet automation tools out there. Many of them are
enterprise-level, and all of them are complex. A lot of them require people to write code. So if
you&amp;rsquo;ve got to write some code, why not just do it all yourself? Here&amp;rsquo;s a quick way to run a sheet
using containers and LibreOffice.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start by running a podman/docker container with Ubuntu, and installing LibreOffice. I&amp;rsquo;m pretty
sure you can use OpenOffice as well, and it might be better maintained, but the scripts I&amp;rsquo;ve been
running use LO.&lt;/p&gt;</description></item><item><title>Custom scrollbars in Flutter</title><link>https://www.vogt.world/custom-scrollbars-in-flutter/</link><pubDate>Tue, 24 May 2022 14:23:08 -0500</pubDate><guid>https://www.vogt.world/custom-scrollbars-in-flutter/</guid><description>&lt;p&gt;Dart and Flutter are growing quickly, but there aren&amp;rsquo;t a lot of packages or blog posts about the
smaller details of the widgets you&amp;rsquo;ll need to build desktop apps. Here&amp;rsquo;s a quick example of how to
build scrollbars that are more flexible, pixel-perfect, and generally better than the default ones.&lt;/p&gt;
&lt;p&gt;You start off by using the &lt;code&gt;ScrollbarPainter&lt;/code&gt;, and give it some default properties.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;_verticalScrollbarPainter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ScrollbarPainter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scrollbarColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;shape:&lt;/span&gt; &lt;span class="n"&gt;RoundedRectangleBorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;borderRadius:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BorderRadius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Radius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;side:&lt;/span&gt; &lt;span class="n"&gt;BorderSide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scrollbarBorderColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;textDirection:&lt;/span&gt; &lt;span class="n"&gt;TextDirection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ltr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;fadeoutOpacityAnimation:&lt;/span&gt; &lt;span class="n"&gt;CurvedAnimation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;parent:&lt;/span&gt; &lt;span class="n"&gt;AnimationController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;vsync:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;duration:&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;value:&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;curve:&lt;/span&gt; &lt;span class="n"&gt;Curves&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;thickness:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;crossAxisMargin:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;mainAxisMargin:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;scrollbarOrientation:&lt;/span&gt; &lt;span class="n"&gt;ScrollbarOrientation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;minLength:&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;minOverscrollLength:&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you detect a scroll gesture, you just use an update function to tell it about the new
properties.&lt;/p&gt;</description></item><item><title>2022-05-14-tallest-brick-skyscraper</title><link>https://www.vogt.world/2022-05-14-tallest-brick-skyscraper/</link><pubDate>Sat, 14 May 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-05-14-tallest-brick-skyscraper/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-05-14-tallest-brick-skyscraper/2022-05-14-tallest-brick-skyscraper.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Simple Typescript performance functions</title><link>https://www.vogt.world/simple-typescript-performance-functions/</link><pubDate>Thu, 07 Apr 2022 08:10:12 -0600</pubDate><guid>https://www.vogt.world/simple-typescript-performance-functions/</guid><description>&lt;p&gt;Here are some simple performance monitoring functions I&amp;rsquo;ve been using for all sorts of TS stuff.
Really helps measure React functions, in addition to class-level methods that might be long-running.
Includes conditional compilation to drop dead branches when building for prod.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Define this in the build process in a Makefile maybe.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// It must be defined. It is the only way to do conditional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// compilation that I know of that is clean. The one issue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// is that you can&amp;#39;t wrap it with other helper functions,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// or else we don&amp;#39;t get dead-code elimination, because at
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// compile time all evaluation involving the constant
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// is replaced with booleans. Eg:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// `process.env.NODE_ENV !== &amp;#34;production&amp;#34;` becomes `true`,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// which drops the dead branch off of if-statements. Or at
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// least it works this way with `esbuild`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// The reason we want to drop it is because each timer fn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// invocation is not free, and in production if you&amp;#39;re calling
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// them alot, they add up. Useful for debugging, developing,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// but less useful in production.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NODE_ENV&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;DescriptorWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;target&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;propKey&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;descriptor?&lt;/span&gt;: &lt;span class="kt"&gt;PropertyDescriptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;PropertyDescriptor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;NamedDescriptorWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name?&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;DescriptorWrapper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Timed&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;name&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Decorator/annotation for method to time how long it takes to run.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;Time&lt;/span&gt;: &lt;span class="kt"&gt;NamedDescriptorWrapper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;interiorTimer&lt;/span&gt;: &lt;span class="kt"&gt;Timed&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;production&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_?&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;propKey&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;descriptor?&lt;/span&gt;: &lt;span class="kt"&gt;PropertyDescriptor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;descriptor&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getOwnPropertyDescriptor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;propKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;interiorTimer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name?&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;target&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;propKey&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;descriptor?&lt;/span&gt;: &lt;span class="kt"&gt;PropertyDescriptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;descriptor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;descriptor&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getOwnPropertyDescriptor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;propKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;originalMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;propKey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-start-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;originalMethod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-end-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;interiorTimer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-start-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sb"&gt;`-end-`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Wrap a function `f` as timed. Does NOT execute function though.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;name&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;interiorTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Time one function that returns T.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interiorTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;: &lt;span class="kt"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TimePerformance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use it like this:&lt;/p&gt;</description></item><item><title>A poem made by searching for "can always" in my programming notes</title><link>https://www.vogt.world/a-poem-made-by-searching-for-you-can-always-in-my-notes/</link><pubDate>Thu, 27 Jan 2022 20:31:11 -0600</pubDate><guid>https://www.vogt.world/a-poem-made-by-searching-for-you-can-always-in-my-notes/</guid><description>&lt;p&gt;I was trying to find something I wrote by searching for a phrase I remember using, and I found that
I use &amp;ldquo;you can always&amp;rdquo; a lot. This is poem written by searching my programming notes for &amp;ldquo;can
always.&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I can always do it later. &lt;br/&gt;
You can always ignore new fields or old fields in your code. &lt;br/&gt;
But you can always tell where you are, so you can walk to somewhere else. &lt;br/&gt;
But you can always fix things, and clean things up. &lt;br/&gt;
You can always come back to it. &lt;br/&gt;
You can always go back to the world as it was by time-traveling versions of the document. &lt;br/&gt;
You can always add features, but it’s hard to take them away. &lt;br/&gt;
We can always add them. &lt;br/&gt;
You can always redo it. &lt;br/&gt;
I can always write something in Rust if we need that performance. &lt;br/&gt;
You can always refactor. &lt;br/&gt;
To start with, we could not allow it, but we can always add it later; we can’t take it away. &lt;br/&gt;
We could always make it nullable. &lt;br/&gt;
You can always build a better version later, as long as the code is clean. &lt;br/&gt;
I can always do it later. &lt;br/&gt;
We can always do it later. &lt;br/&gt;
You can always walk back down the tree. &lt;br/&gt;
You can always walk back up the tree, for that matter. &lt;br/&gt;
You can always pull the rip cord.&lt;/p&gt;</description></item><item><title>2022-01-20-jumbo-rocks-joshua-tree</title><link>https://www.vogt.world/2022-01-20-jumbo-rocks-joshua-tree/</link><pubDate>Thu, 20 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-20-jumbo-rocks-joshua-tree/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-20-jumbo-rocks-joshua-tree/2022-01-20-jumbo-rocks-joshua-tree.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-20-san-diego-pacific-sunset</title><link>https://www.vogt.world/2022-01-20-san-diego-pacific-sunset/</link><pubDate>Thu, 20 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-20-san-diego-pacific-sunset/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-20-san-diego-pacific-sunset/2022-01-20-san-diego-pacific-sunset.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-cacti</title><link>https://www.vogt.world/2022-01-19-cacti/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-cacti/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-cacti/2022-01-19-cacti.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-cacti-glow</title><link>https://www.vogt.world/2022-01-19-cacti-glow/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-cacti-glow/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-cacti-glow/2022-01-19-cacti-glow.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-driving</title><link>https://www.vogt.world/2022-01-19-driving/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-driving/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-driving/2022-01-19-driving.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-inside-the-rock</title><link>https://www.vogt.world/2022-01-19-inside-the-rock/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-inside-the-rock/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-inside-the-rock/2022-01-19-inside-the-rock.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-joshua-tree-shadow</title><link>https://www.vogt.world/2022-01-19-joshua-tree-shadow/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-joshua-tree-shadow/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-joshua-tree-shadow/2022-01-19-joshua-tree-shadow.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-off-in-the-distance</title><link>https://www.vogt.world/2022-01-19-off-in-the-distance/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-off-in-the-distance/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-off-in-the-distance/2022-01-19-off-in-the-distance.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-peach-sky</title><link>https://www.vogt.world/2022-01-19-peach-sky/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-peach-sky/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-peach-sky/2022-01-19-peach-sky.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-19-twenty-nine-palms</title><link>https://www.vogt.world/2022-01-19-twenty-nine-palms/</link><pubDate>Wed, 19 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-19-twenty-nine-palms/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-19-twenty-nine-palms/2022-01-19-twenty-nine-palms.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-18-scrub-jay</title><link>https://www.vogt.world/2022-01-18-scrub-jay/</link><pubDate>Tue, 18 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-18-scrub-jay/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-18-scrub-jay/2022-01-18-scrub-jay.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-17-chicago-alley</title><link>https://www.vogt.world/2022-01-17-chicago-alley/</link><pubDate>Mon, 17 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-17-chicago-alley/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-17-chicago-alley/2022-01-17-chicago-alley.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2022-01-17-pelican-san-diego</title><link>https://www.vogt.world/2022-01-17-pelican-san-diego/</link><pubDate>Mon, 17 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2022-01-17-pelican-san-diego/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2022-01-17-pelican-san-diego/2022-01-17-pelican-san-diego.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Designing and building a couch</title><link>https://www.vogt.world/designing-and-building-a-couch/</link><pubDate>Sun, 19 Dec 2021 13:24:03 -0600</pubDate><guid>https://www.vogt.world/designing-and-building-a-couch/</guid><description>&lt;p&gt;Back in October I designed and built a couch. Here are some pictures of the design and build, which
was in total around 80 hours.&lt;/p&gt;
&lt;hr&gt;
&lt;figure&gt;
 &lt;img src="https://www.vogt.world/designing-and-building-a-couch/couch_mock_up.svg" alt="Couch mock up" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;Here&amp;rsquo;s the clearest progression of my designs as I traced a couple of existing couches, combined
them, and shifted them into something resembling a more formal set of schematics.&lt;/p&gt;
&lt;hr&gt;
&lt;figure&gt;
 &lt;img src="https://www.vogt.world/designing-and-building-a-couch/degrees.svg" alt="Degrees" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;I also mocked up a couple of variations on the same design. Degrees are measured back from the
vertical.&lt;/p&gt;</description></item><item><title>Status update - November 2021</title><link>https://www.vogt.world/status-update-november-2021/</link><pubDate>Sun, 05 Dec 2021 19:03:41 -0600</pubDate><guid>https://www.vogt.world/status-update-november-2021/</guid><description>&lt;p&gt;It&amp;rsquo;s been a quieter month for projects, with the one holiday done and another
coming up.&lt;/p&gt;
&lt;p&gt;I spent the last year writing Rust, and now I&amp;rsquo;m working on a package that&amp;rsquo;s
mostly JS/TS and Go. It&amp;rsquo;s strange to go from a language where you need to be
absolutely explicit about what you&amp;rsquo;re doing (what&amp;rsquo;s mutable, what&amp;rsquo;s a reference,
what type you have, how long you have it) to a language that doesn&amp;rsquo;t care about
that at all. I like JS. I like Rust. But it seems like there&amp;rsquo;s room for
something in between. Some language in between that lets you turn on and off
constraints based on what you&amp;rsquo;re doing, or just looks for invariants that look
dangerous.&lt;/p&gt;</description></item><item><title>Excel and beyond</title><link>https://www.vogt.world/excel-and-beyond/</link><pubDate>Thu, 04 Nov 2021 12:21:43 -0500</pubDate><guid>https://www.vogt.world/excel-and-beyond/</guid><description>&lt;p&gt;Every couple of months the fine readers over at Hacker News work themselves up into a real hoot over
Microsoft Excel.&lt;a href="#0"&gt;[0]&lt;/a&gt; They alternate between love and hate.&lt;/p&gt;
&lt;p&gt;When they love it, I read how democratic Excel is, how anyone can use it, how it&amp;rsquo;s the most popular
programming language and IDE on the planet, and it&amp;rsquo;s where the real work gets done.&lt;/p&gt;
&lt;p&gt;When they hate it, I read that it&amp;rsquo;s not a real language, there&amp;rsquo;s no versioning, collaboration, it&amp;rsquo;s
crude, it&amp;rsquo;s terrible, it creates silos, errors, it&amp;rsquo;s wrong, and it&amp;rsquo;s hard to move away from.&lt;/p&gt;</description></item><item><title>Status update - October 2021</title><link>https://www.vogt.world/status-update-october-2021/</link><pubDate>Tue, 02 Nov 2021 07:53:12 -0500</pubDate><guid>https://www.vogt.world/status-update-october-2021/</guid><description>&lt;p&gt;In my free time this month I built a couch. Building something physical with my
hands feels really good. It&amp;rsquo;s easy to get lost in code, and the layers of
abstraction. Wood working is a good cure for that.&lt;/p&gt;
&lt;p&gt;I usually design by hand with a pen and paper, but I decided to do this one with
Figma. It&amp;rsquo;s easier to get the angles right, and virtual wood working is the
cheapest kind. It pays to make mistakes early, and with vectors, instead of a
hundred dollars worth of maple 1x6s. Since I&amp;rsquo;m designing something that&amp;rsquo;s
basically symmetrical, and at right angles along one plane, Figma is easier than
a tool like AutoCAD, or Blender. Here&amp;rsquo;s a bit of the design evolution.&lt;/p&gt;</description></item><item><title>Status update - September 2021</title><link>https://www.vogt.world/status-update-september-2021/</link><pubDate>Sat, 02 Oct 2021 12:08:33 -0500</pubDate><guid>https://www.vogt.world/status-update-september-2021/</guid><description>&lt;p&gt;Last month I tried doing a This-Month-I-Learned list, so I&amp;rsquo;m going to keep doing
that, but I&amp;rsquo;m also going two write about some other things I&amp;rsquo;ve been thinking
about and doing.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a month of trial and error. Working on the next version of Protobase,
and it&amp;rsquo;s going slowly but well. When I&amp;rsquo;m building something new there&amp;rsquo;s always
the temptation to think that it&amp;rsquo;s too complex, or there&amp;rsquo;s a shortcut. But in the
end, the mountain always looks bigger than it is, and I just need to keep
walking. A lot of my feelings match
&lt;a href="https://scattered-thoughts.net/writing/things-unlearned/"&gt;https://scattered-thoughts.net/writing/things-unlearned/&lt;/a&gt;
where the author says it better.&lt;/p&gt;</description></item><item><title>Status update - August 2021</title><link>https://www.vogt.world/status-update-august-2021/</link><pubDate>Tue, 31 Aug 2021 15:10:57 -0500</pubDate><guid>https://www.vogt.world/status-update-august-2021/</guid><description>&lt;p&gt;Going to try something new. Just listing things that I learn each month. Not on
any particular topic, just writing them down as I learn them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitHub&amp;rsquo;s automation platform is straight up faster than GitLab&amp;rsquo;s. Running my
CI pipeline takes 45 minutes on GL, and only 10 minutes in GH. Seems like a
pretty striking difference considering they are quite literally being paid by
the hour.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SVGs can contain style tags.
&lt;a href="https://www.w3.org/TR/SVG/styling.html"&gt;https://www.w3.org/TR/SVG/styling.html&lt;/a&gt;.
Means animations can be added SVGs without having to add styles directly to
the document.&lt;/p&gt;</description></item><item><title>PSQL functions for simpler queries</title><link>https://www.vogt.world/psql-pattern-for-simpler-queries/</link><pubDate>Mon, 09 Aug 2021 12:33:59 -0500</pubDate><guid>https://www.vogt.world/psql-pattern-for-simpler-queries/</guid><description>&lt;p&gt;Multiple round trips to a postgres database can slow your application down. Adding just a couple of milliseconds each time is a pain.
It&amp;rsquo;s also cumbersome to chain multiple SQL queries together in your services.&lt;/p&gt;
&lt;p&gt;As long as you&amp;rsquo;re not married to the idea of separating your database from your service, there&amp;rsquo;s a better solution.
You can use PG functions, and a &lt;code&gt;WITH&lt;/code&gt; clause to clean up your logic and reduce round trips.&lt;/p&gt;</description></item><item><title>2021-07-16-accidental-shot</title><link>https://www.vogt.world/2021-07-16-accidental-shot/</link><pubDate>Fri, 16 Jul 2021 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2021-07-16-accidental-shot/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2021-07-16-accidental-shot/2021-07-16-accidental-shot.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Writing tests is different from writing code</title><link>https://www.vogt.world/writing-tests-is-different-from-writing-code/</link><pubDate>Sun, 16 May 2021 12:17:18 -0500</pubDate><guid>https://www.vogt.world/writing-tests-is-different-from-writing-code/</guid><description>&lt;p&gt;Writing decent software is difficult because the surface area (&lt;em&gt;what&lt;/em&gt; works) is much different from the volume of the code (&lt;em&gt;how&lt;/em&gt; it works, and more importantly, &lt;em&gt;how it does not&lt;/em&gt; work.)&lt;/p&gt;
&lt;p&gt;This is something I&amp;rsquo;ve been thinking more about lately, and I&amp;rsquo;ve come to think of tests as a different kind of code. They&amp;rsquo;re more or less executable requirements, or executable documentation. In this sense, documentation can be thought of as a subset of requirements.&lt;/p&gt;</description></item><item><title>Running CI tests with two steps</title><link>https://www.vogt.world/running-ci-tests-with-two-steps/</link><pubDate>Sun, 14 Mar 2021 20:40:29 -0500</pubDate><guid>https://www.vogt.world/running-ci-tests-with-two-steps/</guid><description>&lt;p&gt;Gitlab, Github, Travis, and other all are CI pipelines that are intended to run all sorts of integration tests as really
granular actions. The trouble is you end up writing an absurd amount of YAML-logic just to link them together.&lt;/p&gt;
&lt;p&gt;Writing CI jobs with directed acyclic graphs in YAML is a pain, but it&amp;rsquo;s not the worst part. The worst part is that in
order to make sure each job runs fast, you need to do a strange amount of optimization. Optimizations like exposing your
artifacts to the next step, or running setup scripts for each step, or just rebuilding artifact, or starting services.
It adds up to a lot of configuration.&lt;/p&gt;</description></item><item><title>2021-02-01-snowstorm-chicago</title><link>https://www.vogt.world/2021-02-01-snowstorm-chicago/</link><pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2021-02-01-snowstorm-chicago/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2021-02-01-snowstorm-chicago/2021-02-01-snowstorm-chicago.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2021-02-01-sub-zero-chicago</title><link>https://www.vogt.world/2021-02-01-sub-zero-chicago/</link><pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2021-02-01-sub-zero-chicago/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2021-02-01-sub-zero-chicago/2021-02-01-sub-zero-chicago.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2020-12-01-ice-crystals</title><link>https://www.vogt.world/2020-12-01-ice-crystals/</link><pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-12-01-ice-crystals/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-12-01-ice-crystals/2020-12-01-ice-crystals.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2020-12-01-ice-crystals-b</title><link>https://www.vogt.world/2020-12-01-ice-crystals-b/</link><pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-12-01-ice-crystals-b/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-12-01-ice-crystals-b/2020-12-01-ice-crystals-b.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2020-12-01-ice-crystals-c</title><link>https://www.vogt.world/2020-12-01-ice-crystals-c/</link><pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-12-01-ice-crystals-c/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-12-01-ice-crystals-c/2020-12-01-ice-crystals-c.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Rust macro for enum variant pseudo-subtyping</title><link>https://www.vogt.world/rust-macro-for-enum-variant-pseudo-subtyping/</link><pubDate>Wed, 14 Oct 2020 15:21:18 -0500</pubDate><guid>https://www.vogt.world/rust-macro-for-enum-variant-pseudo-subtyping/</guid><description>&lt;p&gt;One of the many cool things about rust is how flexible enums are.
Mixing c-style, tuple, and struct variants in the same enum is a great way to give you flexibility over your models.
But there are times when I want to nest enums to get a sub-and-super-class-like relationship.
For example, if I&amp;rsquo;m modeling events, and I want to give all events some context (id, timestamp, key, version)
in addition to their data, I might do something like this.&lt;/p&gt;</description></item><item><title>Writing on a single-purpose device</title><link>https://www.vogt.world/writing-on-a-single-purpose-device/</link><pubDate>Sun, 11 Oct 2020 12:46:32 -0500</pubDate><guid>https://www.vogt.world/writing-on-a-single-purpose-device/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/writing-on-a-single-purpose-device/neo_2.png" alt="Neo 2" loading="lazy" /&gt;
 &lt;figcaption&gt;Neo 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A little more than two months ago, I bought an &lt;a href="https://www.google.com/search?q=AlphaSmart+Neo2&amp;amp;source=lnms&amp;amp;tbm=isch&amp;amp;sa=X"&gt;AlphaSmart Neo2&lt;/a&gt; - a positively ancient single-purpose computer that
works like a plain-text word processor. What spurred me to make the $39 dollar purchase on Ebay was a review which
claimed the &lt;a href="https://onezero.medium.com/this-35-keyboard-for-children-transformed-me-into-a-novelist-436a55370ee5"&gt;Neo turned the reviewer into a novelist&lt;/a&gt;. I read the review with skepticism, but on the whole,
Forty dollars is too cheap for me not to mess around with a new electronic gadget,
especially considering I won&amp;rsquo;t be contributing to e-waste.&lt;/p&gt;</description></item><item><title>Elmore Leonard's 'Ten Rules For Writing' for design</title><link>https://www.vogt.world/elmore-leonards-ten-rules-of-writing-but-for-design/</link><pubDate>Sat, 29 Aug 2020 14:33:59 -0500</pubDate><guid>https://www.vogt.world/elmore-leonards-ten-rules-of-writing-but-for-design/</guid><description>&lt;p&gt;Some time ago I read a reprint of &lt;a href="https://www.nytimes.com/2001/07/16/arts/writers-writing-easy-adverbs-exclamation-points-especially-hooptedoodle.html"&gt;Elmore Leonard&amp;rsquo;s ten rules on writing&lt;/a&gt;, which was initially published in 2001.&lt;/p&gt;
&lt;p&gt;They are, abbreviated, as follows.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Never open a book with weather.&lt;/li&gt;
&lt;li&gt;Avoid prologues.&lt;/li&gt;
&lt;li&gt;Never us a verb other than said to carry dialogue.&lt;/li&gt;
&lt;li&gt;Never us an adverb to modify the verb &amp;ldquo;said.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Keep your exclamation points under control.&lt;/li&gt;
&lt;li&gt;Never use the words &amp;ldquo;suddenly&amp;rdquo; or &amp;ldquo;all hell broke loose.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Use regional dialect, patois, sparingly.&lt;/li&gt;
&lt;li&gt;Avoid detailed descriptions of characters.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t go into great detail describing places or things.&lt;/li&gt;
&lt;li&gt;Try to leave out the part that readers tend to skip.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In my personal writing I&amp;rsquo;ve found some of these useful, even if they&amp;rsquo;re focused on fiction. The gist of all of them is that writing should serve the story, and you should use the utility of words themselves. That&amp;rsquo;s not to say that you can&amp;rsquo;t use the fullness of the english language, but if you&amp;rsquo;re telling a story, find a way to get the characters to carry the weight of the story.&lt;/p&gt;</description></item><item><title>Notes from 'Programming Rust' book</title><link>https://www.vogt.world/programming-rust-notes/</link><pubDate>Sat, 04 Jul 2020 09:45:06 -0500</pubDate><guid>https://www.vogt.world/programming-rust-notes/</guid><description>&lt;p&gt;Here are some of my notes from
the &lt;a href="https://www.oreilly.com/library/view/programming-rust/9781491927274/"&gt;Programming Rust&lt;/a&gt;
O&amp;rsquo;Reilly book. I&amp;rsquo;m posting them here and in
a &lt;a href="https://gist.github.com/vogtb/eced48f4671333b8b65e1adab0811b91"&gt;gist on github&lt;/a&gt;
so they&amp;rsquo;re searchable to me and anyone else who needs them.&lt;/p&gt;
&lt;h2 id="chapter-1"&gt;Chapter 1&lt;/h2&gt;
&lt;p&gt;(omitted for brevity)&lt;/p&gt;
&lt;h2 id="chapter-2-tour-of-rust"&gt;Chapter 2: Tour of Rust&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Typical for function&amp;rsquo;s return value to &amp;ldquo;fall off the end of the function&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tests marked with #[test] attribute&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trait is a collection of methods that types can implement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Iterators common in rust&lt;/p&gt;</description></item><item><title>2020-06-01-balloon-appleton</title><link>https://www.vogt.world/2020-06-01-balloon-appleton/</link><pubDate>Mon, 01 Jun 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-06-01-balloon-appleton/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-06-01-balloon-appleton/2020-06-01-balloon-appleton.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>CSS For range highlighting</title><link>https://www.vogt.world/css-range-highlighting/</link><pubDate>Wed, 15 Apr 2020 00:00:00 -0500</pubDate><guid>https://www.vogt.world/css-range-highlighting/</guid><description>&lt;style&gt;
 .holder {
 display: flex;
 }

 .box {
 width: 20px;
 height: 20px;
 display: inline-block;
 background: lightblue;
 border-right: solid 2px white;
 border-bottom: solid 2px white;
 }

 .mark {
 width: 20px;
 height: 20px;
 display: inline-block;
 background: blue;
 border-right: solid 2px white;
 border-bottom: solid 2px white;
 }

 .start ~ .box {
 width: 20px;
 height: 20px;
 display: inline-block;
 background: blue;
 border-bottom: solid 2px white;
 }

 .end ~ .box {
 background: lightblue;
 }

 .second &gt; .box:hover ~ .box {
 background: lightblue;
 }
&lt;/style&gt;
&lt;div class="workspace"&gt;
 This is a &lt;strong&gt;workspace post&lt;/strong&gt;. It's a working document of my thoughts as I built something or pieced
 together an idea. It might be unstructured and contain spelling errors. It also might not look good on a small
 screen. But it could be useful to someone or related to another post, so I'm publishing it as-is.
&lt;/div&gt;
&lt;p&gt;
 Highlighting all elements between two classes &lt;code&gt;.start&lt;/code&gt; and &lt;code&gt;.end&lt;/code&gt;.
&lt;/p&gt;</description></item><item><title>2020-03-01-longboard-ca</title><link>https://www.vogt.world/2020-03-01-longboard-ca/</link><pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-03-01-longboard-ca/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-03-01-longboard-ca/2020-03-01-longboard-ca.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2020-03-01-longboard-ca-alt</title><link>https://www.vogt.world/2020-03-01-longboard-ca-alt/</link><pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-03-01-longboard-ca-alt/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-03-01-longboard-ca-alt/2020-03-01-longboard-ca-alt.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2020-03-01-mountain-view-sky-alt</title><link>https://www.vogt.world/2020-03-01-mountain-view-sky-alt/</link><pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-03-01-mountain-view-sky-alt/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-03-01-mountain-view-sky-alt/2020-03-01-mountain-view-sky-alt.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2020-02-10-redwoods-ca</title><link>https://www.vogt.world/2020-02-10-redwoods-ca/</link><pubDate>Mon, 10 Feb 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-02-10-redwoods-ca/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-02-10-redwoods-ca/2020-02-10-redwoods-ca.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2020-01-10-ikea-mountain-view</title><link>https://www.vogt.world/2020-01-10-ikea-mountain-view/</link><pubDate>Fri, 10 Jan 2020 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2020-01-10-ikea-mountain-view/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2020-01-10-ikea-mountain-view/2020-01-10-ikea-mountain-view.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2019-12-01-appleton-winter</title><link>https://www.vogt.world/2019-12-01-appleton-winter/</link><pubDate>Sun, 01 Dec 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2019-12-01-appleton-winter/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2019-12-01-appleton-winter/2019-12-01-appleton-winter.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2019-10-01-chicago-sky</title><link>https://www.vogt.world/2019-10-01-chicago-sky/</link><pubDate>Tue, 01 Oct 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2019-10-01-chicago-sky/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2019-10-01-chicago-sky/2019-10-01-chicago-sky.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2019-10-01-gull</title><link>https://www.vogt.world/2019-10-01-gull/</link><pubDate>Tue, 01 Oct 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2019-10-01-gull/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2019-10-01-gull/2019-10-01-gull.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2019-09-01-austria</title><link>https://www.vogt.world/2019-09-01-austria/</link><pubDate>Sun, 01 Sep 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2019-09-01-austria/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2019-09-01-austria/2019-09-01-austria.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Spreadsheet grid design</title><link>https://www.vogt.world/grid-design/</link><pubDate>Sat, 10 Aug 2019 00:00:00 -0500</pubDate><guid>https://www.vogt.world/grid-design/</guid><description>&lt;link rel="stylesheet" media="all" href="https://www.vogt.world/grid-design/spreadsheet.css?v=1565331592671" type="text/css"&gt;
&lt;script src="https://www.vogt.world/grid-design/spreadsheet.js?v=1565331592671"&gt;&lt;/script&gt;
&lt;div class="workspace"&gt;
 This is a &lt;strong&gt;workspace post&lt;/strong&gt;. It's a working document of my thoughts as I built
 something or pieced
 together an idea. It might be unstructured and contain spelling errors. It also might not look
 good on a small
 screen. But it could be useful to someone or related to another post, so I'm publishing it as-is.
&lt;/div&gt;
&lt;p&gt;
 I like a lot of existing spreadsheet UIs, particularly Airtable's and Google Sheets. But I think
 giving the grid
 more space, gives the user the impression that everything maybe shouldn't be on-screen all of the
 time. It gives
 the impression that cells are the smallest unit of the sheet, but the grid itself (or worksheet,
 if you prefer) is
 a unit that is as much of an atomic-variable as the cell is.
&lt;/p&gt;</description></item><item><title>Review of spreadsheet user interfaces</title><link>https://www.vogt.world/review-of-spreadsheet-user-interfaces/</link><pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/review-of-spreadsheet-user-interfaces/</guid><description>&lt;p&gt;You can find these images with a quick image search, but I wanted examples of each in one place so I can see the general UI patterns. What are the common elements that a user sees? What do they have in common beyond the grid?&lt;/p&gt;
&lt;p&gt;I should mention that a good number of these screenshots came from &lt;a href="https://winworldpc.com/library/applications/tag-spreadsheet"&gt;WinWorldPC.com&lt;/a&gt;, which is a great archive of all sorts of old software.&lt;/p&gt;
&lt;p&gt;Here we go, roughly in in chronological order.&lt;/p&gt;</description></item><item><title>Spreadsheet reading list</title><link>https://www.vogt.world/spreadsheet-reading-list/</link><pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/spreadsheet-reading-list/</guid><description>&lt;p&gt;A list of stuff about spreadsheets.&lt;/p&gt;
&lt;h2 id="books--articles"&gt;Books + Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Excel-Scientific-Engineering-Cookbook-Cookbooks/dp/0596008791"&gt;Excel Scientific and Engineering Cookbook&lt;/a&gt; (2006)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Data-Science-Scratch-Principles-Python/dp/149190142X"&gt;Data Science from Scratch by Joel Grus&lt;/a&gt; (2015)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fast-standard.org/"&gt;FAST Standard&lt;/a&gt; (2016)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="videos"&gt;Videos&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=GyWKxFxyyrQ"&gt;PLSE Seminar Series: Emery Berger, “Saving The World From Spreadsheets”&lt;/a&gt; (2019)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="blog-posts"&gt;Blog Posts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://techcommunity.microsoft.com/t5/Excel-Blog/Preview-of-Dynamic-Arrays-in-Excel/ba-p/252944"&gt;Dynamic Arrays In Excel&lt;/a&gt; (2018)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://baselinescenario.com/2013/02/09/the-importance-of-excel/#"&gt;The Importance of Excel&lt;/a&gt; (2013)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dataingovernment.blog.gov.uk/2019/06/10/improving-how-we-manage-spreadsheet-data/"&gt;Improving How We Manage Spreadsheets by the UK Government&lt;/a&gt; (2019)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="papers--research"&gt;Papers + Research&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hirzels.com/martin/papers/ecoop14-activesheets.pdf"&gt;Stream Processing with a Spreadsheet, IBM TJ Watson Research Center&lt;/a&gt; (2014)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/en-us/research/blog/influencing-mainstream-software-applying-programming-language-research-ideas-to-transform-spreadsheets/?OCID=msr_blog_PLspreadsheets_popl_highlights"&gt;Influencing mainstream software — Applying programming language research ideas to transform spreadsheets, Microsoft&lt;/a&gt; (2019)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://people.cs.umass.edu/~emery/pubs/CheckCell-preprint-OOPSLA2014.pdf"&gt;CheckCell: Data Debugging for Spreadsheets, UMass&lt;/a&gt; (2014)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/pdf/1901.11100.pdf"&gt;ExcelLint: Automatically Finding Spreadsheet Formula Errors&lt;/a&gt; (2019)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="xkcd"&gt;XKCD&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://m.xkcd.com/2180/"&gt;https://m.xkcd.com/2180/&lt;/a&gt; (2019)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last updated: 8/6/2019&lt;/p&gt;</description></item><item><title>2019-05-01-treehouse</title><link>https://www.vogt.world/2019-05-01-treehouse/</link><pubDate>Wed, 01 May 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2019-05-01-treehouse/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2019-05-01-treehouse/2019-05-01-treehouse.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2019-01-01-mirror</title><link>https://www.vogt.world/2019-01-01-mirror/</link><pubDate>Tue, 01 Jan 2019 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2019-01-01-mirror/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2019-01-01-mirror/2019-01-01-mirror.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2018-12-01-san-diego</title><link>https://www.vogt.world/2018-12-01-san-diego/</link><pubDate>Sat, 01 Dec 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2018-12-01-san-diego/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2018-12-01-san-diego/2018-12-01-san-diego.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2018-11-01-ben-and-dad-christmas-tree</title><link>https://www.vogt.world/2018-11-01-ben-and-dad-christmas-tree/</link><pubDate>Thu, 01 Nov 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2018-11-01-ben-and-dad-christmas-tree/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2018-11-01-ben-and-dad-christmas-tree/2018-11-01-ben-and-dad-christmas-tree.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2018-09-10-rain-on-booth-lake</title><link>https://www.vogt.world/2018-09-10-rain-on-booth-lake/</link><pubDate>Mon, 10 Sep 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2018-09-10-rain-on-booth-lake/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2018-09-10-rain-on-booth-lake/2018-09-10-rain-on-booth-lake.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2018-07-01-garage-a</title><link>https://www.vogt.world/2018-07-01-garage-a/</link><pubDate>Sun, 01 Jul 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2018-07-01-garage-a/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2018-07-01-garage-a/2018-07-01-garage-a.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2018-07-01-garage-c</title><link>https://www.vogt.world/2018-07-01-garage-c/</link><pubDate>Sun, 01 Jul 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2018-07-01-garage-c/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2018-07-01-garage-c/2018-07-01-garage-c.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Acoustic fingerprinting television</title><link>https://www.vogt.world/acoustic-fingerprinting-television/</link><pubDate>Tue, 06 Feb 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/acoustic-fingerprinting-television/</guid><description>&lt;p&gt;Let&amp;rsquo;s jump to the good stuff: How hard is it to create a program that can acoustic fingerprint a television show? Can we identify the playback position of a video based on audio tracks? For this blog post I&amp;rsquo;ll use The Drew Carey Show, because it&amp;rsquo;s the only show of which I have multiple seasons.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://www.vogt.world/acoustic-fingerprinting-television/acoustic_fingerprint_header.png" alt="Acoustic Fingerprinting" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;h2 id="crash-course"&gt;Crash Course&lt;/h2&gt;
&lt;p&gt;Acoustic fingerprinting is when a condensed audio signal is used to identify a larger audio sample. In practice, this means that given a small clip of audio from a movie or tv show, I would like to be able to identify the playback location where the clip originated. The complication is that, while a clip and it&amp;rsquo;s origin may sound exactly the same to the human ear, their binary representations may differ to do encoding, compression, or recording artifacts.&lt;/p&gt;</description></item><item><title>2018-02-01-snowshoe</title><link>https://www.vogt.world/2018-02-01-snowshoe/</link><pubDate>Thu, 01 Feb 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2018-02-01-snowshoe/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2018-02-01-snowshoe/2018-02-01-snowshoe.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>horse-lobby-painting-draft-2018-01-02</title><link>https://www.vogt.world/horse-lobby-painting-draft-2018-01-02/</link><pubDate>Tue, 02 Jan 2018 14:27:53 +0000</pubDate><guid>https://www.vogt.world/horse-lobby-painting-draft-2018-01-02/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/horse-lobby-painting-draft-2018-01-02/horse-lobby-painting-draft-2018-01-02.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2018-01-01-the-loop-winter</title><link>https://www.vogt.world/2018-01-01-the-loop-winter/</link><pubDate>Mon, 01 Jan 2018 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2018-01-01-the-loop-winter/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2018-01-01-the-loop-winter/2018-01-01-the-loop-winter.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>1.0.1 Release of js-spreadsheet</title><link>https://www.vogt.world/js-spreadsheet-1-0-1/</link><pubDate>Sun, 03 Dec 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/js-spreadsheet-1-0-1/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/js-spreadsheet-1-0-1/spreadsheet_v_1_0_1.png" alt="v1.0.1" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;Nearly six months ago I released a 1.0.0 version of &lt;a href="https://www.vogt.world/writing/typscript-javascript-spreadsheet/"&gt;js-spreadsheet&lt;/a&gt;, a javascript implementation of a spreadsheet parser and formulas. Today I&amp;rsquo;m bumping the version up to 1.0.1! Here&amp;rsquo;s a list of all the changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added 121 formulas: NA, CHOOSE, GCD, TRIM, LCM, GAMMALN, PERCENTILE, QUARTILE, PRODUCT, QUOTIENT, UPLUS, UMINUS, STDEV, STDEVA, STDEVP, STDEVPA, ISTEXT, ISLOGICAL, ISNUMBER, ISNONTEXT, MROUND, FACTDOUBLE, FREQUENCY, GROWTH, TRIMMEAN, SLOPE, LOWER, UPPER, STANDARDIZE, SMALL, LARGE, KURT, INTERCEPT, FORECAST, SYD, SLN, NPV, NPER, NOMINAL, MIRR, IRR, IPMT, FV, ISEMAIL, ISURL, POISSON, LINEST, PERCENTRANK, PERCENTRANK.INC, PERCENTRANK.EXC, NORMSINV, NORMSDIST, NORMDIST, NORMINV, NEGBINOMDIST, GEOMEAN, HARMEAN, CONFIDENCE, N, UNARY_PERCENT, MULTINOMIAL, BINOMDIST, COVAR, ISREF, ERRORTYPE, ERROR.TYPE, ISBLANK, ISERR, ISERROR, ISNA, TYPE, COLUMN, ROW, T, PPMT, WEIBULL, VARPA, VARP, VARA, VAR, PERMUT, RSQ, SKEW, STEYX, PROB, MODE, RANK, RANK.AVG, RANK.EQ, LOGNORMDIST, TDIST, TO_DATE, TO_PERCENT, TO_DOLLAR, TO_TEXT, ISFORMULA, IFERROR, ADDRESS, COLUMNS, ROWS, ROMAN, TEXT, FVSCHEDULE, PV, RATE, SUBTOTAL, HYPGEOMDIST, ZTEST, FIND, JOIN, LEN, LEFT, RIGHT, SEARCH, REPT, VALUE, CLEAN, MID, PROPER, REPLACE, and SUBSTITUTE.&lt;/li&gt;
&lt;li&gt;Most functions handle Cells gracefully, converting to primitives where necessary, and returning Cells where necessary.&lt;/li&gt;
&lt;li&gt;Numbers can now be entered in scientific-notation format.&lt;/li&gt;
&lt;li&gt;Pulled OpenOffice license into separate file for clarity.&lt;/li&gt;
&lt;li&gt;Documentation and cleanup of Parser.ts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://xkcd.com/1906/"&gt;&lt;figure&gt;
 &lt;img src="https://www.vogt.world/js-spreadsheet-1-0-1/making_progress.png" alt="xkcd comit" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;</description></item><item><title>garage-painting-draft-2017-11-19</title><link>https://www.vogt.world/garage-painting-draft-2017-11-19/</link><pubDate>Sun, 19 Nov 2017 14:25:46 +0000</pubDate><guid>https://www.vogt.world/garage-painting-draft-2017-11-19/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/garage-painting-draft-2017-11-19/garage-painting-draft-2017-11-19.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-11-01-chicago</title><link>https://www.vogt.world/2017-11-01-chicago/</link><pubDate>Wed, 01 Nov 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-11-01-chicago/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-11-01-chicago/2017-11-01-chicago.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-edinburgh</title><link>https://www.vogt.world/2017-09-01-edinburgh/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-edinburgh/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-edinburgh/2017-09-01-edinburgh.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-scotland</title><link>https://www.vogt.world/2017-09-01-scotland/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-scotland/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-scotland/2017-09-01-scotland.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-scotland-ben-neigh-a</title><link>https://www.vogt.world/2017-09-01-scotland-ben-neigh-a/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-scotland-ben-neigh-a/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-scotland-ben-neigh-a/2017-09-01-scotland-ben-neigh-a.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-scotland-ben-neigh-b</title><link>https://www.vogt.world/2017-09-01-scotland-ben-neigh-b/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-scotland-ben-neigh-b/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-scotland-ben-neigh-b/2017-09-01-scotland-ben-neigh-b.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-scotland-ben-neigh-other-side</title><link>https://www.vogt.world/2017-09-01-scotland-ben-neigh-other-side/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-scotland-ben-neigh-other-side/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-scotland-ben-neigh-other-side/2017-09-01-scotland-ben-neigh-other-side.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-scotland-museum-stairs</title><link>https://www.vogt.world/2017-09-01-scotland-museum-stairs/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-scotland-museum-stairs/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-scotland-museum-stairs/2017-09-01-scotland-museum-stairs.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-scotland-red-skyline</title><link>https://www.vogt.world/2017-09-01-scotland-red-skyline/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-scotland-red-skyline/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-scotland-red-skyline/2017-09-01-scotland-red-skyline.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2017-09-01-scotland-sunset</title><link>https://www.vogt.world/2017-09-01-scotland-sunset/</link><pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-09-01-scotland-sunset/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-09-01-scotland-sunset/2017-09-01-scotland-sunset.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Building a spreadsheet with formulas in javascript</title><link>https://www.vogt.world/typscript-javascript-spreadsheet/</link><pubDate>Wed, 26 Apr 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/typscript-javascript-spreadsheet/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/typscript-javascript-spreadsheet/spreadsheet_typescript_header.png" alt="" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;Typescript/Javascript Spreadsheet and Formula - &lt;a href="https://github.com/vogtb/spreadsheet"&gt;https://github.com/vogtb/spreadsheet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I started this project a couple of months ago with the idea of reverse engineering a spreadsheet in order to better understand them. I started by &lt;a href="https://www.vogt.world/writing/guessers-guide-to-google-spreadsheets"&gt;guessing my way through Google Spreadsheets&lt;/a&gt;, using trial and error to figure out the types, errors, and ways that data is stored an formatted. I could have looked all this information up, but I found that figuring it out yourself is more fun. With that as my starting point, I decided not just to blindly fumbly my way through the features of a spreadsheet, but design and build some of those features myself. With a few open-source projects (&lt;a href="https://github.com/handsontable/rulejs"&gt;RuleJS&lt;/a&gt;, and &lt;a href="https://github.com/sutoiku/formula.js/"&gt;FormulaJS&lt;/a&gt;) as my starting points, I was eventually able to implement a spreadsheet in Typescript/Javascript that has over 120 formulas, and matches many of the basic features of GS.&lt;/p&gt;</description></item><item><title>A guesser's guide to Google Spreadsheets</title><link>https://www.vogt.world/guessers-guide-to-google-spreadsheets/</link><pubDate>Tue, 04 Apr 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/guessers-guide-to-google-spreadsheets/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/guessers-guide-to-google-spreadsheets/guessers_guide_spreadsheet.png" alt="Guesser&amp;rsquo;s Guide to Google Spreadsheets." loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;Microsoft Excel is a programming language, and arguably the &lt;a href="http://research.microsoft.com/en-us/um/people/simonpj/Papers/excel/"&gt;most popular one in existence&lt;/a&gt;. Almost every Fortune 500 company uses it, in addition to a hunge number of small businesses. If you&amp;rsquo;re using Google Spreadsheets - considering the overlap in features, formulas, and functionality - it wouldn&amp;rsquo;t be far from the truth to say that you&amp;rsquo;re using Excel. When I started reading up online about MSE and GS features, it dawned on me that the most popular programming language on the planet is one that I&amp;rsquo;m not familiar with. With that in mind, I started exploring the features of MSE and GS through the lens of a programmer; What are the data types? How are types cast? What are the errors and how are they handled? Through my trial-and-error experiments in Google Spreadsheets, I&amp;rsquo;ve figured out the answers to most of thee questions. So this is a post about an exploration of GS, and reverse engineering it.&lt;/p&gt;</description></item><item><title>2017-01-01-shark-bowl</title><link>https://www.vogt.world/2017-01-01-shark-bowl/</link><pubDate>Sun, 01 Jan 2017 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2017-01-01-shark-bowl/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2017-01-01-shark-bowl/2017-01-01-shark-bowl.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Procedural terrain generation</title><link>https://www.vogt.world/procedural-terrain-generation/</link><pubDate>Wed, 30 Nov 2016 00:00:00 +0000</pubDate><guid>https://www.vogt.world/procedural-terrain-generation/</guid><description>&lt;link rel="stylesheet" type="text/css" href="https://www.vogt.world/procedural-terrain-generation/spinner.css" /&gt;
&lt;script
 type="text/javascript"
 src="https://code.jquery.com/jquery-2.2.3.min.js"
&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://www.vogt.world/procedural-terrain-generation/landmap.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="https://www.vogt.world/procedural-terrain-generation/main.js"&gt;&lt;/script&gt;
&lt;style type="text/css"&gt;
 button {
 display: inline-block;
 height: 36px;
 padding: 9px 16px;
 background-color: blue;
 color: white;
 font-weight: 700;
 border: inset darkblue 2px;
 text-transform: uppercase;
 }
 .hidden {
 display: none;
 }
&lt;/style&gt;
&lt;div&gt;
 &lt;div&gt;
 &lt;div&gt;
 &lt;div&gt;
 &lt;img
 src="https://www.vogt.world/procedural-terrain-generation/terrain_map_grid_header.png"
 alt="Procedural Terrain Generation"
 /&gt;
 &lt;p&gt;
 There was a time (before No Man's Sky came out) when I thought that
 procedurally generated worlds would be the future of video games. How
 cool would it be to walk through a forest, or fly over the mountains
 of a world that was generated specially for you? After bouncing around
 the web I've found that I'm not the only one.
 &lt;a href="http://pcg.wikidot.com/category-pcg-algorithms"
 &gt;http://pcg.wikidot.com/category-pcg-algorithms&lt;/a
 &gt;
 and
 &lt;a href="https://www.reddit.com/r/proceduralgeneration/"
 &gt;https://www.reddit.com/r/proceduralgeneration/&lt;/a
 &gt;
 are filled with amateurs and professionals alike, using a wide variety
 of algorithms to create virtual worlds, maps, and games. But over the
 past few months I've shifted from thinking that it would be fun to
 play in a procedurally generated world, to knowing it's way more fun
 to figure out how to generate the world in the first place.
 &lt;/p&gt;</description></item><item><title>2016-10-10-utah-a</title><link>https://www.vogt.world/2016-10-10-utah-a/</link><pubDate>Mon, 10 Oct 2016 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2016-10-10-utah-a/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2016-10-10-utah-a/2016-10-10-utah-a.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2016-10-10-utah-b</title><link>https://www.vogt.world/2016-10-10-utah-b/</link><pubDate>Mon, 10 Oct 2016 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2016-10-10-utah-b/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2016-10-10-utah-b/2016-10-10-utah-b.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2016-10-10-utah-c</title><link>https://www.vogt.world/2016-10-10-utah-c/</link><pubDate>Mon, 10 Oct 2016 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2016-10-10-utah-c/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2016-10-10-utah-c/2016-10-10-utah-c.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2016-05-01-chicago-above</title><link>https://www.vogt.world/2016-05-01-chicago-above/</link><pubDate>Sun, 01 May 2016 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2016-05-01-chicago-above/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2016-05-01-chicago-above/2016-05-01-chicago-above.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>2016-02-01-cables</title><link>https://www.vogt.world/2016-02-01-cables/</link><pubDate>Mon, 01 Feb 2016 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2016-02-01-cables/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2016-02-01-cables/2016-02-01-cables.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Captain's Log a timestamped note taking app</title><link>https://www.vogt.world/captains-log/</link><pubDate>Sat, 26 Sep 2015 00:00:00 +0000</pubDate><guid>https://www.vogt.world/captains-log/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/captains-log/captains_log.jpg" alt="Captain&amp;rsquo;s Log: a timestamped note taking app" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;I used this for a while at work to track some trial-and-error performance tuning of Java apps. Not being able to go back and change your text frees you from the desire to make each sentence perfect.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re writing code it&amp;rsquo;s easy to lose track of what you did and when you did it. By timestamping your notes and writing them to a yaml file containing the raw text, you can keep your notes and grep them too.&lt;/p&gt;</description></item><item><title>2014-10-01-cabin</title><link>https://www.vogt.world/2014-10-01-cabin/</link><pubDate>Wed, 01 Oct 2014 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2014-10-01-cabin/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2014-10-01-cabin/2014-10-01-cabin.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Hexcraft: a Minecraft-like hexagonal tile editor</title><link>https://www.vogt.world/hexcraft/</link><pubDate>Thu, 06 Mar 2014 10:19:53 -0500</pubDate><guid>https://www.vogt.world/hexcraft/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/hexcraft/hexcraft.jpg" alt="Hexcraft: a Minecraft-like hexagonal tile editor" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;After working on a similar project for my computer science capstone course at Beloit College, I
became interested with 3D geometry. Combining a domain I&amp;rsquo;m familiar with (javascript) with a domain
I was only lightly acquainted with, (3D design) I built a hexagonal tile editor. Hexcraft allows the
player to create Minecraft-style worlds and save them to the browser using local storage.&lt;/p&gt;
&lt;p&gt;You can check out the source code at &lt;a href="https://github.com/vogtb/hexcraft"&gt;github.com/vogtb/hexcraft&lt;/a&gt;,
or you can play around with the game here:
&lt;a href="https://vogtb.github.io/hexcraft/"&gt;https://vogtb.github.io/hexcraft/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Live special effects for theatre performance with the Kinect</title><link>https://www.vogt.world/live-special-effects-for-theatre-performance-with-the-kinect/</link><pubDate>Fri, 06 Dec 2013 00:00:00 +0000</pubDate><guid>https://www.vogt.world/live-special-effects-for-theatre-performance-with-the-kinect/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/live-special-effects-for-theatre-performance-with-the-kinect/kinect_screenshot.jpg" alt="Live special effects for theatre performance with the Kinect" loading="lazy" /&gt;
 
&lt;/figure&gt;
&lt;p&gt;Shakespeare&amp;rsquo;s Hamlet opens with a scene of two sentries discovering the Ghost of King Hamlet. More often than not, the part of the ghost is played by an actor in white makeup walking on stage to deliver his lines. I approached this project with the idea that through live motion capture and replay, theatre visual effects can serve to strengthen a performance, and breath new life to dead characters, even if they are just ghosts.&lt;/p&gt;</description></item><item><title>2013-07-01-dad-cabin</title><link>https://www.vogt.world/2013-07-01-dad-cabin/</link><pubDate>Mon, 01 Jul 2013 00:00:00 +0000</pubDate><guid>https://www.vogt.world/2013-07-01-dad-cabin/</guid><description>&lt;figure&gt;
 &lt;img src="https://www.vogt.world/2013-07-01-dad-cabin/2013-07-01-dad-cabin.jpg" alt="image" loading="lazy" /&gt;
 
&lt;/figure&gt;</description></item><item><title>Photos</title><link>https://www.vogt.world/photos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.vogt.world/photos/</guid><description/></item><item><title>Tab</title><link>https://www.vogt.world/tab/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.vogt.world/tab/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Tab&lt;/title&gt;
&lt;style&gt;
body {
 display: flex;
 justify-content: center;
 margin: 0;
 font-family: monospace;
 background: #1e1e1e;
}
#container {
 width: 800px;
 min-height: 100vh;
 padding: 10px 20px;
 box-sizing: border-box;
 display: flex;
}
#editor {
 font-family: monospace;
 font-size: 14px;
 white-space: pre-wrap;
 overflow-wrap: break-word;
 outline: none;
 border: 1px solid #444;
 padding: 20px;
 background: #2d2d2d;
 color: #e0e0e0;
 flex: 1;
 border-radius: 4px;
 position: relative;
}
#editor:empty:not(:focus)::before {
 content: 'text goes here...';
 color: #666;
 position: absolute;
 pointer-events: none;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="container"&gt;
 &lt;div id="editor" contenteditable="true" spellcheck="false" data-placeholder="text goes here..."&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
const editor = document.getElementById('editor');
let timeout;

function save() {
 const text = editor.innerText;
 const base64 = btoa(unescape(encodeURIComponent(text)));
 window.history.replaceState(null, '', '#' + base64);
}

function load() {
 const hash = window.location.hash.slice(1);
 if (hash) {
 try {
 const text = decodeURIComponent(escape(atob(hash)));
 editor.innerText = text;
 } catch(e) {}
 }
}

editor.addEventListener('input', () =&gt; {
 clearTimeout(timeout);
 timeout = setTimeout(save, 500);
 if (!editor.textContent.trim()) {
 editor.innerHTML = '';
 }
});

load();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item></channel></rss>