<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Shells Angels</title>
    <link>http://localhost:1313/</link>
    <description>Recent content on Shells Angels</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 18 May 2026 11:00:00 +0200</lastBuildDate>
    <atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>What rspamd&#39;s neural module is actually learning</title>
      <link>http://localhost:1313/posts/rspamd-neural-demystified/</link>
      <pubDate>Mon, 18 May 2026 11:00:00 +0200</pubDate>
      <guid>http://localhost:1313/posts/rspamd-neural-demystified/</guid>
      <description>&lt;p&gt;If you have switched on rspamd&amp;rsquo;s &lt;code&gt;neural&lt;/code&gt; module, watched it tick along for a quarter, and noticed that the network is contributing almost nothing useful — &lt;code&gt;NEURAL_HAM&lt;/code&gt; firing on most of the inbound stream, never moving the score in any direction that matters — the explanation is usually not a bug. The module is doing what the config tells it to. The mental model in your head doesn&amp;rsquo;t match.&lt;/p&gt;&#xA;&lt;p&gt;The thing to internalise first is what the network actually reads. The body of the message never reaches it. There is no tokeniser, no embedding, no representation of &amp;ldquo;what spam looks like&amp;rdquo; learned from bytes on the wire. The inputs are the firing pattern of every other enabled rspamd symbol for the message being scored: &lt;code&gt;BAYES_SPAM&lt;/code&gt;, &lt;code&gt;DKIM_REJECT&lt;/code&gt;, your noisy &lt;code&gt;RBL_FOO&lt;/code&gt;, the &lt;code&gt;MULTIMAP&lt;/code&gt;-derived greylist hint, the spamtrap signal, whatever else you have wired in. That floating-point vector goes through a small feedforward network — one hidden layer in stock, two if somebody tuned it, tanh activation, small enough to evaluate in microseconds on the same core that did the regex pass — and the network emits one scalar that becomes the contribution of one more symbol (&lt;code&gt;NEURAL_SPAM&lt;/code&gt; or &lt;code&gt;NEURAL_HAM&lt;/code&gt;) to the final score.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What `set -e` actually does (and why your script still leaks)</title>
      <link>http://localhost:1313/posts/what-set-minus-e-actually-does/</link>
      <pubDate>Tue, 12 May 2026 08:00:00 +0200</pubDate>
      <guid>http://localhost:1313/posts/what-set-minus-e-actually-does/</guid>
      <description>&lt;p&gt;You&amp;rsquo;ve seen this line. You probably wrote it this morning. Almost every &amp;ldquo;robust bash script&amp;rdquo; preamble on the internet starts with some variant of:&lt;/p&gt;&#xA;&lt;div class=&#34;codeblock&#34; data-lang=&#34;bash&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/usr/bin/env bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -euo pipefail&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;IFS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;$&amp;#39;\n\t&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;It is, line for line, the most copy-pasted snippet in the DevOps world. And almost every engineer I have worked with, including (until embarrassingly recently) me, has been wrong about what &lt;code&gt;set -e&lt;/code&gt; does.&lt;/p&gt;&#xA;&lt;p&gt;This post is about the rules. Not the folklore.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SIGSEGV at 03:14 — when forbid(unsafe_code) doesn&#39;t save you</title>
      <link>http://localhost:1313/posts/sigsegv-at-0314/</link>
      <pubDate>Tue, 28 Apr 2026 09:30:00 +0200</pubDate>
      <guid>http://localhost:1313/posts/sigsegv-at-0314/</guid>
      <description>&lt;p&gt;The first page came in on a Tuesday. 03:14 AM local. Not 03:00, not 03:30. 03:14, for four nights in a row.&lt;/p&gt;&#xA;&lt;p&gt;The journal entry that woke me up:&lt;/p&gt;&#xA;&lt;div class=&#34;codeblock&#34; data-lang=&#34;text&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[2026-04-22T03:14:07.882Z] worker[7]: received signal: SIGSEGV (11)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[2026-04-22T03:14:07.882Z] worker[7]: fault address: 0x7f9c1afc0000 (not mapped)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[2026-04-22T03:14:07.882Z] worker[7]: dumping core to /var/crash/inventory-7.core.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[2026-04-22T03:14:08.014Z] worker[7]: exit code 139&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[2026-04-22T03:14:08.014Z] systemd[1]: inventory-svc.service: Main process exited&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[2026-04-22T03:14:08.015Z] systemd[1]: inventory-svc.service: Scheduling restart in 5s.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The service is in Rust. Seventeen crates in the workspace, every one with &lt;code&gt;#![forbid(unsafe_code)]&lt;/code&gt; at the top. Rust services crash, but they crash so seldom that this one woke the whole team within an hour. By the third night we had a war room.&lt;/p&gt;</description>
    </item>
    <item>
      <title>io_uring for people who already know epoll</title>
      <link>http://localhost:1313/posts/io-uring-for-epoll-users/</link>
      <pubDate>Mon, 30 Mar 2026 11:00:00 +0200</pubDate>
      <guid>http://localhost:1313/posts/io-uring-for-epoll-users/</guid>
      <description>&lt;p&gt;If you have written a network service in C or Rust on Linux in the last twenty years, you know &lt;code&gt;epoll&lt;/code&gt;. You know the dance: &lt;code&gt;epoll_create1&lt;/code&gt;, &lt;code&gt;epoll_ctl&lt;/code&gt;, &lt;code&gt;epoll_wait&lt;/code&gt;, set non-blocking, read until &lt;code&gt;EAGAIN&lt;/code&gt;, write until &lt;code&gt;EAGAIN&lt;/code&gt;, mind the edge-triggered semantics, mind &lt;code&gt;EPOLLRDHUP&lt;/code&gt;, mind &lt;code&gt;EPOLLET&lt;/code&gt; + &lt;code&gt;EPOLLONESHOT&lt;/code&gt; and the dozen footnotes attached to each.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;io_uring&lt;/code&gt; is the &lt;a href=&#34;https://kernel.dk/io_uring.pdf&#34; rel=&#34;noopener external&#34; target=&#34;_blank&#34;&gt;Linux answer&lt;/a&gt;&#xA; to &amp;ldquo;what if we stopped doing one syscall per I/O and did batched, async, completion-based I/O instead.&amp;rdquo; It landed in 5.1 (2019) and has been growing every kernel release since. By 2026 the API surface is large and the ecosystem has finally caught up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>http://localhost:1313/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/about/</guid>
      <description>&lt;h2 id=&#34;what-this-is&#34;&gt;What this is&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Shells Angels&lt;/strong&gt; is the tech blog of &lt;a href=&#34;https://netitwork.net&#34; rel=&#34;noopener external&#34; target=&#34;_blank&#34;&gt;NETitwork&lt;/a&gt;&#xA;. The kind of thing you bookmark on a Sunday afternoon to learn something new from people that live on the boundaries of technical challenges or daily operational routine in enterprise networks. Each post is meant to be a reference — something that survives skimming and still rewards careful reading.&lt;/p&gt;&#xA;&lt;p&gt;The topics that come up here:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Unix shells &amp;amp; POSIX trivia&lt;/strong&gt; — the weird edges of &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;zsh&lt;/code&gt;, &lt;code&gt;fish&lt;/code&gt;, &lt;code&gt;dash&lt;/code&gt;; signal handling; subshells; pipelines with exit codes nobody respects.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Kernel &amp;amp; systems internals&lt;/strong&gt; — Linux/Unix process model, syscalls, namespaces, eBPF, the io_uring saga.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Exploit dev &amp;amp; defensive security&lt;/strong&gt; — heap shapes, mitigations, sandbox escapes; the angel/devil dichotomy in our threat models.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Distributed systems failure prevention&lt;/strong&gt; — what happens at 03:14 AM and why it&amp;rsquo;s almost never the thing on the dashboard.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tooling &amp;amp; ergonomics&lt;/strong&gt; — terminals, debuggers, profilers, and the slow art of building a workshop you trust.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cool tech &amp;amp; solutions&lt;/strong&gt; - Cool tech from environments with the highest possible demands in stability, security and/or compatibility&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;what-this-isnt&#34;&gt;What this isn&amp;rsquo;t&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A newsletter. Plug in &lt;a href=&#34;http://localhost:1313/index.xml&#34;&gt;the RSS feed&lt;/a&gt;&#xA; and you&amp;rsquo;re done.&lt;/li&gt;&#xA;&lt;li&gt;A list of ten things, including the one that will shock you.&lt;/li&gt;&#xA;&lt;li&gt;Anywhere your data goes. There is no analytics script, no third-party font, no cookie banner because there are no cookies.&lt;/li&gt;&#xA;&lt;li&gt;A money source. We take the TED approach: &amp;ldquo;Ideas worth sharing&amp;rdquo;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-its-built&#34;&gt;How it&amp;rsquo;s built&lt;/h2&gt;&#xA;&lt;p&gt;The full source — including this page — is plain markdown, plain CSS, and ~3 KB of optional JavaScript that handles theme switching and some bling bling. Everything still works with JS disabled; the content is the point.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
