Blog

Everything I can write.

  • CI for a Static Site: What This Repository Actually Runs

    The four GitHub Actions workflows behind this site and the six they replaced, read from the YAML, plus the concurrency, pinning and permission habits worth adding to any static-site pipeline.

    10 min read 1,989 words Category: Software Tags: github actions, ci, jekyll

  • just-exit: Getting a Shell by Asking for a Syscall That Is Forbidden

    A write-up of the pwnable challenge just-exit from DreamHack CTF Season 7, where every modern mitigation is on and the exploit is a single byte, because the seccomp filter answers a denied syscall with SIGSYS and the program's SIGSYS handler calls system.

    6 min read 1,010 words Category: Security Tags: ctf, pwn, linux

  • ABN Gallery: The Host a Checker Reads and the Host a Socket Dials

    A write-up of the web challenge ABN Gallery from DreamHack CTF Season 7, where a hand-written host extractor and the runtime's own URL parser disagree about what "0" means, and that one character of disagreement turns an SSRF guard into a path traversal on the flag.

    7 min read 1,396 words Category: Security Tags: ctf, web, ssrf

  • Attention in NumPy: Scaled Dot-Product, Masks and Multiple Heads

    Implementing scaled dot-product and multi-head attention from scratch, explaining the square-root scaling with a measurement, and reading attention heatmaps on a toy sequence.

    8 min read 1,556 words Category: AI Research Tags: nlp, transformers, attention

  • Amdahl, Gustafson and a Real Scaling Curve: Fitting the Serial Fraction of a Python Pool

    Strong and weak scaling of a Python multiprocessing integration on an eight-core laptop, a fit of Amdahl's law, why a weak-scaling speed-up needs its baseline, and where the overhead comes from.

    10 min read 1,965 words Category: HPC Tags: scaling, amdahls law, multiprocessing

  • A Raspberry Pi Bench for UART, SPI and I²C

    Turning a Raspberry Pi into a hardware lab, with wiring and logic levels, enabling the buses, reading a firmware console with pyserial, dumping an SPI flash with spidev, and the safety rules that keep both boards alive.

    11 min read 2,143 words Category: Security Tags: hardware, raspberry pi, embedded

  • A Performance Budget for This Very Site

    What it took to halve the same-origin CSS and JavaScript on every page of this Jekyll site, with the before-and-after bytes and the check that keeps it that way.

    11 min read 2,041 words Category: Software Tags: web performance, jekyll, frontend

  • Convolutions, Receptive Fields, and Why Stacked 3×3 Kernels Work

    A NumPy conv2d, the arithmetic of receptive-field growth, an edge-detection example on a synthetic image, and the parameter count that explains why modern CNNs use small kernels.

    8 min read 1,535 words Category: AI Research Tags: computer vision, convolution, deep learning

  • Threads, Reductions and False Sharing: Five Ways to Add Up Numbers in Parallel

    A pthreads reduction measured five ways on an eight-core laptop: one shared atomic, packed per-thread counters, padded per-thread counters, register accumulators, and dynamic chunking, with a short primer on the C11 memory model that makes the fast version correct.

    11 min read 2,004 words Category: HPC Tags: pthreads, false sharing, atomics

  • An Android App Security Assessment Checklist

    A static-to-dynamic walkthrough for assessing an Android app you own, from APK structure and exported components to storage, network security config and certificate pinning, mapped to OWASP MASVS.

    11 min read 2,081 words Category: Security Tags: mobile security, android, owasp