<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Aivoituksia</title><link href="//bostik.iki.fi/aivoituksia/" rel="alternate"/><link href="//bostik.iki.fi/aivoituksia/feeds/all.atom.xml" rel="self"/><id>//bostik.iki.fi/aivoituksia/</id><updated>2026-05-10T17:35:57+03:00</updated><entry><title>Choices reveal preferences</title><link href="//bostik.iki.fi/aivoituksia/random/predictable.html" rel="alternate"/><published>2026-04-18T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2026-04-18:/aivoituksia/random/predictable.html</id><summary type="html">&lt;h1&gt;Language choices doubly so&lt;/h1&gt;
&lt;p&gt;The language used in financial markets is fascinating. Everything is
about taking or making bets.&lt;/p&gt;
&lt;p&gt;If you take bets on how companies will do in the future, that's finance.&lt;/p&gt;
&lt;p&gt;If you take bets on sports, that's gambling.&lt;/p&gt;
&lt;p&gt;If you take bets on human misery, that's insurance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CARDS ON THE TABLE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I used to work for a &lt;a href="https://smarkets.com/"&gt;sports betting exchange&lt;/a&gt;. Or
as the industry prefers to be …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Language choices doubly so&lt;/h1&gt;
&lt;p&gt;The language used in financial markets is fascinating. Everything is
about taking or making bets.&lt;/p&gt;
&lt;p&gt;If you take bets on how companies will do in the future, that's finance.&lt;/p&gt;
&lt;p&gt;If you take bets on sports, that's gambling.&lt;/p&gt;
&lt;p&gt;If you take bets on human misery, that's insurance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CARDS ON THE TABLE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I used to work for a &lt;a href="https://smarkets.com/"&gt;sports betting exchange&lt;/a&gt;. Or
as the industry prefers to be known, a prediction market.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Cyclops</title><link href="//bostik.iki.fi/aivoituksia/projects/cyclops.html" rel="alternate"/><published>2026-03-22T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2026-03-22:/aivoituksia/projects/cyclops.html</id><summary type="html">&lt;h1&gt;CycloneDX SBOM indexer&lt;/h1&gt;
&lt;p&gt;Cyclops is a tool to ingest, index and search through
&lt;a href="https://cyclonedx.org/"&gt;CycloneDX&lt;/a&gt; SBOMs. Point it to a directory
containing CycloneDX files (and optionally an S3 bucket path) - it will
index the files and makes them searchable through a simple command line
interface.&lt;/p&gt;
&lt;p&gt;Database engine is SQLite, for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No need to set up external DB for what should be a simple, local only
   tool&lt;/li&gt;
&lt;li&gt;The driver used …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;h1&gt;CycloneDX SBOM indexer&lt;/h1&gt;
&lt;p&gt;Cyclops is a tool to ingest, index and search through
&lt;a href="https://cyclonedx.org/"&gt;CycloneDX&lt;/a&gt; SBOMs. Point it to a directory
containing CycloneDX files (and optionally an S3 bucket path) - it will
index the files and makes them searchable through a simple command line
interface.&lt;/p&gt;
&lt;p&gt;Database engine is SQLite, for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No need to set up external DB for what should be a simple, local only
   tool&lt;/li&gt;
&lt;li&gt;The driver used exports a &lt;code&gt;database/sql&lt;/code&gt; interface, so it should be
   &lt;em&gt;reasonably low effort&lt;/em&gt; to port the tool to use a dedicated, separate
   database instance. Should the need arise.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cyclops is licensed under AGPL.&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/rels/cyclops.tar.xz"&gt;cyclops.tar.xz&lt;/a&gt; (~40kB)&lt;/p&gt;
&lt;p&gt;Git: &lt;code&gt;git clone https://bostik.iki.fi/src/cyclops.git&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;List ingested SBOM types&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-J
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;List detected packaging ecosystems, number of packages&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-E
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ingest SBOMs&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;/path/to/somewhere/with/sboms/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Download SBOMs from S3 in addition to ingesting them&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;/path/to/somewhere/with/sboms/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# becomes download path &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--s3-get&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--s3-bucket&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;BUCKET&lt;span class="w"&gt; &lt;/span&gt;NAME&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--s3-prefix&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;OBJECT&lt;span class="w"&gt; &lt;/span&gt;PATH&lt;span class="w"&gt; &lt;/span&gt;PREFIX&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;--s3-max-days&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;MAX&lt;span class="w"&gt; &lt;/span&gt;OBJECT&lt;span class="w"&gt; &lt;/span&gt;AGE&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;--s3-max-dl-batch&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;PARALLEL&lt;span class="w"&gt; &lt;/span&gt;DOWNLOAD&lt;span class="w"&gt; &lt;/span&gt;BATCH&lt;span class="w"&gt; &lt;/span&gt;SIZE&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;List known packages, their ecosystems, how many found&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-P
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;List known packages, how many found for a single ecosystem&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-P&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;ECOSYSTEM&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;List indexed SBOMs&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-L
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;List indexed SBOMs for a specific type only&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;-j&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;SBOM&lt;span class="w"&gt; &lt;/span&gt;TYPE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Search for dependencies by a partial detection path match&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;PATH&lt;span class="w"&gt; &lt;/span&gt;MATCH&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Search for packages whose names include 'foo'&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;foo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Search for any number of known package names&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;pkg1&lt;span class="w"&gt; &lt;/span&gt;pkg2&lt;span class="w"&gt; &lt;/span&gt;pkg3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pkgN
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Special case for eg. Sha1-Hulud investigation ("do I have any of these
infected packages anywhere in my stack?"):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f1&lt;span class="w"&gt; &lt;/span&gt;/path/to/downloaded/sha1-hulud.csv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;cyclops&lt;span class="w"&gt; &lt;/span&gt;-n
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Various options can be usually combined to list or search through
dependencies only for a given SBOM type and/or a specific packaging
ecosystem.&lt;/p&gt;
&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;I have had a persistent problem at $work. We generate and publish SBOMs
but the only external use I've seen for them is to feed them to
context-free vulnerability "scanner" software.&lt;/p&gt;
&lt;p&gt;Cyclops began as a personal tool to make searching for detection paths
and dependency bloat easier. The data in SBOMs, especially in aggregate,
is far more valuable as a supply chain analytics material and I wanted
to see if I could make this use case more accessible.&lt;/p&gt;
&lt;p&gt;The tool has been written entirely outside of work, though. I had a
problem, some spare time and needed a creative outlet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why AGPL?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I wanted to explicitly discourage anyone from picking up a tool I wrote
for terminal investigations and turning it into a hosted SaaS. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;
the DB schema file is intentionally licensed under
&lt;a href="https://creativecommons.org/public-domain/cc0/"&gt;CC0&lt;/a&gt;; I wanted it to be
clear that any data you have stored in Cyclops's database is always
yours. If you want to interact with it for eg. analytics purposes, you
are free to write tools of your choice to generate reports from data
held in the SQLite file. As long as these tools do not use the code from
the rest of Cyclops, they will remain unaffected by the project's chosen
license.&lt;/p&gt;
&lt;h2&gt;Miscellania&lt;/h2&gt;
&lt;p&gt;Cyclops was first presented at &lt;a href="https://dc4420.org/2026/02/24/"&gt;DC4420&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The name is a homage to CycloneDX project and a play on the far too
common myopic practice of using SBOMs as a fancy input to whatever
vulnerability scanner[TM] happens to be available.&lt;/p&gt;
&lt;p&gt;Supports generating a Zsh autocompletion script with &lt;code&gt;cyclops
completion&lt;/code&gt;.&lt;/p&gt;</content><category term="projects"/></entry><entry><title>Consider</title><link href="//bostik.iki.fi/aivoituksia/random/thinking.html" rel="alternate"/><published>2026-03-08T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2026-03-08:/aivoituksia/random/thinking.html</id><content type="html">&lt;p&gt;Learning without thinking is useless. Thinking without learning is dangerous.
&lt;em&gt;-- C.&lt;/em&gt;&lt;/p&gt;</content><category term="random"/></entry><entry><title>Gent</title><link href="//bostik.iki.fi/aivoituksia/projects/gent.html" rel="alternate"/><published>2026-01-31T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2026-01-31:/aivoituksia/projects/gent.html</id><summary type="html">&lt;h1&gt;Prometheus/Dogstatsd compatible, minimalistic monitoring agent&lt;/h1&gt;
&lt;p&gt;Gent is a simple application telemetry collector &amp;amp; exporter. It Ingests
both regular &lt;code&gt;StatsD&lt;/code&gt; and its extended variant, &lt;code&gt;DogStatsD&lt;/code&gt; messages and
generates Prometheus-compatible telemetry. It is designed to be
reasonably small with &lt;strong&gt;no&lt;/strong&gt; external dependencies. It can be built with
nothing beyond Go standard library.&lt;/p&gt;
&lt;p&gt;Gent is intended to be run on the host or inside a container with direct
host networking. For maximal usefulness …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Prometheus/Dogstatsd compatible, minimalistic monitoring agent&lt;/h1&gt;
&lt;p&gt;Gent is a simple application telemetry collector &amp;amp; exporter. It Ingests
both regular &lt;code&gt;StatsD&lt;/code&gt; and its extended variant, &lt;code&gt;DogStatsD&lt;/code&gt; messages and
generates Prometheus-compatible telemetry. It is designed to be
reasonably small with &lt;strong&gt;no&lt;/strong&gt; external dependencies. It can be built with
nothing beyond Go standard library.&lt;/p&gt;
&lt;p&gt;Gent is intended to be run on the host or inside a container with direct
host networking. For maximal usefulness, it is distributed under the MIT
license.&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/rels/gent.tar.xz"&gt;gent.tar.xz&lt;/a&gt; (~10kB)&lt;/p&gt;
&lt;h2&gt;Using Gent&lt;/h2&gt;
&lt;p&gt;Once the agent is running, send &lt;code&gt;*StatsD&lt;/code&gt; messages to its listening
port. Gent will process the messages and generate an export for
Prometheus-compatible scrapers. These exports are regenerated every 15
seconds.&lt;/p&gt;
&lt;h2&gt;Basic Architecture&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;HOST&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
+-------------------------------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                                                       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+---------------+&lt;span class="w"&gt;               &lt;/span&gt;+---------------+&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;Service&lt;span class="w"&gt; &lt;/span&gt;A&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;-+&lt;span class="w"&gt;           &lt;/span&gt;+-&lt;span class="p"&gt;|&lt;/span&gt;+-------------+&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+---------------+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Container&lt;span class="w"&gt; &lt;/span&gt;X&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;+-------------+&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+---------------+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+---------------+&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;Service&lt;span class="w"&gt; &lt;/span&gt;B&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;-+&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+---------------+&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;msg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;+------+&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;v&lt;span class="w"&gt;           &lt;/span&gt;v&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Gent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;                                            &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
+-------------------Y-----------Y------------&lt;span class="o"&gt;========&lt;/span&gt;---+
&lt;span class="w"&gt;               &lt;/span&gt;localhost&lt;span class="w"&gt;      &lt;/span&gt;container-network
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Performance&lt;/h2&gt;
&lt;p&gt;Tested on a relatively recent AMD Zen 7 @3.3GHz.&lt;/p&gt;
&lt;p&gt;With the included &lt;code&gt;stresser&lt;/code&gt; sources, &lt;code&gt;gent&lt;/code&gt; can sustain a degenerate
rate of 400k packets per second before dropping messages. At rates below
50k/pps the CPU utilisation is negligible.&lt;/p&gt;
&lt;h2&gt;Miscellania&lt;/h2&gt;
&lt;p&gt;The name &lt;code&gt;gent&lt;/code&gt; is a pun, for "a gent".&lt;/p&gt;
&lt;p&gt;It is inspired by &lt;a href="https://github.com/smarkets/bucky3"&gt;bucky3&lt;/a&gt;, a
monitoring agent used internally at &lt;a href="https://smarkets.com/"&gt;Smarkets&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;The ringbuffer design is inspired by
&lt;a href="https://lmax-exchange.github.io/disruptor/disruptor.html"&gt;LMAX Disruptor&lt;/a&gt; but
takes a few shortcuts to make the implementation easier to reason
about.&lt;/p&gt;
&lt;p&gt;For practical information on &lt;code&gt;DogStatsD&lt;/code&gt; message format, see
&lt;a href="https://davidlu1001.github.io/2020/04/22/Send-metric-to-StatsD-Datadog/"&gt;this article&lt;/a&gt;.&lt;/p&gt;</content><category term="projects"/></entry><entry><title>A bubble about to burst</title><link href="//bostik.iki.fi/aivoituksia/random/signs-of-needle-approaching.html" rel="alternate"/><published>2025-12-30T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2025-12-30:/aivoituksia/random/signs-of-needle-approaching.html</id><summary type="html">&lt;h1&gt;The AI bubble of 202x is waiting to pop&lt;/h1&gt;
&lt;p&gt;With both of the big names (&lt;a href="https://www.reuters.com/business/openai-lays-groundwork-juggernaut-ipo-up-1-trillion-valuation-2025-10-29/"&gt;OpenAI&lt;/a&gt;
&amp;amp; &lt;a href="https://www.reuters.com/business/retail-consumer/anthropic-plans-an-ipo-early-2026-ft-reports-2025-12-03/"&gt;Anthropic&lt;/a&gt;)
announcing their speedy IPO plans, the only sensible conclusion to draw
is that the bubble is about to burst. The companies in question know it.
Their investors know it. The &lt;em&gt;public at large&lt;/em&gt; knows it. The investor
class expects it but is looking at trajectory based on history.
&lt;sup id=sf-signs-of-needle-approaching-1-back&gt;&lt;a href=#sf-signs-of-needle-approaching-1 class=simple-footnote title="Surely there is always a bigger fool to sell to."&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The sentiment among the …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;The AI bubble of 202x is waiting to pop&lt;/h1&gt;
&lt;p&gt;With both of the big names (&lt;a href="https://www.reuters.com/business/openai-lays-groundwork-juggernaut-ipo-up-1-trillion-valuation-2025-10-29/"&gt;OpenAI&lt;/a&gt;
&amp;amp; &lt;a href="https://www.reuters.com/business/retail-consumer/anthropic-plans-an-ipo-early-2026-ft-reports-2025-12-03/"&gt;Anthropic&lt;/a&gt;)
announcing their speedy IPO plans, the only sensible conclusion to draw
is that the bubble is about to burst. The companies in question know it.
Their investors know it. The &lt;em&gt;public at large&lt;/em&gt; knows it. The investor
class expects it but is looking at trajectory based on history.
&lt;sup id=sf-signs-of-needle-approaching-1-back&gt;&lt;a href=#sf-signs-of-needle-approaching-1 class=simple-footnote title="Surely there is always a bigger fool to sell to."&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The sentiment among the AI companies is being telegraphed loud and
clear: "take the money and run". If they get to IPO before the reality
catches up, someone else will be holding the bag. The owners and
investors have cashed out. Collapsing stock price is no longer their
problem. The world can burn. &lt;/p&gt;
&lt;p&gt;With any luck, they will also have the money to buy good businesses for
pennies during the crash, and own even more of the global production
when the cataclysm eventually subsides.&lt;/p&gt;
&lt;p&gt;Or as someone else distilled the whole thing: "The price of computer
memory has tripled because a bunch of memory that hasn't been yet
manufactured has been pre-ordered so it can be used in GPUs that aren't
yet installed in data centers that haven't been built yet in order to
supply a demand that doesn't exist so the companies can earn profits
that won't happen."&lt;/p&gt;&lt;ol class=simple-footnotes&gt;&lt;li id=sf-signs-of-needle-approaching-1&gt;Surely there is always a bigger fool to sell to. &lt;a href=#sf-signs-of-needle-approaching-1-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</content><category term="random"/></entry><entry><title>Lessons from 30+ years of information security</title><link href="//bostik.iki.fi/aivoituksia/random/infosec-lesson-0.html" rel="alternate"/><published>2025-12-25T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2025-12-25:/aivoituksia/random/infosec-lesson-0.html</id><content type="html">&lt;h1&gt;The zeroeth rule of thumb for infosec professionals&lt;/h1&gt;
&lt;p&gt;You are not cynical enough.&lt;/p&gt;
&lt;p&gt;No, not even you. Not even after adjusting for the above.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Bone-chilling winds of political change</title><link href="//bostik.iki.fi/aivoituksia/augury/bone-chilling-winds-of-political-change.html" rel="alternate"/><published>2025-12-11T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2025-12-11:/aivoituksia/augury/bone-chilling-winds-of-political-change.html</id><content type="html">&lt;h1&gt;Reading the tea leaves&lt;/h1&gt;
&lt;p&gt;Listening to political winds and reading the tea leaves in the UK make
one thing disturbingly clear.&lt;/p&gt;
&lt;p&gt;The country is about 6 years away from brownshirts, and 9 years from
camps.&lt;/p&gt;
&lt;p&gt;Long-term investment is looking at razor wire and heating element
manufacturing as a growth sector.&lt;/p&gt;</content><category term="augury"/></entry><entry><title>Artificial Misanthropy</title><link href="//bostik.iki.fi/aivoituksia/random/artificial-misanthropy.html" rel="alternate"/><published>2025-12-02T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2025-12-02:/aivoituksia/random/artificial-misanthropy.html</id><content type="html">&lt;h1&gt;Artificial Misanthropy&lt;/h1&gt;
&lt;p&gt;A misanthrope is someone whose view of the world can be distilled into a
simple sentence: &lt;em&gt;"I hate people in general, and everyone in
particular."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And it's a common enough condition in expressed writing that
&lt;a href="https://bostik.iki.fi/aivoituksia/pages/ai-addresses-humanity.html"&gt;even AI has picked it up&lt;/a&gt;.&lt;/p&gt;</content><category term="random"/></entry><entry><title>False positives are so last century</title><link href="//bostik.iki.fi/aivoituksia/random/false-positives-are-so-last-century.html" rel="alternate"/><published>2025-07-20T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2025-07-20:/aivoituksia/random/false-positives-are-so-last-century.html</id><summary type="html">&lt;h1&gt;New hotness: Unvalidated Assumptions&lt;/h1&gt;
&lt;p&gt;Vulnerability scanners, in the year 2025 - and the companies flogging
them to unsuspecting &lt;strike&gt;customers&lt;/strike&gt; victims - are defective
by design. The latest trend in flooding the already substandard spewage
with even more useless noise is to run CI-time checks against non-CI
systems.&lt;/p&gt;
&lt;p&gt;A "modern"[tm] scanner, upon finding a build manifest source code file
with listed dependencies will happily claim that every listed package is
installed on …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;New hotness: Unvalidated Assumptions&lt;/h1&gt;
&lt;p&gt;Vulnerability scanners, in the year 2025 - and the companies flogging
them to unsuspecting &lt;strike&gt;customers&lt;/strike&gt; victims - are defective
by design. The latest trend in flooding the already substandard spewage
with even more useless noise is to run CI-time checks against non-CI
systems.&lt;/p&gt;
&lt;p&gt;A "modern"[tm] scanner, upon finding a build manifest source code file
with listed dependencies will happily claim that every listed package is
installed on the system. It does not bother to verify its claim. That
would be too much work.&lt;/p&gt;
&lt;p&gt;That is just as accurate as if a police visiting a home sees a copy of
Malleus Maleficarum in the bookshelf, and puts everyone in jail because
of iron-clad proof that the family living there burn people alive.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Four stages of getting griefed</title><link href="//bostik.iki.fi/aivoituksia/random/four-stages-of-getting-griefed.html" rel="alternate"/><published>2024-11-25T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2024-11-25:/aivoituksia/random/four-stages-of-getting-griefed.html</id><summary type="html">&lt;h1&gt;Scribbling at $dayjob, again&lt;/h1&gt;
&lt;p&gt;Some time ago (&lt;em&gt;cough&lt;/em&gt; several months &lt;em&gt;cough&lt;/em&gt;) I wrote a piece at work.
As part of a bigger set of reader friendly updates, I knew I needed the
option to link to a concise piece that explains &lt;em&gt;what&lt;/em&gt; takes place in
the event of an online breach. And that piece could not be too specific,
or tied to any single vendor or system.&lt;/p&gt;
&lt;p&gt;Among other things …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Scribbling at $dayjob, again&lt;/h1&gt;
&lt;p&gt;Some time ago (&lt;em&gt;cough&lt;/em&gt; several months &lt;em&gt;cough&lt;/em&gt;) I wrote a piece at work.
As part of a bigger set of reader friendly updates, I knew I needed the
option to link to a concise piece that explains &lt;em&gt;what&lt;/em&gt; takes place in
the event of an online breach. And that piece could not be too specific,
or tied to any single vendor or system.&lt;/p&gt;
&lt;p&gt;Among other things, breaches are reported and news of them read because
humans are... well, human. Selfish. Shallow.&lt;/p&gt;
&lt;p&gt;Consider this a PR-approved, yet sufficiently cynical take on the
anatomy of an online breach:
&lt;a href="https://www.beacon.io/cyberattacks-the-four-stages-of-getting-griefed/"&gt;Four stages of getting griefed&lt;/a&gt;&lt;/p&gt;</content><category term="random"/></entry><entry><title>Crowdstrike outage was inevitable</title><link href="//bostik.iki.fi/aivoituksia/random/crowdstrike-outage-was-inevitable.html" rel="alternate"/><published>2024-07-21T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2024-07-21:/aivoituksia/random/crowdstrike-outage-was-inevitable.html</id><summary type="html">&lt;h1&gt;The global IT outage was only a matter of time&lt;/h1&gt;
&lt;p&gt;Friday, 2024-07-19. Large parts of the world come to a screeching halt,
when Crowdstrike, a "security and endpoint protection solutions company",
deploys a broken signature update.
&lt;a href="https://www.bbc.co.uk/news/articles/cpe3zgznwjno"&gt;8.5 million Windows machines crash and do not recover.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Crowdstrike caught the bullet and the blame, but this could have been
any one of the vendors in the same sector. They are all …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;The global IT outage was only a matter of time&lt;/h1&gt;
&lt;p&gt;Friday, 2024-07-19. Large parts of the world come to a screeching halt,
when Crowdstrike, a "security and endpoint protection solutions company",
deploys a broken signature update.
&lt;a href="https://www.bbc.co.uk/news/articles/cpe3zgznwjno"&gt;8.5 million Windows machines crash and do not recover.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Crowdstrike caught the bullet and the blame, but this could have been
any one of the vendors in the same sector. They are all equally bad.&lt;/p&gt;
&lt;h2&gt;Rootkits, rootkits everywhere&lt;/h2&gt;
&lt;p&gt;An endpoint detection and response product (EDR, NDR, XDR, or whatever
they are called this week) tries to prevent dodgy and/or malicious
software compromising the system. It does this by inspecting,
intercepting, blocking or modifying the low-level library and operating
system calls made by all other software running on the system. To do
that, it must itself run with elevated privileges and even inside
the kernel.&lt;/p&gt;
&lt;p&gt;A piece of third-party software, loaded into the kernel, intended to
modify what other software on the system can see or do. Back in the
1990s we used to call them rootkits.&lt;/p&gt;
&lt;p&gt;The endpoint security products may wear corporate suits and come with
exorbitant marketing budgets, but from a technical perspective they are
just the same: rootkits.&lt;/p&gt;
&lt;h2&gt;Poor quality code&lt;/h2&gt;
&lt;p&gt;The outage from &lt;em&gt;this&lt;/em&gt; particular failure was caused by Crowdstrike's
agent (running in the kernel) parsing a malformed signature data file
... and promptly crashing. Taking the entire system with it.&lt;/p&gt;
&lt;p&gt;On reboot, the agent is one of the first pieces to start, so it has an
early access to read its data files before anything else comes up. So
now it crashes early in the boot sequence, causing a "boot loop".&lt;/p&gt;
&lt;p&gt;Reboot. &lt;em&gt;CRASH!&lt;/em&gt; Reboot. &lt;em&gt;CRASH!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This should be error handling 101, and it is crystal clear Crowdstrike's
agent was not doing it properly. But as I said at the top, this could
have been anyone. If this is how the industry giants write kernel
drivers, their userspace code is unlikely to be any better.&lt;/p&gt;
&lt;p&gt;This is not a new sentiment. Few months back, Dmitri Alperovitch -
founding member of CSRB, co-founder and former CTO of Crowdstrike - said
during a podcast interview that some of the worst code he had ever seen
was in security products. Industry professionals have known this for a
long time, so it didn't come as news... but it was admittedly nice to
hear someone finally say the quiet part out loud.&lt;/p&gt;
&lt;h2&gt;Bad release management practices&lt;/h2&gt;
&lt;p&gt;Based on the reports heard so far, the signature data update ("channel
file") had passed all their build time checks. The malformed data was
inserted into the build artifacts at a later stage, before the
now-modified release artifact was finally made available to their
installed client base.&lt;/p&gt;
&lt;p&gt;How is that an acceptable release mechanism?&lt;/p&gt;
&lt;p&gt;As if that wasn't enough, the updated artifacts were made globally
available without (apparently) testing them internally first. Even the
most basic testing scheme should have caught &lt;em&gt;an entire fleet of
machines crashing after update&lt;/em&gt;. So either Crowdstrike did not have
testing regime in place - or they did, and nobody paid attention to what
the test systems were showing.&lt;/p&gt;
&lt;p&gt;How is that an acceptable release strategy?&lt;/p&gt;
&lt;p&gt;And if Crowdstrike, a supposedly industry-leading giant is doing it this
badly - how bad is it with the rest of the industry?&lt;/p&gt;
&lt;h2&gt;Perverse incentives&lt;/h2&gt;
&lt;p&gt;Based on grapevine and rumour mill (ie. things I can not attribute or
verify), EDR vendors have contractual SLAs that bind them to a
guaranteed 4-hour turnaround from "new threat detected" to "signature
and prevention mechanism deployed to clients".&lt;/p&gt;
&lt;p&gt;High pressure. Complex problems. Arbitrarily tight, unrealistic
deadlines.&lt;/p&gt;
&lt;p&gt;That is a recipe for cutting corners and bypassing checks. If running a
pre-release check cycle takes 20 minutes and you're already running out
of time, then sure, by all means, YOLO the release. If you breach the
SLA, your clients are going to get hefty discounts and service credits -
and your boss's boss will miss their annual bonus ladder.&lt;/p&gt;
&lt;p&gt;What's the worst that could happen?&lt;/p&gt;
&lt;h2&gt;Regulatory capture&lt;/h2&gt;
&lt;p&gt;A lesser known misfeature of the security product vendor race is that
once a vendor is big enough and well-known enough, their name gets
"somehow" added to security questionnaire templates. These templates are
used by various regulators, auditors, clients' vendor
diligence/assurance teams, and insurers. Get big enough as a vendor, and
you get added to a list of pre-approved/known-good providers, into a
dropdown menu in spreadsheet, or a radio button menu in a web form.&lt;/p&gt;
&lt;p&gt;These questionnaires are everywhewre. Every time you, as a party
getting questioned, pick the sane option ("other"), you get to explain
the reason for doing so to non-technical, non-security people. It is no
wonder that for a company going through the same dance for the umpteenth
time, someone high up in the chain will eventually decide that it's
going to be easier to buy a solution from one of the listed vendors just
to cut down on the time and headache.&lt;/p&gt;
&lt;p&gt;A tacit moat is still a moat.&lt;/p&gt;
&lt;h2&gt;Disaster recovery through clicky-clicky&lt;/h2&gt;
&lt;p&gt;As bad as the security product vendors may be, they are not the only
ones to drop the ball. This disaster took out more than eight million
systems in a couple of hours. The companies impacted will take days, if
not weeks, to recover in full.&lt;/p&gt;
&lt;p&gt;In this day and age, system provisioning and recovery should be a solved
problem. Frequently updated, well maintained golden images with well
exercised, automated (re)install cycles &lt;em&gt;should&lt;/em&gt; be table stakes.&lt;/p&gt;
&lt;p&gt;They're not.&lt;/p&gt;
&lt;p&gt;Instead we have overburdened IT admin teams who have to go around
from machine to machine, clicking buttons in the right order, to get the
basic functionality back.&lt;/p&gt;
&lt;p&gt;Our industries are running fleets of machines that are capable of doing
the same thing over and over again, blazingly fast, never getting tired.
We supposedly thrive on automation. And yet the actual maintenance of
these same machines is done without taking advantage of the same
automation capabilities. Instead of routinely used scripts taking care
of the mundane activities, we depend on runbooks &lt;em&gt;with screenshots&lt;/em&gt; to
explain which button to click at any given step in the sequence.&lt;/p&gt;
&lt;h2&gt;The outro&lt;/h2&gt;
&lt;p&gt;A global outage thanks to security vendor failure was not an accident.
It was an inevitability. &lt;/p&gt;
&lt;p&gt;And we're going to see it happen again.&lt;/p&gt;</content><category term="random"/></entry><entry><title>In wake of xz project compromise...</title><link href="//bostik.iki.fi/aivoituksia/random/in-wake-of-xz-compromise.html" rel="alternate"/><published>2024-04-01T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2024-04-01:/aivoituksia/random/in-wake-of-xz-compromise.html</id><content type="html">&lt;h1&gt;OSS project governance demands, distilled&lt;/h1&gt;
&lt;p&gt;Hi, I'm from Entitled Inc.&lt;/p&gt;
&lt;p&gt;You know that unpaid labour of yours, which we benefit from? You should
do more of it. Oh, and you should add all this red tape so that we don't
have to do anything ourselves.&lt;/p&gt;
&lt;p&gt;We're still not going to pay you.&lt;/p&gt;
&lt;p&gt;We also demand that you sign our Modern Slavery statement.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Solution in search of permanence</title><link href="//bostik.iki.fi/aivoituksia/augury/solution-in-search-of-permanence.html" rel="alternate"/><published>2023-11-17T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2023-11-17:/aivoituksia/augury/solution-in-search-of-permanence.html</id><content type="html">&lt;h1&gt;Visions of future past&lt;/h1&gt;
&lt;p&gt;Year is 2041. Freshly elected Tory government, with nothing left in the
country to sell off, find a solution to their prison overcrowding
problem. State sanctioned organ harvesting becomes an overnight export
success.&lt;/p&gt;
&lt;p&gt;Medical facilities are caught by surprise, consistently outbid by the
pet food industry.&lt;/p&gt;</content><category term="augury"/></entry><entry><title>Life of success</title><link href="//bostik.iki.fi/aivoituksia/random/success.html" rel="alternate"/><published>2023-10-22T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2023-10-22:/aivoituksia/random/success.html</id><content type="html">&lt;h1&gt;Three steps to a life of success&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Be born to the right parents&lt;/li&gt;
&lt;li&gt;Nepo&lt;/li&gt;
&lt;li&gt;Coast&lt;/li&gt;
&lt;/ol&gt;</content><category term="random"/></entry><entry><title>Collected scribblings</title><link href="//bostik.iki.fi/aivoituksia/random/collected-scribblings.html" rel="alternate"/><published>2023-07-02T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2023-07-02:/aivoituksia/random/collected-scribblings.html</id><summary type="html">&lt;h1&gt;Things written in times past&lt;/h1&gt;
&lt;p&gt;I used to write things for a previous employer's tech blog, but the old
URLs may succumb to bitrot. These should work as long as Medium works:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/the-challenges-of-running-a-betting-exchange-4a55320d0978"&gt;The challenges of running a betting exchange (2016)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/notes-on-interviewing-engineers-a4fa4383968a"&gt;Notes on interviewing engineers (2016)&lt;/a&gt; -- This one was also picked up
by a recruiter's blog.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/devops-is-a-culture-not-a-title-prefix-b825b44dfcda"&gt;DevOps is culture, not a title prefix (2017)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/security-and-devops-a-natural-fit-74620e428a95"&gt;Security and Devops - a natural fit (2017 …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Things written in times past&lt;/h1&gt;
&lt;p&gt;I used to write things for a previous employer's tech blog, but the old
URLs may succumb to bitrot. These should work as long as Medium works:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/the-challenges-of-running-a-betting-exchange-4a55320d0978"&gt;The challenges of running a betting exchange (2016)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/notes-on-interviewing-engineers-a4fa4383968a"&gt;Notes on interviewing engineers (2016)&lt;/a&gt; -- This one was also picked up
by a recruiter's blog.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/devops-is-a-culture-not-a-title-prefix-b825b44dfcda"&gt;DevOps is culture, not a title prefix (2017)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/security-and-devops-a-natural-fit-74620e428a95"&gt;Security and Devops - a natural fit (2017)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/wait-what-is-my-fleet-doing-2e7b1b06fd0e"&gt;Wait, what is my fleet doing (2018)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/hey-guess-what-your-passwords-have-been-compromised-d56d4f26f1f5"&gt;Hey, guess what? Your passwords have been compromised&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/smarkets/shields-up-on-user-information-b7093fb98b13"&gt;Shields up on user information (2019)&lt;/a&gt;&lt;/p&gt;</content><category term="random"/></entry><entry><title>Coronation Time</title><link href="//bostik.iki.fi/aivoituksia/london-calling/coronation-time.html" rel="alternate"/><published>2023-04-18T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2023-04-18:/aivoituksia/london-calling/coronation-time.html</id><content type="html">&lt;h1&gt;Dedicated to Cause&lt;/h1&gt;
&lt;p&gt;UK government's refusal to negotiate with the NHS staff can only be
taken as dedication to monarchy. They want to make sure that King
Charles's coronation will be a once-in-a-lifetime experience for as many
people as possible.&lt;/p&gt;</content><category term="london-calling"/></entry><entry><title>Audits explained</title><link href="//bostik.iki.fi/aivoituksia/random/audits-explained.html" rel="alternate"/><published>2022-12-07T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2022-12-07:/aivoituksia/random/audits-explained.html</id><content type="html">&lt;h1&gt;Audits explained&lt;/h1&gt;
&lt;p&gt;A pentest is like going to the GP for a check-up. An audit is like
having a month-long colonoscopy.&lt;/p&gt;</content><category term="random"/></entry><entry><title>from copilot import vulnerabilities</title><link href="//bostik.iki.fi/aivoituksia/random/minimum-viable-copypaste.html" rel="alternate"/><published>2021-09-03T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2021-09-03:/aivoituksia/random/minimum-viable-copypaste.html</id><summary type="html">&lt;h1&gt;Not your grandfather's MVC&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.theinsaneapp.com/2021/09/github-copilot-generated-40-percent-insecure-code.html"&gt;This was perfectly predictable.&lt;/a&gt;
CoPilot generates insecure code, as expected.&lt;/p&gt;
&lt;p&gt;Machine Learning, the magic pixie dust of the past decade, is all about
volume. And writing secure code is harder than writing insecure code. So
by sheer volume there will be a lot more insecure code around.&lt;/p&gt;
&lt;p&gt;Given that a lot of code in the wild is essentially a minimum viable
copypaste from the highest scoring …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Not your grandfather's MVC&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.theinsaneapp.com/2021/09/github-copilot-generated-40-percent-insecure-code.html"&gt;This was perfectly predictable.&lt;/a&gt;
CoPilot generates insecure code, as expected.&lt;/p&gt;
&lt;p&gt;Machine Learning, the magic pixie dust of the past decade, is all about
volume. And writing secure code is harder than writing insecure code. So
by sheer volume there will be a lot more insecure code around.&lt;/p&gt;
&lt;p&gt;Given that a lot of code in the wild is essentially a minimum viable
copypaste from the highest scoring answer on StackOverflow, teaching the
code generator model has obviously consumed a lot of insecure code.
Since SO rewards speed, the answers that take the least time to write
will receive most points.&lt;/p&gt;
&lt;p&gt;Writing secure code takes more time and more space - so by the time
someone submits an answer that considers security aspects, the person
asking the question has already accepted (and ran with) the first and
shortest working answer instead.&lt;/p&gt;
&lt;p&gt;StackOverflow has redefined the MVC programming model. It now stands for
&lt;strong&gt;Minimum Viable Copypaste&lt;/strong&gt;.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Chilihillo</title><link href="//bostik.iki.fi/aivoituksia/kokkaus/chili-jam.html" rel="alternate"/><published>2021-06-28T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2021-06-28:/aivoituksia/kokkaus/chili-jam.html</id><summary type="html">&lt;h1&gt;Lusikoitavaa chiliä&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Arvioitu valmistusaika: 1,5h&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="chilit" src="/aivoituksia/images/jam/04--chilis-on-chopping-board.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Muokattu &lt;a href="https://www.theguardian.com/lifeandstyle/2014/mar/28/how-to-make-your-own-chilli-jam-recipe"&gt;Guardianin reseptistä&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Ainekset&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reilu 300g tuoreita chilejä&lt;/li&gt;
&lt;li&gt;1kg hienosokeria&lt;/li&gt;
&lt;li&gt;Pektiiniä&lt;/li&gt;
&lt;li&gt;400ml siideriviinietikkaa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="" src="/aivoituksia/images/jam/01--chilis-in-bowl.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/aivoituksia/images/jam/02--sugar.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Muut tarvikkeet&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hillopurkkeja&lt;/li&gt;
&lt;li&gt;5l kattila&lt;/li&gt;
&lt;li&gt;Soseutin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Esivalmistelut&lt;/h2&gt;
&lt;p&gt;Mittaa reilu 5g pektiiniä ja sekoita hienosokeriin.&lt;/p&gt;
&lt;p&gt;Keitä purkit ja kannet erillisessä kattilassa. Ota syrjään ja pidä
veden alla kunnes hillo on valmista.&lt;/p&gt;
&lt;p&gt;&lt;img alt="sterilointi" src="/aivoituksia/images/jam/03--jar-sterilisation.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Valmistus&lt;/h2&gt;
&lt;p&gt;Leikkaa chilien tyvet pois, halkaise ja poista siemenet sekä suurin osa
valkoisesta lihasta.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ilman siemeniä" src="/aivoituksia/images/jam/05--seeded.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="..." src="/aivoituksia/images/jam/06--produce-and-refuse.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Perattuna chilejä pitäisi olla noin 250g. Ei …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Lusikoitavaa chiliä&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Arvioitu valmistusaika: 1,5h&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="chilit" src="/aivoituksia/images/jam/04--chilis-on-chopping-board.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Muokattu &lt;a href="https://www.theguardian.com/lifeandstyle/2014/mar/28/how-to-make-your-own-chilli-jam-recipe"&gt;Guardianin reseptistä&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Ainekset&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reilu 300g tuoreita chilejä&lt;/li&gt;
&lt;li&gt;1kg hienosokeria&lt;/li&gt;
&lt;li&gt;Pektiiniä&lt;/li&gt;
&lt;li&gt;400ml siideriviinietikkaa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="" src="/aivoituksia/images/jam/01--chilis-in-bowl.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/aivoituksia/images/jam/02--sugar.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Muut tarvikkeet&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hillopurkkeja&lt;/li&gt;
&lt;li&gt;5l kattila&lt;/li&gt;
&lt;li&gt;Soseutin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Esivalmistelut&lt;/h2&gt;
&lt;p&gt;Mittaa reilu 5g pektiiniä ja sekoita hienosokeriin.&lt;/p&gt;
&lt;p&gt;Keitä purkit ja kannet erillisessä kattilassa. Ota syrjään ja pidä
veden alla kunnes hillo on valmista.&lt;/p&gt;
&lt;p&gt;&lt;img alt="sterilointi" src="/aivoituksia/images/jam/03--jar-sterilisation.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Valmistus&lt;/h2&gt;
&lt;p&gt;Leikkaa chilien tyvet pois, halkaise ja poista siemenet sekä suurin osa
valkoisesta lihasta.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ilman siemeniä" src="/aivoituksia/images/jam/05--seeded.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="..." src="/aivoituksia/images/jam/06--produce-and-refuse.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Perattuna chilejä pitäisi olla noin 250g. Ei ole kovin tarkkaa.
(Alkuperäisen reseptin mukaan 200g riittää mutta nyt lisätään vähän
potkua ja makua.)&lt;/p&gt;
&lt;p&gt;&lt;img alt="noin 250g" src="/aivoituksia/images/jam/07--about-250g.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Pilko chilit sopivan pieniksi ja soseuta.&lt;/p&gt;
&lt;p&gt;&lt;img alt="chilinpaloja" src="/aivoituksia/images/jam/08--chopped-up.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="soseutettu" src="/aivoituksia/images/jam/09--blitzed.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Laita aineet kattilaan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sokeri ja pektiini&lt;/li&gt;
&lt;li&gt;soseutettu chili&lt;/li&gt;
&lt;li&gt;etikka&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="kaikki sekaisin" src="/aivoituksia/images/jam/10--combine-it-all.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Keitä ja sekoita noin 15m verran. Keitos saa kuohua ihan kunnolla.&lt;/p&gt;
&lt;p&gt;&lt;img alt="keitos" src="/aivoituksia/images/jam/11--rolling-boil.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Hillo on valmista kun se jähmettyy kylmälle lautaselle. Jos keittämistä
jatkaa muutaman minuutin pitempään, tulos on gelatiinimaisempi.&lt;/p&gt;
&lt;p&gt;Kaada hillo purkkeihin. Vie ensin joksikin aikaa huoneenlämpöön tai ulos
jäähtymään, ja kun purkit eivät enää ole kuumia, siirrä jääkaappiin.&lt;/p&gt;
&lt;p&gt;&lt;img alt="hillopurkit" src="/aivoituksia/images/jam/12--three-jars-of-joy.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="lähikuva" src="/aivoituksia/images/jam/13--close-up.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;Säilytys&lt;/h2&gt;
&lt;p&gt;Pysyy hyvänä jääkaapissa jopa puolikin vuotta. Ellei lopu ensin.&lt;/p&gt;</content><category term="kokkaus"/></entry><entry><title>Swipe to SSH</title><link href="//bostik.iki.fi/aivoituksia/projects/yubikey-ssh.html" rel="alternate"/><published>2021-01-07T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2021-01-07:/aivoituksia/projects/yubikey-ssh.html</id><summary type="html">&lt;h1&gt;SSH (Yubi)Key Authentication&lt;/h1&gt;
&lt;p&gt;SSH with private keys coming from secure hardware. What's not to like?&lt;/p&gt;
&lt;p&gt;You've read the &lt;a href="https://www.stavros.io/posts/u2f-fido2-with-ssh/"&gt;How-To&lt;/a&gt;.
You've changed the pin with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;yubico-piv-tool -a change-pin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You're generating a resident key with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ssh-keygen -t ed25519-sk -O resident -f ~/.ssh/yubi_ed255_key&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After entering your pin, the above command breaks with "enrollment
failed: invalid format". Surely you're doing something wrong? After a
minute of head scratching, you try again, this …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;SSH (Yubi)Key Authentication&lt;/h1&gt;
&lt;p&gt;SSH with private keys coming from secure hardware. What's not to like?&lt;/p&gt;
&lt;p&gt;You've read the &lt;a href="https://www.stavros.io/posts/u2f-fido2-with-ssh/"&gt;How-To&lt;/a&gt;.
You've changed the pin with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;yubico-piv-tool -a change-pin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You're generating a resident key with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ssh-keygen -t ed25519-sk -O resident -f ~/.ssh/yubi_ed255_key&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After entering your pin, the above command breaks with "enrollment
failed: invalid format". Surely you're doing something wrong? After a
minute of head scratching, you try again, this time with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ssh-keygen -vv -t ed25519-sk -O resident -f ~/.ssh/yubi_ed255_key&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And are greeted with a confusing error. According to the error code
(&lt;code&gt;FIDO_ERR_PIN_NOT_SET&lt;/code&gt;) the resident key can not be
generated because your YubiKey is not protected with a pin. But you've
changed it already - what gives?&lt;/p&gt;
&lt;p&gt;You've changed the PIN for the PIV application... which is different
from the FIDO2 application. &lt;/p&gt;
&lt;h2&gt;Right idea, right PIN, wrong application?&lt;/h2&gt;
&lt;p&gt;Turns out you're missing the right tool. Get the correct one with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;${SUDO} apt install yubikey-manager&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And then configure the FIDO2 application code with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ykman fido access change-pin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now you can rerun the command from above and generate a private key
directly with the YubiKey.&lt;/p&gt;
&lt;p&gt;(Update 2025-03-15: &lt;code&gt;ykman&lt;/code&gt; fido command updated)&lt;/p&gt;
&lt;h2&gt;Things that work&lt;/h2&gt;
&lt;p&gt;The private key file, generated by the &lt;code&gt;ssh-keygen&lt;/code&gt; command,
can be nuked. It is after all a &lt;em&gt;resident&lt;/em&gt; key, accessible directly from
the YubiKey device. And you probably didn't add a keyphrase for it
either.&lt;/p&gt;
&lt;p&gt;So you can now load the private key into SSH agent, with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ssh-add -K&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You'll need to type in the PIN you set earlier.&lt;/p&gt;
&lt;h2&gt;... and a few that don't&lt;/h2&gt;
&lt;p&gt;The main problem with the above setup is that &lt;em&gt;every&lt;/em&gt; use of the private
key, even when loaded to the agent, requires to touch the magic button.
To make things worse, the client doesn't show any hint what is needed,
from a casual observer's point of view establishing the connection seems
to hang.&lt;/p&gt;
&lt;p&gt;This is okay for random logins, but breaks non-interactive workflows,
and utterly messes up remote autocomplete. Touch the key one time too
few, and the autocomplete never finishes. Touch it one time too many,
and you've just vomited an OTP string to your terminal.&lt;/p&gt;
&lt;p&gt;An ideal setup would allow the agent to authenticate without interaction
for a configurable time, but so far this seems not to be supported.&lt;/p&gt;
&lt;h2&gt;Near-future experimentation&lt;/h2&gt;
&lt;p&gt;Documentation for &lt;code&gt;ssh-keygen&lt;/code&gt; states that the resident key
may be generated with the additional option &lt;code&gt;-O
no-touch-required&lt;/code&gt; to allow fully non-interactive use. At least at
the time of writing, portable OpenSSH v8.4 does not appear to support
the option, which may be for the best. Additionally, the public key
requires special annotation for its entry in
&lt;code&gt;authorised_keys&lt;/code&gt; but even then it's not a good idea.&lt;/p&gt;
&lt;p&gt;Because this option essentially would turn the YubiKey into a
USB-attached SSH trust/identity dongle, it's far too dangerous to be
used without other mitigations.&lt;/p&gt;
&lt;h2&gt;The missing hint&lt;/h2&gt;
&lt;p&gt;The bit about FIDO2 application for SSH client and the necessary command
was found &lt;a href="https://lists.archive.carbon60.com/openssh/dev/76214"&gt;here.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Helpful two-liners&lt;/h2&gt;
&lt;p&gt;When changing the PIN/PUK codes, of course you want the new codes to be
random. A really easy way to generate them is with python. Like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;% python3&lt;/p&gt;
&lt;p&gt;import secrets&lt;/p&gt;
&lt;p&gt;secrets.randbelow(10**6)  # for PIN&lt;/p&gt;
&lt;p&gt;secrets.randbelow(10**8)  # for PUK
&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="projects"/></entry><entry><title>Getting home for plague'mas</title><link href="//bostik.iki.fi/aivoituksia/random/good-tidings-with-plague.html" rel="alternate"/><published>2020-12-21T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2020-12-21:/aivoituksia/random/good-tidings-with-plague.html</id><content type="html">&lt;h1&gt;Be honest&lt;/h1&gt;
&lt;p&gt;Planning to travel to visit your family in these plague-ridden times,
you're really saying:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"I miss my family so much they will see me if it's the last thing they
do."&lt;/em&gt;&lt;/p&gt;</content><category term="random"/></entry><entry><title>It's that time of the year again</title><link href="//bostik.iki.fi/aivoituksia/random/undated-journal-entry.html" rel="alternate"/><published>2020-12-19T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2020-12-19:/aivoituksia/random/undated-journal-entry.html</id><content type="html">&lt;h1&gt;Page from an undated journal&lt;/h1&gt;
&lt;p&gt;Daddy's crying. Mommy has a black eye. Little sister's hiding under her
bed.&lt;/p&gt;
&lt;p&gt;Yep, it's christmas.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Perception is almost everything</title><link href="//bostik.iki.fi/aivoituksia/random/relatively-corrupted.html" rel="alternate"/><published>2020-11-01T00:00:00+02:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2020-11-01:/aivoituksia/random/relatively-corrupted.html</id><content type="html">&lt;h1&gt;Misunderstood Indexing&lt;/h1&gt;
&lt;p&gt;Holding the number-one spot on Corruption Perceptions Index tells
nothing about how well a country is doing.&lt;/p&gt;
&lt;p&gt;It merely highlights how bad the situation is even for the runner-up.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Dear online surveillance addicts</title><link href="//bostik.iki.fi/aivoituksia/random/no-stalking.html" rel="alternate"/><published>2019-10-09T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2019-10-09:/aivoituksia/random/no-stalking.html</id><summary type="html">&lt;h1&gt;Ground rules for acceptable ads online&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;The following is an edit of a piece originally written in November
2015.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The pinnacle of non-intrusive online ads were the original Google search
ads. They were out of the way, clearly marked as ads - and hence could
be visually filtered out. They were pure text, so could be neatly
included as elements on the rendered page. And they were always
targeting an &lt;strong&gt;INTEREST …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Ground rules for acceptable ads online&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;The following is an edit of a piece originally written in November
2015.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The pinnacle of non-intrusive online ads were the original Google search
ads. They were out of the way, clearly marked as ads - and hence could
be visually filtered out. They were pure text, so could be neatly
included as elements on the rendered page. And they were always
targeting an &lt;strong&gt;INTEREST&lt;/strong&gt;. Not an individual.&lt;/p&gt;
&lt;p&gt;I will take that as the minimum acceptable advertising behaviour. I'm
not implying it's perfect, but at least we set a clear set of ground
rules. With that in mind, &lt;em&gt;my&lt;/em&gt; ideal, non-intrusive ads mechanism
builds on the following rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ads must never be inline to page content.&lt;/li&gt;
&lt;li&gt;Even when clearly out of the way, ads must not be allowed to mimic
  page content; they must be clearly marked as ads.&lt;/li&gt;
&lt;li&gt;Text only.&lt;/li&gt;
&lt;li&gt;I might accept an image within the ad, provided it was always served
  from the content provider's system.&lt;/li&gt;
&lt;li&gt;As an extension to previous point: if the served image size would
  exceed a notable fraction of the page size, it must not be included in
  the output.&lt;/li&gt;
&lt;li&gt;No user tracking of any kind.&lt;/li&gt;
&lt;li&gt;No third-party javascript. Ever.&lt;/li&gt;
&lt;li&gt;At most 15% of display real estate allowed to be used by ads.
  Including the padding in the UI. (It all counts as space denied from
  content.)&lt;/li&gt;
&lt;li&gt;Not allowed to affect page content load times. Ad material must be
  included at the end of the page code. If your service pushes ads from
  internal and separate system, hard timeouts must be imposed: if the
  internal system cannot serve an ad within an allotted time, the
  frontend must never be forced to wait. You just missed an ad
  impression. Tough.&lt;/li&gt;
&lt;li&gt;If clicking an ad takes a user through a bounce page, all identifiable
  information from the user must be stripped. Bounce page or redirect
  must not impose any further page loading delay.&lt;/li&gt;
&lt;li&gt;No beacons.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Breaking even one of the rules automatically disqualifies you.&lt;/p&gt;
&lt;p&gt;If you, as an advertiser, find these rules unacceptable - well, then we
are in mutual disagreement. I find your ads equally unacceptable and
will treat them as a form of cancer.&lt;/p&gt;
&lt;p&gt;However, as a genuine service to the user... please allow the users to
search for ads that have been displayed to them. Preferably by display
context. I would be glad to return to a subject at a later date and
search for something I remember seeing earlier.&lt;/p&gt;
&lt;p&gt;The above set of rules is still not ideal, but everything that behaved
according to them would at least be palatable.&lt;/p&gt;</content><category term="random"/></entry><entry><title>Waste not, want not</title><link href="//bostik.iki.fi/aivoituksia/augury/waste-not-want-not.html" rel="alternate"/><published>2019-09-29T00:00:00+03:00</published><updated>2026-05-10T17:35:57+03:00</updated><author><name>Mika Boström</name></author><id>tag:bostik.iki.fi,2019-09-29:/aivoituksia/augury/waste-not-want-not.html</id><summary type="html">&lt;h1&gt;Visions of future past&lt;/h1&gt;
&lt;p&gt;In our lifetime we will have seen the Western countries not just close
but to barricade their borders. Should an unannounced ship approach,
carrying desperate human beings fleeing the wars and the devastation,
we won't be even allowed to think about accepting them.&lt;/p&gt;
&lt;p&gt;The ships will be, not stopped and turned around, but torpedoed and sunk
on sight. The drowned will be harvested for feed and …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Visions of future past&lt;/h1&gt;
&lt;p&gt;In our lifetime we will have seen the Western countries not just close
but to barricade their borders. Should an unannounced ship approach,
carrying desperate human beings fleeing the wars and the devastation,
we won't be even allowed to think about accepting them.&lt;/p&gt;
&lt;p&gt;The ships will be, not stopped and turned around, but torpedoed and sunk
on sight. The drowned will be harvested for feed and fertiliser.&lt;/p&gt;
&lt;p&gt;My only consolation is that I am old enough to not necessarily witness
all of it.&lt;/p&gt;</content><category term="augury"/></entry></feed>