<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>blog.lvmbdv.dev on Ata Kuyumcu's Blog</title><link>https://blog.lvmbdv.dev/</link><description>Recent content in blog.lvmbdv.dev on Ata Kuyumcu's Blog</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Fri, 31 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.lvmbdv.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Tests for a PDF</title><link>https://blog.lvmbdv.dev/posts/tests-for-a-pdf/</link><pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/tests-for-a-pdf/</guid><description>&lt;p&gt;My CV has a test suite. This is either reasonable or a symptom.&lt;/p&gt;
&lt;p&gt;The excuse is that I&amp;rsquo;m not the first reader. An applicant tracking system is,
and it wants text. Every visual decision in the document (the font, the margins,
where the dates sit) is invisible to it. The only thing it can see is whatever
&lt;code&gt;pdftotext&lt;/code&gt; scrapes off the page.&lt;/p&gt;</description></item><item><title>The fediverse was right</title><link>https://blog.lvmbdv.dev/posts/the-fediverse-was-right/</link><pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/the-fediverse-was-right/</guid><description>&lt;p&gt;I use &lt;a href="https://joinmastodon.org/"&gt;Mastodon&lt;/a&gt; on and off but I would not trade it
for any alternative atm. Not because it&amp;rsquo;s better than Twitter was, the
discoverability is worse, the reply threading is too complex at times, and it
does have sync issues across instances. What it does have is something no
corporate platform will ever offer: you can leave and take your social graph
with you. Your followers, your follows, your block lists. Pack them up, point
your domain at a different server, done.&lt;/p&gt;</description></item><item><title>The dailyprog puzzle safety net</title><link>https://blog.lvmbdv.dev/posts/the-puzzle-safety-net/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/the-puzzle-safety-net/</guid><description>&lt;p&gt;&lt;a href="https://dailyprog.club"&gt;dailyprog&lt;/a&gt; needs a new puzzle every day. I wrote the
first few drafts by hand, then built
&lt;a href="https://blog.lvmbdv.dev/posts/generating-coding-puzzles-with-llms/"&gt;a generator&lt;/a&gt; that writes them with
an LLM and validates the output against real sandbox execution. The generator
works, but it still needs someone to run it. Pick a pattern, kick off the
script, review the result, commit. Fifteen minutes on a good day. More if the
model gets stuck in a repair loop and I need to nudge it.&lt;/p&gt;</description></item><item><title>Adding Go to a browser code runner</title><link>https://blog.lvmbdv.dev/posts/adding-go-to-a-browser-code-runner/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/adding-go-to-a-browser-code-runner/</guid><description>&lt;p&gt;&lt;a href="https://dailyprog.club"&gt;dailyprog&lt;/a&gt; (the daily coding puzzle site,
&lt;a href="https://blog.lvmbdv.dev/posts/generating-coding-puzzles-with-llms/"&gt;previously&lt;/a&gt;) started with
JavaScript. Then Python, then C. Each new language was a different kind of
project. Python needed &lt;a href="https://pyodide.org"&gt;Pyodide&lt;/a&gt;. C needed a
&lt;a href="https://gitlab.com/zsaleeba/picoc"&gt;PicoC&lt;/a&gt; WASM binary and a custom harness for
printf output. Go was supposed to be the fourth. Every Go-to-WASM tutorial
points at the same path, so I took it.&lt;/p&gt;
&lt;p&gt;It was the wrong one.&lt;/p&gt;
&lt;h2 id="the-path-everyone-takes-goosjs"&gt;The path everyone takes: GOOS=js&lt;/h2&gt;
&lt;p&gt;Compiling Go to WASM for the browser means setting &lt;code&gt;GOOS=js GOARCH=wasm&lt;/code&gt;. Go
ships two pieces for this: a compiler target that produces WASM with a
JavaScript syscall bridge, and
&lt;a href="https://go.dev/wiki/WebAssembly"&gt;&lt;code&gt;wasm_exec.js&lt;/code&gt;&lt;/a&gt;, a support file that
implements the Go runtime&amp;rsquo;s expectations on the JS side. You load wasm_exec.js,
you call &lt;code&gt;WebAssembly.instantiate()&lt;/code&gt;, the Go runtime boots, and your program
runs.&lt;/p&gt;</description></item><item><title>Building a passive Ethernet tap</title><link>https://blog.lvmbdv.dev/posts/building-a-passive-ethernet-tap/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/building-a-passive-ethernet-tap/</guid><description>&lt;p&gt;I saw this &lt;a href="https://greatscottgadgets.com/throwingstar/"&gt;cool ethernet tap&lt;/a&gt; and
thought it would be cool to see how chatty my &amp;ldquo;smart&amp;rdquo; TV is. But I didn&amp;rsquo;t want
to pay €39 for it. So I made a clone on mini breadboards.&lt;/p&gt;</description></item><item><title>Generating coding puzzles with LLMs</title><link>https://blog.lvmbdv.dev/posts/generating-coding-puzzles-with-llms/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/generating-coding-puzzles-with-llms/</guid><description>&lt;p&gt;I have been working on this daily coding puzzle site
&lt;a href="https://dailyprog.club"&gt;dailyprog&lt;/a&gt;. It&amp;rsquo;s like Wordle for programming problems.
Each day you get one puzzle with a short narrative, a function stub, and a set
of visible test cases. You write a solution, run it locally against the visible
tests, then submit to verify against hidden tests on the server. There are four
languages atm (JavaScript, Python, C, Go), visual output for some puzzles, and a
share link so you can signal your &lt;em&gt;competency&lt;/em&gt; to your &lt;em&gt;friends&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Revisiting server hardening</title><link>https://blog.lvmbdv.dev/posts/revisiting-server-hardening/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/revisiting-server-hardening/</guid><description>&lt;p&gt;Two months ago I wrote down
&lt;a href="https://blog.lvmbdv.dev/posts/hardening-a-fresh-linux-install/"&gt;my baseline for hardening a fresh Linux install&lt;/a&gt;.
Non-root user, SSH lockdown, UFW, fail2ban, unattended-upgrades, the Docker
firewall hole. It was fine as far as it went. But it didn&amp;rsquo;t go far enough.&lt;/p&gt;
&lt;p&gt;Last week I spun up a new VPS (Debian 13 this time, not Ubuntu) and found six
I&amp;rsquo;d missed the first time around. Post-quantum SSH is also ready and takes one
config line.&lt;/p&gt;</description></item><item><title>Rebuilding my blog with machines, for machines</title><link>https://blog.lvmbdv.dev/posts/rebuilding-my-blog-with-machines-for-machines/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/rebuilding-my-blog-with-machines-for-machines/</guid><description>&lt;p&gt;I rebuilt this blog recently. Not a redesign. The old posts are still here, same
URLs, same markup. What changed is that every page now carries a full structured
data graph and every element is annotated with
&lt;a href="https://microformats.org/"&gt;microformats&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="structured-data-that-pulls-its-weight"&gt;Structured data that pulls its weight&lt;/h2&gt;
&lt;p&gt;Every page gets a &lt;a href="https://json-ld.org/"&gt;JSON-LD&lt;/a&gt; block in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. Not a
plugin. A 120-line Hugo partial that builds a &lt;code&gt;@graph&lt;/code&gt; depending on what kind of
page it is. The partial is mostly a big conditional: &lt;code&gt;if .IsHome&lt;/code&gt; does one
thing, &lt;code&gt;if .IsPage&lt;/code&gt; and &lt;code&gt;.Section &amp;quot;posts&amp;quot;&lt;/code&gt; does another, &lt;code&gt;if .IsSection&lt;/code&gt; or
&lt;code&gt;.Kind &amp;quot;term&amp;quot;&lt;/code&gt; does a third. Each branch appends its nodes to a slice, then the
whole thing gets serialized and dropped into a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;</description></item><item><title>Autopsying a SanDisk Extreme SSD</title><link>https://blog.lvmbdv.dev/posts/sandisk-extreme-ssd-autopsy/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/sandisk-extreme-ssd-autopsy/</guid><description>&lt;p&gt;I was planning a backup setup and dug an old SanDisk Extreme Portable SSD out of
a drawer. Plugged it in, nothing.&lt;/p&gt;
&lt;p&gt;Well, not nothing. &lt;code&gt;dmesg&lt;/code&gt; saw a USB device. &lt;code&gt;sg_inq&lt;/code&gt; got a polite response from
the bridge chip, but the kernel logged &amp;ldquo;Media removed, stopped polling&amp;rdquo; and the
block device reported zero bytes. The USB-to-NVMe bridge chip was alive and as
chatty. The SSD behind it was gone.&lt;/p&gt;
&lt;p&gt;The SanDisk Extreme has a reputation by now. You probably know it if you follow
hardware news. I didn&amp;rsquo;t just want to read about the failure though, I wanted to
see it.&lt;/p&gt;</description></item><item><title>Balancing an MMO economy with a black market</title><link>https://blog.lvmbdv.dev/posts/albions-black-market-as-a-balance-mechanism/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/albions-black-market-as-a-balance-mechanism/</guid><description>&lt;p&gt;Albion Online has a cool design constraint that sounds absurd when you say it
out loud: every item in the game is player-crafted. There are no NPC vendors
selling gear. The world produces nothing on its own except raw resources. The
whole sandbox is built on top of that constraint.&lt;/p&gt;
&lt;p&gt;But Albion also has mobs that drop loot. You go fight a heretic, you sometimes
get a T4 bag. So somebody has to have crafted that bag. Where does it come from?&lt;/p&gt;</description></item><item><title>Hardening a fresh Linux install</title><link>https://blog.lvmbdv.dev/posts/hardening-a-fresh-linux-install/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/hardening-a-fresh-linux-install/</guid><description>&lt;p&gt;I&amp;rsquo;ve been running a small Hetzner VPS for a while now and every time I spin up a
new one I find myself re-deriving the same baseline. This is that baseline,
written down so I stop re-deriving it and so you can steal it. It assumes Ubuntu
24.04 LTS on a Hetzner VPS, but most things hardly change over the years, or
between platforms. None of this is exhaustive, there&amp;rsquo;s no AppArmor profiling, no
AIDE, but it gets you to a point where you won&amp;rsquo;t be embarrassed if someone runs
&lt;code&gt;nmap&lt;/code&gt; at you.&lt;/p&gt;</description></item><item><title>Building custom commands in Bevy</title><link>https://blog.lvmbdv.dev/posts/custom-commands-in-bevy-with-extension-traits/</link><pubDate>Thu, 25 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/custom-commands-in-bevy-with-extension-traits/</guid><description>&lt;div class="my-6 rounded-lg border border-amber-200 bg-amber-50 px-5 py-4 text-sm leading-relaxed text-amber-950 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-100 [&amp;_a]:text-amber-800 [&amp;_a]:underline dark:[&amp;_a]:text-amber-300" role="note"&gt;&lt;strong class="font-semibold"&gt;Historical context&lt;/strong&gt;&lt;br&gt;This post was written for Bevy 0.4 in February 2021. Bevy is now on 0.15+ and the APIs have changed significantly. The extension trait pattern is still valid Rust, but the specific &lt;code&gt;Commands&lt;/code&gt;, &lt;code&gt;Command&lt;/code&gt;, and &lt;code&gt;Bundle&lt;/code&gt; APIs in Bevy have evolved since. For current documentation, see &lt;a href="https://bevyengine.org"&gt;bevyengine.org&lt;/a&gt; and &lt;a href="https://docs.rs/bevy/latest/bevy/"&gt;docs.rs/bevy&lt;/a&gt;.
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://bevyengine.org"&gt;Bevy&lt;/a&gt; is an ECS-based game engine built in Rust.
&lt;a href="https://rust-lang.github.io/rfcs/0445-extension-trait-conventions.html"&gt;Extension traits&lt;/a&gt;
are a pattern in rust that allows you to add methods to an existing type defined
outside of your crate. You can probably guess where I&amp;rsquo;m going with this.&lt;/p&gt;</description></item><item><title>Setting up remote backups with Restic</title><link>https://blog.lvmbdv.dev/posts/remote-backups-with-restic/</link><pubDate>Tue, 22 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/remote-backups-with-restic/</guid><description>&lt;p&gt;Restic is a program that greatly simplifies the process of encrypted,
incremental backups. Backblaze B2 is a
&lt;a href="https://www.backblaze.com/b2/cloud-storage-pricing.html"&gt;pretty cheap&lt;/a&gt; cloud
storage service that restic happens to support as a data storage backend. The
first 10 GB of storage is free, which is plenty for storing configuration files
and some source code.&lt;/p&gt;</description></item><item><title>Working through the SICP exercises</title><link>https://blog.lvmbdv.dev/posts/sicp-exercises-chapter-1-part-1/</link><pubDate>Tue, 20 Nov 2018 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/sicp-exercises-chapter-1-part-1/</guid><description>&lt;p&gt;I started reading through
&lt;a href="https://web.mit.edu/alexmv/6.037/sicp.pdf"&gt;&amp;ldquo;Structure and Interpretation of Computer Programs&amp;rdquo;&lt;/a&gt;
and thought it would be a good idea to publish my progress here. Here are my
solutions for the first ten exercises in the book.&lt;/p&gt;</description></item><item><title>I did a few things at STM CTF 2018 Prelims</title><link>https://blog.lvmbdv.dev/posts/i-did-a-few-things-at-stm-ctf-2018-prelims/</link><pubDate>Mon, 01 Oct 2018 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/i-did-a-few-things-at-stm-ctf-2018-prelims/</guid><description>&lt;p&gt;Here are a few challenges I chose to write about from the preliminary for STM
CTF 2018 which will take place in Ankara at Oct 31. I want to thank the STM team
for a fun and smooth CTF experience. I started competing in CTFs about half a
year ago and I heard good things about STM CTF 2017. I hope I can attend this
year :)&lt;/p&gt;</description></item><item><title>I did a thing at Harekaze CTF 2018</title><link>https://blog.lvmbdv.dev/posts/i-did-a-thing-at-harekaze-2018/</link><pubDate>Thu, 01 Mar 2018 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/i-did-a-thing-at-harekaze-2018/</guid><description>&lt;p&gt;I participated in DKHOS alongside bloodlust (formerly yubitsec) this year but
this post is not about that. While we were waiting for DKHOS to start at
midnight, we decided to warm up with another CTF that was going on at the time.
That CTF was Harekaze 2018.&lt;/p&gt;</description></item><item><title>I did a thing at TU CTF 2017</title><link>https://blog.lvmbdv.dev/posts/i-did-a-thing-at-tu-ctf-2017/</link><pubDate>Mon, 04 Dec 2017 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/posts/i-did-a-thing-at-tu-ctf-2017/</guid><description>&lt;p&gt;It was called “The Neverending Crypto”. I don’t remember what difficulty level
it was listed at, probably the lowest :) Here is how it went.&lt;/p&gt;
&lt;p&gt;You are presented with an address and a port number. When you connect, you are
asked to enter a string. The string you entered is encrypted and sent back to
you. After a few tries, I realize it’s encrypted with a Caesar cipher.&lt;/p&gt;</description></item><item><title>About</title><link>https://blog.lvmbdv.dev/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.lvmbdv.dev/about/</guid><description>&lt;p&gt;&lt;img src="https://blog.lvmbdv.dev/images/avatar.jpg" alt="Ata Kuyumcu" width="512" height="512"
class="float-right ml-6 mb-4 w-32 sm:w-40 rounded-full not-prose" /&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m Ata. Software Engineer, based in the Amsterdam Area.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent the last few years at
&lt;a href="https://www.shell.nl/elektrisch-opladen.html"&gt;Shell Recharge Solutions&lt;/a&gt;
building serverless, event-driven systems in TypeScript on AWS, including a
quarter as interim Tech Lead. Before that: full-stack work at
&lt;a href="https://countly.com"&gt;Countly&lt;/a&gt;, a handful of short-term contracts, and the
&lt;a href="https://blog.lvmbdv.dev/tags/security/"&gt;CTF competitions&lt;/a&gt; that show up all over this blog.&lt;/p&gt;
&lt;p&gt;Right now I&amp;rsquo;m also building &lt;a href="https://dailyprog.club"&gt;dailyprog&lt;/a&gt;, a daily coding
puzzle site with an LLM-driven generation pipeline running against a sandboxed
execution backend.&lt;/p&gt;</description></item></channel></rss>