Uncategorized

  • Index lifecycle before the disk fills, not after

    Daily indices grow linearly and nothing removes them, so a logging cluster works beautifully for four months and then stops accepting writes with a disk watermark error at…

  • A contract test for the API you depend on

    Mocking an upstream service makes the suite fast and guarantees nothing about the upstream still behaving that way. A contract test is a small suite that runs against…

  • fail2ban on the application log, not just the server log

    SSH and HTTP basic auth are covered by shipped filters. A brute force against the application’s own login form is invisible to both, because it is a 200…

  • WooCommerce 3.0 turned products into objects

    Every plugin reading _price from post meta is now reading a private field. The mechanical half, the half that is not, and the compatibility layer for code you…

  • Vue 2.5 and the render function TypeScript story

    Vue 2.5 improved its TypeScript declarations enough that a component can be written without a decorator library, which is the first release where the combination is worth trying…

  • The InnoDB buffer pool hit rate is the number to watch

    Almost every “the database is slow” investigation ends at the same place: the working set no longer fits in memory, so reads that used to be free are…

  • The build cache is invalidated by the first changed layer

    Every instruction produces a layer, and a layer is reused only if every instruction before it is unchanged. Copying the source before installing dependencies therefore reinstalls everything on…

  • Content filters run in an order plugins fight over

    the_content is a queue every plugin joins, and priority decides the outcome. A shortcode that renders as text, a paragraph tag wrapped around a block element, and an…

  • Mix is webpack with the config already written

    Elixir wrapped gulp, which wrapped everything else. Mix wraps webpack directly, which removes a layer and — more usefully — leaves the underlying configuration reachable when the abstraction…

  • A .dockerignore is what makes the context small

    Before a build starts, the whole context directory is sent to the daemon. Without a .dockerignore that includes .git, vendor and node_modules, that is several hundred megabytes copied…