<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>kdsch.org</title>
    <link>/</link>
    <description>Recent content on kdsch.org</description>
    <generator>Hugo</generator>
    <language>en</language>
    <managingEditor>k@kdsch.org (Karl Schultheisz)</managingEditor>
    <webMaster>k@kdsch.org (Karl Schultheisz)</webMaster>
    <lastBuildDate>Thu, 13 Feb 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PCB edge cuts from a 3D model</title>
      <link>/post/freecad-enclosure-to-pcb-edge-cuts/</link>
      <pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/freecad-enclosure-to-pcb-edge-cuts/</guid>
      <description>&lt;p&gt;I&amp;rsquo;d like to explain how I use FreeCAD to create PCB edge cuts in KiCad.&lt;/p&gt;&#xA;&lt;p&gt;I am starting from a STEP model of an off-the-shelf cast aluminum&#xA;enclosure sold by Hammond. These are very popular for guitar pedals and&#xA;other equipment. After selecting an enclosure that I think is the right&#xA;size, I want to create a PCB edge cut by grabbing some of the geometry&#xA;from the STEP model and extracting it into a SVG file. This creates&#xA;the largest PCB that will fit in the enclosure. KiCad will let you&#xA;import an SVG directly into the PCB edge cuts layer. And in Inkscape,&#xA;the edge cuts SVG can be useful for understanding the 2D constraints of&#xA;the design.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recently</title>
      <link>/post/recently-2/</link>
      <pubDate>Thu, 31 Oct 2024 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/recently-2/</guid>
      <description>&lt;p&gt;My life hasn&amp;rsquo;t turned out as I expected it. Being a husband a dad and a&#xA;homeowner and a professional software engineer is harder than I thought&#xA;it would be. And luck has not always served my health. I had a pituitary&#xA;tumor removed last year &amp;mdash; the surgery went fine, although recovery was&#xA;rough. We learned the hard way that my pituitary gland has no function (I&#xA;almost died from a stomach virus), so I take hormones. I lost my libido&#xA;and realized that it was probably from a combination of testosterone&#xA;and oxytocin, two chemicals that my body does not produce. I welcomed this&#xA;insight as a scientific explanation of human behavior.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing system</title>
      <link>/post/notebook/</link>
      <pubDate>Mon, 22 Jul 2024 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/notebook/</guid>
      <description>&lt;p&gt;I used to grab printer paper and scribble on it when I wanted to write something down.&#xA;I&amp;rsquo;d often use the letter-sized sheets in landscape orientation to better fit between my keyboard and the edge of my desk.&#xA;This led to stacks of loose paper piling up in my office.&#xA;When I felt the need to declutter, I had to painstakingly decide page-by-page what to keep and discard.&#xA;About two years ago, I got tired of this system and began to think about improvements.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I got into software engineering</title>
      <link>/post/how-i-got-into-swe/</link>
      <pubDate>Fri, 05 Jul 2024 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/how-i-got-into-swe/</guid>
      <description>&lt;p&gt;I didn&amp;rsquo;t plan to become a software engineer, and the story of how I got to be one may be interesting to you.&lt;/p&gt;&#xA;&lt;h1 id=&#34;90s&#34;&gt;&amp;rsquo;90s&lt;/h1&gt;&#xA;&lt;p&gt;Electronics was one of my earliest interests. I learned by taking things apart. Later came the ability to put them back together. I also remember making a robotic line-follower kit with my dad and I had the first LEGO Mindstorms. I wasn&amp;rsquo;t good at programming it, but I liked the idea of programmable electro-mechanical LEGO models.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple bounded model checking</title>
      <link>/post/cbmc-technique/</link>
      <pubDate>Wed, 22 May 2024 23:35:16 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/cbmc-technique/</guid>
      <description>&lt;p&gt;Bounded model checking is unit testing with superpowers. Thanks to&#xA;symbolic simulation, you can test thousands &amp;ndash; or billions &amp;ndash; of cases&#xA;simultaneously. You spend less time writing tests and more time finding&#xA;broken edge cases.&lt;/p&gt;&#xA;&lt;p&gt;I want to share a technique for applying bounded model checking that&#xA;I recently started using. The advantages of this new technique are&#xA;simplicity, flexibility, and clarity.&lt;/p&gt;&#xA;&lt;p&gt;While it&amp;rsquo;s possible to run &lt;a href=&#34;https://www.cprover.org/cbmc/&#34;&gt;CBMC&lt;/a&gt; on entire programs, this is often impractical&#xA;because whole programs can be slow to simulate. It also doesn&amp;rsquo;t apply to&#xA;libraries. The more generic way to use CBMC is to create a set of carefully&#xA;chosen entrypoints, which are called &amp;ldquo;harnesses&amp;rdquo; in CBMC&amp;rsquo;s documentation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Audio stream median filter</title>
      <link>/post/median/</link>
      <pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/median/</guid>
      <description>&lt;p&gt;Median filtering is used in image processing to remove noise and damage. I&#xA;never encountered it as an &lt;em&gt;audio&lt;/em&gt; effect. Let&amp;rsquo;s figure it out and try it!&#xA;Here are the requirements:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Compute the median of the last N values of a signal for N ∈ [3, 48].&lt;/li&gt;&#xA;&lt;li&gt;Do it in real-time.&lt;/li&gt;&#xA;&lt;li&gt;On a 168-MHz ARM Cortex-M4F microcontroller.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I use a ring buffer in each solution. This is standard in audio stream&#xA;processing. I don&amp;rsquo;t show its implementation because you can find it&#xA;elsewhere, or challenge yourself to implement it!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Parallel development</title>
      <link>/post/parallel-dev/</link>
      <pubDate>Wed, 07 Feb 2024 15:52:31 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/parallel-dev/</guid>
      <description>&lt;p&gt;Sometimes when I am developing something, I want to do an experiment&#xA;or implement a prototype which is based on an existing design. I&amp;rsquo;ve&#xA;found that modifying an old design to accommodate a new idea can be&#xA;difficult. Also, it tends to make it hard to compare the new version&#xA;with the old version, which is a really useful thing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;refactoring-a-function&#34;&gt;Refactoring a function&lt;/h2&gt;&#xA;&lt;p&gt;For example, when refactoring a function, I think it&amp;rsquo;s better to write&#xA;a new function. This allows you to test &amp;mdash; or better, &lt;em&gt;prove&lt;/em&gt; &amp;mdash; that&#xA;the two versions agree. If you&amp;rsquo;re refactoring a function that your code&#xA;calls directly in many places, this approach allows you to introduce the&#xA;new function gradually rather than everywhere all at once. If you&amp;rsquo;ve&#xA;ever faced lots of compiler errors during refactoring, you know what&#xA;I&amp;rsquo;m talking about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CBMC × (LTO – assertions)</title>
      <link>/post/cbmc&#43;lto/</link>
      <pubDate>Fri, 02 Feb 2024 12:00:47 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/cbmc&#43;lto/</guid>
      <description>&lt;p&gt;My &lt;a href=&#34;https://git.sr.ht/~kdsch/sampler&#34;&gt;sampler&lt;/a&gt; project is not just a way for me to explore music tech. It&amp;rsquo;s also&#xA;a research vehicle to explore better ways of engineering embedded software.&lt;/p&gt;&#xA;&lt;p&gt;The code is written in style similar to &lt;a href=&#34;https://en.wikipedia.org/wiki/Design_by_contract&#34;&gt;design by contract&lt;/a&gt;. Functions&#xA;check inputs and outputs by calling &lt;a href=&#34;https://en.cppreference.com/w/c/error/assert&#34;&gt;&lt;code&gt;assert()&lt;/code&gt;&lt;/a&gt;. There are&#xA;a lot of assertions, because I avoid using the &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator with&#xA;conditions. Instead of writing&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;assert(fabsf(x) &amp;lt;= 1 &amp;amp;&amp;amp; other_condition);&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;I write&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;assert(x &amp;lt;= 1);&#xA;assert(-1 &amp;lt;= x);&#xA;assert(other_condition);&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This form provides higher resolution when an assertion fails: it lets me&#xA;know precisely what condition happened. But it results in more branches,&#xA;which reduces speed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A year of writing a sampler</title>
      <link>/post/sampler/</link>
      <pubDate>Tue, 12 Dec 2023 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/sampler/</guid>
      <description>&lt;p&gt;Last January, I got the itch to make a sampler using Meson, ISO C11,&#xA;STM32F4, and libopencm3. The project lulled midyear, but has become&#xA;something I want to refine over time.&lt;/p&gt;&#xA;&lt;p&gt;I forget sometimes that I &lt;a href=&#34;/post/libopencm3-meson-port/&#34;&gt;ported&lt;/a&gt; libopencm3 to Meson only to use Meson&#xA;and libopencm3 together for this project. I guess that&amp;rsquo;s how much I care&#xA;to have &lt;a href=&#34;https://mesonbuild.com/index.html#overview&#34;&gt;good tooling&lt;/a&gt;, and how little I want to compromise on using a&#xA;classic programming language.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A decade of diarism</title>
      <link>/post/diary/</link>
      <pubDate>Mon, 11 Dec 2023 12:04:53 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/diary/</guid>
      <description>&lt;p&gt;Ten years ago, I wrote the first post in my personal, electronic diary. It&#xA;actually wasn&amp;rsquo;t my first try with diarism, but it&amp;rsquo;s the one that survived.&lt;/p&gt;&#xA;&lt;p&gt;I wasn&amp;rsquo;t spurred to adopt it by a faddish impulse to improve myself. I&#xA;realized that I got something from self-reflection. That realization began&#xA;in a tender time of burdensome belief and fallacious faith. Somehow,&#xA;despite my half-closed mind, I couldn&amp;rsquo;t suppress my desire to think, to&#xA;understand myself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>/about/</link>
      <pubDate>Mon, 04 Dec 2023 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/about/</guid>
      <description>&lt;figure&gt;&lt;img src=&#34;/karl.jpg&#34;&#xA;    alt=&#34;Grayscale headshot of Karl with a blank expression.&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Hi, I&amp;rsquo;m Karl, an embedded software developer living in Lancaster, Pennsylvania.&lt;/p&gt;&#xA;&lt;p&gt;Cultured in Linux and holding a B.S. degree in electrical engineering, I&amp;rsquo;ve worked on technology for eight years.&#xA;I focus on bettering embedded systems by taking inspiration from the wider world of software engineering.&#xA;You might not find a person more zealous than me about code quality.&#xA;I believe better code and better English require clearer thinking.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Free-flowing software stories</title>
      <link>/post/narrative/</link>
      <pubDate>Fri, 19 May 2023 04:42:37 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/narrative/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s an argument that despite the prevalence of search engines,&#xA;Wikipedia, and large language models (LLMs), we still need to &lt;a href=&#34;https://controlaltbackspace.org/know/&#34;&gt;know&#xA;things&lt;/a&gt;. We shouldn&amp;rsquo;t just look things up.&lt;/p&gt;&#xA;&lt;p&gt;I think this argument could use better examples. Canonical knowledge,&#xA;like Newtonian physics and text encodings, is not the best example of&#xA;something you should memorize. Sure, you&amp;rsquo;d be faster at solving a problem&#xA;if you know something relevant to that problem. But in some contexts,&#xA;predicting what problem you&amp;rsquo;ll have, and what knowledge you will need,&#xA;is hard. Knowing &lt;em&gt;how&lt;/em&gt; to look up information is nearly as effective&#xA;as knowing &lt;em&gt;that&lt;/em&gt; a million facts are true, and doesn&amp;rsquo;t require me to&#xA;adopt the habit of &lt;a href=&#34;https://controlaltbackspace.org/repeat/&#34;&gt;spaced repetition&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Work with Git submodules</title>
      <link>/post/submodules/</link>
      <pubDate>Wed, 17 May 2023 14:39:16 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/submodules/</guid>
      <description>&lt;h2 id=&#34;add-a-submodule-at-a-specific-commit&#34;&gt;Add a submodule at a specific commit&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;git submodule add https://git.sr.ht/~kdsch/bl&#xA;git -C bl/ checkout 113632ca&#xA;git add bl/&#xA;git commit -m &#39;add bl submodule at 113632ca&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;list-submodules&#34;&gt;List submodules&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;git submodule&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;change-the-version-of-a-submodule&#34;&gt;Change the version of a submodule&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;git -C bl/ checkout f81b3582&#xA;git add bl/&#xA;git commit -m &#39;bl: update to f81b3582&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;change-the-remote-of-a-submodule&#34;&gt;Change the remote of a submodule&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;git submodule set-url bl git@git.sr.ht:~kdsch/bl&#xA;git add .gitmodules&#xA;git commit -m &#39;bl: use ssh protocol for the remote&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; &lt;code&gt;git submodule set-url &amp;lt;path&amp;gt;&lt;/code&gt; will not work correctly if the&#xA;path contains a trailing slash.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Take advantage of Git</title>
      <link>/post/git/</link>
      <pubDate>Wed, 10 May 2023 10:15:28 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/git/</guid>
      <description>&lt;p&gt;Git is awesome, but delivers most of its value when used beyond the utter&#xA;basics.&lt;/p&gt;&#xA;&lt;h2 id=&#34;write-multi-line-commit-messages&#34;&gt;Write multi-line commit messages&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve seen some codebases that make me wonder if the developers know that&#xA;&lt;code&gt;git commit -m&lt;/code&gt; isn&amp;rsquo;t the only way to commit changes.  Some changes are&#xA;too complex to summarize in one line.&lt;/p&gt;&#xA;&lt;p&gt;I never use &lt;code&gt;-m&lt;/code&gt; anyway because I want to heed the commit message style&#xA;guidelines, and my editor helps me do that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A port of libopencm3&#39;s build system to Meson</title>
      <link>/post/libopencm3-meson-port/</link>
      <pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/libopencm3-meson-port/</guid>
      <description>&lt;p&gt;I am &lt;a href=&#34;https://git.sr.ht/~kdsch/libopencm3&#34;&gt;porting&lt;/a&gt; &lt;a href=&#34;http://libopencm3.org/&#34;&gt;libopencm3&lt;/a&gt;&amp;rsquo;s build system to &lt;a href=&#34;https://mesonbuild.com&#34;&gt;Meson&lt;/a&gt;. I&amp;rsquo;ve used&#xA;Make for a long time. Here&amp;rsquo;s why I want to use Meson for new projects.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Meson puts &lt;em&gt;me&lt;/em&gt; in charge of dependency integration, not some vendor or SDK.&#xA;I don&amp;rsquo;t want to copy files into my source tree or be tied to some&#xA;&amp;ldquo;workspace&amp;rdquo; that an IDE requires. I want to point at a Git commit.&#xA;Git submodules are too hard to delete. I&amp;rsquo;ve &lt;a href=&#34;https://kdsch.org/post/meson-wraps&#34;&gt;written&lt;/a&gt; about this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automating in-tree dependencies with Meson</title>
      <link>/post/meson-wraps/</link>
      <pubDate>Tue, 07 Feb 2023 21:56:27 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/meson-wraps/</guid>
      <description>&lt;p&gt;System-installed libraries don&amp;rsquo;t make sense in a microcontroller project,&#xA;which naturally wants all code to be in the project tree. Vendoring&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;creates the tree by hand, offering cumbersome ways to specify the version&#xA;of a dependency and to update the tree when it changes. This habit may&#xA;struggle to keep a pace of development that supports software over a&#xA;long lifecycle.&lt;/p&gt;&#xA;&lt;p&gt;Git &lt;a href=&#34;https://git-scm.com/book/en/v2/Git-Tools-Submodules&#34;&gt;submodules&lt;/a&gt; simplify specifying a version and updating the&#xA;tree automatically. However, their reputation for fragility has been&#xA;earned fairly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On the job again</title>
      <link>/post/on-the-job-again/</link>
      <pubDate>Sun, 01 Jan 2023 11:16:13 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/on-the-job-again/</guid>
      <description>&lt;p&gt;In late November, I started an embedded software engineering job. My&#xA;first task was to troubleshoot a network module whose creators were no&#xA;longer at the company. The module uses a 32-bit microcontroller running&#xA;a real-time operating system (RTOS). One of my colleagues had observed&#xA;via serial logs that the system was running out of memory. The software&#xA;design uses multiple heap allocators. He suspected a memory leak and&#xA;asked me to investigate the RTOS&amp;rsquo;s heap allocations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reverse engineering the Korg ES-1</title>
      <link>/post/reverse/</link>
      <pubDate>Sat, 13 Aug 2022 22:19:40 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/reverse/</guid>
      <description>&lt;p&gt;Korg released the ES-1 in 2000 and describes it as a &amp;ldquo;rhythm production&#xA;sampler&amp;rdquo;. It&amp;rsquo;s relevant today as a piece of cheap used hardware that&amp;rsquo;s&#xA;easy and fun to use.&lt;/p&gt;&#xA;&lt;p&gt;And not only for making music!&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;/es-1-playing.gif&#34;&#xA;    alt=&#34;An animation of the ES-1, all plugged in, playing in pattern mode at 170 bpm, with a SmartMedia card nearby.&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;p&gt;Actually, reversing it is the main reason I have it.&lt;/p&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;ve taken a technical interest in samplers since the time I became&#xA;aware of their creative use in the production of late 1990&amp;rsquo;s drum &amp;amp;&#xA;bass. I dreamt of my own product ideas and wanted to better understand&#xA;how samplers are designed. In that respect, the ES-1 would only be a&#xA;rough guide, because technology is much different today. Nevertheless,&#xA;I felt the ES-1 offered me a lesson.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Promoting a culture of mental health</title>
      <link>/post/mh/</link>
      <pubDate>Mon, 30 May 2022 20:51:32 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/mh/</guid>
      <description>&lt;p&gt;America has a culture problem: we don&amp;rsquo;t know how to promote mental health.&#xA;While I view mental health&amp;mdash;and public health generally&amp;mdash;as a collective&#xA;responsibility, sharing what you&amp;rsquo;ve learned about mental health nudges&#xA;the system in the right direction. So that&amp;rsquo;s what I&amp;rsquo;m going to do in&#xA;this post.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;My life was never as stressful as during the coronavirus pandemic. While&#xA;much media coverage about workers during this time told the story of&#xA;their awkward transition to working from home, my situation was totally&#xA;different. I had been laid off (you know&amp;mdash;fired, but politely) from my&#xA;fully remote job a few months prior and was in the middle of a delicate&#xA;career transition. I had just begun a new professional networking effort&#xA;and had made some good connections; I even did some consulting work for&#xA;one of them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fuzzing Hare</title>
      <link>/post/harefuzz/</link>
      <pubDate>Sat, 21 May 2022 08:28:51 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/harefuzz/</guid>
      <description>&lt;p&gt;Some years ago, I first encountered American Fuzzy Lop (AFL), a fuzz&#xA;tester. I found it nifty and forgot about it. I recognized the term&#xA;&amp;ldquo;fuzz testing&amp;rdquo;, but didn&amp;rsquo;t understand it. I wrote mostly Go then, so I&#xA;didn&amp;rsquo;t need AFL, which targets C programs.&lt;/p&gt;&#xA;&lt;p&gt;With time, my interest in C deepened, as I savored its set of tradeoffs&#xA;in the great expanse of Language–Designland. I remembered that C programs&#xA;benefit from nifty tooling. What was that fuzzer called? I should try it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Evolving a technique for unit testing in C</title>
      <link>/post/unit-tests-c-revisited/</link>
      <pubDate>Mon, 11 Apr 2022 13:43:23 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/unit-tests-c-revisited/</guid>
      <description>&lt;p&gt;I expect to be writing a lot more lately, because today is my son&amp;rsquo;s first&#xA;day of daycare. My stint as a full-time parent is officially over, and now&#xA;it&amp;rsquo;s time to get back in the groove. I plan to write more on that soon.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;In a &lt;a href=&#34;/post/unit-tests-c&#34;&gt;previous article&lt;/a&gt;, I described a way to do&#xA;table-driven testing in C. Since then, experience with this technique&#xA;(and others) has suggested an evolution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Faust: an experience report</title>
      <link>/post/faust-experience-report/</link>
      <pubDate>Wed, 16 Feb 2022 20:51:17 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/faust-experience-report/</guid>
      <description>&lt;p&gt;For those who do not know, Faust is a domain-specific language (DSL) for&#xA;developing audio digital signal processors. It is a functional programming&#xA;language developed by &lt;a href=&#34;https://grame.fr&#34;&gt;GRAME&lt;/a&gt;, a French research institution, since&#xA;about 2002. The Faust compiler, and the majority of accessory code,&#xA;is written in C++, although the compiler also targets other languages.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been using Faust for about two years. I found it a pretty easy&#xA;language to learn, given that I was already comfortable with functional&#xA;programming. The five block diagram operators still seem a bit magical,&#xA;but I get by.&lt;/p&gt;</description>
    </item>
    <item>
      <title>FOSS and socialism</title>
      <link>/post/foss-socialism/</link>
      <pubDate>Tue, 08 Feb 2022 03:46:00 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/foss-socialism/</guid>
      <description>&lt;p&gt;Sometimes comparisons are drawn between the free software movement&#xA;and socialism. In an article about software licensing, Drew DeVault&#xA;described free software as a &amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2019/06/13/My-journey-from-MIT-to-GPL.html&#34;&gt;socialist utopia&lt;/a&gt;&amp;hellip; ripe for&#xA;exploitation by capitalists&amp;rdquo;. Andrew Keen accused Lawrence Lessig, a&#xA;prominent free-culture activist, of being an &lt;a href=&#34;https://en.wikipedia.org/wiki/Free-culture_movement#Copyright_proponents&#34;&gt;&amp;ldquo;intellectual property&#xA;communist&amp;rdquo;&lt;/a&gt;. An article published in Jacobin Magazine claims&#xA;&amp;ldquo;&lt;a href=&#34;https://www.jacobinmag.com/2016/02/free-software-movement-richard-stallman-linux-open-source-enclosure&#34;&gt;free software isn&amp;rsquo;t socialism&lt;/a&gt; for your computer&amp;rdquo;. What is the&#xA;relationship between socialism and the free software movement?&lt;/p&gt;</description>
    </item>
    <item>
      <title>&#34;Compensation&#34;</title>
      <link>/post/compensation/</link>
      <pubDate>Sun, 28 Nov 2021 21:07:31 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/compensation/</guid>
      <description>&lt;p&gt;December 2019, Lancaster, Pennsylvania. CareerLink office. The&#xA;tone was set by the front desk staff. I was asked what I was here&#xA;for. &amp;ldquo;R-E-S-E-A.&amp;rdquo; &amp;ldquo;OK, re-see ya.&amp;rdquo; As I signed in, I was told to check&#xA;a certain box, but I did not see which one. I guessed correctly.  I was&#xA;then directed down the hall to the third door on the right, a small&#xA;classroom.  I had to sign in there, too. Did I have my letter? Yes. Did&#xA;I have my 304&amp;rsquo;s?  I don&amp;rsquo;t know what that is. &amp;ldquo;It&amp;rsquo;s OK; I&amp;rsquo;ll explain it.&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recently</title>
      <link>/post/recently/</link>
      <pubDate>Fri, 12 Nov 2021 04:55:10 -0500</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/recently/</guid>
      <description>&lt;h2 id=&#34;reading&#34;&gt;Reading&lt;/h2&gt;&#xA;&lt;p&gt;I read Ursula K. Le Guin&amp;rsquo;s &lt;a href=&#34;https://libcom.org/library/dispossessed-ursula-le-guin&#34;&gt;&lt;em&gt;The Dispossessed&lt;/em&gt;&lt;/a&gt; to great&#xA;inspiration last month. It&amp;rsquo;s the first novel I&amp;rsquo;ve read since &lt;em&gt;The Kite&#xA;Runner&lt;/em&gt; when I began college. The first paragraphs took a bit of&#xA;acclimation, but thereafter I was hooked.&lt;/p&gt;&#xA;&lt;p&gt;I want my child(ren) to read it, maybe after some education in philosophy&#xA;and science. The book&amp;rsquo;s effect isn&amp;rsquo;t to predict future technology,&#xA;but to affirm the complexity of humanity and to challenge us to meet&#xA;ourselves with a philosophy that deserves us. For Le Guin, &lt;a href=&#34;https://plato.stanford.edu/entries/daoism/&#34;&gt;Taoism&lt;/a&gt;&#xA;is such a philosophy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Knowledge is made in curious ways</title>
      <link>/post/building-knowledge/</link>
      <pubDate>Fri, 22 Oct 2021 04:57:29 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/building-knowledge/</guid>
      <description>&lt;p&gt;Since I began writing ode2dsp (mentioned &lt;a href=&#34;/post/ode2dsp&#34;&gt;previously&lt;/a&gt;),&#xA;it has been refactored a few times, and has achieved what it set out&#xA;to do. Success! Maybe.&lt;/p&gt;&#xA;&lt;p&gt;When ode2dsp was first conceived, it was meant to be a tool to prevent&#xA;silly mistakes in creating models. Having built this, it was not difficult&#xA;to add other features that leverage the existing data structures&amp;mdash;namely,&#xA;computing stability conditions. I expected this to enable developers&#xA;to anticipate stability issues in generated models.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Convert ODEs to DSP—with a tool</title>
      <link>/post/ode2dsp/</link>
      <pubDate>Wed, 15 Sep 2021 14:57:06 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/ode2dsp/</guid>
      <description>&lt;p&gt;Since my last &lt;a href=&#34;/post/nonlinear-dsp/&#34;&gt;post&lt;/a&gt;, I embraced the mathematical&#xA;challenges of DSP. I quickly tired of writing&amp;mdash;and miswriting&amp;mdash;equations&#xA;by hand. Then, I betrayed all of my mathematics instructors by using&#xA;computer algebra to check my results. I betrayed them again when I felt&#xA;the computer was simply better than me at the job. But I vindicated&#xA;computer scientists when I resolved to automate the symbolic computations.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been a &lt;a href=&#34;https://www.sagemath.org/&#34;&gt;SageMath&lt;/a&gt; user since 2013, back when it was called Sage&#xA;and it only ran on Linux. Sage was a main reason I began using Linux,&#xA;and I feel a strong bond with the project. However, after eight years,&#xA;I&amp;rsquo;ve learned more about software development, and Sage feels inconsistent,&#xA;complex, opaque, and difficult to use. Sage&amp;rsquo;s goal is to compete with&#xA;proprietary software like Mathematica. And as an open source project,&#xA;it opted to integrate many independent mathematics packages under one&#xA;interface. Mathematica is old enough to have crufty corners, but it has no&#xA;such burden as integrating dozens of unrelated bits of software, and I do&#xA;not doubt that it achieves much smoother integration than Sage ever will.&#xA;(Maxima, Sage&amp;rsquo;s default backend for common symbolic calculations, has no&#xA;programmatic interface&amp;mdash;no API&amp;mdash;and fully assumes that only a human&#xA;being sitting at a terminal is interacting with it.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nonlinear DSP is good, fun, and hard</title>
      <link>/post/nonlinear-dsp/</link>
      <pubDate>Thu, 12 Aug 2021 13:40:26 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/nonlinear-dsp/</guid>
      <description>&lt;p&gt;From day to day, my job is to take care of my son, and will be for the&#xA;foreseeable future. While I enjoy him trotting up to me, book in hand,&#xA;speaking the unfathomable, I anticipate a break. When I get a break,&#xA;I like to spend it on something that unites all of my skills, interests,&#xA;and concerns, and lately that has been digital signal processing.&lt;/p&gt;&#xA;&lt;p&gt;Though I spent the past year focusing on hardware, especially analog&#xA;circuits, it&amp;rsquo;s not the best thing for me to focus on right now, for&#xA;many reasons. I love analog electronics, so this was a bittersweet&#xA;realization. But DSP makes me more content.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Small is beautiful</title>
      <link>/post/bl/</link>
      <pubDate>Tue, 27 Jul 2021 03:50:15 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/bl/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://git.sr.ht/~kdsch/bl/tree&#34;&gt;bl&lt;/a&gt; is a tiny backlight adjuster I wrote for myself. I&amp;rsquo;ve used it&#xA;for years without needing to change it very much. When I am feeling sad,&#xA;I enjoy reading its codebase.&lt;/p&gt;&#xA;&lt;p&gt;The tool was first written in Go and later rewritten in C for the sake&#xA;of minimalism. A neat way to see its simplicity is to run it with strace&#xA;and count the lines of the output.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ strace -o /dev/stdout bl + | wc -l&#xA;14&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Its build system, designed to reduce size and dependencies, generates 33&#xA;kB. Its tests achieve clarity by following an unusual &lt;a href=&#34;/post/unit-tests-c/&#34;&gt;convention&lt;/a&gt;.&#xA;bl adjusts smoothly at any brightness level, since it scales by a&#xA;constant factor.&lt;/p&gt;</description>
    </item>
    <item>
      <title>&#34;Coming to an understanding&#34;</title>
      <link>/post/understanding/</link>
      <pubDate>Mon, 12 Jul 2021 19:55:30 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/understanding/</guid>
      <description>&lt;p&gt;Format: MP3&lt;br&gt;&#xA;Size: 1.8 MB&lt;br&gt;&#xA;Duration: 5:18&lt;/p&gt;&#xA;&lt;audio controls&gt;&#xA;  &lt;source src=&#34;/understanding.mp3&#34; type=&#34;audio/mp3&#34;&gt;&#xA;&lt;/audio&gt;</description>
    </item>
    <item>
      <title>How to liberate billions of Android users</title>
      <link>/post/android-bulletin/</link>
      <pubDate>Sat, 10 Jul 2021 12:42:19 -0400</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/android-bulletin/</guid>
      <description>&lt;p&gt;As of 2019, there were &lt;a href=&#34;https://www.androidpolice.com/2019/05/07/there-are-now-more-than-2-5-billion-active-android-devices/&#34;&gt;2.5 billion&lt;/a&gt; active Android&#xA;devices. Typically, software vendors such as Google, Samsung, LG,&#xA;and Motorola only support devices for two or three years. After&#xA;that, vendors &lt;em&gt;drop&lt;/em&gt; software updates, a complaint motivating the&#xA;development of &lt;a href=&#34;http://postmarketos.org/&#34;&gt;postmarketOS&lt;/a&gt;, a Linux distribution targeting&#xA;mobile devices. Users&amp;rsquo; ability to adopt such community-controlled&#xA;software is hindered, however, by vendors&amp;rsquo; persistent &lt;em&gt;grip&lt;/em&gt; on&#xA;bootloaders&amp;mdash;refusal to unlock them to allow installing third-party&#xA;software. Vendors act like they &lt;a href=&#34;https://drewdevault.com/2020/06/26/Vendor-purpose-OS.html&#34;&gt;own&lt;/a&gt; these devices.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart: starting an electronics biz during a chip shortage</title>
      <link>/2021/03/31/smart-starting-an-electronics-biz-during-a-chip-shortage/</link>
      <pubDate>Wed, 31 Mar 2021 17:09:15 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2021/03/31/smart-starting-an-electronics-biz-during-a-chip-shortage/</guid>
      <description>&lt;p&gt;At some point while designing an electronic product, one has to decide the hardware implementation. The number of options is a thing of awe. To gather relevant information and focus on one aspect at a time can get you past the paralysis. And make your requirements and constraints clear.&lt;/p&gt;&#xA;&lt;p&gt;Should you face a shortage of semiconductors, you want to avoid committing to special chips. Aim for the least common denominator, seems right. I look at what&amp;rsquo;s in stock now and might be relieved to find things that could work, yet fear them scarce come production time. Companies nimble enough are redesigning their products to use whatever is available. Others hoard. Wisdom seems to be that nobody should expect the shortage to clear up before &amp;lsquo;22.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wait, maybe not Rust</title>
      <link>/2021/02/12/wait-maybe-not-rust/</link>
      <pubDate>Fri, 12 Feb 2021 19:02:06 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2021/02/12/wait-maybe-not-rust/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t like to come to conclusions prematurely, but the fact is that most human decisions are made from the gut, before we become aware of it, despite our conscious rationalization. One such decision is whether to develop Recursyn using C or Rust. Here&amp;rsquo;s the rationalization.&lt;/p&gt;&#xA;&lt;p&gt;Rust is the &amp;ldquo;most loved&amp;rdquo; programming language. Doesn&amp;rsquo;t that mean it&amp;rsquo;s a good choice for new systems programming projects? Even professional Rust consultants are skeptical:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recursyn development report 0</title>
      <link>/2021/01/24/recursyn-development-report-0/</link>
      <pubDate>Sun, 24 Jan 2021 22:11:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2021/01/24/recursyn-development-report-0/</guid>
      <description>&lt;p&gt;What&amp;rsquo;s the current status of Recursyn?&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m evaluating developing the firmware in Rust, particularly the application logic and peripheral drivers. Rust is attractive because it is a modern language, simpler than C++, targeting microcontrollers, with a large enough community to provide most of the functionality Recursyn needs. Rust comes with challenges, however; the language reference is incomplete at 316 pages, and its ecosystem is known to often break APIs. In addition, &lt;a href=&#34;https://docs.rust-embedded.org/book/static-guarantees/typestate-programming.html&#34;&gt;typestate interfaces&lt;/a&gt;, which are often used in embedded Rust to enforce contracts, seem to incur a cost in readability. If Recursyn ultimately suffers from these tradeoffs, it probably needs C.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recursyn: analog resampling synthesizer</title>
      <link>/2021/01/08/recursyn-analog-resampling-synthesizer/</link>
      <pubDate>Fri, 08 Jan 2021 05:06:10 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2021/01/08/recursyn-analog-resampling-synthesizer/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been listening to drum &amp;amp; bass music since my teens, but only late last year did I study in detail the history of its production. Drum &amp;amp; bass was the among the first music genres to explore the remotest sound design possibilities of digital sampling. This exploration resembled an unwitting turn of electronic music toward a much earlier musical movement, &lt;em&gt;musique concrète&lt;/em&gt;, which employed similar techniques of unrecognizable sound. The golden age of drum &amp;amp; bass coincided with the apex of hardware samplers, which were rapidly killed off by personal computers running digital audio workstations. Drum &amp;amp; bass survived, but in symbiosis with different tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Faust Brings Functional Programming to DSP</title>
      <link>/2021/01/04/faust-brings-functional-programming-to-dsp/</link>
      <pubDate>Mon, 04 Jan 2021 16:42:17 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2021/01/04/faust-brings-functional-programming-to-dsp/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;In the future, all radical new languages will be domain-specific languages.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.infoq.com/presentations/language-design-process/?itm_source=presentations_about_qcon-sanfrancisco-2018&amp;amp;itm_medium=link&amp;amp;itm_campaign=qcon-sanfrancisco-2018&#34;&gt;Peter Alvaro&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;If you write digital signal processing code and you haven&amp;rsquo;t encountered &lt;a href=&#34;https://faust.grame.fr/&#34;&gt;Faust&lt;/a&gt;, it&amp;rsquo;s worth a look, especially if you have ever wanted a change of pace from writing DSP in C/C++. Faust is a functional language for DSP that cuts through the noise.&lt;/p&gt;&#xA;&lt;p&gt;I first used functional programming professionally when last year I contributed to a web GUI in &lt;a href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;. Many of the arguments for using Elm over JavaScript are also relevant to using Faust over C/C++. Elm is simple enough that I came to grasp it in a few months. I was hooked; I started using it for hobby projects, like a &lt;a href=&#34;https://ellie-app.com/bZ5PMqncjVQa1&#34;&gt;CIEXYZ-to-RGB color picker&lt;/a&gt;. And when I started using Faust a few months ago, I felt the same zing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My 2020: Development Comes to a Head</title>
      <link>/2020/12/10/my-2020-development-comes-to-a-head/</link>
      <pubDate>Thu, 10 Dec 2020 12:44:14 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2020/12/10/my-2020-development-comes-to-a-head/</guid>
      <description>&lt;p&gt;Over the past 15 months, my life has rapidly transformed. But for you to understand the significance of that transformation, I have to tell you the story of my life since high school.&lt;/p&gt;&#xA;&lt;p&gt;In 2001, I was fourteen years old, skateboarding, and listening to the Chemical Brothers. When I entered tenth grade, I enrolled in an electronic  technology program at a &lt;a href=&#34;https://www.berkscareer.com/&#34;&gt;vo-tech school&lt;/a&gt;, a decision to exert greater control over my education, not to skip college and become a technician. Leonard Krug, my instructor, recognized and nourished my curiosity with significant latitude to explore. Voltage-controlled filters enchanted me, and I built a four-pole filter using LM13600&amp;rsquo;s as part of a joint senior project. (The other part was a digital oscillator/sequencer designed by Andrew Meehan, my friend to this day.) During this period, I received a book that offered permanent career inspiration: &lt;em&gt;The Art and Science of Analog Circuit Design&lt;/em&gt;, by Jim Williams.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Musician Taught the Engineer</title>
      <link>/2020/09/22/the-musician-taught-the-engineer/</link>
      <pubDate>Tue, 22 Sep 2020 16:37:10 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2020/09/22/the-musician-taught-the-engineer/</guid>
      <description>&lt;p&gt;Tatsuya Takahashi, a designer of modern analog synthesizers, has a coherent philosophy of musical instrument design. He argues that the guitar has been a dominant instrument because of its superiority in a number of aspects. The guitar is versatile: it can play chords or leads, rhythms or melodies. The guitar is portable: light enough to carry, loud enough for a small gathering. The guitar is autonomous: it is self-powered and needs no special environment, such as a production studio, to make music. The guitar is expressive: it responds inherently to nuances of touch and articulation, which a skilled performer can put to musical use. The guitar is simple: a set of strings attached to a wooden resonator, not banks of knobs and switches.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Useful Work Logging</title>
      <link>/2020/02/17/useful-work-logging/</link>
      <pubDate>Mon, 17 Feb 2020 17:25:21 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2020/02/17/useful-work-logging/</guid>
      <description>&lt;p&gt;Ticket systems such as Atlassian Jira can bridge developers and product&#xA;owners, if used effectively. Developers don&amp;rsquo;t need see logging their work&#xA;as an arbitrary chore that happens to please management. Work logging&#xA;keeps product owners informed about development pace and can help teams&#xA;of developers use resources efficiently.&lt;/p&gt;&#xA;&lt;p&gt;I use the verbal phrase &amp;ldquo;work logging&amp;rdquo; rather than the noun phrase &amp;ldquo;work&#xA;log&amp;rdquo; to emphasize the practice over the artifact. The goal isn&amp;rsquo;t merely&#xA;to produce an artifact, but to tell the story of development.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Troubleshooting Home Network Quality Issues</title>
      <link>/2020/02/04/troubleshooting-home-network-quality-issues/</link>
      <pubDate>Tue, 04 Feb 2020 22:22:20 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2020/02/04/troubleshooting-home-network-quality-issues/</guid>
      <description>&lt;p&gt;Devices using my home wireless network have suffered from a mysterious&#xA;quality issue for a few months. It manifests in the form of episodes,&#xA;which vary a lot in their characteristics, but tend to have high&#xA;latency (as high as 40 seconds) and sometimes high packet loss (greater&#xA;than 80%). As Steve Litt tells us, &lt;a href=&#34;https://web.archive.org/web/20190611113807/http://www.troubleshooters.com/tinterm.htm&#34;&gt;intermittent problems challenge us the&#xA;most&lt;/a&gt;,&#xA;as unknown factors modulate them. Though the issue persists, I&amp;rsquo;ve learned&#xA;a lot in troubleshooting it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I Make Terminal Sessions Productive</title>
      <link>/2020/01/31/how-i-make-terminal-sessions-productive/</link>
      <pubDate>Fri, 31 Jan 2020 18:29:22 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2020/01/31/how-i-make-terminal-sessions-productive/</guid>
      <description>&lt;p&gt;Call me old fashioned, but in an era of IDEs written in JavaScript&#xA;reaching peak popularity among developers, I still use a terminal&#xA;to get everything done. In contrast to IDEs, which attempt to own&#xA;the main productivity experience and defer customization to plugins,&#xA;being productive in the terminal hinges on hand-selecting your tools&#xA;and knowing how to use them.&lt;/p&gt;&#xA;&lt;p&gt;Here are some ways I stay productive in the terminal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hope for Reducing C/C&#43;&#43; Build Times</title>
      <link>/2020/01/19/hope-for-reducing-c-c-build-times/</link>
      <pubDate>Sun, 19 Jan 2020 17:40:33 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2020/01/19/hope-for-reducing-c-c-build-times/</guid>
      <description>&lt;p&gt;When I write software, I&amp;rsquo;m often motivated by a desire for structural simplicity. My low tolerance for complexity makes me avoid certain solutions, even if it means more work. A love of simplicity, in some contexts, is a strength. In others, it&amp;rsquo;s a weakness.&lt;/p&gt;&#xA;&lt;p&gt;Embedded Linux development often entails building large amounts of system software, which is typically written in C and C++. Build times on the order of hours limit the speed of the development cycle. Many have complained about this situation, but feel little hope for improvement.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data in the History of Automation Tools</title>
      <link>/2020/01/17/hello-world/</link>
      <pubDate>Fri, 17 Jan 2020 20:22:13 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/2020/01/17/hello-world/</guid>
      <description>&lt;p&gt;Shells have always been used for both interaction and automation. Today, automation tools are highly evolved and diverse. Here are some notes I&amp;rsquo;ve taken while searching for meaning in the chaos.&lt;/p&gt;&#xA;&lt;p&gt;Louis Pouzin coined the term &amp;ldquo;shell&amp;rdquo; and also wrote the first one: RUNCOM. This program featured composable commands and permitted automating repetitive tasks. Multics shell, inspired by Pouzin&amp;rsquo;s ideas, was created in 1965 by Glenda Schroeder. In 1971, Ken Thompson wrote a similar shell for Unix.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What I&#39;m Up To</title>
      <link>/post/update/</link>
      <pubDate>Thu, 19 Sep 2019 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/update/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve got a few projects rolling at the moment. The overall trend is to pursue intelligibility.&lt;/p&gt;&#xA;&lt;h2 id=&#34;document-publishing&#34;&gt;Document publishing&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m in the process of learning &lt;a href=&#34;https://pollenpub.com&#34;&gt;Pollen&lt;/a&gt;, a next-generation document&#xA;publishing tool written in Racket, a dialect of Scheme. I intend to use&#xA;it for my résumé, this blog (sorry Hugo, you&amp;rsquo;re too complex), and random&#xA;typographical stuff I produce for events such as parties. Matthew Butterick&amp;rsquo;s&#xA;&lt;a href=&#34;https://practicaltypography.com&#34;&gt;&lt;em&gt;Practical Typography&lt;/em&gt;&lt;/a&gt; has turned me into an amateur typographer,&#xA;such that I now offer free, unsolicited design services to friends who ask&#xA;me to improve their writing. Having been a reader of &lt;a href=&#34;https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-4.html#%25_toc_start&#34;&gt;SICP&lt;/a&gt; since about 2014,&#xA;I have some experience in Scheme, but Racket seems much more featureful;&#xA;more like C++ is to C, or Scala is to Java. I&amp;rsquo;ll have to proceed with caution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Designing a Platform for Programming Language Experimentation</title>
      <link>/post/pl-2/</link>
      <pubDate>Wed, 11 Sep 2019 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/pl-2/</guid>
      <description>&lt;p&gt;Roughly two years ago, I read a description of how a Forth interpreter works.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Forth interpreter is very simple. It just does this over and over:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Read a line of input&lt;/li&gt;&#xA;&lt;li&gt;While there is more data in the line:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Parse a whitespace-delimited word&lt;/li&gt;&#xA;&lt;li&gt;Lookup the word in a list of defined words.&#xA;If found, execute the code for that word.&lt;/li&gt;&#xA;&lt;li&gt;Otherwise, try to interpret the word as a number&#xA;in the current number base. If so, push it on the stack.&lt;/li&gt;&#xA;&lt;li&gt;Otherwise display an error message&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I remember the thrill of feeling that it was in reach. Two-hundred lines&#xA;of Go later, I had written my first interpreter. Since then, the project&#xA;branched out into a music composition language, an investigation of type&#xA;systems (including Hindley-Milner type inference), a yearlong search for a&#xA;Raymond Smullyan book, and most recently, a concatenative language based on&#xA;Robert Kleffner&amp;rsquo;s &amp;ldquo;lambda-compose&amp;rdquo;. There were several blind alleys along the&#xA;way. (Among them: trying to use propagation of constraints for type inference.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>I Slayed a Callback Dragon Today</title>
      <link>/post/callback-dragon/</link>
      <pubDate>Tue, 30 Jul 2019 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/callback-dragon/</guid>
      <description>&lt;p&gt;I was writing some Core Bluetooth code on iOS when the dragon appeared.&lt;/p&gt;&#xA;&lt;p&gt;A callback looks like a function. But it&amp;rsquo;s not a function; it&amp;rsquo;s an event&#xA;disguised as a function.&lt;/p&gt;&#xA;&lt;p&gt;Once you know the beast&amp;rsquo;s weakness, it&amp;rsquo;s simple, though not easy.&lt;/p&gt;&#xA;&lt;p&gt;Don&amp;rsquo;t write callbacks. Write code to handle events. &lt;em&gt;All&lt;/em&gt; events implicated&#xA;by a particular objective. That code might be a state machine, or it might&#xA;be something more complex. It&amp;rsquo;s much easier to debug a state machine than&#xA;a callback dragon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Designing a Concatenative Language</title>
      <link>/post/pl/</link>
      <pubDate>Wed, 05 Jun 2019 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/pl/</guid>
      <description>&lt;p&gt;The tasks of designing a language and creating an interpreter are distinct, but&#xA;practically, they are tightly coupled. The interpreter serves as a research&#xA;vehicle for design choices. The language serves as an occasion for interpreter&#xA;design.&lt;/p&gt;&#xA;&lt;p&gt;The first interpreter I wrote was for a Forth-like, stack-based, postfix&#xA;language. It was extremely simple, consisting of a tokenizer and a&#xA;word evaluator, inspired by a description of &lt;a href=&#34;http://wiki.laptop.org/go/Forth_Lesson_1#How_the_Interpreter_Works&#34;&gt;the Open Firmware Forth&#xA;interpreter&lt;/a&gt;. I got by with this minimal design for some months while&#xA;I toyed around with language features and applications, particularly signal&#xA;processing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Write C to Test C</title>
      <link>/post/unit-tests-c/</link>
      <pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/unit-tests-c/</guid>
      <description>&lt;p&gt;It disappoints me to see messy, procedural, assertion-based testing in C&#xA;codebases. Here&amp;rsquo;s an example from the wild:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;const char *key = &amp;quot;404&amp;quot;;&#xA;const int values[3] = { 0, 1, 2 };&#xA;&#xA;plan_no_plan();&#xA;&#xA;Map *map = map_new();&#xA;&#xA;ok(map &amp;amp;&amp;amp; map_empty(map), &amp;quot;Creation&amp;quot;);&#xA;ok(map_first(map, &amp;amp;key) == NULL &amp;amp;&amp;amp; strcmp(key, &amp;quot;404&amp;quot;) == 0, &amp;quot;First on empty map&amp;quot;);&#xA;ok(map_empty(map_prefix(map, &amp;quot;404&amp;quot;)), &amp;quot;Empty prefix map&amp;quot;);&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;In assertion-based testing, it&amp;rsquo;s common to test an entire data structure in a&#xA;single function, instead of testing one of its operations. This groups together&#xA;tests for unrelated behaviors. Assertions tend to contain difficult boolean&#xA;expressions that mutate state silently, coupling test cases together. They&#xA;use magic to hide the test framework implementation, and reimplement features&#xA;that your programming language already has.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What I learned from trying TCR</title>
      <link>/post/tcr/</link>
      <pubDate>Sat, 13 Apr 2019 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/tcr/</guid>
      <description>&lt;p&gt;&lt;code&gt;test &amp;amp;&amp;amp; commit || revert&lt;/code&gt; (TCR) is a coding workflow &lt;a href=&#34;https://medium.com/@kentbeck_7670/test-commit-revert-870bbd756864&#34;&gt;proposed&lt;/a&gt; by extreme programming guru Kent Beck. I just tried it out. Here&amp;rsquo;s what I learned.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-starting-out-is-somewhat-paradoxical&#34;&gt;1. Starting out is somewhat paradoxical&lt;/h2&gt;&#xA;&lt;p&gt;You have to write tests that pass, otherwise they get deleted. So you end up&#xA;aiming for silly things, like tests that test nothing or test stubs. After&#xA;that, it seems to work well enough for something like a Fibonacci function.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Code Framing</title>
      <link>/post/code-framing/</link>
      <pubDate>Thu, 20 Dec 2018 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/code-framing/</guid>
      <description>&lt;p&gt;I assume that our conceptualization of programming languages has been influenced&#xA;by the &lt;a href=&#34;https://en.wikipedia.org/wiki/Grammatical_mood&#34;&gt;grammatical moods&lt;/a&gt; of&#xA;natural language. The imperative mood: imperative, statement-driven programming;&#xA;the conditional and subjunctive moods: condtional statements and clauses; the&#xA;indicative mood: declarations&amp;mdash;be they data, constraints, relationships, or&#xA;whatever.&lt;/p&gt;&#xA;&lt;p&gt;Most programmers have more experience with programming constructs than with&#xA;grammatical moods. But if such moods influence our idea of programming, maybe&#xA;they can be a research vehicle in programming language design.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Clean Concurrency in Go</title>
      <link>/post/clean-concurrency-go/</link>
      <pubDate>Fri, 13 Jul 2018 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/clean-concurrency-go/</guid>
      <description>&lt;p&gt;The Go programming language makes it possible to write readable software. But&#xA;readability is not an ingredient of a language. It follows from the language&amp;rsquo;s&#xA;design and how it is used.&lt;/p&gt;&#xA;&lt;p&gt;In my brief experience with Go, using interfaces enhances readability.&#xA;Interfaces can be used to separate concerns, so that unrelated thoughts don&amp;rsquo;t&#xA;intrude on one another.&lt;/p&gt;&#xA;&lt;p&gt;Concurrency, one of Go&amp;rsquo;s &amp;ldquo;headline features,&amp;rdquo; enables separation of concerns in&#xA;a different way. In sequential code, two statements always happen in the same&#xA;order, even if that order is irrelevant.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Case for a Cooperative Internet Service Provider</title>
      <link>/post/isp-coop/</link>
      <pubDate>Sun, 10 Jun 2018 00:00:00 +0000</pubDate><author>k@kdsch.org (Karl Schultheisz)</author>
      <guid>/post/isp-coop/</guid>
      <description>&lt;p&gt;As the Internet has evolved, new services have challenged the engineering and&#xA;business assumptions of existing networks. &lt;a href=&#34;https://en.wikipedia.org/wiki/BitTorrent#Throttling_and_encryption&#34;&gt;BitTorrent and Comcast&lt;/a&gt;,&#xA;&lt;a href=&#34;https://www.wired.com/2009/10/iphone-att-skype/&#34;&gt;Skype/iPhone and AT&amp;amp;T&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Level_3_Communications#Comcast_dispute&#34;&gt;Netflix/Level 3 and Comcast&lt;/a&gt; are just a few&#xA;cases in which changing relations among Internet organizations have caused&#xA;consumer dissatisfaction.&lt;/p&gt;&#xA;&lt;p&gt;Consumers rightly see the risk in giving ISPs too much power.  However,&#xA;they typically lack insight into the technical and business situations&#xA;that ISPs confront, for example, &lt;a href=&#34;https://en.wikipedia.org/wiki/Routing&#34;&gt;routing&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Peering#Peering_agreement&#34;&gt;peering agreements&lt;/a&gt;,&#xA;making it easy for the actions of ISPs to be seen as Orwellian.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
