<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Ghettos of Abu Nawas</title>
    <link>http://malloc.dog</link>
    <description>static site generator</description>
    <pubDate>Mon, 29 Jun 2026 18:49:06 EDT</pubDate>
    <lastBuildDate>Mon, 29 Jun 2026 18:49:06 EDT</lastBuildDate>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>Org-page static site generator (https://github.com/kelvinh/org-page)</generator>
    <item>
      <title>What is a Scheduler Anyways?</title>
      <link>http://malloc.dog/blog/2026/02/09/what-is-a-scheduler-anyways/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>What is a Scheduler Anyways?</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org37b2eda">1. So What Happened?</a></li>
<li><a href="#orgc93f215">2. Lavd</a></li>
<li><a href="#orgcd4ba24">3. Erlang Schedulers</a></li>
<li><a href="#org9c210c7">4. The Problem</a></li>
</ul>
</div>
</div>

<div id="org2047885" class="figure">
<p><img src="/assets/blog/2026/02/09/what-is-a-scheduler-anyways/2025-12-28_18-49-05_screenshot.png" alt="2025-12-28_18-49-05_screenshot.png" />
</p>
</div>

<p>
Last year, we had an outage that got detailed in the Linux Plumbers Conference: <a href="https://www.youtube.com/watch?v=KFItEHbFEwg">https://www.youtube.com/watch?v=KFItEHbFEwg</a>, where a deployment of Lavd broke the Erlang runtime that had CPU pinning enabled.
</p>

<p>
As part of this, I wanted to learn more about the interplay between these two systems. <code>sched_ext</code><sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup> is here to stay, and growing, and I expect it to only get more important as time goes on<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>. Runtimes are also getting more sophisticated: <a href="https://fil-c.org/">Fil-C</a> is building a memory safe C runtime, Python might be finally losing its GIL and getting a JIT<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup>, and Go is seeing ever more adoption. As these runtimes layer their own scheduling on top of the kernel, the cross-interactions between the two create second order effects that are hard to predict. This post is about one of those.
</p>
<div id="outline-container-org37b2eda" class="outline-2">
<h2 id="org37b2eda"><span class="section-number-2">1.</span> So What Happened?</h2>
<div class="outline-text-2" id="text-1">
<p>
We pin CPU cores for Erlang schedulers on WhatsApp in order to get more performance. An Erlang scheduler is an abstract worker that can process arbitrary units of work. Traditionally in Erlang, after 4000 reductions<sup><a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink">4</a></sup>, the schedulers will swap away from the current task and give another task a chance to run.
</p>

<p>
Schedulers can be configured to be bound to particular CPUs using the <a href="https://www.erlang.org/doc/apps/erts/erl_cmd.html#%2Bsbt"><code>sbt</code> setting</a>, which has many options around NUMA, hyperthread spreading, etc. As a bit of foreshadowing, there is a very interesting note in the documentation:
</p>

<div id="orgf27a20a" class="figure">
<p><img src="/assets/blog/2026/02/09/what-is-a-scheduler-anyways/2026-02-09_20-26-14_screenshot.png" alt="2026-02-09_20-26-14_screenshot.png" />
</p>
</div>

<p>
Suddenly one day we had absolutely garbage P99 response times. This took us a while to debug, but ultimately with the help of various people we were able to pin it down to Lavd<sup><a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink">5</a></sup>. So this gives us a good place to start: why the hell does lavd muck up my cpu affinity?
</p>
</div>
</div>
<div id="outline-container-orgc93f215" class="outline-2">
<h2 id="orgc93f215"><span class="section-number-2">2.</span> Lavd</h2>
<div class="outline-text-2" id="text-2">
<p>
Luckily for us, lavd has excellent public documentation: <a href="https://github.com/sched-ext/scx/tree/ad30a290a1531987a434e034e2ab2307880a4a11/scheds/rust/scx_lavd">https://github.com/sched-ext/scx/tree/ad30a290a1531987a434e034e2ab2307880a4a11/scheds/rust/scx_lavd</a>
</p>

<p>
The first paragraph gives us a good explainer (emphasis mine):
</p>
<blockquote>
<p>
<code>scx_lavd</code> is a BPF scheduler that implements an LAVD (Latency-criticality Aware Virtual Deadline) scheduling algorithm. While LAVD is new and still evolving, its core ideas are 1) <b>measuring how much a task is latency critical</b> and 2) <b>leveraging the task's latency-criticality information in making various scheduling decisions</b> (e.g., task's deadline, time slice, etc.). As the name implies, LAVD is based on the foundation of deadline scheduling. This scheduler consists of the BPF part and the Rust part. The BPF part makes all the scheduling decisions; the Rust part provides high-level information (e.g., CPU topology) to the BPF code, loads the BPF code and conducts other chores (e.g., printing sampled scheduling decisions).
</p>
</blockquote>

<p>
So we have a BPF thing that polls and gets scheduling information, and then we have a main.rs that binds CPU topology. Neat. Before we go further, we need to understand what lavd sits on top of. We are in <a href="https://lwn.net/Articles/969062/">EEVDF land</a> for the Linux scheduler now, which has completely replaced the old CFS scheduler. So forget your time quanta, now you need to think about lag<sup><a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink">6</a></sup>.
</p>

<p>
In the classical EEVDF space, we have a per CPU runqueue<sup><a id="fnr.7" class="footref" href="#fn.7" role="doc-backlink">7</a></sup>. Specifically, the runqueue struct has this information:
</p>
<div class="org-src-container">
<pre class="src src-c">struct rq {
  struct cfs_rq		cfs;
  struct rt_rq		rt;
  struct dl_rq		dl;
#ifdef CONFIG_SCHED_CLASS_EXT
  struct scx_rq		scx;
#endif

}
</pre>
</div>

<p>
So, cool, we can see that there's a runqueue for scx (<code>sched_ext</code>) and a runqueue for <code>eevdf</code> (still called <code>cfs</code>). Given that it's per CPU, this means that each CPU maintains its own rb tree of runnable tasks<sup><a id="fnr.8" class="footref" href="#fn.8" role="doc-backlink">8</a></sup>:
</p>
<div class="org-src-container">
<pre class="src src-c">struct cfs_rq {
  /* ... other not interesting stuff ... */
  struct rb_root_cached	tasks_timeline; // rb tree
}
</pre>
</div>

<p>
So that's neat. This tree means that all the tasks on a given core only compete against other tasks on that same core.
</p>

<p>
Now if we look at <code>lavd</code>, specifically the scheduling mechanism<sup><a id="fnr.9" class="footref" href="#fn.9" role="doc-backlink">9</a></sup>:
</p>

<div class="org-src-container">
<pre class="src src-c">static u64 calc_virtual_deadline_delta(struct task_struct *p,
                                       task_ctx *taskc)
{
  u64 deadline, adjusted_runtime;
  u32 greedy_penalty;

  /*
   * Calculate the deadline based on runtime,
   * latency criticality, and greedy ratio.
   */
  calc_lat_cri(p, taskc);
  greedy_penalty = calc_greedy_penalty(p, taskc);
  adjusted_runtime = calc_adjusted_runtime(taskc);

  deadline = (adjusted_runtime * greedy_penalty) / taskc-&gt;lat_cri;
  return deadline &gt;&gt; LAVD_SHIFT;
}
</pre>
</div>

<p>
We can see here that there's a notion of "latency criticality" and "greediness." A higher latency criticality gives a tighter deadline, and the greedy penalty ensures fairness while scheduling.
</p>

<p>
Lavd's Rust handoff code is in <a href="https://github.com/sched-ext/scx/blob/ad30a290a1531987a434e034e2ab2307880a4a11/scheds/rust/scx_lavd/src/main.rs#L888">main.rs</a>, where <code>scheduler::run()</code> is the handoff to BPF. If autopower is on, we poll the system power profile and then push to BPF, and then process stats.
</p>

<p>
The BPF code then wakes up, and performs this <a href="https://github.com/sched-ext/scx/blob/ad30a290a1531987a434e034e2ab2307880a4a11/scheds/rust/scx_lavd/src/bpf/main.bpf.c#L2274-L2300">gigantic list of operations</a>:
</p>
<div class="org-src-container">
<pre class="src src-c">SCX_OPS_DEFINE(lavd_ops,
             .select_cpu		= (void *)lavd_select_cpu,
             .enqueue			= (void *)lavd_enqueue,
             .dequeue			= (void *)lavd_dequeue,
             .dispatch		= (void *)lavd_dispatch,
             .runnable		= (void *)lavd_runnable,
             .running			= (void *)lavd_running,
             .tick			= (void *)lavd_tick,
             .stopping		= (void *)lavd_stopping,
             .quiescent		= (void *)lavd_quiescent,
...
</pre>
</div>

<p>
You can look at the individual functions, but:
</p>
<ul class="org-ul">
<li><code>lavd_enqueue()</code> calculates the virtual deadline, and inserts it into a queueing structure called the DSQ.</li>
<li><code>lavd_dispatch()</code> pulls work from the DSQ</li>
<li><code>lavd_running()</code> calculates the time slices, and advances the logical clock</li>
<li><code>lavd_tick()</code> has some very key logic that checks if there is any higher priority task left in the DSQ. If there is, it shrinks the current time slice to give the higher priority task a chance to run, effectively yielding the current task.</li>
<li><code>lavd_stopping()</code> is a cleanup op</li>
<li><code>lavd_quiescent()</code> handles various sleeping stats</li>
</ul>

<p>
So critical to this entire system is the concept of a DSQ (dispatch queue). Unlike EEVDF's per-CPU runqueues, a DSQ is shared across multiple CPUs, arranged either by the last level cache (LLC) or an AMD core complex (CCX).
</p>

<p>
For example, you can think of a traditional CPU with 4 cores, each with their own L1/L2 caches but a big shared L3 cache as sharing one DSQ. This is a more traditional CPU:
</p>

<p>
<img src="/assets/blog/2026/02/09/what-is-a-scheduler-anyways/2026-02-15_16-13-37_screenshot.png" alt="2026-02-15_16-13-37_screenshot.png" /><sup><a id="fnr.10" class="footref" href="#fn.10" role="doc-backlink">10</a></sup>
</p>

<p>
However, with the <a href="https://qsantos.fr/2024/10/03/amd-cpus-ccds-and-ccxs/">rise of AMD's packaging</a>, we've effectively added a newer interconnect called the "Infinity Fabric":
</p>


<div id="org4174310" class="figure">
<p><img src="/assets/blog/2026/02/09/what-is-a-scheduler-anyways/2026-02-15_16-05-18_screenshot.png" alt="2026-02-15_16-05-18_screenshot.png" />
</p>
</div>

<p>
So this means that for older, Intel chips, they'll have a single DSQ for all their cores on the CPU, while newer AMD CPUs will have multiple DSQs, one for each CCX.
</p>
</div>
</div>
<div id="outline-container-orgcd4ba24" class="outline-2">
<h2 id="orgcd4ba24"><span class="section-number-2">3.</span> Erlang Schedulers</h2>
<div class="outline-text-2" id="text-3">
<p>
We now need to take another digression into how the Erlang (BEAM) scheduler works. We talked about this briefly at the start, but I'll go more into detail here.
</p>

<p>
The BEAM scheduling mechanism is divided into subsystems called <code>schedulers</code><sup><a id="fnr.11" class="footref" href="#fn.11" role="doc-backlink">11</a></sup>. There is typically a single scheduler per core, and each "scheduler" is really an OS thread that acts as a worker, doing some amount of work before switching to another piece of work<sup><a id="fnr.12" class="footref" href="#fn.12" role="doc-backlink">12</a></sup>. From the Linux kernel's perspective, each Erlang scheduler is just another thread to be scheduled. Because Erlang is an actor based programming paradigm, this ensures that each actor only gets a particular amount of CPU, before yielding to another actor. Erlang uses a dimensionless metric known as a "reduction." A reduction roughly maps to a single function call, and because Erlang is a functional programming language, you're guaranteed to have to make some function calls at some point<sup><a id="fnr.13" class="footref" href="#fn.13" role="doc-backlink">13</a></sup>. After a specific amount of reductions (4k as of writing), the scheduler switches<sup><a id="fnr.14" class="footref" href="#fn.14" role="doc-backlink">14</a></sup>.
</p>

<p>
Because the BEAM has cascading schedulers, this fixed reduction count means that when a scheduler has a bunch of stuff queued up and it doesn't execute, then it piles up the work. Unscheduled schedulers (heh) also cannot have tasks stolen without cooperation from the victim scheduler.<sup><a id="fnr.15" class="footref" href="#fn.15" role="doc-backlink">15</a></sup>
</p>


<p>
Now, as with any scheduling system, we need to implement some form of task stealing. If scheduler A is running something and has a big queue of work while scheduler B has nothing to do, it surely makes sense to allow scheduler B to pick up some of the slack. Erlang does this with single task stealing, which means that a scheduler steals a single task from another scheduler's runqueue after the victim scheduler has acknowledged it<sup><a id="fnr.16" class="footref" href="#fn.16" role="doc-backlink">16</a></sup><sup>, </sup><sup><a id="fnr.17" class="footref" href="#fn.17" role="doc-backlink">17</a></sup>.
</p>
</div>
</div>
<div id="outline-container-org9c210c7" class="outline-2">
<h2 id="org9c210c7"><span class="section-number-2">4.</span> The Problem</h2>
<div class="outline-text-2" id="text-4">
<p>
Phew! We've finally gotten to the actual issue!
</p>

<p>
At the start, I mentioned that we <b>bound</b> Erlang schedulers to specific CPUs, pinning specific schedulers to specific cores.
</p>

<p>
Remember that the Erlang scheduler thread has CPU affinity set, so it can <b>only</b> run on, say, CPU 3. But lavd didn't have per-CPU queues at the time. It dumps the thread into the shared LLC DSQ alongside everything else. So the Erlang scheduler thread only gets picked up when CPU 3 happens to pull from the front of the DSQ, which might not be for a while.
</p>

<p>
This also causes head-of-line blocking. When CPUs 0, 1, and 2 scan the DSQ for work, they find the Erlang scheduler thread sitting there, pinned to CPU 3 and useless to them. They have to iterate past it. Not catastrophic on its own, but it compounds.
</p>

<p>
In Erlang land, because Erlang schedulers cannot steal tasks without the acknowledgement of the victim scheduler, starving a particular Erlang scheduler means that its runqueue is effectively frozen. Even worse, this creates a second order effect, where:
</p>
<ol class="org-ol">
<li>Lavd would finally allow the BEAM scheduler to run</li>
<li>The BEAM scheduler runs for a very long time, exceeding the amount of time it's allocated, because it has so much work to do and hasn't been able to offload any of its work to other schedulers</li>
<li>Exceeding this virtual deadline means that lavd naturally pushes back the BEAM scheduler further back into the DSQ, due to the greediness penalty.</li>
<li>Because it takes so long for the BEAM scheduler to get a chance to run again, it builds up so much work that it exceeds the virtual deadline even further, worsening the situation!</li>
</ol>


<p>
Now this situation was less serious on AMD chips, because multiple CCXs meant multiple shallower DSQs, so the BEAM schedulers got to run more often. However, on machines with a single LLC, this meant that a fat DSQ could cause the BEAM schedulers to get shoved way into the back of the queue.
</p>

<p>
This was <a href="https://github.com/sched-ext/scx/commit/de00b29cdf9a7a8dc5d956eaa5475c44f653e350">fixed with per-CPU DSQs for Lavd</a>, which is conceptually simple. But the outage wasn't caused by any single bad decision. Erlang's CPU pinning is reasonable. Lavd's shared DSQ was a reasonable default. The greediness penalty is a fair scheduling mechanism. Each layer was doing something sensible in isolation. The problem is that runtime schedulers and kernel schedulers are mostly unaware of each other, and when their assumptions collide, you get feedback loops that neither system is equipped to break.
</p>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://github.com/sched-ext/scx">https://github.com/sched-ext/scx</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
As the GPU goblins start stealing my electricity from below, and the death of Moore's Law eats us from above, application developers like me have to retreat back to specialization: eeking out more performance out of what we have.
</p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://peps.python.org/pep-0744/">https://peps.python.org/pep-0744/</a>. Also check out Xu, Haoran, and Fredrik Kjolstad. “Copy-and-Patch Compilation: A Fast Compilation Algorithm for High-Level Languages and Bytecode.” Proceedings of the ACM on Programming Languages 5, no. OOPSLA (2021): 1–30. <a href="https://doi.org/10.1145/3485513">https://doi.org/10.1145/3485513</a>.
</p></div></div>

<div class="footdef"><sup><a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink">4</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Another unit of work for Erlang. A reduction is roughly a function call. Compare this with Golang, which gives every goroutine around ~10ms of runtime before swapping to another.
</p></div></div>

<div class="footdef"><sup><a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink">5</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
The Linux plumbers video gives a bit better explanation about how the Linux team @ FB tested lavd.
</p></div></div>

<div class="footdef"><sup><a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink">6</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://www.youtube.com/watch?v=ENCQZhpPiDU">https://www.youtube.com/watch?v=ENCQZhpPiDU</a>, <a href="https://www.youtube.com/watch?v=pHX-KgBCjwQ">https://www.youtube.com/watch?v=pHX-KgBCjwQ</a>, and <a href="https://www.youtube.com/watch?v=dxsbtjJRSm4&amp;sttick">https://www.youtube.com/watch?v=dxsbtjJRSm4&amp;sttick</a>= are excellent reviews.
</p></div></div>

<div class="footdef"><sup><a id="fn.7" class="footnum" href="#fnr.7" role="doc-backlink">7</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L123">https://github.com/torvalds/linux/blob/master/kernel/sched/core.c#L123</a>, <a href="https://github.com/torvalds/linux/blob/master/kernel/sched/sched.h#L1112-L1118">https://github.com/torvalds/linux/blob/master/kernel/sched/sched.h#L1112-L1118</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.8" class="footnum" href="#fnr.8" role="doc-backlink">8</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://github.com/torvalds/linux/blob/master/kernel/sched/sched.h#L674C1-L679C43">https://github.com/torvalds/linux/blob/master/kernel/sched/sched.h#L674C1-L679C43</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.9" class="footnum" href="#fnr.9" role="doc-backlink">9</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://github.com/sched-ext/scx/blob/ad30a290a1531987a434e034e2ab2307880a4a11/scheds/rust/scx_lavd/src/bpf/lat_cri.bpf.c#L289-L305">https://github.com/sched-ext/scx/blob/ad30a290a1531987a434e034e2ab2307880a4a11/scheds/rust/scx_lavd/src/bpf/lat_cri.bpf.c#L289-L305</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.10" class="footnum" href="#fnr.10" role="doc-backlink">10</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
From <a href="https://therecord.media/new-side-channel-attack-targets-the-cpu-ring-bus-for-the-first-time">https://therecord.media/new-side-channel-attack-targets-the-cpu-ring-bus-for-the-first-time</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.11" class="footnum" href="#fnr.11" role="doc-backlink">11</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
I know, kind of terrible naming.
</p></div></div>

<div class="footdef"><sup><a id="fn.12" class="footnum" href="#fnr.12" role="doc-backlink">12</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
There is also a concept of a "dirty" scheduler, meant for running io bound tasks. We will ignore these for now, but they are meant for longer running applications beyond the 4k reduction limit. See <a href="https://blog.stenmans.org/theBeamBook/#_implementing_a_simple_nif">https://blog.stenmans.org/theBeamBook/#_implementing_a_simple_nif</a>.
</p></div></div>

<div class="footdef"><sup><a id="fn.13" class="footnum" href="#fnr.13" role="doc-backlink">13</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
I was trying to find a good blog post that explained this more in detail, but honestly <a href="https://news.ycombinator.com/item?id=13503951">https://news.ycombinator.com/item?id=13503951</a> was the best point. There's a ton of annoying blog posts that call Erlang a preemptive scheduler when it's really a cooperative scheduler with yielding on the reduction counts
</p></div></div>

<div class="footdef"><sup><a id="fn.14" class="footnum" href="#fnr.14" role="doc-backlink">14</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
This is all implemented in <code>erts_schedule()</code> in <a href="https://github.com/erlang/otp/blob/master/erts/emulator/beam/erl_process.c#L9606"><code>erl_process.c</code>.</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.15" class="footnum" href="#fnr.15" role="doc-backlink">15</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
The BEAM also uses <code>sched_wall_time_change()</code> to determine scheduler transitions. Starved schedulers are still considered active, so the BEAM stops scheduling new work onto them and encourages other schedulers to steal from their queues.
</p></div></div>

<div class="footdef"><sup><a id="fn.16" class="footnum" href="#fnr.16" role="doc-backlink">16</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
<a href="https://www.erlang.org/docs/24/apps/erts/processmanagementoptimizations">https://www.erlang.org/docs/24/apps/erts/processmanagementoptimizations</a>
</p></div></div>

<div class="footdef"><sup><a id="fn.17" class="footnum" href="#fnr.17" role="doc-backlink">17</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
If you're coming from Rust, this might sound very familiar to the Tokio task stealing mechanism, where every OS thread acts as a worker. When the worker threads run out of work, they search the global queue, and if that's empty, <a href="https://docs.rs/tokio/latest/src/tokio/runtime/scheduler/multi_thread/worker.rs.html">they attempt to steal half the tasks from top of a peer's queue</a>. Erlang's task stealing mechanism is indeed very similar!
</p></div></div>


</div>
</div>
</div>
</div>]]></description>
      <pubDate>2026-02-15</pubDate>
      <guid>http://malloc.dog/blog/2026/02/09/what-is-a-scheduler-anyways/</guid>
    </item>
    <item>
      <title>Hot Reloading Code in Erlang: How Does It Work?</title>
      <link>http://malloc.dog/blog/2026/01/31/hot-reloading-code-in-erlang-how-does-it-work/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Hot Reloading Code in Erlang: How Does It Work?</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org90535c1">1. How does Erlang store code?</a></li>
<li><a href="#orgb27ee5e">2. Basic state migration</a></li>
<li><a href="#orge327a7a">3. Okay, now do it with TCP</a></li>
<li><a href="#org09cd51a">4. This sounds like a maintenance nightmare, why would you do this to yourself?</a></li>
</ul>
</div>
</div>

<div id="org54f4192" class="figure">
<p><img src="/assets/blog/2026/01/31/hot-reloading-code-in-erlang-how-does-it-work/header.jpg" alt="header.jpg" />
</p>
</div>
<blockquote>
<p>
Engine schematic for the Paraguay Railway. I took this back in December 2024. Hot reloading is a bit like swapping out the engine while the train is moving.
</p>
</blockquote>

<p>
A while back, I fixed a prod outage with hot reloading code in the BEAM VM, and earlier today I caught a random heisenbug using it<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. This post covers how Erlang hot reloading works, with demos on migrating state and hot reloading TCP servers without dropping connections.
</p>
<div id="outline-container-org90535c1" class="outline-2">
<h2 id="org90535c1"><span class="section-number-2">1.</span> How does Erlang store code?</h2>
<div class="outline-text-2" id="text-1">
<p>
One of the core primitives in Erlang is called <code>gen_server</code>. This is effectively a single "actor" if you're familiar with the actor framework. A single <code>gen_server</code> holds some stateful information in a variable called <code>State</code><sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>. A <code>gen_server</code> communicates with other actors through <code>messages</code>, and there's a concept of a mailbox, and performing RPC calls depending on the specifics of a <code>message</code>.
</p>

<p>
The Erlang Runtime System (ERTS) uses a <a href="https://www.erlang.org/doc/apps/kernel/code.html">code server</a>, basically a running process that keeps track of compiled code that's been loaded into the BEAM VM. The system is set up to keep <b>two</b> versions of code, a "current" version and an "old" version. What this means is that if you're an actor running the "old" version of the code, your local calls will still get routed to the "old" version, while newer fully qualified remote calls will get routed to the "current" version of the code.
</p>

<p>
This plays out like this:
<img src="/assets/blog/2026/01/31/hot-reloading-code-in-erlang-how-does-it-work/d1.png" alt="d1.png" />
</p>
</div>
</div>
<div id="outline-container-orgb27ee5e" class="outline-2">
<h2 id="orgb27ee5e"><span class="section-number-2">2.</span> Basic state migration</h2>
<div class="outline-text-2" id="text-2">
<p>
You'll often want to change the information stored in <code>State</code>, or the structure of it. For example, consider this code:
</p>

<div class="org-src-container">
<pre class="src src-erlang">-module(counter).
-behaviour(gen_server).
-vsn("1.0.0").
-export([start_link/0, get_count/0, increment/0]).
-export([init/1, handle_call/3, handle_cast/2, code_change/3, terminate/2, handle_info/2]).

%% -- API --
start_link() -&gt;
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

get_count() -&gt;
    gen_server:call(?MODULE, get_count).

increment() -&gt;
    gen_server:cast(?MODULE, increment).

%% -- Callbacks --
init([]) -&gt;
    {ok, 0}.

handle_cast(increment, Count) -&gt;
    {noreply, Count + 1}.

handle_call(get_count, _From, Count) -&gt;
    {reply, Count, Count}.

code_change(_OldVsn, State, _Extra) -&gt;
    {ok, State}.

handle_info(_Info, State) -&gt; {noreply, State}.
terminate(_Reason, _State) -&gt; ok.
</pre>
</div>

<p>
This <code>gen_server</code> stores an integer <code>Count</code> that increments when you call <code>counter:increment()</code>, and returns via <code>counter:get_count()</code>.
</p>

<p>
In the shell:
</p>
<div class="org-src-container">
<pre class="src src-erlang">peixian@Mac ~/c/erl-hot-reloading&gt; erl
Erlang/OTP 27 [erts-15.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

Eshell V15.2 (press Ctrl+G to abort, type help(). for help)
1&gt; file:copy("counter_v1.erl", "counter.erl"), c(counter).
{ok,counter}
2&gt; counter:start_link().
{ok,&lt;0.95.0&gt;}
3&gt; counter:get_count().
0
4&gt; counter:increment().
ok
5&gt; counter:get_count().
1
6&gt; counter:increment().
ok
7&gt; counter:increment().
ok
8&gt; counter:get_count().
3
</pre>
</div>

<p>
The <code>code_change</code> callback handles migration between versions. Right now <code>State</code> is a single integer. Not great if we want to track when it was last updated.
</p>

<p>
We can change our <code>counter</code> module to:
</p>
<div class="org-src-container">
<pre class="src src-erlang">-module(counter).
-behaviour(gen_server).
-vsn("2.0.0").
-export([start_link/0, get_count/0, increment/0, get_info/0]).
-export([init/1, handle_call/3, handle_cast/2, code_change/3, terminate/2, handle_info/2]).

%% State map
-record(state, {
                count = 0,
                increment_count = 0,
                last_updated
               }).

%% -- API --
start_link() -&gt;
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

get_count() -&gt;
    gen_server:call(?MODULE, get_count).

increment() -&gt;
    gen_server:cast(?MODULE, increment).

get_info() -&gt;
    sys:get_state(?MODULE).

%% -- Callbacks --

init([]) -&gt;
     {ok, #state{}}.

handle_cast(increment, State) -&gt;
    {noreply, State#state{count = State#state.count + 1,
                          increment_count = 1,
                          last_updated = erlang:timestamp()
                         }}.

handle_call(get_count, _From, State) -&gt;
    {reply, State#state.count, State}.

code_change("1.0.0", OldState, _Extra) when is_integer(OldState) -&gt;
    NewState = #state{
                  count = OldState,
                  increment_count = OldState,
                  last_updated = erlang:timestamp()},
    {ok, NewState};

code_change(_OldVsn, State, _Extra) -&gt;
    {ok, State}.

handle_info(_Info, State) -&gt; {noreply, State}.
terminate(_Reason, _State) -&gt; ok.
</pre>
</div>

<p>
We added <code>counter:get_info()</code> to return the state, and this migration clause:
</p>
<div class="org-src-container">
<pre class="src src-erlang">code_change("1.0.0", OldState, _Extra) when is_integer(OldState) -&gt;
    NewState = #state{
                  count = OldState,
                  increment_count = OldState,
                  last_updated = erlang:timestamp()},
    {ok, NewState};
</pre>
</div>

<p>
This chunk allows us to migrate old state, checking when the old state was specifically an integer. The <code>vsn</code> tag allows us to easily distinguish which version it's coming from.
</p>

<p>
In the shell:
</p>
<div class="org-src-container">
<pre class="src src-erlang">peixian@Mac ~/c/erl-hot-reloading&gt; erl
Erlang/OTP 27 [erts-15.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

Eshell V15.2 (press Ctrl+G to abort, type help(). for help)
1&gt; file:copy("counter_v1.erl", "counter.erl"), c(counter).
{ok,counter}
2&gt; counter:start_link().
{ok,&lt;0.95.0&gt;}
3&gt; counter:increment().
ok
4&gt; counter:increment().
ok
5&gt; counter:get_count().
2
6&gt; file:copy("counter_v2.erl", "counter.erl"), c(counter).
{ok,counter}
7&gt; counter:get_info().
2
8&gt; sys:suspend(counter).
ok
9&gt; sys:change_code(counter, counter, "1.0.0", []).
ok
10&gt; sys:resume(counter).
ok
11&gt; counter:get_info().
{state,2,2,{1769,908677,996152}}
12&gt;
</pre>
</div>


<p>
Commands 1-5: load v1, increment twice, count is 2. Command 6: load v2, which gives us <code>counter:get_info()</code>.
</p>

<p>
The key sequence is 8, 9, and 10: we suspend the process, reload the code (calling <code>code_change</code>), then resume. On 11, we see the state has changed from a single integer into the tuple record.
</p>

<p>
The sequence diagram then looks like this:
<img src="/assets/blog/2026/01/31/hot-reloading-code-in-erlang-how-does-it-work/d2.png" alt="d2.png" />
</p>
</div>
</div>
<div id="outline-container-orge327a7a" class="outline-2">
<h2 id="orge327a7a"><span class="section-number-2">3.</span> Okay, now do it with TCP</h2>
<div class="outline-text-2" id="text-3">
<p>
Hot reloading is useful because it's <b>fast</b> and <b>preserves</b> user state. Let's see how this works with TCP.
</p>

<p>
Here's a demo: V1 is an echo server, V2 upcases everything. We hot reload without dropping the <code>netcat</code> connection:
</p>

<script src="https://asciinema.org/a/vW2Z8fRQ3UPRJRcc.js" id="asciicast-vW2Z8fRQ3UPRJRcc" async="true"></script>

<p>
Erlang implements TCP with <code>gen_tcp</code>. You can <a href="https://www.erlang.org/doc/apps/kernel/gen_tcp.html">read more about the specifics</a>, but the short version is <code>gen_tcp</code> implements a listener that hands off the socket to another process.
</p>

<p>
V1:
</p>
<div class="org-src-container">
<pre class="src src-erlang">-module(tcp_demo).
-behaviour(gen_server).
-vsn("1.0.0").

-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, code_change/3, terminate/2]).

-record(state, {socket}).

%% -- API --

start_link() -&gt;
    spawn(fun() -&gt; start_listener() end).

start_listener() -&gt;
    {ok, Listen} = gen_tcp:listen(9000, [binary, {packet, 0}, {active, true}, {reuseaddr, true}]),
    io:format("Listening on 9000...~n"),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen),

    %% Start the gen_server (using start, not start_link, so it's independent)
    {ok, Pid} = gen_server:start({local, ?MODULE}, ?MODULE, Socket, []),

    ok = gen_tcp:controlling_process(Socket, Pid),

    io:format("Socket transferred to PID ~p. Listener dying.~n", [Pid]).

%% -- Callbacks --

init(Socket) -&gt;
    io:format("V1 (Echo) Started.~n"),
    {ok, #state{socket = Socket}}.

handle_info({tcp, Socket, Data}, State) -&gt;
    gen_tcp:send(Socket, Data), %% Echo back whatever the user sent
    {noreply, State};

handle_info({tcp_closed, _S}, State) -&gt;
    io:format("Client disconnected~n"),
    {stop, normal, State}.

handle_call(_Req, _From, State) -&gt; {reply, ok, State}.
handle_cast(_Msg, State) -&gt; {noreply, State}.
code_change(_OldVsn, State, _Extra) -&gt; {ok, State}.
terminate(_Reason, _State) -&gt; ok.
</pre>
</div>

<p>
Run this and <code>nc localhost 9000</code>. It echoes back whatever you type.
</p>

<p>
V2:
</p>

<div class="org-src-container">
<pre class="src src-erlang">
-module(tcp_demo).
-behaviour(gen_server).
-vsn("2.0.0").

-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, code_change/3, terminate/2]).

-record(state, {socket, buffer = &lt;&lt;&gt;&gt;}).


%% -- API --
start_link() -&gt;
    spawn(fun() -&gt; start_listener() end).

start_listener() -&gt;
    {ok, Listen} = gen_tcp:listen(9000, [binary, {packet, 0}, {active, true}, {reuseaddr, true}]),
    io:format("V2 Listener on 9000...~n"),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen),

    {ok, Pid} = gen_server:start({local, ?MODULE}, ?MODULE, Socket, []),
    ok = gen_tcp:controlling_process(Socket, Pid),
    io:format("Socket transferred to PID ~p. Listener dying.~n", [Pid]).

%% -- Callbacks --

init(Socket) -&gt;
    io:format("V2 (Shouting) Started.~n"),
    {ok, #state{socket = Socket, buffer = &lt;&lt;&gt;&gt;}}.

%% V2 Logic: Buffering &amp; Shouting
handle_info({tcp, Socket, Data}, State = #state{buffer = Buff}) -&gt;
    NewBuff = &lt;&lt;Buff/binary, Data/binary&gt;&gt;,
    {Lines, Rest} = split_lines(NewBuff, []),

    %% Process all complete lines found
    [gen_tcp:send(Socket, &lt;&lt;(string:uppercase(Line))/binary, "\n"&gt;&gt;) || Line &lt;- Lines],

    {noreply, State#state{buffer = Rest}};

handle_info({tcp_closed, _S}, State) -&gt;
    io:format("Client disconnected~n"),
    {stop, normal, State}.

%% -- Migration Logic --

%% Upgrade from V1 (Socket only) -&gt; V2 (Socket + Buffer)
code_change("1.0.0", {state, Socket}, _Extra) -&gt;
    io:format("Migrating State: V1 -&gt; V2 (Adding buffer)~n"),
    {ok, #state{socket = Socket, buffer = &lt;&lt;&gt;&gt;}};

code_change(_OldVsn, State, _Extra) -&gt; {ok, State}.

%% -- Helpers --

%% Recursively split binary into lines
split_lines(Bin, Acc) -&gt;
    case binary:split(Bin, &lt;&lt;"\n"&gt;&gt;) of
        [Line, Rest] -&gt; split_lines(Rest, [Line | Acc]);
        [Last]       -&gt; {lists:reverse(Acc), Last}
    end.

handle_call(_Req, _From, State) -&gt; {reply, ok, State}.
handle_cast(_Msg, State) -&gt; {noreply, State}.
terminate(_Reason, _State) -&gt; ok.
</pre>
</div>

<p>
The V2 code adds a <code>buffer</code> field to the state. Why buffer? TCP is a stream protocol, so it doesn't preserve message boundaries. A single <code>recv</code> might give you half a line, two lines, or one and a half lines. Without buffering, you'd uppercase partial words or chop messages in weird places. The buffer accumulates bytes until we hit a newline, then we process the complete line.
</p>

<p>
The <code>code_change</code> clause migrates the V1 state (socket only) to V2 (socket + empty buffer). Any partial data in flight gets handled correctly after the reload.
</p>
</div>
</div>
<div id="outline-container-org09cd51a" class="outline-2">
<h2 id="org09cd51a"><span class="section-number-2">4.</span> This sounds like a maintenance nightmare, why would you do this to yourself?</h2>
<div class="outline-text-2" id="text-4">
<p>
For most situations you probably don't want to be doing this. However, there's a few cases where it's been invaluable:
</p>
<ul class="org-ul">
<li>heisenbugs that are state dependent, that you're not sure if you're going to be able to reproduce if you do a reconnect/service restart. As much as we want our systems to be stateless, many of them aren't.</li>
<li>very quick remediations. I've seen this twice, but hot code reloading effectively means you can parallel ssh into <b>all</b> machines and hot reload and patch, avoiding the need for an hours long deploy across tens of thousands of machines.</li>
</ul>

<p>
You can find all the code for this on <a href="https://git.sr.ht/~peixian/erlang-hot-reloading/">https://git.sr.ht/~peixian/erlang-hot-reloading/</a> as well.
</p>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
And <a href="https://blog.stenmans.org/theBeamBook/#_code_loading">the BEAM book</a> is honestly not as detailed about hot code reloading as I would prefer.
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Erlang variables start with a Capital letter. Lowercase letters are string literals called <code>atoms</code>.
</p></div></div>


</div>
</div>
</div>
</div>]]></description>
      <pubDate>2026-02-09</pubDate>
      <guid>http://malloc.dog/blog/2026/01/31/hot-reloading-code-in-erlang-how-does-it-work/</guid>
    </item>
    <item>
      <title>Reading List</title>
      <link>http://malloc.dog/books/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Reading List</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org75a96cd">1. January 2026</a></li>
<li><a href="#orgb70a80b">2. November 2025</a></li>
<li><a href="#orgc5d7537">3. October 2025</a></li>
<li><a href="#orga8203c5">4. August 2025</a></li>
<li><a href="#org87c09a8">5. May 2025</a></li>
<li><a href="#orga7e6737">6. April 2025</a></li>
<li><a href="#org62c6033">7. January 2025</a></li>
<li><a href="#org92d6df7">8. December 2024</a></li>
<li><a href="#org1d72569">9. November 2024</a></li>
<li><a href="#org9c931b2">10. October 2024</a></li>
<li><a href="#org66705d5">11. September 2024</a></li>
<li><a href="#org6a566c9">12. August 2024</a></li>
<li><a href="#org7c21593">13. June 2024</a></li>
<li><a href="#orgf7c7ca3">14. May 2024</a></li>
<li><a href="#org3b1f972">15. April 2024</a></li>
<li><a href="#org3bb625c">16. March 2024</a></li>
<li><a href="#orga7855a6">17. Feburary 2024</a></li>
<li><a href="#orge885088">18. January 2024</a></li>
<li><a href="#org60e6a97">19. December 2023</a></li>
<li><a href="#org3f4d0cb">20. November 2023</a></li>
<li><a href="#orgad7f300">21. October 2023</a></li>
<li><a href="#org87afcdc">22. September 2023</a></li>
<li><a href="#org0556c34">23. August 2023</a></li>
<li><a href="#orgb33973f">24. July 2023</a></li>
<li><a href="#orge1c0cff">25. June 2023</a></li>
<li><a href="#orgdb86ffe">26. April 2023</a></li>
<li><a href="#org4ff7823">27. March 2023</a></li>
<li><a href="#org313dffd">28. Feburary 2023</a></li>
<li><a href="#org0c2aeea">29. January 2023</a></li>
<li><a href="#orgecf6498">30. November 2022</a></li>
<li><a href="#orgf697130">31. October 2022</a></li>
<li><a href="#orgaf64498">32. September 2022</a></li>
<li><a href="#orgad40b2a">33. August 2022</a></li>
<li><a href="#orge158d1f">34. July 2022</a></li>
<li><a href="#org8e5a54c">35. June 2022</a></li>
<li><a href="#org5b4d7af">36. May 2022</a></li>
<li><a href="#orgf5687bf">37. Feburary 2022</a></li>
<li><a href="#org366fd90">38. January 2022</a></li>
<li><a href="#org46c3809">39. December 2021</a></li>
<li><a href="#org5d6bfb8">40. November 2021</a></li>
<li><a href="#orgcce7230">41. October 2021</a></li>
<li><a href="#orgfcd1736">42. September 2021</a></li>
<li><a href="#orgfabb6fd">43. August 2021</a></li>
<li><a href="#org32b9283">44. July 2021</a></li>
<li><a href="#org12b80d9">45. May 2021</a></li>
<li><a href="#org1e85250">46. March 2021</a></li>
<li><a href="#org227ab97">47. January 2021</a></li>
<li><a href="#org0d15a56">48. December 2020</a></li>
<li><a href="#orgebd6dcb">49. October 2020</a></li>
<li><a href="#org9b0a477">50. August 2020</a></li>
<li><a href="#orgb5a47e2">51. July 2020</a></li>
<li><a href="#org33524fe">52. June 2020</a></li>
<li><a href="#org932aafa">53. May 2020</a></li>
<li><a href="#org19e218f">54. April 2020</a></li>
<li><a href="#org1388e86">55. March 2020</a></li>
<li><a href="#org743f7c0">56. February 2020</a></li>
<li><a href="#org3a2d1c0">57. January 2020</a></li>
<li><a href="#orgc59c2c4">58. November 2019</a></li>
<li><a href="#org322d873">59. September 2019</a></li>
<li><a href="#org937e2d1">60. August 2019</a></li>
<li><a href="#org71d5e5a">61. July 2019</a></li>
<li><a href="#org643af71">62. June 2019</a></li>
<li><a href="#org1deceff">63. May 2019</a></li>
<li><a href="#orgd9e30f7">64. April 2019</a></li>
<li><a href="#orgcb7e013">65. March 2019</a></li>
<li><a href="#orgcb419f8">66. February 2019</a></li>
<li><a href="#org3f69fa6">67. January 2019</a></li>
<li><a href="#org3d5fde2">68. December 2018</a></li>
<li><a href="#org01c8a42">69. November 2018</a></li>
<li><a href="#orgdeaa9b6">70. September 2018</a></li>
<li><a href="#org2ba4da4">71. August 2018</a></li>
<li><a href="#orgda6e52f">72. July 2018</a></li>
<li><a href="#orgca05401">73. June 2018</a></li>
<li><a href="#orgaf50cba">74. May 2018</a></li>
<li><a href="#orgb574c26">75. April 2018</a></li>
<li><a href="#org1851c6e">76. March 2018</a></li>
<li><a href="#orgd6d89cc">77. February 2018</a></li>
<li><a href="#org7331141">78. January 2018</a></li>
<li><a href="#org569642a">79. 2017</a></li>
<li><a href="#orgf14e63b">80. 2016</a></li>
</ul>
</div>
</div>
<p>
Books I've read:
</p>
<div id="outline-container-org75a96cd" class="outline-2">
<h2 id="org75a96cd"><span class="section-number-2">1.</span> January 2026</h2>
<div class="outline-text-2" id="text-1">
<ul class="org-ul">
<li><i>Pieces of the Action</i>, by Vannevar Bush (1970)</li>
<li><i>Gathering Moss: A Natural and Cultural History of Mosses</i>, by Robin Wall Kimmerer (2003)</li>
<li><i>Instantiation</i>, by Greg Egan (2020)</li>
<li><i>The Posthumous Memoirs of Brás Cubas</i>, by Macahdo de Assis (1881)</li>
</ul>
</div>
</div>
<div id="outline-container-orgb70a80b" class="outline-2">
<h2 id="orgb70a80b"><span class="section-number-2">2.</span> November 2025</h2>
<div class="outline-text-2" id="text-2">
<ul class="org-ul">
<li><i>Planet of Slums</i>, by Mike Davis (2006) <code>LOVED</code></li>
</ul>
</div>
</div>
<div id="outline-container-orgc5d7537" class="outline-2">
<h2 id="orgc5d7537"><span class="section-number-2">3.</span> October 2025</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li><i>Breakneck: China's Quest to Engineer the Future</i>, by Dan Wang (2025)</li>
<li><i>Sarajevo Firewood</i> by Said Khatibi (2021)</li>
<li><i>Salvador</i>, by Joan Didion (1983)</li>
</ul>
</div>
</div>
<div id="outline-container-orga8203c5" class="outline-2">
<h2 id="orga8203c5"><span class="section-number-2">4.</span> August 2025</h2>
<div class="outline-text-2" id="text-4">
<ul class="org-ul">
<li><i>People from Oetimu</i>, by Felix K. Nesi (2019) <code>LOVED</code></li>
<li><i>Perfection</i>, by Vincezo Latronico (2022)</li>
<li><i>Shadow of the Sun</i>, by Taleb Alrefai (2012)</li>
<li><i>The Living and the Rest</i>, by José Eduardo Agualusa (2020)</li>
<li><i>Operating Systems: Three Easy Pieces</i>, by Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau (2012)</li>
<li><i>Secular Translations: Nation-State, Modern Self, and Calculative Reason</i>, by Talal Asad (2018) <code>LOVED</code></li>
<li><i>Salvage: a Personal Odyssey</i>, by Ian Tew (2007)</li>
</ul>
</div>
</div>
<div id="outline-container-org87c09a8" class="outline-2">
<h2 id="org87c09a8"><span class="section-number-2">5.</span> May 2025</h2>
<div class="outline-text-2" id="text-5">
<ul class="org-ul">
<li><i>Wall Street Noir</i>, edited by Stephen Rhodes (2007)</li>
<li><i>Delhi Noir</i>, edited by Hirsh Sawhney (2009)</li>
<li><i>Talking to Ourselves</i>, by Andrés Neuman (2012)</li>
<li><i>A General Theory of Oblivion</i>, by José Eduardo Agualusa (2012)</li>
<li><i>Hong Kong Noir</i>, edited by Jason Y Ng (2018)</li>
<li><i>Song for the Unraveling of the World: Stories</i>, by Brian Evenson (2019)</li>
</ul>
</div>
</div>
<div id="outline-container-orga7e6737" class="outline-2">
<h2 id="orga7e6737"><span class="section-number-2">6.</span> April 2025</h2>
<div class="outline-text-2" id="text-6">
<ul class="org-ul">
<li><i>São Paulo Noir</i>, edited by Tony Bellotto (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-org62c6033" class="outline-2">
<h2 id="org62c6033"><span class="section-number-2">7.</span> January 2025</h2>
<div class="outline-text-2" id="text-7">
<ul class="org-ul">
<li><i>Glorious Exploits</i>, by Ferdia Lennon (2024) <code>LOVED</code></li>
</ul>
</div>
</div>
<div id="outline-container-org92d6df7" class="outline-2">
<h2 id="org92d6df7"><span class="section-number-2">8.</span> December 2024</h2>
<div class="outline-text-2" id="text-8">
<ul class="org-ul">
<li><i>High Static, Dead Lines: Sonic Spectres &amp; the Object Hereafter</i>, by Kristen Gallerneaux (2018)</li>
<li><i>Focus: The ASML way - Inside the power struggle over the most complex machine on earth</i>, by Martin Hijink (2024)</li>
</ul>
</div>
</div>
<div id="outline-container-org1d72569" class="outline-2">
<h2 id="org1d72569"><span class="section-number-2">9.</span> November 2024</h2>
<div class="outline-text-2" id="text-9">
<ul class="org-ul">
<li><i>At the Tomb of the Inflatable Pig: Travels Through Paraguay</i>, by John Gimlette (2003)</li>
<li><i>Turn the Ship Around!: A True Story of Turning Followers into Leaders</i>, by L. David Marquet (2013)</li>
<li><i>Mona</i>, by Pola Oloixarac (2019)</li>
<li><i>Death is Hard Work</i>, by Khaled Khalifa (2016) <code>LOVED</code></li>
<li><i>Last Days</i>, by Brian Evenson (2009)</li>
<li><i>The Glassy, Burning Floor of Hell</i>, by Brian Evenson (2021)</li>
<li><i>Marrakech Noir</i>, edited by Adnan Yassin (2018)</li>
<li><i>The City and Its Uncertain Walls</i>, by Haruki Murakami (2023)</li>
</ul>
</div>
</div>
<div id="outline-container-org9c931b2" class="outline-2">
<h2 id="org9c931b2"><span class="section-number-2">10.</span> October 2024</h2>
<div class="outline-text-2" id="text-10">
<ul class="org-ul">
<li><i>The Data Center as a Computer: An Introduction to the Design of Warehouse-Scale Machines</i>, by Luiz Andre Barroso (2009) <code>LOVED</code></li>
</ul>
</div>
</div>
<div id="outline-container-org66705d5" class="outline-2">
<h2 id="org66705d5"><span class="section-number-2">11.</span> September 2024</h2>
<div class="outline-text-2" id="text-11">
<ul class="org-ul">
<li><i>Mountains vs Desire: Climbing vs the End of the World</i>, by Margret Grebowicz (2021)</li>
<li><i>Montreal Noir</i>, edited by Jacques Filippi (2017)</li>
<li><i>Smoke and Ashes: Opium's Hidden Stories</i>, by Amitav Ghosh (2024)</li>
<li><i>Unsong</i>, by Scott Alexander (2017)</li>
</ul>
</div>
</div>
<div id="outline-container-org6a566c9" class="outline-2">
<h2 id="org6a566c9"><span class="section-number-2">12.</span> August 2024</h2>
<div class="outline-text-2" id="text-12">
<ul class="org-ul">
<li><i>Drug Cartels Do Not Exist: Narcotrafficking in US and Mexican Culture</i>, by Oswaldo Zavala <code>LOVED</code> (2022)</li>
<li><i>Moonbound</i>, by Robin Sloan (2024)</li>
</ul>
</div>
</div>
<div id="outline-container-org7c21593" class="outline-2">
<h2 id="org7c21593"><span class="section-number-2">13.</span> June 2024</h2>
<div class="outline-text-2" id="text-13">
<ul class="org-ul">
<li><i>Rio Noir</i>, edited by Luiz Alfredo Garcia-Roza (2014)</li>
<li><i>The Book of All Skies</i>, by Greg Egan (2021)</li>
<li><i>Distress</i>, by Greg Egan (2013)</li>
</ul>
</div>
</div>
<div id="outline-container-orgf7c7ca3" class="outline-2">
<h2 id="orgf7c7ca3"><span class="section-number-2">14.</span> May 2024</h2>
<div class="outline-text-2" id="text-14">
<ul class="org-ul">
<li><i>The Mountain in the Sea</i>, by Ray Nayler (2022)</li>
<li><i>Wounded Tigris: A River Journey Through the Cradle of Civilization</i>, by Leon McCarron (2023)</li>
</ul>
</div>
</div>
<div id="outline-container-org3b1f972" class="outline-2">
<h2 id="org3b1f972"><span class="section-number-2">15.</span> April 2024</h2>
<div class="outline-text-2" id="text-15">
<ul class="org-ul">
<li><i>Morphotropic</i>, by Greg Egan (2024)</li>
<li><i>Beirut Noir</i>, edited by Rawi Hage (2015)</li>
</ul>
</div>
</div>
<div id="outline-container-org3bb625c" class="outline-2">
<h2 id="org3bb625c"><span class="section-number-2">16.</span> March 2024</h2>
<div class="outline-text-2" id="text-16">
<ul class="org-ul">
<li><i>The Epiphany of Gliese 581</i>, by Fernando Borretti (2022) <code>LOVED</code></li>
</ul>
</div>
</div>
<div id="outline-container-orga7855a6" class="outline-2">
<h2 id="orga7855a6"><span class="section-number-2">17.</span> Feburary 2024</h2>
<div class="outline-text-2" id="text-17">
<ul class="org-ul">
<li><i>Can the Monster Speak? A Report to an Academy of Psychoanalysts</i>, by Paul B. Preciado (2020)</li>
<li><i>Kill It with Fire: Manage Aging Computer Systems</i>, by Marianne Bellotti (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-orge885088" class="outline-2">
<h2 id="orge885088"><span class="section-number-2">18.</span> January 2024</h2>
<div class="outline-text-2" id="text-18">
<ul class="org-ul">
<li><i>Languages: A Very Short Introduction</i>, by Stephen R. Anderson (2012)</li>
<li><i>The Adventure</i>, by Georgio Agamben (2018)</li>
<li><i>Cruel Optimism</i>, by Lauren Berlant (2011) <code>LOVED</code></li>
<li><i>Preliminary Materials for a Theory of the Young-Girl</i>, by Tiqqun (1999) <code>LOVED</code></li>
<li><i>Busy Doing Nothing</i>, by Rekka Bellum and Devine Lu Linvega (2021)</li>
<li><i>Four Thousand Weeks: Time Management for Mortals</i>, by Oliver Burkeman (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-org60e6a97" class="outline-2">
<h2 id="org60e6a97"><span class="section-number-2">19.</span> December 2023</h2>
<div class="outline-text-2" id="text-19">
<ul class="org-ul">
<li><i>The Purple Land</i>, by William Henry Hudson (1885)</li>
<li><i>Ra</i>, by qntm (2014) <code>LOVED</code></li>
<li><i>Havana Noir</i>, edited by Leonardo Padura Fuentes (2007)</li>
<li><i>Wiktopher</i>, by Rekka Bellum (2023)</li>
<li><i>Philosophy for Passengers</i>, by Michael Marder (2022)</li>
</ul>
</div>
</div>
<div id="outline-container-org3f4d0cb" class="outline-2">
<h2 id="org3f4d0cb"><span class="section-number-2">20.</span> November 2023</h2>
<div class="outline-text-2" id="text-20">
<ul class="org-ul">
<li><i>Singapore Noir</i>, edited by Lu-Lien Cheryl Tan (2014)</li>
<li><i>Tehran Noir</i>, edited by Salar Abdoh (2014)</li>
<li><i>Buenos Aires Noir</i>, edited by Ernesto Mallo (2014)</li>
</ul>
</div>
</div>
<div id="outline-container-orgad7f300" class="outline-2">
<h2 id="orgad7f300"><span class="section-number-2">21.</span> October 2023</h2>
<div class="outline-text-2" id="text-21">
<ul class="org-ul">
<li><i>Norweigan Wood</i>, by Haruki Murakami (1987)</li>
</ul>
</div>
</div>
<div id="outline-container-org87afcdc" class="outline-2">
<h2 id="org87afcdc"><span class="section-number-2">22.</span> September 2023</h2>
<div class="outline-text-2" id="text-22">
<ul class="org-ul">
<li><i>Logic Beach: Part I</i>, by Exurb1a (2017)</li>
<li><i>Stuff Goes Bad: Erlang in Anger</i>, by Fred Hebert (2014)</li>
<li><i>There Is No Antimemetics Division</i>, by qntm (2020)</li>
<li><i>The Bridge to Lucy Dunne</i>, by Exurb1a (2016)</li>
<li><i>Permutation City</i>, by Greg Egan (1994)</li>
<li><i>Ed</i>, by qntm (2013)</li>
<li><i>Sleep and the Soul</i>, by Greg Egan (2023)</li>
<li><i>The Utopia of Rules: On Technology, Stupidity, and the Secret Joys of Bureaucracy</i>, by David Graeber (2013)</li>
</ul>
</div>
</div>
<div id="outline-container-org0556c34" class="outline-2">
<h2 id="org0556c34"><span class="section-number-2">23.</span> August 2023</h2>
<div class="outline-text-2" id="text-23">
<ul class="org-ul">
<li><i>Unwanted Witnesses: Journalists and Conflict in Latin America</i>, by Gabriela Polit Duenas (2019)</li>
<li><i>Diaspora</i>, by Greg Egan (1997)</li>
</ul>
</div>
</div>
<div id="outline-container-orgb33973f" class="outline-2">
<h2 id="orgb33973f"><span class="section-number-2">24.</span> July 2023</h2>
<div class="outline-text-2" id="text-24">
<ul class="org-ul">
<li><i>A Thousand Trails Home</i>, by Seth Kantner (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-orge1c0cff" class="outline-2">
<h2 id="orge1c0cff"><span class="section-number-2">25.</span> June 2023</h2>
<div class="outline-text-2" id="text-25">
<ul class="org-ul">
<li><i>The Prince of Milk</i>, by Exurb1a (2017)</li>
</ul>
</div>
</div>
<div id="outline-container-orgdb86ffe" class="outline-2">
<h2 id="orgdb86ffe"><span class="section-number-2">26.</span> April 2023</h2>
<div class="outline-text-2" id="text-26">
<ul class="org-ul">
<li><i>An Anthropology of Nothing in Particular</i>, by Martin Demant Frederiksen (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-org4ff7823" class="outline-2">
<h2 id="org4ff7823"><span class="section-number-2">27.</span> March 2023</h2>
<div class="outline-text-2" id="text-27">
<ul class="org-ul">
<li><i>Discourse on Colonialism</i>, by Aimé Césaire (1955)</li>
<li><i>Hollow Kingdom</i>, by Jane Kira Buxton (2019)</li>
</ul>
</div>
</div>
<div id="outline-container-org313dffd" class="outline-2">
<h2 id="org313dffd"><span class="section-number-2">28.</span> Feburary 2023</h2>
<div class="outline-text-2" id="text-28">
<ul class="org-ul">
<li><i>Valuable Humans in Transit and Other Stories</i>, by qntm (2022)</li>
<li><i>Venomous Lumpsucker</i>, by Ned Beauman (2022)</li>
<li><i>On Suicide Bombing</i>, by Talal Asad (2007)</li>
</ul>
</div>
</div>
<div id="outline-container-org0c2aeea" class="outline-2">
<h2 id="org0c2aeea"><span class="section-number-2">29.</span> January 2023</h2>
<div class="outline-text-2" id="text-29">
<ul class="org-ul">
<li><i>Dark Constellations</i>, Pola Oloxiarac (2019)</li>
<li><i>Poems for the Lost Because I'm Lost Too</i>, by Exurb1a (2022)</li>
</ul>
</div>
</div>
<div id="outline-container-orgecf6498" class="outline-2">
<h2 id="orgecf6498"><span class="section-number-2">30.</span> November 2022</h2>
<div class="outline-text-2" id="text-30">
<ul class="org-ul">
<li><i>Invitation to a Beheading</i>, by Vladimir Nabokov (2011)</li>
<li><i>Chasing Homer</i>, by László Krasznahorkai (2021)</li>
<li><i>Total Shambles</i>, by F. George (2015)</li>
</ul>
</div>
</div>
<div id="outline-container-orgf697130" class="outline-2">
<h2 id="orgf697130"><span class="section-number-2">31.</span> October 2022</h2>
<div class="outline-text-2" id="text-31">
<ul class="org-ul">
<li><i>Intoxicology: A Cultural History of Drink and Drugs</i>, by Walton Stuart (2016)</li>
<li><i>Automatic Religion: Nearhuman Agents of Brazil and France</i>, by Paul Christopher Johnson (2020)</li>
</ul>
</div>
</div>
<div id="outline-container-orgaf64498" class="outline-2">
<h2 id="orgaf64498"><span class="section-number-2">32.</span> September 2022</h2>
<div class="outline-text-2" id="text-32">
<ul class="org-ul">
<li><i>The Fifth Science</i>, by Exurb1a (2018)</li>
<li><i>Pilgrims Until We Die: Unending Pilgrimage in Shikoku</i>, by Ian Reader (2021)</li>
<li><i>Raccoon</i>, by Daniel Heath Justice (2021)</li>
<li><i>Awake</i>, by Harald Voetmann (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-orgad40b2a" class="outline-2">
<h2 id="orgad40b2a"><span class="section-number-2">33.</span> August 2022</h2>
<div class="outline-text-2" id="text-33">
<ul class="org-ul">
<li><i>Dirtbag, Massachusetts: A Confessional</i>, by Isaac Fitzgerald (2022)</li>
<li><i>My War Gone By, I Miss It So</i>, by Anthony Loyd (1999)</li>
<li><i>The Kind Worth Killing</i>, by Peter Swanson (2015)</li>
<li><i>Washington Bullets</i>, by Vijay Prashad (2020)</li>
<li><i>Another Bloody Love Letter</i>, by Anthony Loyd (2007)</li>
</ul>
</div>
</div>
<div id="outline-container-orge158d1f" class="outline-2">
<h2 id="orge158d1f"><span class="section-number-2">34.</span> July 2022</h2>
<div class="outline-text-2" id="text-34">
<ul class="org-ul">
<li><i>Meaty</i>, by Samantha Irby (2013)</li>
<li><i>Experimenting with Ethnography: A Companion to Analysis</i>, by Andrea Ballestero (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-org8e5a54c" class="outline-2">
<h2 id="org8e5a54c"><span class="section-number-2">35.</span> June 2022</h2>
<div class="outline-text-2" id="text-35">
<ul class="org-ul">
<li><i>The Elephant Vanishes</i>, by Haruki Murakami (1993)</li>
<li><i>Redemptive Suffering in Islam: A Study of the Devotional Aspects of Ashura in Twelver Shi'ism</i>, by Mahmoud M. Ayoub (1978)</li>
<li><i>How Did You Get This Number: Essays</i>, by Sloan Crosley (2010)</li>
<li><i>Unbury Our Dead With Song</i>, by Mukoma wa Ngugi (2021)</li>
<li><i>Modularity - The Engines of Cognition</i>, by the LessWrong community (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-org5b4d7af" class="outline-2">
<h2 id="org5b4d7af"><span class="section-number-2">36.</span> May 2022</h2>
<div class="outline-text-2" id="text-36">
<ul class="org-ul">
<li><i>What Is Religious Authority?: Cultivating Islamic Communities in Indonesia</i>, by Ismail Fajrie Alatas (2021)</li>
<li><i>Trust - The Engines of Cognition</i>, by the LessWrong community (2021)</li>
<li><i>The Courage to Act: A Memoir of a Crisis and Its Aftermath</i>, by Ben S. Bernanke (2015)</li>
<li><i>Fine Structure</i>, by qntm (2010)</li>
<li><i>Carte Blanche: The Erosion of Medical Consent</i>, by Harriet A. Washington (2021)</li>
<li><i>After Dark</i>, by Haruki Murakami (2007)</li>
</ul>
</div>
</div>
<div id="outline-container-orgf5687bf" class="outline-2">
<h2 id="orgf5687bf"><span class="section-number-2">37.</span> Feburary 2022</h2>
<div class="outline-text-2" id="text-37">
<ul class="org-ul">
<li><i>The Graves of Tarim: Genealogy and Mobility across the Indian Ocean</i>, by Enseng Ho (2006)</li>
<li><i>Baghdad Noir</i>, by Samuel Shimon (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-org366fd90" class="outline-2">
<h2 id="org366fd90"><span class="section-number-2">38.</span> January 2022</h2>
<div class="outline-text-2" id="text-38">
<ul class="org-ul">
<li><i>The Man Who Solved the Market: How Jim Simons Launched the Quant Revolution</i>, by Gregory Zuckerman (2019)</li>
</ul>
</div>
</div>
<div id="outline-container-org46c3809" class="outline-2">
<h2 id="org46c3809"><span class="section-number-2">39.</span> December 2021</h2>
<div class="outline-text-2" id="text-39">
<ul class="org-ul">
<li><i>An Elegant Puzzle: Systems of Engineering Management</i>, by Will Larson (2019)</li>
<li><i>Staff Engineer: Leadership Beyond the Management Track</i>, by Will Larson (2021)</li>
<li><i>Secular Translations: Nation-State, Modern Self, and Calculative Reason</i>, by Talal Asad (2018)</li>
<li><i>The Impossibility of Religious Freedom</i>, by Winnifred Fallers Sullivan (2007)</li>
<li><i>Sex and Secularism</i>, by Joan Wallach Scott (2017)</li>
</ul>
</div>
</div>
<div id="outline-container-org5d6bfb8" class="outline-2">
<h2 id="org5d6bfb8"><span class="section-number-2">40.</span> November 2021</h2>
<div class="outline-text-2" id="text-40">
<ul class="org-ul">
<li><i>Modern Things on Trial: Islam's Global and Material Reformation in the Age of Rida, 1865-1935</i>, by Leor Halevi (2019)</li>
</ul>
</div>
</div>
<div id="outline-container-orgcce7230" class="outline-2">
<h2 id="orgcce7230"><span class="section-number-2">41.</span> October 2021</h2>
<div class="outline-text-2" id="text-41">
<ul class="org-ul">
<li><i>The Enlightenment Bible: Translation, Scholarship, Culture</i>, by Jonathan Sheehan (2005)</li>
<li><i>Locations of Buddhism: Colonialism and Modernity in Sri Lanka</i>, by Anne M. Blackburn (2010)</li>
</ul>
</div>
</div>
<div id="outline-container-orgfcd1736" class="outline-2">
<h2 id="orgfcd1736"><span class="section-number-2">42.</span> September 2021</h2>
<div class="outline-text-2" id="text-42">
<ul class="org-ul">
<li><i>Geometry for Ocelots</i>, by Exurb1a (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-orgfabb6fd" class="outline-2">
<h2 id="orgfabb6fd"><span class="section-number-2">43.</span> August 2021</h2>
<div class="outline-text-2" id="text-43">
<ul class="org-ul">
<li><i>The Kowloon English Club</i>, by Stephen Griffiths (2019)</li>
<li><i>I, Who Did Not Die</i>, by Zahed Haftlang and Najah Aboud (2017)</li>
<li><i>The Spymaster of Baghdad</i>, by Margaret Coker (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-org32b9283" class="outline-2">
<h2 id="org32b9283"><span class="section-number-2">44.</span> July 2021</h2>
<div class="outline-text-2" id="text-44">
<ul class="org-ul">
<li><i>The Structure of Scientific Revolutions</i>, by Thomas S. Kuhn (1962)</li>
<li><i>This City is a Minefield</i>, by Aaron Chan (2019)</li>
<li><i>Good Times in Dystopia</i>, by George F. (2020)</li>
<li><i>First Person Singular: Stories</i>, by Haruki Murakami (2021)</li>
</ul>
</div>
</div>
<div id="outline-container-org12b80d9" class="outline-2">
<h2 id="org12b80d9"><span class="section-number-2">45.</span> May 2021</h2>
<div class="outline-text-2" id="text-45">
<ul class="org-ul">
<li><i>Understanding 'sectarianism': Sunni-Shi'a Relations in the Modern Arab World</i>, by Fanar Haddad (2020)</li>
</ul>
</div>
</div>
<div id="outline-container-org1e85250" class="outline-2">
<h2 id="org1e85250"><span class="section-number-2">46.</span> March 2021</h2>
<div class="outline-text-2" id="text-46">
<ul class="org-ul">
<li><i>Beyond Debt: Islamic Experiments in Global Finance</i>, by Daromir Rudnyckyj (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-org227ab97" class="outline-2">
<h2 id="org227ab97"><span class="section-number-2">47.</span> January 2021</h2>
<div class="outline-text-2" id="text-47">
<ul class="org-ul">
<li><i>Out of Mesopotamia</i>, by Salar Abdoh (2020)</li>
<li><i>The Bus Driver Who Wanted to be God &amp; Other Stories</i>, by Etgar Keret (2001)</li>
<li><i>Scientific Freedom: The Exilir of Civilization</i>, by Donald W. Braben (2008)</li>
<li><i>Finite and Infinite Games: A Vision of Life as Play and Possibility</i>, by James P. Carse (1987)</li>
</ul>
</div>
</div>
<div id="outline-container-org0d15a56" class="outline-2">
<h2 id="org0d15a56"><span class="section-number-2">48.</span> December 2020</h2>
<div class="outline-text-2" id="text-48">
<ul class="org-ul">
<li><i>History Has Begun</i>, by Bruno Macaes (2020)</li>
<li><i>War from the Ground Up: Twenty-First Century Combat as Politics</i>, by Emile Simpson (2012)</li>
<li><i>Arabian Satire: Poetry from the 18th Century Najd</i>, by Ḥmēdān al-Shwēʿir , Jane Tylus (Foreword), Marcel Kurpershoek (Translator) (2020)</li>
<li><i>Savage Theories</i>, by Pola Oloixarac (2008)</li>
</ul>
</div>
</div>
<div id="outline-container-orgebd6dcb" class="outline-2">
<h2 id="orgebd6dcb"><span class="section-number-2">49.</span> October 2020</h2>
<div class="outline-text-2" id="text-49">
<ul class="org-ul">
<li><i>Contending Visions of the Middle East: The History and Politics of Orientialism</i>, by Zachary Lockman (2004)</li>
<li><i>The Dip: A Little Book That Teaches You When to Quit</i>, by Seth Godin (2007)</li>
</ul>
</div>
</div>
<div id="outline-container-org9b0a477" class="outline-2">
<h2 id="org9b0a477"><span class="section-number-2">50.</span> August 2020</h2>
<div class="outline-text-2" id="text-50">
<ul class="org-ul">
<li><i>Ghostwritten</i>, by David Mitchell (1999)</li>
</ul>
</div>
</div>
<div id="outline-container-orgb5a47e2" class="outline-2">
<h2 id="orgb5a47e2"><span class="section-number-2">51.</span> July 2020</h2>
<div class="outline-text-2" id="text-51">
<ul class="org-ul">
<li><i>Baghdad: City of Peace, City of Blood &#x2013; A History in Thirteen Centuries</i>, by Justin Marozzi (2014)</li>
<li><i>Dance Dance Dance</i>, by Haruki Murakami (1988)</li>
<li><i>A Wild Sheep Chase (The Rat, #3)</i>, by Haruki Murakami (1982)</li>
</ul>
</div>
</div>
<div id="outline-container-org33524fe" class="outline-2">
<h2 id="org33524fe"><span class="section-number-2">52.</span> June 2020</h2>
<div class="outline-text-2" id="text-52">
<ul class="org-ul">
<li><i>Religion and Nationalism in Global Perspective</i>, by J. Christopher Soper and Joel S. Fetzer (2018)</li>
<li><i>The Last Wolf / Herman</i>, by László Krasznahorkai (2016)</li>
<li><i>New Dark Age: Technology and the End of the Future</i>, by James Bridle (2018)</li>
<li><i>Peace Operations Seen From Below: UN Missions and Local People</i>, by Beatrice Pouligny (2006)</li>
<li><i>A Concise History of Sunnis and Shi'is</i>, by John McHugo (2017)</li>
<li><i>State of Repression: Iraq Under Saddam Hussein</i>, by Lisa Blaydes (2018)</li>
<li><i>Goat Days</i>, by Benyamin (2008)</li>
</ul>
</div>
</div>
<div id="outline-container-org932aafa" class="outline-2">
<h2 id="org932aafa"><span class="section-number-2">53.</span> May 2020</h2>
<div class="outline-text-2" id="text-53">
<ul class="org-ul">
<li><i>Ultralearning: Master Hard Skills, Outsmart the Competition, and Accelerate Your Career</i>, by Scott Young (2019)</li>
<li><i>Streetwise: How Taxi Drivers Establish Customer's Trustworthiness</i>, by Diego Gambetta and Heather Hamill (2005)</li>
<li><i>Look Alive Out There</i>, by Sloane Crosley (2018)</li>
<li><i>Chaos, a Fable</i>, by Rodrigo Rey Rosa (2019)</li>
<li><i>Iraq After America: Strongmen, Sectarians, Resistance</i>, by Joel Rayburn (2014)</li>
</ul>
</div>
</div>
<div id="outline-container-org19e218f" class="outline-2">
<h2 id="org19e218f"><span class="section-number-2">54.</span> April 2020</h2>
<div class="outline-text-2" id="text-54">
<ul class="org-ul">
<li><i>A PhD Is Not Enough: A Guide To Survival In Science</i>, by Peter J. Feibelman (1993)</li>
<li><i>How to Take Smart Notes: One Simple Technique to Boost Writing, Learning and Thinking – for Students, Academics and Nonfiction Book Writers</i>, by Sönke Ahrens (2017)</li>
<li><i>Ottoman Refugees, 1878-1939: Migration in a Post-Imperial World</i>, by Isa Blumi (2013)</li>
<li><i>Afghanistan Rising: Islamic Law and Statecraft Between the Ottoman and British Empires</i>, by Faiz Ahmed (2017)</li>
<li><i>Spiritual Subjects: Central Asian Pilgrims and the Ottoman Hajj at the End of Empire</i>, by Lâle Can (2020)</li>
<li><i>Training for the New Alpinism: A Manual for the Climber as Athlete</i>, by Steve House &amp; Scott Johnston (2014)</li>
<li><i>Training for the Uphill Athlete: A Manual for Mountain Runners and Ski Mountaineers</i>, by Steve House (2019)</li>
<li><i>The Universal Enemy: Jihad as Solidarity at the End of Empire</i>, by Darryl Li (2019)</li>
<li><i>Deep Work: Rules for Focused Success in a Distracted World</i>, by Cal Newport (2016)</li>
<li><i>Our Women on the Ground: Essays by Arab Women Reporting from the Arab World</i>, edited by Zahra Hankir (2019)</li>
</ul>
</div>
</div>
<div id="outline-container-org1388e86" class="outline-2">
<h2 id="org1388e86"><span class="section-number-2">55.</span> March 2020</h2>
<div class="outline-text-2" id="text-55">
<ul class="org-ul">
<li><i>Imagined Communities: Reflections on the Origin and Spread of Nationalism</i>, by Benedict Anderson (1983)</li>
<li><i>Humanism in Ruins: Entangled Legacies of the Greek-Turkish Population Exchange</i>, by Asli Igsiz (2019)</li>
<li><i>How to Write a Thesis</i>, by Umberto Eco (1977)</li>
<li><i>The Last Ottoman Generation and the Making of the Modern Middle East</i>, by Michael Provence (2017)</li>
</ul>
</div>
</div>
<div id="outline-container-org743f7c0" class="outline-2">
<h2 id="org743f7c0"><span class="section-number-2">56.</span> February 2020</h2>
<div class="outline-text-2" id="text-56">
<ul class="org-ul">
<li><i>Familiar Futures: Time, Selfhood, and Sovereignty in Iraq</i>, by Sara Pursely (2019)</li>
<li><i>A Nation of Empire: The Ottoman Legacy of Turkish Modernity</i>, by Michael Meeker (2002)</li>
</ul>
</div>
</div>
<div id="outline-container-org3a2d1c0" class="outline-2">
<h2 id="org3a2d1c0"><span class="section-number-2">57.</span> January 2020</h2>
<div class="outline-text-2" id="text-57">
<ul class="org-ul">
<li><i>The Book of Disappearance</i>, by Ibtisam Azem (2019)</li>
<li><i>Scenes from Village Life</i>, by Amos Oz (2011)</li>
</ul>
</div>
</div>
<div id="outline-container-orgc59c2c4" class="outline-2">
<h2 id="orgc59c2c4"><span class="section-number-2">58.</span> November 2019</h2>
<div class="outline-text-2" id="text-58">
<ul class="org-ul">
<li><i>The Great War for Civilization: The Conquest of the Middle East</i>, by Robert Fisk (2005)</li>
</ul>
</div>
</div>
<div id="outline-container-org322d873" class="outline-2">
<h2 id="org322d873"><span class="section-number-2">59.</span> September 2019</h2>
<div class="outline-text-2" id="text-59">
<ul class="org-ul">
<li><i>Seven Pillars of Wisdom</i>, by T.E. Lawrence (1922)</li>
</ul>
</div>
</div>
<div id="outline-container-org937e2d1" class="outline-2">
<h2 id="org937e2d1"><span class="section-number-2">60.</span> August 2019</h2>
<div class="outline-text-2" id="text-60">
<ul class="org-ul">
<li><i>The Wandering Falcon</i>, by Jamil Ahmad (2011)</li>
</ul>
</div>
</div>
<div id="outline-container-org71d5e5a" class="outline-2">
<h2 id="org71d5e5a"><span class="section-number-2">61.</span> July 2019</h2>
<div class="outline-text-2" id="text-61">
<ul class="org-ul">
<li><i>First as Tragedy, Then as Farce</i>, by Slavoj Žižek (2009)</li>
</ul>
</div>
</div>
<div id="outline-container-org643af71" class="outline-2">
<h2 id="org643af71"><span class="section-number-2">62.</span> June 2019</h2>
<div class="outline-text-2" id="text-62">
<ul class="org-ul">
<li><i>House on Fire: The Fight to Eradicate Smallpox</i>, by William H. Foege (2011)</li>
<li><i>Asymmetry</i>, by Lisa Halliday (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-org1deceff" class="outline-2">
<h2 id="org1deceff"><span class="section-number-2">63.</span> May 2019</h2>
<div class="outline-text-2" id="text-63">
<ul class="org-ul">
<li><i>Secession and Security: Explaining State Strategy Against Separatists</i>, by Ahsan Butt (2017)</li>
<li><i>The Bookseller of Kabul</i>, by Åsne Siererstad (2004)</li>
<li><i>The Burning Shores: Inside the Battle for the New Libya</i>, by Frederic Wehrey (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-orgd9e30f7" class="outline-2">
<h2 id="orgd9e30f7"><span class="section-number-2">64.</span> April 2019</h2>
<div class="outline-text-2" id="text-64">
<ul class="org-ul">
<li><i>The Little Book of Fixers</i>, by Jan Chipchase (2019)</li>
<li><i>Sacred Cesium Group and Isa's Deluge: Two Novellas of Japan's 3/11 Disaster</i>, by Yusuke Kimura (2019)</li>
<li><i>The Infernal Library: On Dictators, the Books They Wrote, and Other Catastrophes of Literacy</i>, by Daniel Kalder (2018)</li>
<li><i>Extremism</i>, by J.M. Berger (2018)</li>
<li><i>The Locust Effect: Why the End of Poverty Requires the End of Violence</i>, by Gary A. Haugen (2014)</li>
</ul>
</div>
</div>
<div id="outline-container-orgcb7e013" class="outline-2">
<h2 id="orgcb7e013"><span class="section-number-2">65.</span> March 2019</h2>
<div class="outline-text-2" id="text-65">
<ul class="org-ul">
<li><i>Burning Country: Syrians in Revolution and War</i>, by Robin Yassin-Kassab (2016)</li>
<li><i>War Reporting for Cowards</i>, by Chris Ayres (2006)</li>
<li><i>We Want to Negotiate: The Secret World of Kidnapping, Hostages and Ransom</i>, by Joel Simon (2019)</li>
<li><i>Babel: Around the World in Twenty Languages</i>, by Gaston Dorren (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-orgcb419f8" class="outline-2">
<h2 id="orgcb419f8"><span class="section-number-2">66.</span> February 2019</h2>
<div class="outline-text-2" id="text-66">
<ul class="org-ul">
<li><i>Literature from the "Axis of Evil": Writing from Iran, Iraq, North Korea, and Other Enemy Nations</i>, edited by Alane Mason (2006)</li>
<li><i>To the Mountains: My Life in Jihad, from Algeria to Afghanistan</i>, by Abdullah Anas (2019)</li>
</ul>
</div>
</div>
<div id="outline-container-org3f69fa6" class="outline-2">
<h2 id="org3f69fa6"><span class="section-number-2">67.</span> January 2019</h2>
<div class="outline-text-2" id="text-67">
<ul class="org-ul">
<li><i>Ibn Khaldun: An Intellectual Biography</i>, by Robert Irwin (2018)</li>
<li><i>Why Don't We Learn from History?</i>, by B.H. Liddel Hart (1944)</li>
</ul>
</div>
</div>
<div id="outline-container-org3d5fde2" class="outline-2">
<h2 id="org3d5fde2"><span class="section-number-2">68.</span> December 2018</h2>
<div class="outline-text-2" id="text-68">
<ul class="org-ul">
<li><i>The Wind-Up Bird Chronicle</i>, by Haruki Murakami (1994)</li>
<li><i>Colorless Tsukuru Tazaki and His Years of Pilgrimage</i>, by Haruki Murakami (2013)</li>
<li><i>The Curse of Bigness: Antitrust in the New Gilded Age</i>, by Tim Wu (2018)</li>
<li><i>A Month by the Sea: Encounters in Gaza</i>, by Dervla Murphy (2013)</li>
<li><i>Kafka on the Shore</i>, by Haruki Murakami (2003)</li>
</ul>
</div>
</div>
<div id="outline-container-org01c8a42" class="outline-2">
<h2 id="org01c8a42"><span class="section-number-2">69.</span> November 2018</h2>
<div class="outline-text-2" id="text-69">
<ul class="org-ul">
<li><i>Hezbollah: The Global Footprint of Lebanon's Party of God</i>, by Matthew Levitt (2013)</li>
<li><i>Babel No More: The Search for the World's Most Extraordinary Language Learners</i>, by Michael Erard (2012)</li>
<li><i>The Master and Margarita</i>, by Mikhail Bulgakov (1967)</li>
<li><i>Killing Commendatore</i>, by Haruki Murakami (2017)</li>
</ul>
</div>
</div>
<div id="outline-container-orgdeaa9b6" class="outline-2">
<h2 id="orgdeaa9b6"><span class="section-number-2">70.</span> September 2018</h2>
<div class="outline-text-2" id="text-70">
<ul class="org-ul">
<li><i>The Baghdad Eucharist: A Novel</i>, by Sinan Antoon (2012)</li>
<li><i>The 2020 Commission Report on the North Korean Nuclear Attacks Against the United States: A Speculative Novel</i>, by Jeffery Lewis (2018)</li>
<li><i>Judas</i>, by Amos Oz (2015)</li>
<li><i>Saudi America: The Truth about Fracking and How It's Changing the World</i>, by Bethany McLean (2018)</li>
<li><i>Into the Hands of the Soldiers: Freedom and Chaos in Egypt and the Middle East</i>, by David Kirkpatrick (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-org2ba4da4" class="outline-2">
<h2 id="org2ba4da4"><span class="section-number-2">71.</span> August 2018</h2>
<div class="outline-text-2" id="text-71">
<ul class="org-ul">
<li><i>Quicksilver War: Syria, Iraq and the Spiral of Conflict</i>, by William Harris (2017)</li>
<li><i>An Intimate War: An Oral History of the Helman Conflict</i>, by Mike Martin (2017)</li>
</ul>
</div>
</div>
<div id="outline-container-orgda6e52f" class="outline-2">
<h2 id="orgda6e52f"><span class="section-number-2">72.</span> July 2018</h2>
<div class="outline-text-2" id="text-72">
<ul class="org-ul">
<li><i>Spies in the Family: An American Spymaster, His Russian Crown Jewel, and the Friendship That Helped End the Cold War</i>, by Eva Dillion (2017)</li>
<li><i>Ballots, Bullets, and Bargains: American Foreign Policy and Presidential Elections</i>, by Michael H Armacost (2015)</li>
<li><i>Ignition!: An Informal History of Liquid Rocket Propellants</i>, by John Drury Clark (1972)</li>
<li><i>The Impossible Revolution: Making Sense of the Syrian Tragedy</i>, by Yassin Al-Haj Saleh (2017)</li>
<li><i>Aftershocks: Great Powers and Domestic Reforms in the Twentieth Century</i>, by Seva Gunitsky (2017)</li>
<li><i>The Taliban Reader: War, Islam, Politics</i>, edited by Alex Strick van Linschoten and Felix Kuehn (2018)</li>
<li><i>Couchsurfing in Iran: Revealing a Hidden World</i>, by Stephen Orth (2016)</li>
<li><i>Bullets and Bulletins: Media and Politics in the Wake of the Arab Uprisings</i>, edited by Mohamed Zayani and Suzi Mirgani (2016)</li>
<li><i>The Caliphate at War: The Ideological, Organisational and Military Innovations of Islamic State</i>, by Ahmed S. Hashim (2017)</li>
</ul>
</div>
</div>
<div id="outline-container-orgca05401" class="outline-2">
<h2 id="orgca05401"><span class="section-number-2">73.</span> June 2018</h2>
<div class="outline-text-2" id="text-73">
<ul class="org-ul">
<li><i>Safe Passage: The Transition from British to American Hegemony</i>, by Kori Schake (2017)</li>
<li><i>Seizing Power: The Strategic Logic of Military Coups</i>, by Naunihal Singh (2014)</li>
<li><i>Afghanistan from the Cold War through the War on Terror</i>, by Barnett Rubin (2013)</li>
<li><i>A People's History of the United States</i>, by Howard Zinn (2005)</li>
</ul>
</div>
</div>
<div id="outline-container-orgaf50cba" class="outline-2">
<h2 id="orgaf50cba"><span class="section-number-2">74.</span> May 2018</h2>
<div class="outline-text-2" id="text-74">
<ul class="org-ul">
<li><i>Trees, maps, and theorems</i>, by Jean-luc Doumont (2009)</li>
<li><i>Brothers of the Gun: A Memoir of the Syrian War</i>, by Marwan Hisham (2018)</li>
<li><i>History of the Silk Road</i>, by Jonathan Clements (2017)</li>
<li><i>Losing the Nobel Prize</i>, by Brian Keating (2018)</li>
</ul>
</div>
</div>
<div id="outline-container-orgb574c26" class="outline-2">
<h2 id="orgb574c26"><span class="section-number-2">75.</span> April 2018</h2>
<div class="outline-text-2" id="text-75">
<ul class="org-ul">
<li><i>The Koran in English: A Biography</i>, by Bruce B. Lawrence (2017)</li>
<li><i>The Red Star and the Crescent: China and the Middle East</i>, by James Reardon-Anderson (2018)</li>
<li><i>High-Speed Empire: Chinese Expansion and the Future of Southeast Asia</i>, by Will Doig (2018)</li>
<li><i>On Gravity: A Brief Tour of a Weighty Subject</i>, by A. Zee (2018)</li>
<li><i>Foreign Devils on the Silk Road</i>, by Peter Hopkirk (2006)</li>
<li><i>Tribes and Politics in Yemen: A History of the Houthi Conflict</i>, by Marieke Brandt (2017)</li>
<li><i>Xinjiang and the Modern Chinese State</i>, by Justin M. Jacbos (2016)</li>
</ul>
</div>
</div>
<div id="outline-container-org1851c6e" class="outline-2">
<h2 id="org1851c6e"><span class="section-number-2">76.</span> March 2018</h2>
<div class="outline-text-2" id="text-76">
<ul class="org-ul">
<li><i>The Ghost Map: The Story of London's Most Terrifying Epidemic</i>, by Steven Johnson (2007)</li>
<li><i>Afghanistan: A Cultural and Political History</i>, by Thomas Barfield (2010)</li>
<li><i>Why Nations Fail: The Origins of Power, Prosperity, and Poverty</i>, by Daron Acemoğlu (2012)</li>
<li><i>Alone in the Ocean</i>, by Slava Kurilov (2016)</li>
<li><i>Memories of a Theoretical Physicist</i>, by Joseph Polchinski (2017)</li>
<li><i>Dear Committee Members</i>, by Julie Schumacher, (2014)</li>
<li><i>A History of the Middle East</i>, by Peter Mansfield (2013)</li>
</ul>
</div>
</div>
<div id="outline-container-orgd6d89cc" class="outline-2">
<h2 id="orgd6d89cc"><span class="section-number-2">77.</span> February 2018</h2>
<div class="outline-text-2" id="text-77">
<ul class="org-ul">
<li><i>Rise to Globalism: American Foreign Policy Since 1938</i>, by Stephen E. Ambrose (2010)</li>
<li><i>A Savage War of Peace: Algeria, 1954-1962</i>, by Alistar Horne (2006)</li>
</ul>
</div>
</div>
<div id="outline-container-org7331141" class="outline-2">
<h2 id="org7331141"><span class="section-number-2">78.</span> January 2018</h2>
<div class="outline-text-2" id="text-78">
<ul class="org-ul">
<li><i>Pipe Dreams: The Plunder of Iraq's Oil Wealth</i>, by Erin Banco (2018)</li>
<li><i>The Black Banners: The Inside Story of 9/11 and the War Against al-Qaeda</i>, by Ali H Soufan (2011)</li>
<li><i>Another Fine Mess: America, Uganda, and the War on Terror</i>, by Helen C. Epstein (2017)</li>
<li><i>Career Diplomacy: Life and Work in the US Foreign Service</i>, Harry W. Knopp (2017)</li>
<li><i>Becoming Fluent: How Cognitive Science Can Help Adults Learn a Foreign Language</i>, by Richard M. Roberts (2015)</li>
<li><i>The Tao of Pooh</i>, by Benjamin Hoff (2003)</li>
</ul>
</div>
</div>
<div id="outline-container-org569642a" class="outline-2">
<h2 id="org569642a"><span class="section-number-2">79.</span> 2017</h2>
<div class="outline-text-2" id="text-79">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<tbody>
<tr>
<td class="org-left"><i>When Breath Becomes Air</i></td>
<td class="org-left">Paul Kalanithi</td>
</tr>

<tr>
<td class="org-left"><i>Law's Abnegation</i></td>
<td class="org-left">Adrian Vermeule</td>
</tr>

<tr>
<td class="org-left"><i>High Performance Browser Networking</i></td>
<td class="org-left">Ilya Grigorik</td>
</tr>

<tr>
<td class="org-left"><i>Zero Day: The Threat in Cyberspace</i></td>
<td class="org-left">Robert O'Harrow Jr.</td>
</tr>

<tr>
<td class="org-left"><i>Hardboiled Wonderland and the End of the World</i></td>
<td class="org-left">Haruki Murakami</td>
</tr>

<tr>
<td class="org-left"><i>Paper Tigers: China's Nuclear Posture</i></td>
<td class="org-left">Jeffery Lewis</td>
</tr>

<tr>
<td class="org-left"><i>Blank Spots on the Map: The Dark Geography of the Pentagon's Secret World</i></td>
<td class="org-left">Trevor Paglen</td>
</tr>

<tr>
<td class="org-left"><i>Kill All Normies: Online Culture Wars from 4chan and Tumblr to Trump and the Alt-Right</i></td>
<td class="org-left">Angela Nagel</td>
</tr>

<tr>
<td class="org-left"><i>The Field Study Handbook</i></td>
<td class="org-left">Jan Chipchase</td>
</tr>

<tr>
<td class="org-left"><i>The Global Novel: Writing the World in the 21st Century</i></td>
<td class="org-left">Adam Kirsch</td>
</tr>

<tr>
<td class="org-left"><i>The Cosmopolites: The Coming of the Global Citizen</i></td>
<td class="org-left">Atossa Araxia Abrahamian</td>
</tr>

<tr>
<td class="org-left"><i>Why Wall Street Matters</i></td>
<td class="org-left">William D. Cohan</td>
</tr>

<tr>
<td class="org-left"><i>Atlas Obscura: An Explorer's Guide to the World's Hidden Wonders</i></td>
<td class="org-left">Joushua Foer</td>
</tr>

<tr>
<td class="org-left"><i>Typewriters, Bombs, Jellyfish: Essays</i></td>
<td class="org-left">Tom McCarthy</td>
</tr>

<tr>
<td class="org-left"><i>Outpatients</i></td>
<td class="org-left">Sasha Issenberg</td>
</tr>

<tr>
<td class="org-left"><i>A Question of Order: India, Turkey, and the Return of Strongmen</i></td>
<td class="org-left">Basharat Peer</td>
</tr>

<tr>
<td class="org-left"><i>Do I Make Myself Clear? Why Writing Well Matters</i></td>
<td class="org-left">Harold Evans</td>
</tr>

<tr>
<td class="org-left"><i>Putin Country: A Journey into the Real Russia</i></td>
<td class="org-left">Anne Garrels</td>
</tr>

<tr>
<td class="org-left"><i>Field Notes from a Catastrophe: Man, Nature, and Climate Change</i></td>
<td class="org-left">Elizabeth Kolbert</td>
</tr>

<tr>
<td class="org-left"><i>Shadow Courts: The Tribunals that Rule Global Trade</i></td>
<td class="org-left">Haley Sweetland Edwards</td>
</tr>

<tr>
<td class="org-left"><i>Experimental Geography: Radical Approaches to Landscape, Cartography, and Urbanism</i></td>
<td class="org-left">Nato Thompson</td>
</tr>

<tr>
<td class="org-left"><i>Blind Spot</i></td>
<td class="org-left">Teju Cole</td>
</tr>

<tr>
<td class="org-left"><i>Great Games, Local Rules: The New Great Power Contest in Central Asia</i></td>
<td class="org-left">Alexander Cooley</td>
</tr>

<tr>
<td class="org-left"><i>Invisible Cities</i></td>
<td class="org-left">Italo Calvino</td>
</tr>

<tr>
<td class="org-left"><i>Little Rice: Smartphones, Xiaomi, and The Chinese Dream</i></td>
<td class="org-left">Clay Shirky</td>
</tr>

<tr>
<td class="org-left"><i>Code: The Hidden Language of Computer Hardware and Software</i></td>
<td class="org-left">Charles Petzold</td>
</tr>

<tr>
<td class="org-left"><i>Naked in Baghdad: The Iraq War and the Aftermath</i></td>
<td class="org-left">Annel Garrels</td>
</tr>

<tr>
<td class="org-left"><i>Twitter and Tear Gas: The Power and Fragility of Networked Protest</i></td>
<td class="org-left">Zenyenp Tufekci</td>
</tr>

<tr>
<td class="org-left"><i>The Song of the Dodo</i></td>
<td class="org-left">David Quammen</td>
</tr>

<tr>
<td class="org-left"><i>Coup d'État</i></td>
<td class="org-left">Edward Luttwak</td>
</tr>

<tr>
<td class="org-left"><i>No Good Men Among the Living: America, the Taliban, and the War through Afghan Eyes</i></td>
<td class="org-left">Anad Gopal</td>
</tr>

<tr>
<td class="org-left"><i>Listening in: Cybersecurity in an Insecure Age</i></td>
<td class="org-left">Susan Landau</td>
</tr>

<tr>
<td class="org-left"><i>Letters from Burma</i></td>
<td class="org-left">Aung San Suu Kyi</td>
</tr>

<tr>
<td class="org-left"><i>How to Talk About Books You Haven't Read</i></td>
<td class="org-left">Pierre Bayard</td>
</tr>

<tr>
<td class="org-left"><i>Children of Paradise: The Struggle for the Soul of Iran</i></td>
<td class="org-left">Laura Secor</td>
</tr>

<tr>
<td class="org-left"><i>Above the Timberline</i></td>
<td class="org-left">Gregory Manchess</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-orgf14e63b" class="outline-2">
<h2 id="orgf14e63b"><span class="section-number-2">80.</span> 2016</h2>
<div class="outline-text-2" id="text-80">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">


<colgroup>
<col  class="org-left" />

<col  class="org-left" />
</colgroup>
<tbody>
<tr>
<td class="org-left"><i>The Nature of Code</i></td>
<td class="org-left">Daniel Shiffman</td>
</tr>

<tr>
<td class="org-left"><i>Introduction to Modern Cryptography</i></td>
<td class="org-left">Jonathan Katz &amp; Yehuda Lindell</td>
</tr>

<tr>
<td class="org-left"><i>Computer Networking: A Top-Down Approach</i></td>
<td class="org-left">F. Kurose James</td>
</tr>

<tr>
<td class="org-left"><i>Playing Dead: A Journel Through the World of Death Fraud</i></td>
<td class="org-left">Elizabeth Greenwood</td>
</tr>

<tr>
<td class="org-left"><i>Mr. Penumbra's 24 Hour Bookstore</i></td>
<td class="org-left">Robin Sloan</td>
</tr>

<tr>
<td class="org-left"><i>The Stormlight Archive</i></td>
<td class="org-left">Brandon Sanderson</td>
</tr>
</tbody>
</table>
</div>
</div>

</div>
</div>]]></description>
      <pubDate>2026-01-31</pubDate>
      <guid>http://malloc.dog/books/</guid>
    </item>
    <item>
      <title>Post-mortem, 2025 Edition</title>
      <link>http://malloc.dog/blog/2025/12/28/post-mortem-2025-edition/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Post-mortem, 2025 Edition</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org5599a3e">1. Travel</a></li>
<li><a href="#orge6a557e">2. Work</a></li>
<li><a href="#orgeb9194a">3. Learning</a></li>
<li><a href="#org8a44ea1">4. Life</a></li>
</ul>
</div>
</div>

<div id="org75d76c3" class="figure">
<p><img src="/assets/blog/2025/12/28/post-mortem-2025-edition/syria-2025.jpeg" alt="syria-2025.jpeg" />
</p>
</div>
<blockquote>
<p>
Damascus, Jan 2025.
</p>
</blockquote>


<p>
Another year, another performance review season to procrastinate on. I felt like I largely locked in this year on work, so the scorecard is:
</p>
<div id="outline-container-org5599a3e" class="outline-2">
<h2 id="org5599a3e"><span class="section-number-2">1.</span> Travel</h2>
<div class="outline-text-2" id="text-1">
<p>
In January I went to <a href="https://malloc.dog/field/syria">Syria</a>, spending about a month there and bopping around Sayyida Zaineb. The experience was incredible, especially only a month after the fall of the Assad Regime—plus I had the opportunity to visit Aleppo and Lattakia.
</p>

<p>
Visiting Iraq (again) was also amusing. In the winter, there was 24 hours of government electricity, which itself was a shocker. I saw old friends in Erbil, and even a weird boxing match series in Ainkawa:
</p>


<div id="orgbcf1c10" class="figure">
<p><img src="/assets/blog/2025/12/28/post-mortem-2025-edition/bxf.jpeg" alt="bxf.jpeg" />
</p>
</div>
<blockquote>
<p>
BXF (Babalyon X Fighting)
</p>
</blockquote>

<p>
In May I went off to <a href="https://malloc.dog/field/algeria">Algeria</a> for a week, where I was charmed by the mosaics and annoyed by the lack of shisha. This was my first trip to Algeria, and really my first exposure seriously to the Maghreb. I'm quite keen on going back, as it's substantially different than Arab culture in the Mashriq.
</p>

<p>
<a href="https://malloc.dog/field/elsalvador">El Salvador</a> was also an interesting trip, I relaxed, worked through a small earthquake, and also spent quite a bit of time learning about Romero and thinking about saints. It surprised me with how much depth it had. The nightlife was a little dull, but I enjoyed having a tropical place to focus, work, and think.
</p>
</div>
</div>
<div id="outline-container-orge6a557e" class="outline-2">
<h2 id="orge6a557e"><span class="section-number-2">2.</span> Work</h2>
<div class="outline-text-2" id="text-2">
<p>
This year was really filled with work. Many 60 hour weeks, and I spent a significant amount of time getting up to speed on operations for WA and writing Erlang. Towards the end of this year, I'm happy to say I've mostly succeeded, I'm able to pick up most aspects of WhatsApp as an org and navigate and drive impact. I've been on an absurd number of outages this year, and I've seen all sorts of weird things break in WA<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>.
</p>

<p>
One of our funnier outages even made it to the Linux Plumbers Conference this year, where the <code>sched_ext</code> mechanism for providing external schedulers, using the lavd scheduler, caused conflicts with CPU affinity and wreaked havoc on my tail latencies.
</p>


<div id="org65d1b95" class="figure">
<p><img src="/assets/blog/2025/12/28/post-mortem-2025-edition/2025-12-28_18-49-05_screenshot.png" alt="2025-12-28_18-49-05_screenshot.png" />
</p>
</div>
<blockquote>
<p>
See <a href="https://www.youtube.com/watch?v=KFItEHbFEwg&amp;source_ve_path=MTc4NDI0">https://www.youtube.com/watch?v=KFItEHbFEwg&amp;source_ve_path=MTc4NDI0</a> for the full talk.
</p>
</blockquote>

<p>
Honestly this constant firefighting has gotten me feeling a little burned out. In February I'll be transitioning to a role on HHVM Server, where I'll be working on the JIT and platform for HHVM, which has reinvigorated me a bit.
</p>

<p>
There's a big AI push at Meta currently, where we're heavily being encouraged to use as much AI as possible. I find Claude Code useful, but I've personally gone through the curve of inflated expectations and then the trough. I've seen people submit some real AI slop for me to review, forcing me to be the first line of quality control, but Claude Code also has made me much more productive in areas of programming I wouldn't have devoted time to before, such as Javascript. I now don't really worry about writing Javascript or having to learn React, or learning the latest Python package manager<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>.
</p>

<p>
I'm still not quite sure how I feel about AI. The environmental impact I actually don't quite believe as much as the media hypes it up, but I do feel like it is pulling the ladder up behind us, removing the need for junior engineers. I feel like a thief who's made it past state lines, where I can efficiently guide the robot through doing tasks. If I was a junior engineer, I'd find it very difficult to resist the urge of using the robot for everything.
</p>

<p>
AI is an excellent study buddy. It's useful for reframing my thoughts, and it excels as a vague "vibe based" search engine. I feel like the <a href="https://rfd.shared.oxide.computer/rfd/0576">Oxide RFD on LLMs</a> accurately summarizes my experience with it: it's genuinely a transformative tool, but we need to be wary of how it impacts learning. It's sufficiently lowered the bar for learning new technologies, but I am unsure if I trust it with building serious products. For simpler codebases, I think it is excellent. For other codebases, I think I'd like to use it to churn out scaffolding more than anything else.
</p>

<p>
Despite all the hubbub about vibe coding, I find myself most efficient with the LLM when I understand the system and I just need the encantations for gluing things together. For example, our CLI tool at WhatsApp is written in Rust. Claude is quite good at writing a <b>lot</b> of Rust, but whether it's good Rust is a different question, as it seems to heavily favor <code>clone()</code> and pass by value. However, for a CLI tool this is nearly irrelevant, so I'm fine having Claude churn this stuff out.
</p>
</div>
</div>
<div id="outline-container-orgeb9194a" class="outline-2">
<h2 id="orgeb9194a"><span class="section-number-2">3.</span> Learning</h2>
<div class="outline-text-2" id="text-3">
<p>
On the learning front, one of my biggest highlights this year was how I managed to read 49(!) papers for <a href="https://malloc.dog/blog/2025/12/27/swe-tea---year-2/">SWE Tea</a>. SWE Tea really has been a joy to do, and frankly it's quite high return. We read through a series a topics, from huge pages to LLM post training to data center power and so on, and we dived deep into many of the topics. I've learned a ton from SWE Tea, it's definitely been one of the best decisions I've made in recent history.
</p>

<p>
On a meta note, I'd say I've learned two things about running a paper reading group:
</p>
<ol class="org-ol">
<li>Reschedule, never skip. If you get into the habit of skipping weeks, you'll end up normalizing the deviation and then eventually drop off.</li>
<li>Batch themes together. When we first started SWE Tea, we did papers in roughly random topics, jumping around. However, batching papers chronologically allows you to trace the evolution of a technology. For example, in our latest theme of sanitizers, we started with Valgrind, walked through ASAN and TSAN, and worked our way up to memory tagging. This was something we happened upon this year, and it's really helped us read these papers. Not only do you maintain context between each week and the next, you can compare and contrast papers and authors in the same field.</li>
</ol>

<p>
Unfortunately, this year has been somewhat bad for my reading and language studying. I've kept up my Arabic and Spanish studying, but those have effectively been high fluency for a while, and only require maintenance mode. I started the year studying Russian but quickly had to give up due to a lack of time. I'd like to pick it back up next year.
</p>

<p>
I've only read <a href="https://malloc.dog/books">23 books this year</a>, although some of the books were excellent. Highlights include:
</p>
<ul class="org-ul">
<li><i>Glorious Exploits</i>, by Ferdia Lennon
<ul class="org-ul">
<li>I didn't know what to expect going into this book, but it was an excellent emotional tug on the act of putting on a play. The theme sounds contrived, but it's short and I'd greatly recommend it</li>
</ul></li>
<li><i>People from Oetimu</i>, by Felix K. Nesi
<ul class="org-ul">
<li>I discovered <a href="https://archipelagobooks.org/">Archipelago Books</a> relatively recently, and I was enchanted with this particular book. Nesi writes beautifully, and weaves a fascinating historical fiction of the Indonesian occupation of Timor.</li>
</ul></li>
<li><i>Planet of Slums</i>, by Mike Davis
<ul class="org-ul">
<li>This book was on my to read list for a while, and I kept putting it off. When I finally sat down to read it, I was enchanted by the prose and arguments. If you're into books like <i>Drug Cartels Do Not Exist</i> or similar type of academic books, this one will draw you in as well.</li>
</ul></li>
<li><i>Secular Translations: Nation-State, Modern Self, and Calculative Reason</i>, by Talal Asad
<ul class="org-ul">
<li><p>
This was technically a re-read, but honestly I got so much more out of the re-read than the first read. One of the biggest benefits of re-reading authors like Asad is that you pick up so much more with time and distance. I read this originally for school in my MA program, picking it back up years later showed me so much more. Asad's description of language and how it gets used and reworded in this book is clearer than most of his other books, with banger quotes such as<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup>:
</p>
<blockquote>
<p>
The translation of values from one natural language to another is always problematic, as every anthropologist who has carried out research in a society that speaks a language foreign to her own knows. Which is why what makes sense to a Western ethnographer in a nonmodern community sometimes doesn’t do so as easily when she returns home to Euro- America. It is almost impossible to abstract an important idea that indicates something distinctive of a particular form of life and find a ready word in a language belonging to a very different form of life&#x2026;
</p>
</blockquote></li>
</ul></li>
</ul>
</div>
</div>
<div id="outline-container-org8a44ea1" class="outline-2">
<h2 id="org8a44ea1"><span class="section-number-2">4.</span> Life</h2>
<div class="outline-text-2" id="text-4">
<p>
Looking back, this year has really been leaning into being a big tech worker. I've ramped up to 4 days of crossfit a week, with the plan of going up to 5 days a week in January next year. I've stayed around New York, feeling some aches to leave but not firm plans on permanently leaving yet. I didn't get a chance to do a big bike trip like my Montreal bike trip last year, but I've really thrown myself into crossfit as a result.
</p>

<p>
Crossfit has been my point of sanity. With a stressful job, having the ability to just hop over to a gym and lift heavy shit during the middle of the day has kept me grounded. Having good trainers that help drive me towards clear progressions in my goals is a good anchor in the waves at work.
</p>

<p>
One of the things that you learn quickly when working at big tech is the scale of impact and how many problems really are organizational problems. WhatsApp server is very few people, and yet the product is routinely used by billions of people across the world a day. I spend most of my time consensus building at work, drafting alignment docs and firefighting, and I expect that to only stay constant or grow with time. This is sort of the life of big tech, where people end up fighting over stuff like "scope" or "consensus."
</p>

<p>
I haven't yet decided how I feel about it. I like the opportunities big tech affords me, I enjoy working on large industrial scale software, and I love the fact that I can sightsee and that my coworkers on WhatsApp are incredibly smart. On the other hand, it is exhausting at a particular point, I somewhat miss my old job, where I was putting in significantly less hours.
</p>

<p>
Now that I've come back to NYC after a few years away, the last year and a half can be described as a lack of FOMO. When I first moved to NYC, I was desperate to go to all the events, see all the people, so on. Now I'm at the stage where I'd prefer quiet nights and make time to see specific friends, which I suppose means that I have come down with a case of the old.
</p>

<p>
I recently chatted with a friend about this, who pointed out that I had an interesting, well paid job, and have roughly everything else lined up in life. Which is all true, but I constantly feel the pang of wanting to head back into the chaos of the Middle East.
</p>


<p>
I've forgotten where this came from (perhaps 4X games), but a while back I heard about the expand/exploit tradeoff. With the limited resources of time, I've felt like the past few years I've been expanding, seeing the world, learning new things, and so on. This last year, I've felt like I've been in the exploit phase, focusing on myself and getting really good at software. Part of it has been accepting that I'm in exploit mode for now, banking skills and resources while the expand urge waits.
</p>

<p>
For now, I'm choosing depth over breadth. We'll see how long that lasts.
</p>


<div id="org36b9edc" class="figure">
<p><img src="/assets/blog/2025/12/28/post-mortem-2025-edition/the-sheep.jpg" alt="the-sheep.jpg" />
</p>
</div>
<blockquote>
<p>
النعجة - اجعوط مصطفى
</p>

<p>
One of my favorite pieces in the Algiers calligraphy museum, titled "The Sheep" by Mustafa Ajaout.
</p>
</blockquote>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
And I even broke WhatsApp a bit myself!
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
I'm old. <code>uv</code> is still "new" to me.
</p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Asad, Talal. Secular Translations: Nation-State, Modern Self, and Calculative Reason. Columbia University Press, 2018. <a href="https://doi.org/10.7312/asad18968">https://doi.org/10.7312/asad18968</a>.
</p></div></div>


</div>
</div>
</div>
</div>]]></description>
      <pubDate>2025-12-28</pubDate>
      <guid>http://malloc.dog/blog/2025/12/28/post-mortem-2025-edition/</guid>
    </item>
    <item>
      <title>Dilettantes and Polymaths</title>
      <link>http://malloc.dog/blog/2020/12/29/dilettantes-and-polymaths/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Dilettantes and Polymaths</h1>
<p>
<i>this post is far more rambling than my regular ones</i>
</p>

<p>
It's been a year. Normally I'd write up something wrapping up about my goals and how far I accomplished, but I think for me this year was one long lesson in understanding the difference between being a dilettante and a polymath.
</p>

<p>
I've always been terrified of being a dilettante, mostly because it creates some sort of "crank" identity, such as the weirdos who post about timecubes or start "writing" (if we can use that term) stuff and putting it on <a href="https://vixra.org/">vixra</a>. Being a dilettante always seemed being like those DC bro types who start writing essays about "death the of Hong Kong", having never been there. Dilettantism slides easily into delusions, especially as the world concentrates more and more power into smaller and smaller segments of people. How can anyone trust their own decisions when the knowledge you have is so subjectively little? Pikety writes about how economists should stop adopting mathematical language when economists know very little of anything, the language and rigor are separate things. The same thing happens in nearly all the social sciences at this point, the poor undergrad kid aggressively trying to p-hack his way to a paper is subject to the greater forces of adopting language without rigor.
</p>

<p>
What the hell is a polymath then? To be honest, I used to think it was someone that picked specific fields and went deep into them. For me, the stuff I wanted to master was distributed systems, militias in Iraq, and linguistic shit. Which, all things considered, is going pretty well. I switched teams at work to the NLP team, which rekindled my desire for software engineering while opening doors to working on more linguistics-related things, but also am going deep into Kubernetes currently. So that's been working out pretty well.
</p>

<p>
Back to polymath-ism. There's actually a novel called "The Polymath" that's about Ibn Khaldun, which I've been meaning to read about this. Ibn Khaldun was brilliant, and I can really only hope to reach a portion of the amount of insight he produced. Yet one thing I'm beginning to notice is that knowledge <i>production</i> and <i>bridging</i> is what has differentiated my current work from the past. I'm actively writing more and attempting to bridge my knowledge of software, middle east studies, and linguistics, on higher levels than I had thought before. I'm rereading <i>Godel, Escher, Bach</i> again, while reading <i>Steps to an Ecology of Mind</i> for the first time. At the same time, I'm going through a book club on Braben's <i>Scientific Freedom</i>.
</p>

<p>
So it's been a year. I bought a place, I trained a lot more, I studied a lot more, and at the end of it, the only lesson I have is that I need to rethink how I approach ideas. I used to think ideas were static sets of things to acquire or discard, each idea was a historical nugget to either stash away, use quickly, or chuck out. But at the end of this year, I've realized that I need to let the ideas ruminate and grow in the background, the ecology of the mind, as it were. Who knows what next year is going to be like, but I weirdly have a feeling it's going to be a good year.
</p>

</div>
</div>]]></description>
      <pubDate>2025-12-28</pubDate>
      <guid>http://malloc.dog/blog/2020/12/29/dilettantes-and-polymaths/</guid>
    </item>
    <item>
      <title>Fieldnotes</title>
      <link>http://malloc.dog/field/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Fieldnotes</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org1c0e9fe">1. Central America</a></li>
<li><a href="#org2143756">2. South America</a></li>
<li><a href="#org72bede4">3. Middle East and North Africa</a></li>
</ul>
</div>
</div>

<div id="org596cb04" class="figure">
<p><img src="/assets/field/field.jpeg" alt="field.jpeg" style="display: block; margin-left: auto; margin-right: auto; max-height: 400px;" />
</p>
</div>

<blockquote>
<p>
Midnight volleyball in Fort Washington Park, 2021.
</p>
</blockquote>

<p>
Some fieldnotes from various places I've lived in. I usually will write up a section for any country I've lived for more than a month in.
</p>
<div id="outline-container-org1c0e9fe" class="outline-2">
<h2 id="org1c0e9fe"><span class="section-number-2">1.</span> Central America</h2>
<div class="outline-text-2" id="text-1">
<ul class="org-ul">
<li><a href="https://malloc.dog/field/elsalvador">El Salvador</a></li>
</ul>
</div>
</div>
<div id="outline-container-org2143756" class="outline-2">
<h2 id="org2143756"><span class="section-number-2">2.</span> South America</h2>
<div class="outline-text-2" id="text-2">
<ul class="org-ul">
<li><a href="http://malloc.dog/field/uruguay">Uruguay</a></li>
<li><a href="http://malloc.dog/field/argentina/">Argentina</a></li>
</ul>
</div>
</div>
<div id="outline-container-org72bede4" class="outline-2">
<h2 id="org72bede4"><span class="section-number-2">3.</span> Middle East and North Africa</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li><a href="http://malloc.dog/field/iraq">Iraq</a></li>
<li><a href="http://malloc.dog/field/syria">Syria</a></li>
<li><a href="http://malloc.dog/field/algeria/">Algeria</a></li>
</ul>
</div>
</div>

</div>
</div>]]></description>
      <pubDate>2025-12-28</pubDate>
      <guid>http://malloc.dog/field/</guid>
    </item>
    <item>
      <title>Pret&#39;s Fruit Cup</title>
      <link>http://malloc.dog/blog/2018/05/23/prets-fruit-cup/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Pret&#39;s Fruit Cup</h1>
<p>
I prod the strawberry with my fork. It's actually half of a strawberry, sliced in twain by some machine at some indeterminate time ago. The plastic cup it came in promised "organic" and "fresh daily", although I figure companies like Pret probably have redefined "daily" in terms of elephant years or something. The bottom tip of the strawberry's red flesh is a bit mushy, but also sweeter than the rest of it. I pause, briefly considering if this strawberry's other half is in another fruit cup somewhere. Did I partake in deporting a strawberry from it's better half? Cause this half was very mediocre.
</p>

<p>
There's blueberries too. And some grapes, although grapes are the definition of filler in fruit cups. No one's asking for a grape cup, cause that just makes you seem weird, like some bizarre alcoholic who needs alcohol before it's fermented. The grapes are fine, just like the strawberry half. This is like my AP Language essays that came back with C+ on the top criticizing me for my lack of proper structure, or my lack of diction, or, the worst of them all, my lack of <b>theme</b>. What the hell, if you read through my entire essay about some crisis and you couldn't figure out the theme it's not my fault, perhaps you're just too dumb.
</p>

<p>
Back to the fruit cup. The blueberries are astoundingly fresh, like they've just been picked. Maybe Pret does use human time for it's "daily". One has to gaze in awe at the sheer variation of quality within a single fruit cup, like a world unto itself.
</p>

<p>
In the end, it all disappears into my gullet anyways. It was a goddamn eight dollar fruit cup, because New York brain damage everything is hideously overpriced. Whatever, I'll be back in a month once the shame of the eight dollar fruit cup subsides.
</p>

</div>
</div>]]></description>
      <pubDate>2025-12-28</pubDate>
      <guid>http://malloc.dog/blog/2018/05/23/prets-fruit-cup/</guid>
    </item>
    <item>
      <title>Read the Damn Error Message</title>
      <link>http://malloc.dog/blog/2021/05/02/read-the-damn-error-message/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Read the Damn Error Message</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#orgb196f4b">1. Example</a>
<ul>
<li><a href="#orgc9b0dcc">1.1. Tracebacks is a structured logs</a></li>
<li><a href="#org363fe98">1.2. Read the actual error</a></li>
<li><a href="#org34aa4e3">1.3. Check the filenames, switch the reading order</a></li>
<li><a href="#org918bf52">1.4. Print it (or use pdb)</a></li>
</ul>
</li>
<li><a href="#org1b6176f">2. Debugging Mentality</a></li>
</ul>
</div>
</div>
<p>
I've been working on a project for grad school, and through watching my teammates, I've seen them exhibit some of the same behaviors I see juniors do. The most frustrating one is the inability to debug, or the failure to <i>reason about debugging</i>.
</p>

<p>
For example, given this traceback:
</p>
<div class="org-src-container">
<pre class="src src-text">Traceback (most recent call last):
  File "/scratch/username/nlu/experiment-script.py", line 354, in &lt;module&gt;
    tot = loader(dataset_name, tokenizer, args.cache_dir)
  File "/scratch/username/nlu/experiment-script.py", line 150, in loader
    tot.append(_preprocess_dataset(dataset_name, data, sentence_col, tokenizer))
  File "/scratch/username/nlu/experiment-script.py", line 157, in _preprocess_dataset
    data = data.map(
  File "/scratch/username/envName/lib/python3.9/site-packages/datasets/dataset_dict.py", line 432, in map
    {
  File "/scratch/username/envName/lib/python3.9/site-packages/datasets/dataset_dict.py", line 433, in &lt;dictcomp&gt;
    k: dataset.map(
  File "/scratch/username/envName/lib/python3.9/site-packages/datasets/arrow_dataset.py", line 1407, in map
    update_data = does_function_return_dict(test_inputs, test_indices)
  File "/scratch/username/envName/lib/python3.9/site-packages/datasets/arrow_dataset.py", line 1378, in does_function_return_dict
    function(*fn_args, indices, **fn_kwargs) if with_indices else function(*fn_args, **fn_kwargs)
  File "/scratch/username/nlu/experiment-script.py", line 158, in &lt;lambda&gt;
    lambda x: tokenizer(x["input_text"], padding="max_length", truncation=True),
  File "/scratch/username/envName/lib/python3.9/site-packages/transformers/tokenization_utils_base.py", line 2210, in __call__
    assert isinstance(text, str) or (
AssertionError: text input must of type `str` (single example), `List[str]` (batch or single pretokenized example) or `List[List[str]]` (batch of pretokenized examples).
</pre>
</div>

<p>
I've seen junior engs completely ignore this traceback, thinking it's all garbage. Alternatively, I've also heard the excuse that Python isn't their wheelhouse, so it's fine to not know how to read this, or that their area of focus is experimentation and not writing/reading/debugging code.
</p>

<p>
Both of these concepts are absurd. Junior engs miss a treasure trove of information when they skip the traceback. Programmers, whether as grad students or software engineers, will read a magnitude more code than they write. Learning how to debug code that you don't understand is simply an extension of that. CS grad students are never explicitly taught how to read a paper, yet it's expected for students to simply "pick it up" along the way. Reading and reasoning about unfamiliar code is an invaluable skill, one that allows programmers to work in a variety of environments. In hopes of fixing that, I'm going to walk through how I would debug this particular traceback, and then talk about the mentality programmers should approach debugging with.
</p>
<div id="outline-container-orgb196f4b" class="outline-2">
<h2 id="orgb196f4b"><span class="section-number-2">1.</span> Example</h2>
<div class="outline-text-2" id="text-1">
<p>
Going back to the traceback above, I'll walk through my chain of reasoning and how to debug it. There's already <a href="https://realpython.com/python-traceback/">many</a> <a href="http://cs.franklin.edu/~ansaria/traceback.html">tutorials</a> on how a traceback is structured, but I'm going to walk through this specific one with an example.
</p>
</div>
<div id="outline-container-orgc9b0dcc" class="outline-3">
<h3 id="orgc9b0dcc"><span class="section-number-3">1.1.</span> Tracebacks is a structured logs</h3>
<div class="outline-text-3" id="text-1-1">
<p>
Because tracebacks are structured logs, they should be read from the point of error, and work backwards to isolate the specific problem. In this case, the error is helpfully at the bottom, so I'm going start by reading from the bottom up.
</p>
</div>
</div>
<div id="outline-container-org363fe98" class="outline-3">
<h3 id="org363fe98"><span class="section-number-3">1.2.</span> Read the actual error</h3>
<div class="outline-text-3" id="text-1-2">
<div class="org-src-container">
<pre class="src src-text">AssertionError: text input must of type `str` (single example), `List[str]` (batch or single pretokenized example) or `List[List[str]]` (batch of pretokenized examples).
</pre>
</div>

<p>
This error is fairly explicit, it's telling us that the <code>text input</code> must be of a specific type. If this is unclear, the line above helpfully gives an example, stating <code>assert isinstance(text, str) or (</code>. So now we know that there's a type mismatch somewhere.
</p>
</div>
</div>
<div id="outline-container-org34aa4e3" class="outline-3">
<h3 id="org34aa4e3"><span class="section-number-3">1.3.</span> Check the filenames, switch the reading order</h3>
<div class="outline-text-3" id="text-1-3">
<p>
Now, knowing <i>what</i> the error is, we need to find out <i>where</i> the error comes from. Now it could come from anywhere within the traceback, and there's a lot of information, so we need to narrow it down quickly. One of the first passes I usually do is <b>scanning the filenames</b><sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>.
</p>

<p>
In this traceback, we know that error line that comes from <code>/python3.9/site-packages/datasets/</code> is coming from the <code>datasets</code> library, so we can likely discard it. Mentally, after removing all the error lines that comes out of the <code>datasets</code> library, we have:
</p>

<div class="org-src-container">
<pre class="src src-text">Traceback (most recent call last):
  File "/scratch/username/nlu/experiment-script.py", line 354, in &lt;module&gt;
    tot = loader(dataset_name, tokenizer, args.cache_dir)
  File "/scratch/username/nlu/experiment-script.py", line 150, in loader
    tot.append(_preprocess_dataset(dataset_name, data, sentence_col, tokenizer))

&lt;&lt;datasets library stuff....&gt;

  File "/scratch/username/nlu/experiment-script.py", line 157, in _preprocess_dataset
    data = data.map(
  File "/scratch/username/nlu/experiment-script.py", line 158, in &lt;lambda&gt;
    lambda x: tokenizer(x["input_text"], padding="max_length", truncation=True),
</pre>
</div>

<p>
This is far more readable, and can be read top-down! Going back to the idea that tracebacks are structured logs, structured logs should be read <b>bottom-up</b> to identify <i>what</i> and <i>where</i> the problem is, but then logs should be read <b>top-down</b> to <i>how the error occurred</i>. Reading logs top-down gives the ability to reconstruct the flow of the program itself.
</p>

<p>
In this case, we can see that the the <code>loader</code> function is called, which then calls <code>append</code>, which then calls into the datasets library, and then eventually calls into a <code>map</code> on a <code>lambda</code>. So now we know that there's something wrong with the lambda function.
</p>
</div>
</div>
<div id="outline-container-org918bf52" class="outline-3">
<h3 id="org918bf52"><span class="section-number-3">1.4.</span> Print it (or use pdb)</h3>
<div class="outline-text-3" id="text-1-4">
<p>
At this point, it becomes unclear what's going on. It seems like the problem is <code>x["input_text"]</code> has a mismatching type, but we can't really be sure until we have a little more debugging information. The next stage can be done by simply replacing the <code>tokenizer</code> call with a print call, so <code>lambda x: tokenizer(x["input_text"], padding="max_length", truncation=True</code> becomes <code>lambda x: print(x["input_text"], type(x["input_text"]))</code>.
</p>

<p>
At this point, the answer was that <code>x["input_text"]</code> returned an incorrect datatype.
</p>
</div>
</div>
</div>
<div id="outline-container-org1b6176f" class="outline-2">
<h2 id="org1b6176f"><span class="section-number-2">2.</span> Debugging Mentality</h2>
<div class="outline-text-2" id="text-2">
<p>
The above traceback is a good example of working through the debugging mentality. The error messages will most likely tell you what the errors are, and the role of a programmer during debugging is to find out the <i>where</i> and the <i>how</i>. As a result, it's important to not approach debugging with a specific hypothesis. Each stage in the debugging process should give you more questions, and a programmer must use their brain in debugging. The goal of debugging is not to come in with a specific hypothesis and attempt to prove/disprove it, but rather to find the correct set of questions to answer, and gradually narrow it down. It's important to remain intellectually curious about how your system can behave pathologically.
</p>

<p>
If a programmer comes into the system with a predetermined set of hypotheses, it's easy to fiddle around with the code in order to (dis)prove those hypotheses. This is a very "scientific method" point of view, but as programmers, we luckily don't have to be constrained by that! The scientific process operates on <i>information</i>, which is why the mode and technique of inquiry is important. But software is <i>both information and a process</i><sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>, which means that programmers do not have to be bound in the same way. We can observe software in action, and take the logs of software to reconstruct the events, rather than testing specific conditions. As a result, it's important to never let your hypothesis about bugs overshadow what the error messages are saying.
</p>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Yes, I know the error is coming from directly the line above it, but I'm going to pretend to not understand the lambda for example purposes.
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Bryan Cantrill said this in some talk I can't recall.
</p></div></div>


</div>
</div>
</div>
</div>]]></description>
      <pubDate>2025-12-28</pubDate>
      <guid>http://malloc.dog/blog/2021/05/02/read-the-damn-error-message/</guid>
    </item>
    <item>
      <title>Shrines</title>
      <link>http://malloc.dog/shrines/</link>
      <description><![CDATA[<div>
<div class="post">
<h1>Shrines</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org8526491">1. Locations:</a></li>
</ul>
</div>
</div>
<div id="outline-container-org8526491" class="outline-2">
<h2 id="org8526491"><span class="section-number-2">1.</span> Locations:</h2>
<div class="outline-text-2" id="text-1">

<div id="orga7e8122" class="figure">
<p><img src="/assets/shrines/map.svg" alt="map.svg" class="org-svg" />
</p>
</div>

<p>
Photographs of various shrines I've seen. A shrine here is basically anything I consider to have spiritual significance.
</p>

<p>
<img src="/assets/shrines/akre-city-masjid.jpeg" alt="akre-city-masjid.jpeg" />
&lt; 2021:07:21 09:55:40 &gt; - &lt; <i>36.7586833333333, 43.8936416666667</i> &gt;
</p>

<p>
<img src="/assets/shrines/akre-sufi-shrine.jpeg" alt="akre-sufi-shrine.jpeg" />
&lt; 2021:07:21 11:25:05 &gt; - &lt; <i>36.7682833333333, 43.8941166666667</i> &gt;
</p>

<p>
<img src="/assets/shrines/algiers.jpeg" alt="algiers.jpeg" />
&lt; 2025:05:04 09:07:04 &gt; - &lt; <i>36.7849083333333, 3.06117222222222</i> &gt;
</p>

<p>
<img src="/assets/shrines/amman-mosque.jpeg" alt="amman-mosque.jpeg" />
&lt; 2019:07:05 16:42:06 &gt; - &lt; <i>31.9500888888889, 35.9348805555556</i> &gt;
</p>

<p>
<img src="/assets/shrines/basra-church-of-the-heart.jpeg" alt="basra-church-of-the-heart.jpeg" />
&lt; 2021:08:21 11:26:04 &gt; - &lt; <i>30.5183805555556, 47.8370138888889</i> &gt;
</p>

<p>
<img src="/assets/shrines/basra-masjid.jpeg" alt="basra-masjid.jpeg" />
&lt; 2021:08:21 16:46:12 &gt; - &lt; <i>30.4000805555556, 47.7329</i> &gt;
</p>

<p>
<img src="/assets/shrines/berlin.jpeg" alt="berlin.jpeg" />
&lt; 2022:04:05 14:46:38 &gt; - &lt; <i>52.5051333333333, 13.3355305555556</i> &gt;
</p>

<p>
<img src="/assets/shrines/bishkek.JPG" alt="bishkek.JPG" />
&lt; 2017:11:19 11:49:19 &gt; - &lt; <i>42.8782055555556, 74.6085277777778</i> &gt;
</p>

<p>
<img src="/assets/shrines/buenos-aires-church.jpeg" alt="buenos-aires-church.jpeg" />
&lt; 2023:11:19 16:46:06 &gt; - &lt; <i>-34.5871666666667, -58.4275361111111</i> &gt;
</p>

<p>
<img src="/assets/shrines/buenos-aires-peron-bar.jpeg" alt="buenos-aires-peron-bar.jpeg" />
&lt; 2023:11:19 19:27:05 &gt; - &lt; <i>-34.6173666666667, -58.3731277777778</i> &gt;
</p>

<p>
<img src="/assets/shrines/duhok-nala-roadside.jpeg" alt="duhok-nala-roadside.jpeg" />
&lt; 2023:05:06 11:17:21 &gt; - &lt; <i>36.9710305555556, 43.3164527777778</i> &gt;
</p>

<p>
<img src="/assets/shrines/dutch-kills.jpeg" alt="dutch-kills.jpeg" />
&lt; 2021:12:30 21:41:04 &gt; - &lt; <i>40.7478916666667, -73.9400722222222</i> &gt;
</p>

<p>
<img src="/assets/shrines/erbil-jalil-hayat.jpeg" alt="erbil-jalil-hayat.jpeg" />
&lt; 2021:07:10 13:30:36 &gt; - &lt; <i>36.2012555555556, 44.0189222222222</i> &gt;
</p>

<p>
<img src="/assets/shrines/flores-church.jpeg" alt="flores-church.jpeg" />
&lt; 2022:11:02 13:34:22 &gt; - &lt; <i>39.4537305555556, -31.2631083333333</i> &gt;
</p>

<p>
<img src="/assets/shrines/hakone-buddah-statue.jpg" alt="hakone-buddah-statue.jpg" />
&lt; 2017:12:13 15:24:18 &gt; - &lt; <i>35.2342944444444, 139.095322222222</i> &gt;
</p>

<p>
<img src="/assets/shrines/karbala-abbas.jpeg" alt="karbala-abbas.jpeg" />
&lt; 2022:07:14 22:57:18 &gt; - &lt; <i>32.6178972222222, 44.0359388888889</i> &gt;
</p>

<p>
<img src="/assets/shrines/karbala-al-hur.jpeg" alt="karbala-al-hur.jpeg" />
&lt; 2022:03:27 16:00:34 &gt; - &lt; <i>32.6511333333333, 43.984925</i> &gt;
</p>

<p>
<img src="/assets/shrines/karbala-ezekiel.jpeg" alt="karbala-ezekiel.jpeg" />
&lt; 2021:08:17 16:38:29 &gt; - &lt; <i>32.2266416666667, 44.367325</i> &gt;
</p>

<p>
<img src="/assets/shrines/karbala-hussein.jpeg" alt="karbala-hussein.jpeg" />
&lt; 2023:04:28 12:21:13 &gt; - &lt; <i>32.6158361111111, 44.032425</i> &gt;
</p>

<p>
<img src="/assets/shrines/karbala-old-graveyard.jpeg" alt="karbala-old-graveyard.jpeg" />
&lt; 2022:03:27 16:25:08 &gt; - &lt; <i>32.5944027777778, 44.0308694444444</i> &gt;
</p>

<p>
<img src="/assets/shrines/karbala-thai-mokeb.jpeg" alt="karbala-thai-mokeb.jpeg" />
&lt; 2022:09:13 22:22:00 &gt; - &lt; <i>32.3225666666667, 44.2666444444444</i> &gt;
</p>

<p>
<img src="/assets/shrines/kibla-najaf-karbala.jpeg" alt="kibla-najaf-karbala.jpeg" />
&lt; 2022:09:13 12:33:52 &gt; - &lt; <i>32.17915, 44.3124555555556</i> &gt;
</p>

<p>
<img src="/assets/shrines/laylish.jpeg" alt="laylish.jpeg" />
&lt; 2021:07:21 14:01:17 &gt; - &lt; <i>36.771225, 43.3034694444444</i> &gt;
</p>

<p>
<img src="/assets/shrines/lisboa-mosteiro-dos-jeronimos.jpeg" alt="lisboa-mosteiro-dos-jeronimos.jpeg" />
&lt; 2022:11:11 14:20:35 &gt; - &lt; <i>38.697475, -9.20533888888889</i> &gt;
</p>

<p>
<img src="/assets/shrines/montevideo-church.jpeg" alt="montevideo-church.jpeg" />
&lt; 2023:06:11 15:11:31 &gt; - &lt; <i>-34.9033777777778, -56.2006861111111</i> &gt;
</p>

<p>
<img src="/assets/shrines/najaf-ali.jpeg" alt="najaf-ali.jpeg" />
&lt; 2023:04:28 17:00:31 &gt; - &lt; <i>31.996075, 44.3149527777778</i> &gt;
</p>

<p>
<img src="/assets/shrines/nasyriah-marshes-shrine.jpeg" alt="nasyriah-marshes-shrine.jpeg" />
&lt; 2021:08:20 10:10:30 &gt; - &lt; <i>30.9798, 47.0426555555556</i> &gt;
</p>

<p>
<img src="/assets/shrines/paris-orthodox-church.jpeg" alt="paris-orthodox-church.jpeg" />
&lt; 2022:04:07 15:15:53 &gt; - &lt; <i>48.8777916666667, 2.30157222222222</i> &gt;
</p>

<p>
<img src="/assets/shrines/ponda-delgada-church.jpeg" alt="ponda-delgada-church.jpeg" />
&lt; 2022:10:26 17:04:06 &gt; - &lt; <i>37.7402583333333, -25.6622444444444</i> &gt;
</p>

<p>
<img src="/assets/shrines/ramadi-grave.jpeg" alt="ramadi-grave.jpeg" />
&lt; 2023:02:11 13:44:19 &gt; - &lt; <i>33.4045944444444, 43.4746388888889</i> &gt;
</p>

<p>
<img src="/assets/shrines/saint-hormuz-monastary.jpeg" alt="saint-hormuz-monastary.jpeg" />
&lt; 2021:07:21 15:02:46 &gt; - &lt; <i>36.7489916666667, 43.1152416666667</i> &gt;
</p>

<p>
<img src="/assets/shrines/san-salvador-rosario.jpg" alt="san-salvador-rosario.jpg" />
&lt; 2025:08:16 11:28:31 &gt; - &lt; <i>13.6972888888889, -89.1890472222222</i> &gt;
</p>

<p>
<img src="/assets/shrines/sf-church.jpeg" alt="sf-church.jpeg" />
&lt; 2023:03:11 17:00:44 &gt; - &lt; <i>37.7554944444444, -122.41735</i> &gt;
</p>

<p>
<img src="/assets/shrines/sf-computer-museum.jpeg" alt="sf-computer-museum.jpeg" />
&lt; 2023:03:12 15:53:12 &gt; - &lt; <i>37.4145777777778, -122.077561111111</i> &gt;
</p>

<p>
<img src="/assets/shrines/suli-erbil-roadside.jpeg" alt="suli-erbil-roadside.jpeg" />
&lt; 2023:05:15 16:51:08 &gt; - &lt; <i>35.668, 45.0039027777778</i> &gt;
</p>

<p>
<img src="/assets/shrines/suli-kazanazi.jpeg" alt="suli-kazanazi.jpeg" />
&lt; 2023:05:14 01:23:35 &gt; - &lt; <i>35.5663027777778, 45.3740194444444</i> &gt;
</p>

<p>
<img src="/assets/shrines/ushuaia-airport.jpeg" alt="ushuaia-airport.jpeg" />
&lt; 2023:11:05 13:46:30 &gt; - &lt; <i>-54.8397555555556, -68.3120194444444</i> &gt;
</p>

<p>
<img src="/assets/shrines/virgen-de-lourdes.jpg" alt="virgen-de-lourdes.jpg" />
&lt; 2024:01:13 17:32:06 &gt; - &lt; <i>-34.8535166666667, -55.9860916666667</i> &gt;
</p>
</div>
</div>

</div>
</div>]]></description>
      <pubDate>2025-12-28</pubDate>
      <guid>http://malloc.dog/shrines/</guid>
    </item>
    <item>
      <title>El Salvador</title>
      <link>http://malloc.dog/field/elsalvador</link>
      <description><![CDATA[<div>
<div class="post">
<h1>El Salvador</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org648e327">1. Fiestas de Agosto</a>
<ul>
<li><a href="#orgd221a39">1.1. Mass on the 6th</a></li>
</ul>
</li>
<li><a href="#orgd6b4d8c">2. Romero</a></li>
<li><a href="#org5cf5eeb">3. Misc</a></li>
<li><a href="#orga532566">4. Wrap</a></li>
</ul>
</div>
</div>

<div id="org6c0ce24" class="figure">
<p><img src="/assets/field/elsalvador/san-salvador.JPG" alt="san-salvador.JPG" />
</p>
</div>

<p>
I just came back from three weeks in El Salvador. You land to a giant sign that says "El Salvador, the Land of Smiles," which might be a stretch. Summer means rain most afternoons; thunderstorms drift through most evenings for an hour or two.
</p>

<p>
I spent three weeks in the city for the Fiestas de Agosto and San Salvador's 500th anniversary of its founding. I came for the procession and stayed for small things: pupusas on paper, Cadejo blond ale cold, guards choreographing gates. It felt safe in the center and easy to move. The coast and a volcano sit a short drive away. These notes are about the capital, plus a hike and a beach run.
</p>

<p>
San Salvador is not really a walkable city beyond the center, which closes early. Barbed wire separates most neighborhoods, and most people get around by motorcycle or car. Like parts of the Middle East, wealthier areas self-segregate into small malls and shopping zones, while walkability is less prized. There are token bike lanes in some wealthy areas, but it's not easy to walk around.
</p>

<p>
Military presence is everywhere. Although none of them checked my ID<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>, soldiers are posted across the city.
</p>
<div id="outline-container-org648e327" class="outline-2">
<h2 id="org648e327"><span class="section-number-2">1.</span> Fiestas de Agosto</h2>
<div class="outline-text-2" id="text-1">

<div id="orgf80ae82" class="figure">
<p><img src="/assets/field/elsalvador/festival.jpeg" alt="festival.jpeg" />
</p>
</div>
<blockquote>
<p>
Sivarland at night. Rain slick, smoke, Ferris wheel lit.
</p>
</blockquote>

<p>
I came into the festival by the southern gate around 8pm. First hit was sugar and oil from churros, then gunpowder. Generators droned. Cables sagged over the walkway. A kid, fingers sticky, bumped into me and the parent shot me an apologetic look.
</p>

<p>
Soldiers are present without hurry. Long guns slung, hands light on the grip. At the gate, they asked three questions, looked at my bag, and waved me through. The choreography at gatehouses is quick: a nod, a clipboard, a latch.
</p>

<p>
Sivarland, the carnival zone, runs loud for six days at the start of August<sup><a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>. Ferris wheels, drums, fireworks, vendors in the street. The point is to celebrate the Transfiguration of Christ, with the fiesta leading up to the event mass at the metropolitan church.
</p>


<div id="orgea744b3" class="figure">
<p><img src="/assets/field/elsalvador/festival-vendor.JPG" alt="festival-vendor.JPG" />
</p>
</div>
<blockquote>
<p>
“Elotes Locos,” “Papitas Fritas,” “Churros Españoles.” Prices in marker, cables overhead.
</p>
</blockquote>

<p>
I walked the loop twice looking for a beer and failed. Drinks were soda and water; I gave up and had a cold one at home. Maybe that’s policy during the fair. There was a concert going on as well, and carnival rides and families gathered everywhere. Circus animals, and plenty of military strolling around.
</p>

<p>
It’s a carnival threaded with Jesus: banners on ride fronts, a small altar by the speakers, a prayer before the fireworks. 
</p>
</div>
<div id="outline-container-orgd221a39" class="outline-3">
<h3 id="orgd221a39"><span class="section-number-3">1.1.</span> Mass on the 6th</h3>
<div class="outline-text-3" id="text-1-1">

<div id="org4e3ccd1" class="figure">
<p><img src="/assets/field/elsalvador/mass.JPG" alt="mass.JPG" />
</p>
</div>
<blockquote>
<p>
Gathered at mass.
</p>
</blockquote>

<p>
The Catedral Metropolitana filled for the Transfiguration. I stood for hours in sun and shade. The homily circled Romero and opened with a prayer for migrants in the United States. People shaded their faces with programs and parasols. Water sellers threaded the aisle. A woman beside me whispered each response half a beat early. When the final hymn started the square sang back.
</p>

<p>
The mass was reserved. The priest focused on Salvadorans in the US in light of recent deportations, then transitioned to Romero and the struggles of priests past. I've been to many masses in Mar Yousef in Erbil, and this one felt tame in comparison.
</p>

<p>
The cathedral square is big, with one of those small parks that has a few water fountains from the ground for children to play in. There's a variety of good coffee shops around<sup><a id="fnr.3" class="footref" href="#fn.3" role="doc-backlink">3</a></sup> the square itself, framed by the gigantic National Library<sup><a id="fnr.4" class="footref" href="#fn.4" role="doc-backlink">4</a></sup> and the National Palace. It's a relaxing area. Later in the day, I trekked back inside the cathedral, and it's surprisingly sparse. The cathedral still has two large portraits of Romero hanging on the side:
</p>


<div id="orgc55fa01" class="figure">
<p><img src="/assets/field/elsalvador/cathedral.jpeg" alt="cathedral.jpeg" />
</p>
</div>

<p>
Romero is present in the air, not just in museums. The priest quoted him twice; the crowd answered both times. This was particularly surprising to me, as I had vaguely known about his influence, but never seriously considered it. Matt Eisenbrandt puts it<sup><a id="fnr.5" class="footref" href="#fn.5" role="doc-backlink">5</a></sup>:
</p>
<blockquote>
<p>
Óscar Romero is one of the towering heroes in El Salvador’s history whose influence transcends the borders of that small country. Romero’s impact can be measured quantitatively, by the 100,000 mourners who risked their lives to attend his funeral, or by the disturbing truth that his assassination accelerated El Salvador’s descent into civil war.
</p>
</blockquote>
</div>
</div>
</div>
<div id="outline-container-orgd6b4d8c" class="outline-2">
<h2 id="orgd6b4d8c"><span class="section-number-2">2.</span> Romero</h2>
<div class="outline-text-2" id="text-2">
<p>
He is everywhere: bus decals, murals, keychains at the cathedral gate. The strongest encounter was at the hospital chapel where he was killed. A small room holds his vestments and diary pages. The guide speaks softly and points with two fingers. Outside, a white rose bush is kept trimmed. The shadow he casts is practical as much as holy: quotes on banners, names on parish flyers, a tone of moral certainty in casual talk.
</p>

<p>
I found the Museo de la Palabra y la Imagen to be the default memory/genocide museum. While small compared to the Art Museum or the Dr. David J. Guzmán National Museum, it had a dedicated exhibition on Romero and the civil war.
</p>

<p>
The Romero section was filled with photos of his life, including the elephant he met at the San Salvador Zoo. Photos of him preaching, busts of his face, his family, his notes. The whole space functioned as a shrine, and that's striking because many religious figures people strive to emulate are far away (temporally speaking). Kobo Daishi, Anastasia, and Hussein exist as canonical figures, but Romero exists in color photographs. You can walk the same paths he did, go to the same restaurants he did. Many people who are still alive today remember him.
</p>

<p>
There's an art to the construction of a saint, especially one that transgresses borders. Romero functions as a politicized sainthood, and I'd almost place him alongside Sheikh Abdesslam Yassine, the Moroccan cleric who wrote Al-Islam aw al-tufan<sup><a id="fnr.6" class="footref" href="#fn.6" role="doc-backlink">6</a></sup> to admonish King Hassan II. This form of sainthood is active: Yassine set himself against an oppressive regime, and both he and Romero cast long shadows with religious authority contrasted against political power.
</p>

<p>
Saints are made by the people before they are made by institutions, which you can see in Romero's late canonization in 2018. But Salvadoran society is saturated with Romero, which raises the question of how a living saint becomes a martyr when reproductions and evidence of their life are so obvious and near. Martyrdom is almost easier without photos and documents; you can dramatize, reproduce, replay the saintly life into thematic principles. But Romero and Yassine are difficult to shape or dramatize, as their lives press so close to believers. 
</p>

<p>
Self-censorship is a spectrum, but I had expected there to be significantly less space dedicated to the civil war than there actually was. Numerous photos, faces in black-and-white prints of fighters, and an old classroom kept as it was. A small candle monument to those who died, and an entire gigantic room dedicated to a reproduction of Radio Venceremos.
</p>


<div id="orgd417c5d" class="figure">
<p><img src="/assets/field/elsalvador/radio.JPG" alt="radio.JPG" />
</p>
</div>
<blockquote>
<p>
Reproduction of the broadcasting room.
</p>
</blockquote>

<p>
Radio Venceremos was one of the largest anti-government radio stations of the FMLN. Famously, the government tried so hard to shut them down that radio broadcasters used themselves as bait to lure a government general, and shot down his helicopter. It was on Venceremos that the end of the civil war was broadcast. This room is remarkable as well in its completeness, one can easily see that this room was carved with care.
</p>
</div>
</div>
<div id="outline-container-org5cf5eeb" class="outline-2">
<h2 id="org5cf5eeb"><span class="section-number-2">3.</span> Misc</h2>
<div class="outline-text-2" id="text-3">
<p>
I was vaguely aware that Bukele was Palestinian, but I didn't realize how much emigration of Palestinians occurred <b>to</b> El Salvador until I walked by Schafik Hándal's massive grave.
</p>


<div id="org9229544" class="figure">
<p><img src="/assets/field/elsalvador/handal.JPG" alt="handal.JPG" />
</p>
</div>

<p>
Handal was the general secretary of the FMLN, and fought against the government and then eventually transitioned to becoming a politician.
</p>

<p>
It's in the food too; I kept seeing <b>quibe</b> (kibbeh) on menus and even a restaurant called "Matkub." The graves of Palestinian resistance fighters are all over the necropolis too.
</p>
</div>
</div>
<div id="outline-container-orga532566" class="outline-2">
<h2 id="orga532566"><span class="section-number-2">4.</span> Wrap</h2>
<div class="outline-text-2" id="text-4">
<p>
I liked El Salvador. It's a small country, so you can cross it in a few hours, but there's surprising depth in the politics and history. I especially enjoyed the necropolis; it resembles the one in Buenos Aires. 
</p>


<div id="orgb019097" class="figure">
<p><img src="/assets/field/elsalvador/beach-horse.jpeg" alt="beach-horse.jpeg" />
</p>
</div>


<ul class="org-ul">
<li>More Photos: <a href="/assets/field/el-salvador/">Link</a></li>
</ul>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
In Lebanon and Iraq, I'd expect checkpoints staffed by the military to stop me and check IDs. I hit zero checkpoints in El Salvador. 
</p></div></div>

<div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
“Sivar” is a local nickname for San Salvador.
</p></div></div>

<div class="footdef"><sup><a id="fn.3" class="footnum" href="#fnr.3" role="doc-backlink">3</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Salvadorans are proud of their coffee production and culture. 
</p></div></div>

<div class="footdef"><sup><a id="fn.4" class="footnum" href="#fnr.4" role="doc-backlink">4</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Donated in part from the Chinese apparently.
</p></div></div>

<div class="footdef"><sup><a id="fn.5" class="footnum" href="#fnr.5" role="doc-backlink">5</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
Eisenbrandt, Matt. Assassination of a Saint: The Plot to Murder Óscar Romero and the Quest to Bring His Killers to Justice. University of California Press, 2017.
</p></div></div>

<div class="footdef"><sup><a id="fn.6" class="footnum" href="#fnr.6" role="doc-backlink">6</a></sup> <div class="footpara" role="doc-footnote"><p class="footpara">
"Islam or the Deluge"
</p></div></div>


</div>
</div>
</div>
</div>]]></description>
      <pubDate>2025-12-28</pubDate>
      <guid>http://malloc.dog/field/elsalvador</guid>
    </item>
  </channel>
</rss>