<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>xlii.space</title>
    <link>https://xlii.space/</link>
    <description>Recent content on xlii.space</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 02 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://xlii.space/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Elegant Rust with proc macros</title>
      <link>https://xlii.space/eng/elegant-rust-with-proc-macros/</link>
      <pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/elegant-rust-with-proc-macros/</guid>
      <description>&lt;p&gt;When writing immediate mode (egui) applications it comes to me quickly that nigh all logic computations should be done off the UI thread. There are many ways to approach it, however as a fan of event-based systems sooner or later I implement some kind of event handling. The pattern is almost the same with minor differences and looks like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[derive(Clone)]&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ProcessorConfig&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; id: String }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[derive(Clone)]&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TaskResult&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; success: &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;State&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; active_tasks: Vec&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#[derive(Clone)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Event&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ProcessorStart { config: &lt;span style=&#34;color:#a6e22e&#34;&gt;ProcessorConfig&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ProcessorStop,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  LongRunningTask { id: &lt;span style=&#34;color:#66d9ef&#34;&gt;u32&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  LongRunningTaskComplete { task_result: &lt;span style=&#34;color:#a6e22e&#34;&gt;TaskResult&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;EventHandler&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  state: &lt;span style=&#34;color:#a6e22e&#34;&gt;Arc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;RwLock&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;State&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tx: &lt;span style=&#34;color:#a6e22e&#34;&gt;tokio&lt;/span&gt;::mpsc::Sender&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Event&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;impl&lt;/span&gt; EventHandler {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handle&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, event: &lt;span style=&#34;color:#a6e22e&#34;&gt;Event&lt;/span&gt;, event_queue: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; VecDeque&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Event&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; Event::&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt; event {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ProcessorStart { &lt;span style=&#34;color:#f92672&#34;&gt;..&lt;/span&gt; } &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; self.process_processor_start(event, event_queue),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ProcessorStop &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; self.process_processor_stop(event, event_queue),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      LongRunningTask { &lt;span style=&#34;color:#f92672&#34;&gt;..&lt;/span&gt; } &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; self.process_long_running_task(event, event_queue),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      LongRunningTaskComplete { &lt;span style=&#34;color:#f92672&#34;&gt;..&lt;/span&gt; } &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; self.process_long_running_task_complete(event, event_queue),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;process_processor_start&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, event: &lt;span style=&#34;color:#a6e22e&#34;&gt;Event&lt;/span&gt;, _event_queue: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; VecDeque&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Event&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Event::ProcessorStart { config } &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; event &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Starting processor with config: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, config.id);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;process_processor_stop&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, event: &lt;span style=&#34;color:#a6e22e&#34;&gt;Event&lt;/span&gt;, _event_queue: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; VecDeque&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Event&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Event::ProcessorStop &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; event &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Stopping processor...&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;process_long_running_task&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, event: &lt;span style=&#34;color:#a6e22e&#34;&gt;Event&lt;/span&gt;, _event_queue: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; VecDeque&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Event&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Event::LongRunningTask { id } &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; event &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Starting task &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, id);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Ok(&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; state) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self.state.write() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      state.active_tasks.push(id);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;process_long_running_task_complete&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self, event: &lt;span style=&#34;color:#a6e22e&#34;&gt;Event&lt;/span&gt;, _event_queue: &lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mut&lt;/span&gt; VecDeque&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Event&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Event::LongRunningTaskComplete { task_result } &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; event &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Task completed. Success: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, task_result.success);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; Ok(&lt;span style=&#34;color:#66d9ef&#34;&gt;mut&lt;/span&gt; state) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self.state.write() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      state.active_tasks.clear(); &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>datafuck</title>
      <link>https://xlii.space/projects/datafuck/</link>
      <pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/projects/datafuck/</guid>
      <description>&lt;p&gt;Ever heard about Brainf*ck language?&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s an esoteric language that has 8 operators that programmer can use to create programs. This, for example, is &amp;ldquo;Hello World&amp;rdquo; example:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;++++++++[&amp;lt;+++++++++&amp;gt;-]&amp;lt;.&amp;gt;++++[&amp;lt;+++++++&amp;gt;-]&amp;lt;+.+++++++..+++.&amp;gt;&amp;gt;++++++[&amp;lt;+++++++&amp;gt;-]&amp;lt;++.------------.&amp;gt;++++++[&amp;lt;+++++++++&amp;gt;-]&amp;lt;+.&amp;lt;.+++.------.--------.&amp;gt;&amp;gt;&amp;gt;++++[&amp;lt;++++++++&amp;gt;-]&amp;lt;+.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In case Brainf*ck name is too offensive, there is also Ook! Ook! language that uses pairs of &lt;code&gt;Ook.&lt;/code&gt;, &lt;code&gt;Ook?&lt;/code&gt; and &lt;code&gt;Ook!&lt;/code&gt; as operators. An example operators in Ook! Ook! is &lt;code&gt;Ook! Ook.&lt;/code&gt; or another is &lt;code&gt;Ook? Ook?&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I guess you can already see that I have some experience with esoteric languages.&lt;/p&gt;</description>
    </item>
    <item>
      <title>llmuxer</title>
      <link>https://xlii.space/projects/llmuxer/</link>
      <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/projects/llmuxer/</guid>
      <description>&lt;p&gt;Every LLM-backed tool I built started the same way: wire up an API client, handle key storage, paper over provider quirks. hn-jobs-evaluator had Gemini baked in. Next tool, same plumbing from scratch.&lt;/p&gt;&#xA;&lt;p&gt;llmuxer is the extraction of that pattern into a 3-crate library.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;llmuxer&lt;/code&gt; is the core: &lt;code&gt;LlmConfig&lt;/code&gt; holds provider + key, builds a client, and exposes &lt;code&gt;QueryBuilder&lt;/code&gt; and &lt;code&gt;CacheBuilder&lt;/code&gt; via a fluent interface. Provider differences stay inside.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;llmuxer-keystore&lt;/code&gt; persists configs so you&amp;rsquo;re not re-entering API keys across tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title>It Takes All The Running You Can Do to Still Not Get a Job</title>
      <link>https://xlii.space/thoughts/it-takes-all-the-running-you-can-do/</link>
      <pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/thoughts/it-takes-all-the-running-you-can-do/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been almost 20 years since I started working as a software engineer. Finding my next role has become excruciatingly difficult. If you&amp;rsquo;re looking for someone like me, my resume is linked - feel free to reach out.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I rarely sent out more than three applications. Usually, from those three that I sent, two resulted in interview invitations that converted to offers.&lt;/p&gt;&#xA;&lt;p&gt;Today the reality is vastly different. Out of 20 applications I sent, and those were carefully selected - I don&amp;rsquo;t like going wide - only four resulted in initial interviews. None have led to an offer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HN Jobs Evaluator</title>
      <link>https://xlii.space/projects/hn-jobs-evaluator/</link>
      <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/projects/hn-jobs-evaluator/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;../hn_jobs_evaluator.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Monthly &amp;ldquo;Who&amp;rsquo;s Hiring&amp;rdquo; threads on HN are a mess to filter. Freeform text, dynamic ordering - keyword search misses half the relevant listings.&lt;/p&gt;&#xA;&lt;p&gt;Good problem for an LLM. I built a Rust/egui app that fetches the thread, scores each listing against your resume and requirements via Gemini, ranks by fit.&lt;/p&gt;&#xA;&lt;p&gt;The interesting design decision was the UI. Listings are long, evaluations are freeform, there are hundreds of them. CLI/TUI ruled out immediately - some descriptions wouldn&amp;rsquo;t fit a screen. A table with scrollable cells is quirky (scroll-in-scroll), but it&amp;rsquo;s the only layout that lets you skim fast without losing context. Everything else I tried either hid too much or required too many clicks to get anywhere.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your Static Types Are Not Safe. Mine Are.</title>
      <link>https://xlii.space/eng/your-static-types-are-not-safe-mine-are/</link>
      <pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/your-static-types-are-not-safe-mine-are/</guid>
      <description>&lt;p&gt;Every software engineer worth their salt has lived through the static vs dynamic debate at least once. It&amp;rsquo;s a good debate to have, many times even. The arguments are well known but often tackled from different angles. At its core, however, it goes in a similar direction. Static types give confidence, ease of refactoring, guarantees. Dynamic types give flexibility, ease of use and no-fuss development. Both are equally successful at delivering software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Approved. Unread. Shipped.</title>
      <link>https://xlii.space/fiction/approved_unread_shipped/</link>
      <pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/fiction/approved_unread_shipped/</guid>
      <description>&lt;p&gt;Every team has a code review process. Tickets move, PRs open, comments accumulate, something gets merged. The system looks like it&amp;rsquo;s working because the system looks like it&amp;rsquo;s working.&lt;/p&gt;&#xA;&lt;p&gt;This is about what actually happens in the middle part &amp;ndash; between &amp;ldquo;created&amp;rdquo; and &amp;ldquo;merged&amp;rdquo; &amp;ndash; and the people doing it. You&amp;rsquo;ve worked with all of them. One of them is you.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;the-pure-engineer&#34;&gt;The Pure Engineer&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;&amp;ldquo;Politics is for people who can&amp;rsquo;t write good code.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>I Hate Github Actions with Passion</title>
      <link>https://xlii.space/eng/i-hate-github-actions-with-passion/</link>
      <pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/i-hate-github-actions-with-passion/</guid>
      <description>&lt;p&gt;I can&amp;rsquo;t overstate how much I hate GitHub Actions. I don&amp;rsquo;t even remember hating any other piece of technology I used. Sure, I still make fun of PHP that I remember from times of PHP4&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, but even then I didn&amp;rsquo;t &lt;em&gt;hate&lt;/em&gt; it. Merely I found it subpar technology to other emerging at the time (like Ruby on Rails or Django). And yet I hate GitHub Actions.&lt;/p&gt;&#xA;&lt;p&gt;With Passion&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;    &lt;img src=&#34;https://xlii.space/images/github-actions-workflow-failed-small_hu_41b5aaa5fc955172.jpg&#34; width=&#34;659&#34; height=&#34;400&#34; alt=&#34;&#34;&gt;&#xA;  &#xA;&#xA;&#xA;&lt;h2 id=&#34;road-to-hell&#34;&gt;Road to Hell&lt;/h2&gt;&#xA;&lt;p&gt;Day before writing these words I was implementing &lt;code&gt;build.rs&lt;/code&gt; for my &lt;a href=&#34;https://github.com/exlee/tmplr&#34;&gt;tmplr&lt;/a&gt; project. To save you a click - it is a file/project scaffold tool with human readable (and craftable) template files. I (personally) use it very often, given how easy it is to craft new templates, by hand or with aid of the tool, so check it out if you need a similar tool.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CUE Does It All, But Can It Literate?</title>
      <link>https://xlii.space/cue/cue-does-it-all-but-can-it-literate/</link>
      <pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/cue/cue-does-it-all-but-can-it-literate/</guid>
      <description>&lt;p&gt;&lt;code&gt;CUE&lt;/code&gt; is the Swiss Army knife of file generation. It is the tool you grab when you need to generate complex JSON, validate YAML, or generally stop configuration files from ruining your life. It slices, it dices, it ensures your integers are actually integers. But guess what else it can be? It turns out, it is also a surprisingly effective &lt;strong&gt;&lt;strong&gt;Literate Programming&lt;/strong&gt;&lt;/strong&gt; tool.&lt;/p&gt;&#xA;&lt;p&gt;This is important because, let’s be honest, the current king of this hill is &lt;code&gt;org-mode&lt;/code&gt;. And while &lt;code&gt;org-mode&lt;/code&gt; is powerful, it is also a bit of a golden cage. It works perfectly as long as you never leave the Emacs ecosystem. But the moment you try to export a workflow to a colleague who uses VS Code, you realize you have accidentally signed up for vendor lock-in. You want your documentation - your &amp;ldquo;literate code&amp;rdquo; - to be portable, not a magic spell that only works inside one specific editor.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Four-Language Waltz: A Tale of Allocators and Regret</title>
      <link>https://xlii.space/eng/the-four-language-waltz-a-tale-of-allocators-and-regret/</link>
      <pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/the-four-language-waltz-a-tale-of-allocators-and-regret/</guid>
      <description>&lt;p&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-definition-of-insanity&#34;&gt;The Definition of Insanity&lt;/h2&gt;&#xA;&lt;p&gt;They say the definition of insanity is doing the same thing over and&#xA;over again and expecting different results. In software engineering,&#xA;we call this &amp;ldquo;benchmarking.&amp;rdquo; Or, in my specific case, &amp;ldquo;rewriting a&#xA;template utility four times because I am spiritually incapable of&#xA;settling.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The goal was simple. Deceptively so. I wanted a tool called &lt;code&gt;tmplr&lt;/code&gt;. Its&#xA;job? To take a template, sprinkle in some variables, and spit out a&#xA;file. It is the sort of task that a shell script could do if you&#xA;didn&amp;rsquo;t value your sanity, or that Python could do if you didn&amp;rsquo;t value&#xA;your startup time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Multi-package Haskell project with file dispersion done in Cue</title>
      <link>https://xlii.space/cue/multi-package-haskell-with-cue/</link>
      <pubDate>Fri, 28 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/cue/multi-package-haskell-with-cue/</guid>
      <description>&lt;p&gt;&amp;hellip;also known as synergized orchestration of federated functional&#xA;paradigms via lattice-theoretic constraint-based asset dissemination&#xA;&lt;code&gt;;-)&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;or &amp;ldquo;how I generate X YAML files with Cue to keep my sanity intact&amp;rdquo;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I like modularity. When working on &lt;a href=&#34;https://microdiagram.com&#34;&gt;my project&lt;/a&gt; I made every diagram (or&#xA;parts of it) into separate module. E.g. something like this:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://xlii.space/ox-hugo/haskell_cue_package.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Unfortunately - Haskell&amp;rsquo;s Stack gets confused and then (for example) testing&#xA;&lt;code&gt;mod2&lt;/code&gt; makes it rebuild whole application; slow and annoying.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple make file with CUE</title>
      <link>https://xlii.space/cue/simple-make-file-with-cue/</link>
      <pubDate>Fri, 21 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/cue/simple-make-file-with-cue/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cue&#34; data-lang=&#34;cue&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// make_tool.cue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;package&lt;/span&gt; main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool/file&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;files&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;command&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; make&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; k&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; v &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; files {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;\(&lt;/span&gt;k&lt;span style=&#34;color:#e6db74&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; file.Create &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      filename&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; k&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      contents&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; v.contents&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a quick boilerplate for Cue lang to start producing (text) files.&lt;/p&gt;&#xA;&lt;p&gt;That way one can create many (consistent!) files from a single Cue file/package by using&#xA;&lt;code&gt;cue cmd make&lt;/code&gt;. As an example - I use it to generate Pikchr diagrams&#xA;wrapped in Markdown:&lt;/p&gt;</description>
    </item>
    <item>
      <title>On Small Functions (and Haskell)</title>
      <link>https://xlii.space/eng/small-functions/</link>
      <pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/small-functions/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re one of my 3 stalkers &lt;em&gt;(HEY Y&amp;rsquo;ALL!)&lt;/em&gt;, you might&amp;rsquo;ve noticed that&#xA;I started to write about Haskell recently. If not, well you know now&#xA;&lt;code&gt;:)&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Haskell is a nice language in a way that it teaches one (i.e. me) a&#xA;new tricks. Tricks from Haskell that I started started wrtiting a&#xA;piece about. I&amp;rsquo;m at the trick of small functions but I also recently&#xA;read an interesting article with which I don&amp;rsquo;t (in general) agree and&#xA;decided to follow on &amp;ndash;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;a href=&#34;https://copyconstruct.medium.com/small-functions-considered-harmful-91035d316c29&#34;&gt;Small functions&#xA;considered harmful&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing Silly LLM Agent in Haskell</title>
      <link>https://xlii.space/eng/writing-silly-llm-in-haskell/</link>
      <pubDate>Fri, 07 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/writing-silly-llm-in-haskell/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;&#xA;&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#design&#34;&gt;Design&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#word-on-the-prompt&#34;&gt;Word on the Prompt&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#types&#34;&gt;Types&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#implementation&#34;&gt;Implementation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#main-function&#34;&gt;Main Function&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#end-result-and-final-word&#34;&gt;End result and final word&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#main-dot-hs&#34;&gt;Main.hs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;!--endtoc--&gt;&#xA;&lt;p&gt;Inspired by &lt;a href=&#34;https://fly.io/blog/everyone-write-an-agent/&#34;&gt;Fly.io article&lt;/a&gt; I figured that writing an Agent in Haskell&#xA;(which I recently picked up) would be a nice exercise, so hey,&#xA;why not do it?&lt;/p&gt;&#xA;&lt;p&gt;This post is walk through full implementation of a GNU Sed agent (that&#xA;doesn&amp;rsquo;t work &lt;em&gt;correctly&lt;/em&gt;, but probably because I&amp;rsquo;m using it wrong).&lt;/p&gt;&#xA;&lt;h2 id=&#34;design&#34;&gt;Design&lt;/h2&gt;&#xA;&lt;p&gt;When thinking about agent design my thought process was as follows:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Microdiagram Prototype Description</title>
      <link>https://xlii.space/eng/microdiagram-prototype/</link>
      <pubDate>Sun, 26 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/microdiagram-prototype/</guid>
      <description>&lt;p&gt;This is a description of recently released&#xA;&lt;a href=&#34;https://microdiagram.com&#34;&gt;MicroDiagram&lt;/a&gt; prototype. Check it out if you&#xA;haven&amp;rsquo;t yet. It&amp;rsquo;s mostly technical and discusses some of the challenges&#xA;I faced, as it was my first Haskell project.&lt;/p&gt;&#xA;&lt;h2 id=&#34;moving-parts&#34;&gt;Moving Parts&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Backend - single binary written in Haskell, consisting of&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Piano Diagram Parser + Generator&lt;/li&gt;&#xA;&lt;li&gt;Diagram generating utilities&lt;/li&gt;&#xA;&lt;li&gt;Scotty web server &lt;a href=&#34;#ref-ScottyWebServer&#34;&gt;[1]&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;HSpec and Quickcheck tests&lt;/li&gt;&#xA;&lt;li&gt;Code volume is - approx. 1200 non-empty lines of Haskell code&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Frontend unpoly &lt;a href=&#34;#ref-UnpolyProgressiveEnhancement&#34;&gt;[2]&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;With fragment rendering for the Piano result&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Deployment&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Couple Cloudflare Containers&#xA;&lt;a href=&#34;#ref-CloudflareContainersBeta2025&#34;&gt;[3]&lt;/a&gt; load balanced by&#xA;Cloudflare worker&lt;/li&gt;&#xA;&lt;li&gt;Single not-static binary running on Debian&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Average request duration is 7 ms and the median CPU time per request&#xA;(diagrams are updated on keystroke!) is 0.88 ms.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs, meet Lozenge</title>
      <link>https://xlii.space/eng/emacs-lozenge/</link>
      <pubDate>Fri, 24 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/emacs-lozenge/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;&#xA;&lt;div class=&#34;heading&#34;&gt;Table of Contents&lt;/div&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#setup&#34;&gt;Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#how-to-input&#34;&gt;How to input &lt;code&gt;◊&lt;/code&gt; ?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#tricks&#34;&gt;Tricks&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#smart-flush&#34;&gt;Smart Flush&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#instant-templates--just-add-water&#34;&gt;Instant Templates (just add water)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#regexp-catch-guards&#34;&gt;Regexp Catch-Guards&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#the-recipe-for-macro-success&#34;&gt;The Recipe For Macro Success&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#g-lozenge-crazy&#34;&gt;G◊-◊-◊-◊ Lozenge crazy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#final-words&#34;&gt;Final Words&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;!--endtoc--&gt;&#xA;&lt;p&gt;Recently I&amp;rsquo;ve stolen from tremendous&#xA;&lt;a href=&#34;https://anvil-editor.net/&#34;&gt;anvil editor&lt;/a&gt; &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; idea of using Lozenge (&lt;code&gt;◊&lt;/code&gt;) as an utility character in&#xA;Emacs.&lt;/p&gt;&#xA;&lt;p&gt;Since it integrated almost seamlessly I decided to share it with world.&lt;/p&gt;&#xA;&lt;p&gt;While article this is Emacs-specific, it&amp;rsquo;s highly probable you could&#xA;integrate following tricks in the editor of your choice.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Weird, but Haskell feels easy</title>
      <link>https://xlii.space/eng/haskell-feels-easy/</link>
      <pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/haskell-feels-easy/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on a specific idea for some time - microdiagrams&#xA;DSL. The core concept is quite straightforward: instead of having one&#xA;language for all diagrams, have multiple languages for various&#xA;purposes. For example, this diagram is designed to help learn piano by&#xA;illustrating the relationship between different keys.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://xlii.space/images/pianos.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;This idea had multiple prototypes. I won&amp;rsquo;t get into the details why&#xA;(hey, I hope to make some money out of it someday!), but I&amp;rsquo;ve&#xA;entertained the same idea for quite some time. One would say that&#xA;technology doesn&amp;rsquo;t matter, but I disagree. I think that for side&#xA;projects (or Magnum Opus for that), one shouldn&amp;rsquo;t use boring&#xA;technology.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Easy org-babel mode</title>
      <link>https://xlii.space/eng/easy-org-babel/</link>
      <pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/easy-org-babel/</guid>
      <description>&lt;p&gt;Recently I thought that writing about Cuelang and thought &amp;ldquo;hey,&#xA;wouldn&amp;rsquo;t it be nice if I could put some Cue code into Org and&#xA;evaluate it so that I could showcase the result&amp;rdquo;?&lt;/p&gt;&#xA;&lt;p&gt;Well, it&amp;rsquo;s a shame ob-cuelang doesn&amp;rsquo;t exist. However, thanks to the&#xA;LLMs I could vibe code it, right? And so, I steeled my nerves, thought hours about the prompt and, after&#xA;30 minutes and 2 glasses I put nervously:&lt;/p&gt;</description>
    </item>
    <item>
      <title>State of Opinion - Programming Languages - Autumn 2025 Edition</title>
      <link>https://xlii.space/eng/opinion-languages-autumn2025/</link>
      <pubDate>Sat, 11 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/opinion-languages-autumn2025/</guid>
      <description>&lt;div class=&#34;ox-hugo-toc toc&#34;&gt;&#xA;&lt;div class=&#34;heading&#34;&gt;&#xA;&lt;p&gt;Table of Contents&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#favorite&#34;&gt;Favorite&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#go&#34;&gt;Go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#cuelang&#34;&gt;Cuelang&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#clips&#34;&gt;CLIPS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#zig&#34;&gt;Zig&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#promising&#34;&gt;Promising&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#c&#34;&gt;C&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#haskell&#34;&gt;Haskell&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#souffle%C3%A9&#34;&gt;Souffleé&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#false-promise&#34;&gt;False promise&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#prolog&#34;&gt;Prolog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#mercury&#34;&gt;Mercury&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#lang-state-autumn-2025--perl&#34;&gt;Perl&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#left-behind&#34;&gt;Left behind&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#clojure&#34;&gt;Clojure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#rust&#34;&gt;Rust&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#ruby&#34;&gt;Ruby&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#elixir&#34;&gt;Elixir&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#bland&#34;&gt;Bland&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#python&#34;&gt;Python&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#typescript&#34;&gt;TypeScript&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#honorable-mentions&#34;&gt;Honorable mentions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#no-please-no&#34;&gt;No, please, no&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;!--endtoc--&gt;&#xA;&lt;p&gt;As I&amp;rsquo;m juggling languages often there are those which I like more or&#xA;less and it fluxuates over the period of time. I figured out it might be&#xA;good idea to put on (virtual) paper why I find language attractive.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Crazy Parser Idea</title>
      <link>https://xlii.space/eng/parser-idea/</link>
      <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/parser-idea/</guid>
      <description>&lt;p&gt;This one is stupid. I have an idea for parser and I even have a proof&#xA;of concept working in CLIPS&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Given my search it seems it&#xA;something like recursive-descend parser, but I&amp;rsquo;m not sure if it&#xA;qualifies.&lt;/p&gt;&#xA;&lt;p&gt;If you know drop me an e-mail please.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pre-word&#34;&gt;Pre-word&lt;/h2&gt;&#xA;&lt;p&gt;I will use Lisp-like syntax, but this has no implementation except for&#xA;aformentioned CLIPS, and is more about data structures and logic.&lt;/p&gt;&#xA;&lt;p&gt;When I write about rune I mean rune as per in Go language, aka a&#xA;codepoint. Token is one of (I&amp;rsquo;m still considering full grammar):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Talent is Alignment</title>
      <link>https://xlii.space/thoughts/talent-is-alignment/</link>
      <pubDate>Fri, 03 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/thoughts/talent-is-alignment/</guid>
      <description>&lt;iframe width=&#34;100%&#34; height=&#34;300&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allow=&#34;autoplay&#34; src=&#34;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/soundcloud%253Atracks%253A2181431059&amp;color=%23222e39&amp;auto_play=false&amp;hide_related=true&amp;show_comments=false&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=false&amp;visual=true&#34;&gt;&lt;/iframe&gt;&lt;div style=&#34;font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;&#34;&gt;&lt;a href=&#34;https://soundcloud.com/axkaminski&#34; title=&#34;Przemysław Alexander Kamiński&#34; target=&#34;_blank&#34; style=&#34;color: #cccccc; text-decoration: none;&#34;&gt;Przemysław Alexander Kamiński&lt;/a&gt; · &lt;a href=&#34;https://soundcloud.com/axkaminski/raideur-des-doigts&#34; title=&#34;Raideur des doigts&#34; target=&#34;_blank&#34; style=&#34;color: #cccccc; text-decoration: none;&#34;&gt;Raideur des doigts&lt;/a&gt;&lt;/div&gt;&#xA;&lt;p&gt;September 20th, 2025 marks exactly one year since I bought Roland&amp;rsquo;s&#xA;FPX-30, 88-keys full sized digital piano. Being in my 4th decade of&#xA;life I never taught myself any instrument, even though I own and dabble with many.&lt;/p&gt;&#xA;&lt;p&gt;In fact, while I&amp;rsquo;m unable to remember sounds or hear them in my head,&#xA;it seems I have a rather good understanding what &amp;ldquo;sounds nice&amp;rdquo; that&#xA;allows me to ad-hoc compose music.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Free Will&#39;s Tiny Probabilistic Edge</title>
      <link>https://xlii.space/thoughts/free-will-probabilistic-edge/</link>
      <pubDate>Tue, 02 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/thoughts/free-will-probabilistic-edge/</guid>
      <description>&lt;p&gt;Is free will an illusion? For centuries, this question has felt like a philosophical deadlock. Arguments often get stuck trying to define consciousness or find a &amp;ldquo;ghost in the machine.&amp;rdquo; But what if the problem isn&amp;rsquo;t how we see ourselves, but an outdated way of seeing the universe?&lt;/p&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t another abstract philosophical argument. It’s a practical case built on two of the most powerful tools we have for understanding reality: statistics and physics. The goal isn&amp;rsquo;t to &amp;ldquo;prove&amp;rdquo; free will directly, but to dismantle the one argument that insists it&amp;rsquo;s impossible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs: Profiling on macOS</title>
      <link>https://xlii.space/eng/emacs-macos-profiling/</link>
      <pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/emacs-macos-profiling/</guid>
      <description>&lt;p&gt;Profiling Emacs on macOS is a child&amp;rsquo;s play&amp;hellip;&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;    &lt;img src=&#34;https://xlii.space/images/gnu_instruments_hu_ab6d03465c1b173.png&#34; width=&#34;800&#34; height=&#34;400&#34; alt=&#34;&#34;&gt;&#xA;  &#xA;&#xA;&#xA;&lt;p&gt;&amp;hellip;with a playbook stashed away.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;It&amp;rsquo;s easy in the end; however, there are numerous pieces of misleading information out there that have to be found.&lt;/p&gt;&#xA;&lt;p&gt;What&amp;rsquo;s needed?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Xcode + CommandLineTools&lt;/li&gt;&#xA;&lt;li&gt;Instruments.app&lt;/li&gt;&#xA;&lt;li&gt;Emacs with source and debugging symbols (optional, but recommended)&lt;/li&gt;&#xA;&lt;li&gt;GNU Make (for the lazy) - scroll to the bottom&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Getting Xcode and the CommandLineTools are straightforward; Instruments.app should come inside the package.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs: The macOS Bug</title>
      <link>https://xlii.space/eng/emacs-the-macos-bug/</link>
      <pubDate>Sun, 27 Jul 2025 12:55:10 +0200</pubDate>
      <guid>https://xlii.space/eng/emacs-the-macos-bug/</guid>
      <description>&lt;img src=&#34;https://xlii.space/images/gnu_apple_hu_eafeabffdca3b0ce.png&#34; width=&#34;400&#34; height=&#34;400&#34; alt=&#34;&#34;&gt;&#xA;  &#xA;&#xA;&#xA;&lt;h2 id=&#34;the-context&#34;&gt;The Context&lt;/h2&gt;&#xA;&lt;p&gt;I have been recently roaming.&lt;/p&gt;&#xA;&lt;p&gt;Doing some Zig, doing some Go, some Janet. Some C integration. Should have focused on my project but life threw more at me than I could handle, so I sought&amp;hellip; happy distractions.&lt;/p&gt;&#xA;&lt;p&gt;My experience with those technologies taught me new tricks and one day, when I needed some more distraction, I decided to debug something that had made me furious for years: Emacs jank&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Forest Thinking in Prolog</title>
      <link>https://xlii.space/eng/forest-thinking-in-prolog/</link>
      <pubDate>Wed, 26 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/forest-thinking-in-prolog/</guid>
      <description>&lt;p&gt;One thing that really annoyed me at the beginning of my adventure with Prolog was when THIS happened:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-swi-prolog&#34; data-lang=&#34;swi-prolog&#34;&gt;?- between(1,3,A).&#xA;A = 1 █ &amp;lt;- blinking cursor&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;p&gt;I couldn&amp;rsquo;t understand Why Prolog wouldn&amp;rsquo;t produce all the solutions? It felt so obvious, that A can have 3 different results.&lt;/p&gt;&#xA;&lt;p&gt;When working with predicates (fancy name for function as far as I am concerned), they not only produce value as in the other programming languages. They can produce something along the lines of &lt;em&gt;&amp;ldquo;hey, here&amp;rsquo;s a result, but you know, I have more, so get back to me if you want, m&amp;rsquo;kay?&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Grounding in Prolog</title>
      <link>https://xlii.space/eng/grounding-in-prolog/</link>
      <pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/grounding-in-prolog/</guid>
      <description>&lt;p&gt;Grounding is one of the weirdest concepts in Prolog and the ones that occassionally comes back to haunt me.&lt;/p&gt;&#xA;&lt;p&gt;Since Prolog is for Nerds³ I decided to translate it to Engineer½ (like myself) language.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;../prolog-grounding-redacted.png&#34; alt=&#34;&#34; title=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;When you &lt;strong&gt;declare&lt;/strong&gt; a list in Prolog it comes with strings attached (sometimes literally):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-prolog&#34; data-lang=&#34;prolog&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;?-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;(AwesomeList, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AwesomeList &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;_&lt;/span&gt;].&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Too much? Not enough? Who can say! According to Prolog it might be what you wanted!&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Flying Giraffe</title>
      <link>https://xlii.space/eng/flying-giraffe/</link>
      <pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/flying-giraffe/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Single iteration loop&lt;/strong&gt;, that can be taken from &amp;ldquo;base&amp;rdquo; software development process, one that&amp;rsquo;s often taught during education usually is a simple one.&lt;/p&gt;&#xA;&lt;p&gt;There are many variations but usually they all look like this:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;../software-cycle-basic.png&#34; alt=&#34;&#34; title=&#34;Image of a basic software like cycle&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I wouldn&amp;rsquo;t say this representation is &lt;strong&gt;bad&lt;/strong&gt;, but it has one nasty flaw.&lt;/p&gt;&#xA;&lt;p&gt;It camouflages &lt;strong&gt;complexity&lt;/strong&gt;. Complexity which accumulates over time from this naïvely basic process happening again and again and again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Network Scenarios Cheatsheet</title>
      <link>https://xlii.space/eng/network-scenarios/</link>
      <pubDate>Sat, 15 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/network-scenarios/</guid>
      <description>&lt;p&gt;I find it amusing that software engineers (or at least those I know) are very risk averse but paradoxically very optimistic about some topics. Complete trust in reliable network conditions is a belief that puzzles me often.&lt;/p&gt;&#xA;&lt;p&gt;After frequent conversations about what is - and should - be considered “normal” reliability when passing messages between distributed systems I got bored with recalling (and repeating!) same examples.&lt;/p&gt;&#xA;&lt;p&gt;So I designed cheat sheet to look at when planning for systems interactions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrading Node Stack</title>
      <link>https://xlii.space/eng/upgrading-node/</link>
      <pubDate>Wed, 10 May 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/upgrading-node/</guid>
      <description>&lt;p&gt;Dealing with a dependency hell is a dirty job.&lt;/p&gt;&#xA;&lt;p&gt;It probably got its name directly from how fun that activity is. Years ago I heard description that something is like a chewing on a broken glass, but slightly less entertaining. It would fit.&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;Some time ago I was tasked with upgrading libraries for a medium-sized project. It wasn&amp;rsquo;t legacy by any means, as dozens of developers divided between the teams were working on it daily. I wouldn&amp;rsquo;t describe structure as trivial. It was neatly split into parts which kept dependencies between them and had adequate volume of source for the role it was fulfilling.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What the ADHD?</title>
      <link>https://xlii.space/non-eng/what_the_adhd/</link>
      <pubDate>Sun, 07 May 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/non-eng/what_the_adhd/</guid>
      <description>&lt;h2 id=&#34;caveat-emptor&#34;&gt;Caveat emptor&lt;/h2&gt;&#xA;&lt;p&gt;Without going into personal details — I have a stake in &lt;code&gt;ADHD&lt;/code&gt;. I&amp;rsquo;m raising awareness and try to help those who have it — knowingly or not. Due to that I&amp;rsquo;m always on the lookout of new knowledge, ideas, techniques and tools.&lt;/p&gt;&#xA;&lt;p&gt;My knowledge is based on personal experience, accounts of those diagnosed and pre-diagnosed, conversations with therapists but also taken from the books and internet sources such as published research, info-sites or (rarely) popular publications.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Software Is A Tire</title>
      <link>https://xlii.space/non-eng/software_is_a_tire/</link>
      <pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/non-eng/software_is_a_tire/</guid>
      <description>&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tires are everywhere&lt;/li&gt;&#xA;&lt;li&gt;Nobody needs a tire by itself&lt;/li&gt;&#xA;&lt;li&gt;Tires aren&amp;rsquo;t exciting (except for tire engineers and tire salespeople)&lt;/li&gt;&#xA;&lt;li&gt;Tires &amp;ldquo;just are&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You don&amp;rsquo;t have to buy very expensive tires&lt;/li&gt;&#xA;&lt;li&gt;There are reasons why the cheapest tires are cheap&lt;/li&gt;&#xA;&lt;li&gt;For some people tire&amp;rsquo;s brand is more important than it&amp;rsquo;s quality&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tires are more complicated than most think&lt;/li&gt;&#xA;&lt;li&gt;It&amp;rsquo;s neigh impossible to explain in detail process of making tires&lt;/li&gt;&#xA;&lt;li&gt;Modern tires are result of work of many specialists and highly specialized equipment&lt;/li&gt;&#xA;&lt;li&gt;Nobody cares how awesomely engineered your tire is (unless you&amp;rsquo;re in business of selling tires)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tires require specific skills to handle&lt;/li&gt;&#xA;&lt;li&gt;Everyone can learn skills to handle tires&lt;/li&gt;&#xA;&lt;li&gt;Even with knowledge, handling tires is hard work&lt;/li&gt;&#xA;&lt;li&gt;It might be very difficult to get rid of stains got from handling tires&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Many claim to be able to change the tire, a few succeed&lt;/li&gt;&#xA;&lt;li&gt;Tire change isn&amp;rsquo;t critical knowledge for a tire engineer&lt;/li&gt;&#xA;&lt;li&gt;Handlers are relevant only as long as there&amp;rsquo;s something to put tires on&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tires deteriorate over time&lt;/li&gt;&#xA;&lt;li&gt;Well maintained tires can serve for a long time&lt;/li&gt;&#xA;&lt;li&gt;Neglected tires under bad conditions can deteriorate very quickly&lt;/li&gt;&#xA;&lt;li&gt;Unskilled handler can have serious impact on the tire lifetime&lt;/li&gt;&#xA;&lt;li&gt;The more tires your own the harder it is to maintain them&lt;/li&gt;&#xA;&lt;li&gt;The biggest cost come from the tires that are not in use&lt;/li&gt;&#xA;&lt;li&gt;It&amp;rsquo;s important to be aware of the state of your tires&lt;/li&gt;&#xA;&lt;li&gt;Badly maintained tires can blow in your face&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s important to properly dispose of used tires&lt;/li&gt;&#xA;&lt;li&gt;Some dump used tires in the woods and hope for the best&lt;/li&gt;&#xA;&lt;li&gt;Smoke from burning tires can be seen from miles away&lt;/li&gt;&#xA;&lt;li&gt;The more tires you have, the more visible fire will be&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tires by themselves won&amp;rsquo;t help you figure out where you should be going&lt;/li&gt;&#xA;&lt;li&gt;Tire shouldn&amp;rsquo;t be the leading factor when deciding on the route&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t opt for rough road only because you have tires to test&lt;/li&gt;&#xA;&lt;li&gt;It&amp;rsquo;s not the tires&amp;rsquo; fault that you got lost or hit dead end&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Good tires are important component of safety&lt;/li&gt;&#xA;&lt;li&gt;Some tires can make you more comfortable&lt;/li&gt;&#xA;&lt;li&gt;Some tires make increase your mileage&lt;/li&gt;&#xA;&lt;li&gt;Tires can save lives&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s not a good idea to run on bald tires&lt;/li&gt;&#xA;&lt;li&gt;Bald tires + rough conditions = almost certain crash&lt;/li&gt;&#xA;&lt;li&gt;In some lucky cases journey with bald tires might still turn out OK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;There is no &amp;ldquo;best&amp;rdquo; tire&lt;/li&gt;&#xA;&lt;li&gt;Tires should be picked with road and conditions in mind&lt;/li&gt;&#xA;&lt;li&gt;Tire that works for someone else might not be good fit for you&lt;/li&gt;&#xA;&lt;li&gt;Tire tailored for specific conditions can be the worst choice when they change&lt;/li&gt;&#xA;&lt;li&gt;Sometimes you need a very special tires&lt;/li&gt;&#xA;&lt;li&gt;On some occassions tires will be helpless and employing extra means might be necessary&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tire is easy to blame when things go out of control&lt;/li&gt;&#xA;&lt;li&gt;Nobody talks about tires when they do their job right&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Emacs Compile/Recompile Trick</title>
      <link>https://xlii.space/blog/recompile/</link>
      <pubDate>Thu, 23 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/recompile/</guid>
      <description>&lt;p&gt;Mickey Petersen wrote nice piece about compile feature in Emacs - something I use a lot and I recommend &lt;a href=&#34;https://www.masteringemacs.org/article/compiling-running-scripts-emacs&#34;&gt;the read&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I like to have instant feedback, so I use it for almost everything after which run &lt;code&gt;recompile&lt;/code&gt; that replays last &lt;code&gt;compile&lt;/code&gt; command. &lt;code&gt;recompile&lt;/code&gt; can be bound to the key, but my favorite trick is to use &lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables.html&#34;&gt;Local Variables&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;Ready recipe:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-any&#34; data-lang=&#34;any&#34;&gt;## Local Variables:&#xA;## eval: (add-hook &amp;#39;after-save &amp;#39;recompile nil t)&#xA;## End:&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It works with any file and thanks to that I get &lt;code&gt;recompile&lt;/code&gt; every single time I save the file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Emacs Compile/Recompile Trick</title>
      <link>https://xlii.space/eng/recompile/</link>
      <pubDate>Thu, 23 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/recompile/</guid>
      <description>&lt;p&gt;Mickey Petersen wrote nice piece about compile feature in Emacs - something I use a lot and I recommend &lt;a href=&#34;https://www.masteringemacs.org/article/compiling-running-scripts-emacs&#34;&gt;the read&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I like to have instant feedback, so I use it for almost everything after which run &lt;code&gt;recompile&lt;/code&gt; that replays last &lt;code&gt;compile&lt;/code&gt; command. &lt;code&gt;recompile&lt;/code&gt; can be bound to the key, but my favorite trick is to use &lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables.html&#34;&gt;Local Variables&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;Ready recipe:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-any&#34; data-lang=&#34;any&#34;&gt;## Local Variables:&#xA;## eval: (add-hook &amp;#39;after-save &amp;#39;recompile nil t)&#xA;## End:&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It works with any file and thanks to that I get &lt;code&gt;recompile&lt;/code&gt; every single time I save the file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lunch, One Of Many</title>
      <link>https://xlii.space/blog/lunch/</link>
      <pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/lunch/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Thanks for accepting my invite. Don&amp;rsquo;t worry, this will be short. I have a places to be, people to&amp;hellip; educate. So I&amp;rsquo;ll have to run soon.&lt;/p&gt;&#xA;&lt;p&gt;I took the liberty and ordered for both of us. Steak &amp;amp; salad. Good, right?&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;See, I&amp;rsquo;m with the Company. Yeah, &amp;hellip;that one. We serve your coffee, we make your cereal, we provide you with social entertainment and all this other boring stuff. I do, however, always find it amusing that the same company can produce toothpaste and at the same time be a supplier of network cable for a city.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lunch, One Of Many</title>
      <link>https://xlii.space/fiction/lunch/</link>
      <pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/fiction/lunch/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hey!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Thanks for accepting my invite. Don&amp;rsquo;t worry, this will be short. I have a places to be, people to&amp;hellip; educate. So I&amp;rsquo;ll have to run soon.&lt;/p&gt;&#xA;&lt;p&gt;I took the liberty and ordered for both of us. Steak &amp;amp; salad. Good, right?&lt;/p&gt;&#xA;&lt;p&gt;See, I&amp;rsquo;m with the Company. Yeah, &amp;hellip;that one. We serve your coffee, we make your cereal, we provide you with social entertainment and all this other boring stuff. I do, however, always find it amusing that the same company can produce toothpaste and at the same time be a supplier of network cable for a city.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Battery Issue</title>
      <link>https://xlii.space/blog/battery_issue/</link>
      <pubDate>Fri, 10 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/battery_issue/</guid>
      <description>&lt;p&gt;For the last few months I was very unhappy with my iPhone 13 Pro battery.&lt;/p&gt;&#xA;&lt;p&gt;It was discharging way too quick. How quick? After 10 hours after unplugging I usually got &amp;ldquo;battery low&amp;rdquo; alert. I didn&amp;rsquo;t feel my usage throughout the day would be enough explain it.&lt;/p&gt;&#xA;&lt;p&gt;I tried to troubleshoot it, but to no avail. The only hint I got was &amp;ldquo;Find My&amp;rdquo; app, that was using 100% of the battery when inspecting part of the available battery slope. I tried various strategies but wasn&amp;rsquo;t able to fix it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Battery Issue</title>
      <link>https://xlii.space/eng/battery_issue/</link>
      <pubDate>Fri, 10 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/battery_issue/</guid>
      <description>&lt;p&gt;For the last few months I was very unhappy with my iPhone 13 Pro battery.&lt;/p&gt;&#xA;&lt;p&gt;It was discharging way too quick. How quick? After 10 hours after unplugging I usually got &amp;ldquo;battery low&amp;rdquo; alert. I didn&amp;rsquo;t feel my usage throughout the day would be enough explain it.&lt;/p&gt;&#xA;&lt;p&gt;I tried to troubleshoot it, but to no avail. The only hint I got was &amp;ldquo;Find My&amp;rdquo; app, that was using 100% of the battery when inspecting part of the available battery slope. I tried various strategies but wasn&amp;rsquo;t able to fix it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>This one PR trick</title>
      <link>https://xlii.space/blog/pr_trick/</link>
      <pubDate>Fri, 28 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/pr_trick/</guid>
      <description>&lt;pre&gt;&lt;code&gt;Hey y&#39;all!&#xA;&#xA;I have an important PR:&#xA;&amp;gt; ...&#xA;&amp;gt; 131 files changed, 1255 insertions(+), 318 deletions(-)&#xA;&#xA;Anyone up for a review?&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;{{ image(src=&amp;quot;/images/let_me_oout.jpg&amp;quot;,alt=&amp;ldquo;Meme image about man trying to get out of fenced area&amp;rdquo;) }}&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Huge PRs can be a scary thing. When PRs like this are in review queue one I&amp;rsquo;ve seen following happen:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PR is pushed away for as long as possible (or even to oblivion)&lt;/li&gt;&#xA;&lt;li&gt;Reviewer studies PR for a long time and their energy is drained to last drop&lt;/li&gt;&#xA;&lt;li&gt;PR is skimmed top to bottom and pushed forward with &amp;ldquo;not my problem&amp;rdquo; attitude&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Everyone knows that such huge pull requests should be split into smaller, reviewable ones. And yet they still happen from time to time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>This one PR trick</title>
      <link>https://xlii.space/eng/pr_trick/</link>
      <pubDate>Fri, 28 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/pr_trick/</guid>
      <description>&lt;pre&gt;&lt;code&gt;Hey y&#39;all!&#xA;&#xA;I have an important PR:&#xA;&amp;gt; ...&#xA;&amp;gt; 131 files changed, 1255 insertions(+), 318 deletions(-)&#xA;&#xA;Anyone up for a review?&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;&lt;img src=&#34;../let_me_oout.jpg&#34; alt=&#34;&#34; title=&#34;Meme image about man trying to get out of fenced area&#34;&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Huge PRs can be a scary thing. When PRs like this are in review queue one I&amp;rsquo;ve seen following happen:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PR is pushed away for as long as possible (or even to oblivion)&lt;/li&gt;&#xA;&lt;li&gt;Reviewer studies PR for a long time and their energy is drained to last drop&lt;/li&gt;&#xA;&lt;li&gt;PR is skimmed top to bottom and pushed forward with &amp;ldquo;not my problem&amp;rdquo; attitude&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Everyone knows that such huge pull requests should be split into smaller, reviewable ones. And yet they still happen from time to time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blackboxing React Components</title>
      <link>https://xlii.space/blog/blackboxing_react_components/</link>
      <pubDate>Wed, 31 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/blackboxing_react_components/</guid>
      <description>&lt;p&gt;Blackboxing of React Component is a (self-named) process that I use in order to separate visual component from the logic layer.&lt;/p&gt;&#xA;&lt;p&gt;As a refresher - visual components are the type of components which role is to &amp;ldquo;look nice&amp;rdquo;. They can have some logic inside, but ultimately they&amp;rsquo;re dumb. They don&amp;rsquo;t reach out for data, they don&amp;rsquo;t handle complex state changes, however they can render different elements reacting to props changes. Components that have complex logic in them are usually named Controller Components or Logic Components. While it’s a very good idea to aim for such separation, real life project have this line blurred.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blackboxing React Components</title>
      <link>https://xlii.space/eng/blackboxing_react_components/</link>
      <pubDate>Wed, 31 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/eng/blackboxing_react_components/</guid>
      <description>&lt;p&gt;Blackboxing of React Component is a (self-named) process that I use in order to separate visual component from the logic layer.&lt;/p&gt;&#xA;&lt;p&gt;As a refresher - visual components are the type of components which role is to &amp;ldquo;look nice&amp;rdquo;. They can have some logic inside, but ultimately they&amp;rsquo;re dumb. They don&amp;rsquo;t reach out for data, they don&amp;rsquo;t handle complex state changes, however they can render different elements reacting to props changes. Components that have complex logic in them are usually named Controller Components or Logic Components. While it’s a very good idea to aim for such separation, real life project have this line blurred.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/a_flying_giraffe/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/a_flying_giraffe/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;A Flying Giraffe&amp;#34;&#xA;date = &amp;#34;2024-06-17&amp;#34;&lt;/p&gt;&#xA;&lt;p&gt;template = &amp;#34;page_toc.html&amp;#34;&#xA;slug = &amp;#34;flying-giraffe&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;software&amp;#34;, &amp;#34;software-engineering&amp;#34;, &amp;#34;process&amp;#34;]&#xA;[extra]&lt;/p&gt;&#xA;&lt;p&gt;intro = &amp;#34;&amp;#34;&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&lt;/p&gt;&#xA;&lt;div class=&#34;disclaimer-block&#34;&gt;&#xA;&lt;p&gt;In spirit of trying to not get into very long texts, I&amp;#39;ve extracted this from a larger piece, which might feel disconnected.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;Single iteration loop&lt;/strong&gt;, that can be taken from &amp;#34;base&amp;#34; software development process, one that&amp;#39;s often taught during education usually is a simple one.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/grounding_prolog/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/grounding_prolog/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;Grounding in Prolog&amp;#34;&#xA;date = &amp;#34;2024-06-20&amp;#34;&lt;/p&gt;&#xA;&lt;p&gt;template = &amp;#34;page_toc.html&amp;#34;&#xA;slug = &amp;#34;grounding-in-prolog&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;prolog&amp;#34;, &amp;#34;software_engineering&amp;#34;]&#xA;[extra]&#xA;#class = &amp;#34;orange_header&amp;#34;&lt;/p&gt;&#xA;&lt;p&gt;intro = &amp;#34;&amp;#34;&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Grounding is one of the weirdest concepts in Prolog and the ones that occassionally comes back to haunt me.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Since Prolog is for Nerds³ I decided to translate it to Engineer½ (like myself) language.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&amp;lt;div class=&amp;#34;framed w-75 centered&amp;#34;&amp;gt;&amp;lt;img src=&amp;#34;/images/prolog-grounding-redacted.png&amp;#34; alt=&amp;#34;&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/knob/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/knob/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;The Knob&amp;#34;&#xA;date = &amp;#34;2023-03-30&amp;#34;&#xA;template = &amp;#34;story.html&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;fiction&amp;#34;]&#xA;[extra]&#xA;class = &amp;#34;knob&amp;#34;&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I pressed play and sat as slightly coarse sound of a vinyl record filled the room. Compared to available technology quality was laughable at best, but it wasn&amp;#39;t about the music for me. I don&amp;#39;t know if that was true or not yet turning various knobs to get what I wanted felt great and precise. Lows, mids, highs; frequencies tuned exactly as I wanted.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/network_scenarios/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/network_scenarios/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;Network Scenarios Cheatsheet&amp;#34;&#xA;date = &amp;#34;2024-06-15&amp;#34;&lt;/p&gt;&#xA;&lt;p&gt;template = &amp;#34;page_toc.html&amp;#34;&#xA;slug = &amp;#34;network-scenarios&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;software_engineering&amp;#34;, &amp;#34;network&amp;#34;, &amp;#34;design&amp;#34;]&#xA;[extra]&lt;/p&gt;&#xA;&lt;p&gt;intro = &amp;#34;&amp;#34;&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&#xA;I find it amusing that software engineers (or at least those I know) are very risk averse but paradoxically very optimistic about some topics. Complete trust in reliable network conditions is a belief that puzzles me often.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;After frequent conversations about what is - and should - be considered “normal” reliability when passing messages between distributed systems I got bored with recalling (and repeating!) same examples.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/software_is_a_tire/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/software_is_a_tire/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;Software Is A Tire&amp;#34;&#xA;date = &amp;#34;2023-05-05&amp;#34;&#xA;template = &amp;#34;page.html&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;light&amp;#34;, &amp;#34;software&amp;#34;]&#xA;[extra]&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tires are everywhere&lt;/li&gt;&#xA;&lt;li&gt;Nobody needs a tire by itself&lt;/li&gt;&#xA;&lt;li&gt;Tires aren&amp;#39;t exciting (except for tire engineers and tire salespeople)&lt;/li&gt;&#xA;&lt;li&gt;Tires &amp;#34;just are&amp;#34;&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You don&amp;#39;t have to buy very expensive tires&lt;/li&gt;&#xA;&lt;li&gt;There are reasons why the cheapest tires are cheap&lt;/li&gt;&#xA;&lt;li&gt;For some people tire&amp;#39;s brand is more important than it&amp;#39;s quality&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Tires are more complicated than most think&lt;/li&gt;&#xA;&lt;li&gt;It&amp;#39;s neigh impossible to explain in detail process of making tires&lt;/li&gt;&#xA;&lt;li&gt;Modern tires are result of work of many specialists and highly specialized equipment&lt;/li&gt;&#xA;&lt;li&gt;Nobody cares how awesomely engineered your tire is (unless you&amp;#39;re in business of selling tires)&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Tires require specific skills to handle&lt;/li&gt;&#xA;&lt;li&gt;Everyone can learn skills to handle tires&lt;/li&gt;&#xA;&lt;li&gt;Even with knowledge, handling tires is hard work&lt;/li&gt;&#xA;&lt;li&gt;It might be very difficult to get rid of stains got from handling tires&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Many claim to be able to change the tire, a few succeed&lt;/li&gt;&#xA;&lt;li&gt;Tire change isn&amp;#39;t critical knowledge for a tire engineer&lt;/li&gt;&#xA;&lt;li&gt;Handlers are relevant only as long as there&amp;#39;s something to put tires on&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Tires deteriorate over time&lt;/li&gt;&#xA;&lt;li&gt;Well maintained tires can serve for a long time&lt;/li&gt;&#xA;&lt;li&gt;Neglected tires under bad conditions can deteriorate very quickly&lt;/li&gt;&#xA;&lt;li&gt;Unskilled handler can have serious impact on the tire lifetime&lt;/li&gt;&#xA;&lt;li&gt;The more tires your own the harder it is to maintain them&lt;/li&gt;&#xA;&lt;li&gt;The biggest cost come from the tires that are not in use&lt;/li&gt;&#xA;&lt;li&gt;It&amp;#39;s important to be aware of the state of your tires&lt;/li&gt;&#xA;&lt;li&gt;Badly maintained tires can blow in your face&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;It&amp;#39;s important to properly dispose of used tires&lt;/li&gt;&#xA;&lt;li&gt;Some dump used tires in the woods and hope for the best&lt;/li&gt;&#xA;&lt;li&gt;Smoke from burning tires can be seen from miles away&lt;/li&gt;&#xA;&lt;li&gt;The more tires you have, the more visible fire will be&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Tires by themselves won&amp;#39;t help you figure out where you should be going&lt;/li&gt;&#xA;&lt;li&gt;Tire shouldn&amp;#39;t be the leading factor when deciding on the route&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;#39;t opt for rough road only because you have tires to test&lt;/li&gt;&#xA;&lt;li&gt;It&amp;#39;s not the tires&amp;#39; fault that you got lost or hit dead end&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Good tires are important component of safety&lt;/li&gt;&#xA;&lt;li&gt;Some tires can make you more comfortable&lt;/li&gt;&#xA;&lt;li&gt;Some tires make increase your mileage&lt;/li&gt;&#xA;&lt;li&gt;Tires can save lives&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;It&amp;#39;s not a good idea to run on bald tires&lt;/li&gt;&#xA;&lt;li&gt;Bald tires + rough conditions = almost certain crash&lt;/li&gt;&#xA;&lt;li&gt;In some lucky cases journey with bald tires might still turn out OK&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;There is no &amp;#34;best&amp;#34; tire&lt;/li&gt;&#xA;&lt;li&gt;Tires should be picked with road and conditions in mind&lt;/li&gt;&#xA;&lt;li&gt;Tire that works for someone else might not be good fit for you&lt;/li&gt;&#xA;&lt;li&gt;Tire tailored for specific conditions can be the worst choice when they change&lt;/li&gt;&#xA;&lt;li&gt;Sometimes you need a very special tires&lt;/li&gt;&#xA;&lt;li&gt;On some occassions tires will be helpless and employing extra means might be necessary&#xA;&amp;lt;hr/&amp;gt;&lt;/li&gt;&#xA;&lt;li&gt;Tire is easy to blame when things go out of control&lt;/li&gt;&#xA;&lt;li&gt;Nobody talks about tires when they do their job right&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/thinking_in_trees/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/thinking_in_trees/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;Forest Thinking in Prolog&amp;#34;&#xA;date = &amp;#34;2024-06-26&amp;#34;&lt;/p&gt;&#xA;&lt;p&gt;template = &amp;#34;page.html&amp;#34;&#xA;slug = &amp;#34;forest-thinking-in-prolog&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;prolog&amp;#34;, &amp;#34;choicepoints&amp;#34;, &amp;#34;backtracking&amp;#34;]&#xA;[extra]&#xA;#class = &amp;#34;orange_header&amp;#34;&lt;/p&gt;&#xA;&lt;p&gt;intro = &amp;#34;&amp;#34;&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&#xA;One thing that really annoyed me at the beginning of my adventure with Prolog was when THIS happened:&lt;/p&gt;&#xA;&lt;div class=&#34;src src-swi-prolog&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-swi-prolog&#34; data-lang=&#34;swi-prolog&#34;&gt;?- between(1,3,A).&#xA;A = 1 █ &amp;lt;- blinking cursor&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;/div&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I couldn&amp;#39;t understand Why Prolog wouldn&amp;#39;t produce all the solutions? It felt so obvious, that A can have 3 different results.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/upgrading_node_stack/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/upgrading_node_stack/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;Upgrading Node Stack&amp;#34;&#xA;date = &amp;#34;2023-05-10&amp;#34;&lt;/p&gt;&#xA;&lt;p&gt;template = &amp;#34;page_toc.html&amp;#34;&#xA;slug = &amp;#34;upgrading-node&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;software_engineering&amp;#34;, &amp;#34;javascript&amp;#34;]&#xA;[extra]&lt;/p&gt;&#xA;&lt;p&gt;intro = &amp;#34;&amp;#34;&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&lt;/p&gt;&#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;Job&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;Dealing with a dependency hell is a dirty job.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;It probably got its name directly from how fun that activity is. Years ago I heard description that something is like a chewing on a broken glass, but slightly less entertaining. It would fit.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/blog/what_the_adhd/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/blog/what_the_adhd/</guid>
      <description>&lt;p&gt;&lt;del&gt;+&lt;/del&gt;&#xA;title = &amp;#34;What the ADHD?&amp;#34;&#xA;date = &amp;#34;2023-05-07&amp;#34;&#xA;template = &amp;#34;page_toc.html&amp;#34;&#xA;draft = false&#xA;[taxonomies]&#xA;tags = [&amp;#34;adhd&amp;#34;]&#xA;[extra]&#xA;intro = &amp;#34;Following text covers ADHD exclusively and is a break-off from a longer text on related topic. While it can be read by anyone, it does have some engineering-related concepts and comparisons.&amp;#34;&#xA;&lt;del&gt;+&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;#+END_EXPORT&lt;/p&gt;&#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;Caveat emptor&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;Without going into personal details — I have a stake in &lt;code class=&#34;verbatim&#34;&gt;ADHD&lt;/code&gt;. I&amp;#39;m raising awareness and try to help those who have it — knowingly or not. Due to that I&amp;#39;m always on the lookout of new knowledge, ideas, techniques and tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://xlii.space/posts/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/posts/</guid>
      <description>&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;Posts&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;&#xA;&lt;h3 id=&#34;headline-2&#34;&gt;&#xA;Engineering&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;span class=&#34;tags&#34;&gt;&lt;span class=&#34;tag-@eng&#34;&gt;@eng&lt;/span&gt;&lt;/span&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;&#xA;&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-4&#34;&gt;&#xA;&lt;h4 id=&#34;headline-3&#34;&gt;&#xA;&lt;span class=&#34;todo status-todo&#34;&gt;TODO&lt;/span&gt;&#xA;Optimizing Emacs on macOS - Status Report&#xA;&lt;/h4&gt;&#xA;&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-4&#34;&gt;&#xA;&lt;p&gt;&#xA;It&amp;#39;s been more than 5 months since I started working on Emacs&#xA;optimization on macOS. This posts is a &amp;#34;check-in&amp;#34; because at this&#xA;specific moment I&amp;#39;m reasonably satisfied with its performance.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;It is also, however, an explanation why I got to that point and what&#xA;I&amp;#39;m confident is a root cause of this behavior along with underlying&#xA;mechanisms for that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About Me</title>
      <link>https://xlii.space/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a neuroatypical, chaotic engineer who figured out more than 20 years ago that by&#xA;hacking different solutions one can make a reasonable living.&lt;/p&gt;&#xA;&lt;p&gt;My area of expertise is lack of expertise - I consider myself a &lt;a href=&#34;https://merki.ca/blog/what-is-a-wildcard-person&#34;&gt;wildcard person&lt;/a&gt;, however I do tend to naturally gravitate towards work that requires optimization or tooling.&lt;/p&gt;&#xA;&lt;p&gt;Amongst many things I&amp;rsquo;ve done, some were more fun than the others:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Plenty of optimizations (PostgreSQL, apps, build times) - one of my favorites&lt;/li&gt;&#xA;&lt;li&gt;Investigations - all the kinds: system, networks, bugs, people, you name it&lt;/li&gt;&#xA;&lt;li&gt;Searching for an internal knowledge graph solution. It was a long haul that took me through implementations in &lt;a href=&#34;https://www.swi-prolog.org&#34;&gt;Prolog&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Datalog&#34;&gt;Datalog&lt;/a&gt;, &lt;a href=&#34;https://souffle-lang.github.io&#34;&gt;Soufflé&lt;/a&gt;, &lt;a href=&#34;https://clojure.org&#34;&gt;Clojure&lt;/a&gt;, &lt;a href=&#34;https://cuelang.org&#34;&gt;Cuelang&lt;/a&gt; and &lt;a href=&#34;https://ocaml.org&#34;&gt;OCaml&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Building Go-powered multi-container orchestrator with isolated networks (e.g. one-click Grafana stack for your app, multiple parallel runs)&lt;/li&gt;&#xA;&lt;li&gt;Optimizing Elixir&amp;rsquo;s build process&lt;/li&gt;&#xA;&lt;li&gt;Refactoring complex GitHub CI actions&lt;/li&gt;&#xA;&lt;li&gt;Debugging why a big vendor silently ignored API calls by hooking up &lt;a href=&#34;https://mitmproxy.org&#34;&gt;MITM Proxy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Migrated a reasonable-sized JavaScript monorepo a couple years into the future (and built a &lt;a href=&#34;https://xlii.space/eng/upgrading-node&#34;&gt;time machine&lt;/a&gt; while doing that)&lt;/li&gt;&#xA;&lt;li&gt;Was doing &lt;a href=&#34;https://foundation.tlapl.us&#34;&gt;TLA+&lt;/a&gt; models to verify time-based assumptions in an unstable distributed system environment.&lt;/li&gt;&#xA;&lt;li&gt;But also checking on &lt;a href=&#34;https://dafny.org&#34;&gt;Dafny&lt;/a&gt; and &lt;a href=&#34;https://fstar-lang.org&#34;&gt;F*&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://threejs.org&#34;&gt;Three.js&lt;/a&gt; visualization model linked to product data&lt;/li&gt;&#xA;&lt;li&gt;Took a decision and successfully rewrote a search engine 2 days before launch because the planned one was heavily unstable&lt;/li&gt;&#xA;&lt;li&gt;Had my own personal kernel for a Fujitsu-Siemens laptop because the suspend button didn&amp;rsquo;t work as I wanted&lt;/li&gt;&#xA;&lt;li&gt;&amp;hellip;and own drivers for a Logitech keyboard because it was crippled&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Want to say hi? &lt;code&gt;alexander at kaminski dot se&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Free Will&#39;s Tiny Probabilistic Edge</title>
      <link>https://xlii.space/sources/free-will/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/sources/free-will/</guid>
      <description>&lt;h2 id=&#34;alexander&#34;&gt;Alexander&lt;/h2&gt;&#xA;&lt;p&gt;Hey Lily I want to discuss one thing - free will and determinism. Later we&amp;rsquo;ll compile article from it. Feel free to ask me question as you&amp;rsquo;ll be shadow writer for it.&lt;/p&gt;&#xA;&lt;p&gt;So, I start with a thesis: even with free will determining 1/1000 out choices and 999 being completely external/deterministic we still can&amp;rsquo;t say that we are deterministic. Reasoning for this is that we are taking decisions every nanosecond and determinism &amp;ldquo;taints&amp;rdquo; choice within time frame. So if we consider 1s chance it will be deterministic is 99.9^1000000000&lt;/p&gt;</description>
    </item>
    <item>
      <title>Portfolio</title>
      <link>https://xlii.space/portfolio/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/portfolio/</guid>
      <description>&lt;p&gt;List of projects developed outside of professional time.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;HN Job Evaluator&lt;/strong&gt; &lt;a href=&#34;https://github.com/exlee/hn-jobs-evaluator&#34;&gt;[link]&lt;/a&gt; - HN&amp;rsquo;s &amp;ldquo;Who is hiring&amp;rdquo; listing evaluators through LLM (&lt;a href=&#34;https://xlii.space/projects/hn-jobs-evaluator&#34;&gt;release note&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pikchr suite&lt;/strong&gt; &lt;a href=&#34;https://github.com/exlee/pikchr.pl&#34;&gt;[link]&lt;/a&gt; - 3 projects, &lt;code&gt;pikchr.pro&lt;/code&gt; (Prolog over Pikchr wrapper), &lt;code&gt;pikchr.pl&lt;/code&gt; Prolog/Pikchr live editor and &lt;code&gt;diagramIDE&lt;/code&gt; Amiga-workspace inspired IDE for Diagrams through Tcl, Pikchr or Prolog&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ssort&lt;/strong&gt; - &lt;a href=&#34;https://github.com/exlee/ssort&#34;&gt;[link]&lt;/a&gt; - stream sorting utility, doesn&amp;rsquo;t filter only bubbles up more relevant results (good for finding class of items in stream) - written in Go&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SedAgent&lt;/strong&gt; - &lt;a href=&#34;https://codeberg.org/exlee/haskell-toys/src/branch/master/SedAgent&#34;&gt;[link]&lt;/a&gt; - attempt on LLM Agent with Ollama, Haskell and Sed&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tmplr&lt;/strong&gt; - &lt;a href=&#34;https://github.com/exlee/tmplr&#34;&gt;[link]&lt;/a&gt; - Template instantiation Utility written in Rust (&lt;a href=&#34;https://xlii.space/eng/the-four-language-waltz-a-tale-of-allocators-and-regret&#34;&gt;read why&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Emacs Toolkit&lt;/strong&gt; - &lt;a href=&#34;https://codeberg.org/exlee/emacs-toolkit&#34;&gt;[link]&lt;/a&gt; - Emacs idempotent runner and memory report analyzer, written in Haskell&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Emacs Patches&lt;/strong&gt; - &lt;a href=&#34;https://codeberg.org/exlee/emacs-toolkit/src/branch/master/patches&#34;&gt;[link]&lt;/a&gt; - list of Emacs patches I&amp;rsquo;m working on - changes in C (just as Emacs)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Stemple&lt;/strong&gt; - &lt;a href=&#34;https://gitlab.com/exlee/temple&#34;&gt;[link]&lt;/a&gt; - Template Instantiation Utility written in Haskell&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;MicroDiagram&lt;/strong&gt; - &lt;a href=&#34;https://microdiagram.com&#34;&gt;[link]&lt;/a&gt; - Mini DSLs for diagramming based on Pikchr, written in Haskell, self deployed on CloudFront (source unavailable)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;zax&lt;/strong&gt; - &lt;a href=&#34;https://github.com/exlee/zax&#34;&gt;[link]&lt;/a&gt; - Some utilities for Zig projects&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Sample PDF Generator&lt;/strong&gt; - &lt;a href=&#34;https://github.com/exlee/generate_pdf&#34;&gt;[link]&lt;/a&gt; - Generator of sample PDF with ability to specify both visual qualities (page color and text) as well as final PDF size.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;NPM Time Machine&lt;/strong&gt; - &lt;a href=&#34;https://github.com/exlee/npm_time_machine&#34;&gt;[link]&lt;/a&gt; - Utility to &amp;ldquo;move&amp;rdquo; &lt;code&gt;package.lock&lt;/code&gt; through time so that long update strides can be made with minimal invasiveness, written in Rust&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;K810 FN Keys Switcher&lt;/strong&gt; - &lt;a href=&#34;https://github.com/exlee/k810_fkeys_mac&#34;&gt;[link]&lt;/a&gt; - small utility that switched automatically Logitech K810 keys to standard F1.. ones. According to support it was impossible to do ;-)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Resume</title>
      <link>https://xlii.space/resume/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://xlii.space/resume/</guid>
      <description>&lt;blockquote class=&#34;bq bq-warn&#34;&gt;&#xA;  &lt;p&gt;This page is very actively under development. You&amp;rsquo;ll find typos and&#xA;missing content. Feel free to refresh now and then :)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Officially I started working in 2008 as a junior developer in&#xA;Voxcommerce sp. z o.o., but I took odd jobs as a technology&#xA;consultant years before.&lt;/p&gt;&#xA;&lt;p&gt;My first paid sysadmin job was in 1999 when I was rewiring network for&#xA;a family friend&amp;rsquo;s company. I never wanted to become programmer, as I&#xA;perceived is as boring kind of work, but as of today I joke that the&#xA;only difference between work and leisure is whether I&amp;rsquo;m paid or not.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
