<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <atom:link href="https://www.ethangunderson.com/feed.xml" rel="self" type="application/rss+xml" />
  <title>Ethan Gunderson</title>
  <link>https://www.ethangunderson.com</link>
  <description>Writing, reviews, and other stuff by Ethan Gunderson, software engineer.</description>
  <language>en-us</language>
  <generator>Tableau v0.24.0</generator>
    <item>
       <title>To Be Taught, If Fortunate</title>
       <link>https://www.ethangunderson.com/media/to-be-taught-if-fortunate</link>
       <pubDate>Tue, 31 Mar 2026 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/media/to-be-taught-if-fortunate</guid>
       <description><![CDATA[ 
I went into this novella blind and finished it not entirely sure if I liked it or not, nor do I really know how to describe it. There’s little traditional plot, character development, or action. Instead, the story follows four astronauts exploring distant planets, told through logs sent back to Earth.

The story starts with a set of ideas on how slower than light travel could be possible, and how humans could adapt to different environments. It explores an independent space organization, and what space travel would look like if it was deeply rooted in ethics. The different planets have different conditions, different life, and require different adaptation. This part is all very fun to read.

However, it ends abruptly, and not in a good way. From a character standpoint, they make a decision to essentially give up all agency and amounts to a time-delayed form of suicide. The reader is supposed to assume that more debate happens, but that debate never appears on the page.

What I did enjoy, though, is the central question the book poses. Is the pursuit of scientific discovery, knowing that it will have no practical application, still worthwhile? The book was written in 2019, and that question is even more relevant in 2026 as NASA's budget continues to be cut.
 ]]></description>
    </item>
    <item>
       <title>Project Hail Mary</title>
       <link>https://www.ethangunderson.com/media/project-hail-mary-movie</link>
       <pubDate>Sun, 29 Mar 2026 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/media/project-hail-mary-movie</guid>
       <description><![CDATA[ 
I loved the book and the movie was everything that I hopped it would be.
 ]]></description>
    </item>
    <item>
       <title>Khruangbin Live at Radio City Music Hall: New York Edition</title>
       <link>https://www.ethangunderson.com/media/khruangbin-rcmh</link>
       <pubDate>Wed, 18 Mar 2026 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/media/khruangbin-rcmh</guid>
       <description><![CDATA[  ]]></description>
    </item>
    <item>
       <title>Hades 2</title>
       <link>https://www.ethangunderson.com/media/hades2</link>
       <pubDate>Sat, 14 Mar 2026 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/media/hades2</guid>
       <description><![CDATA[  ]]></description>
    </item>
    <item>
       <title>Dungeon Crawler Carl</title>
       <link>https://www.ethangunderson.com/media/dungeon-crawler-carl</link>
       <pubDate>Tue, 10 Feb 2026 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/media/dungeon-crawler-carl</guid>
       <description><![CDATA[  ]]></description>
    </item>
    <item>
       <title>Hades</title>
       <link>https://www.ethangunderson.com/media/hades</link>
       <pubDate>Tue, 10 Feb 2026 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/media/hades</guid>
       <description><![CDATA[  ]]></description>
    </item>
    <item>
       <title>SLOs and SLAs are not Interchangeable Terms</title>
       <link>https://www.ethangunderson.com/slos-and-slas-are-not-interchangeable-terms</link>
       <pubDate>Wed, 30 Oct 2024 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/slos-and-slas-are-not-interchangeable-terms</guid>
       <description><![CDATA[ 
I'm a self-proclaimed SLA/SLO cop. I’m passionate about using the correct terms. Misunderstanding these two terms can lead to serious issues in service operations. Let’s clarify the differences:

* **Service Level Indicator (SLI):** A specific measurement of service performance, such as latency or error rates.

* **Service Level Objective (SLO):** A target for those measurements—what we aspire to achieve.

* **Service Level Agreement (SLA):** A formal contract that outlines expected service levels and penalties for non-compliance.

#### Why This Matters

SLAs are **contracts**. If a service violates the terms of the SLA, there are consequences. Normally, someone owes someone money, in some form or another.

In contrast, SLOs are **goals**. While an SLI represents the current reality of service performance, an SLO defines what we aim for. SLOs are designed to be flexible; they can evolve as your service and business needs change. When an SLO is not met, it’s an opportunity to ask important questions: "Is this target still relevant? Do we need to adjust our goals?" or "How can we improve in this area?" In other words, an SLO violation opens the door for constructive conversation.

SLAs are not mutable. At least, not without a lot of paperwork and lawyers. They are set in stone. They are what you are legally bound to uphold.

An SLA violation should be a significant event (and hopefully a rare event). However, mislabeling SLOs as SLAs will trivialize SLA violations, while mistaking SLAs for SLOs will lead to treating flexible goals as immutable contracts, ultimately undermining their intended value.

#### In Summary

* **SLOs = Goals (mutable)**
* **SLAs = Contracts (fixed)**
 ]]></description>
    </item>
    <item>
       <title>Conference Talk: Telemetry Powered Observability</title>
       <link>https://www.ethangunderson.com/conference-talk-telemetry-powered-observability</link>
       <pubDate>Wed, 11 May 2022 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/conference-talk-telemetry-powered-observability</guid>
       <description><![CDATA[ 
<iframe async=true width="560" height="315" src="https://www.youtube.com/embed/eOD6H8U_0GE?si=tjl6qAyKZScG3G9h" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

I was fortunate enough to be invited to speak about Elixir, Telemetry, and Observability at Empex MTN on May 6th. I didn't realize how much I missed nerding out with people, in person. Getting to know more folks in the Elixir community was absolutely fantastic.

This was my first conference talk in a long time, close to 8 years. While I definitely stumbled a little bit, I had a lot of fun putting this talk together. I already have some more talk ideas brewing around in my head and can't wait to get back into speaking on a more regular basis.
 ]]></description>
    </item>
    <item>
       <title>Sparklines in Chart.js</title>
       <link>https://www.ethangunderson.com/sparklines-in-chartjs</link>
       <pubDate>Wed, 01 Sep 2021 00:00:00 UTC</pubDate>
       <guid>https://www.ethangunderson.com/sparklines-in-chartjs</guid>
       <description><![CDATA[ 
A sparkline is a small, simple chart that can be used to show trend information at a glance. There are normally no axes or tooltips, just a small line of data points. While building Glean, I wanted a quick way to show the user how their accounts are performing over time. Sparklines were perfect for this use case.

While Chart.js doesn’t have a first class sparkline chart option, the configurability of line charts still makes this possible without including any other libraries or plugins.

The following code will produce a sparkline in Chart.js version 3.3.2

``` javascript
new Chart(chartContext, {
    type: "line",
    data: {
      labels: series,
      datasets: [
        {
          data: series,
          fill: false,
          pointRadius: 0,
          spanGaps: true,
          tension: 0.2
        },
      ],
    },
    options: {
      events: [],
      borderColor: borderColor,
      borderWidth: 1.5,
      responsive: false,
      plugins: {
        legend: {
          display: false,
          labels: {
            display: false
          }
        },
        tooltips: {
          display: false
        }
      },
      scales: {
        x: {
          display: false,
        },
        y: {
          display: false,
        }
      },
    },
  });
```
 ]]></description>
    </item>
  </channel>
</rss>
