Technical Blog
Between client work, open source projects, and our own endless noodling, we run into a lot of obscure, technical issues. Surprisingly often, not even Google can help.
It's easy to feel alone — especially when first starting out — but discovering edge cases is a normal and natural part of being on the front lines of computing. Possibilities and features and bugs are all part of the mix.
Someone somewhere once said, "Write the blog post you wish you'd found when you were struggling with a problem."
That's what we've tried to do here.
To make it easier for you to decide what to read and what to skip, we've employed some simple color-coding:
- If you're a developer, pay attention to the purple bits.
- If you're a Linux user and/or system administrator, the black sections will be of more interest.
- If you like reading about non-server-related security issues, hacking, etc., follow the red.
Introducing Pxsum!
Pxsum is an x86-64 Linux CLI tool for calculating and verifying checksums corresponding to the decoded pixel data of image files.
Making Up Numbers: Constrained Numerical Types in Rust
When working with logically-constrained numerical values in Rust, exposing those constraints to the compiler can help it optimize away overflow/bounds checks.
Building a Custom XanMod Kernel on Ubuntu 23.10
The XanMod Linux kernel is impressive out of the box, but if you want to push it even further, you'll need to build it manually from source.
Introducing Rip Rip Hooray!
Rip Rip Hooray! is a fundamentally different kind of audio CD-ripper, one designed and optimized specifically for data recovery.
Installing CUETools 2.2.4 on Linux via WINE
With just a little bit of setup, Linux users can leverage CUETools' advanced verification and repair functionality.
Disabling Snap, and Keeping It Disabled
It is easy enough to uninstall snap from Ubuntu, but preventing Ubuntu from reinstalling it the each time you upgrade to a new release requires a bit more effort.
Re-rewriting JS Mate Poe in Rust/Wasm
WebAssembly has come a long way, but cannot yet fully eliminate the need for Javascript. This article explores the concessions and workarounds required to make a (mostly) Wasm Mate Poe work.
Optimizing FLAC Audio Files for Production Hosting
Squeezing every last byte out of FLAC compression takes a little bit of effort, but is well worth it when files are being used on the web.
Introducing Guff, a Combined SASS/SCSS Compiler and CSS Minifier
This article looks at the new x86-64 Linux CLI tool Guff, a fast, lightweight SASS/SCSS compiler and CSS minifier.
Migrating to Vanilla Firefox on Ubuntu 22.04
The latest Ubuntu LTS — 22.04 Jammy Jellyfish — only packages Firefox as a snap app, which unfortunately doesn't work very well. This article shows you how to work around that by going vanilla.
How You Manage Debian Apt Sources Is Changing
This article aims to demystify the new Deb822 apt source format and recent deprecation of apt-key, while providing instructions for migrating to the new setup.
WordPress Core File Checksums
This post compares the relative performance of verifying the integrity of WordPress Core files against pre-recorded Blake3, MD5, SHA256, and SHA512 checksums.
Announcing Refract GTK!
The Refract image conversion tool is now a sexy GTK app, allowing you to easily view JPEG and PNG sources alongside the WebP, AVIF, and JPEG XL candidates.
JPEG XL, the New Image Format Nobody Wanted or Needed
This post looks at the new JPEG XL image format in comparison with existing next-generation formats like WebP and AVIF.
More Fussing With Images
This post walks through using the CLI app Refract to generate hand-tuned WebP and AVIF images more efficiently.
Faster Path Canonicalization in Rust
This post looks at how to improve recurisve directory traversal times in Rust by conditionally canonicalizing paths.
Fussing With Images
A deep dive into how digital image formats work, where they're strong, where they're weak, and how to make the files as small as possible.
Dissecting the Blobfolio-Three-Ways Home Page Hero
This case study looks at how we created the Blobfolio-Three-Ways-With-X-Ray-Wipe block on our home page.
Solving Simple Problems With Simple Apps
Taking an afternoon to write a simple application to solve a simple problem can make a world of difference.
Developing a Web Site *Without* Node/NPM in 2020
This article explores ways to minimize web project dependence on Node and NPM by using technologies like just, watchexec, sassc, and Closure Compiler.
Randomizing Weighted Choices in Javascript
This tutorial explores different methods for handling weighted lists in Javascript, comparing logic, execution, and performance.
Better Binary Batter: Mixing Base64 and Uint8Array
This case study explores the pros and cons of different types of binary data encodings, both in terms of storage and runtime resource usage and performance, and looks at ways of combining their relative strengths for maximum benefit.
Replacing WPA Supplicant with iwd in Ubuntu Eoan
Intel's iwd networking drivers are a (mostly) production-ready drop-in replacement for the aging wpa_supplicant libraries. This tutorial explains how to Ubuntu Eoan Ermine users can make the switch!
Restoring GTK3 Typeahead in Ubuntu 19.10 Eoan Ermine
This tutorial covers how to patch and rebuild the GTK3 packages to restore the old typeahead behavior in file dialogues, etc.
PSA: Ubuntu Eoan Upgrade Process Snapifies Some Apps
Upgrading from Ubuntu 19.04 (Disco Dingo) to (Eoan Ermine) causes some local packages to be replaced with their Snap counterparts.
Using Docker as a Build Environment
Docker is more than a way for Apple users to set up LAMP stacks on their MacBooks. Isolation, portability, and statelessness make Docker ideal for use as a general-purpose build environment. This tutorial puts that into practice, repackaging Debian Stretch's Nginx without polluting the host machine.
Enable TLS 1.3 in Nginx on Debian Stretch
This tutorial covers how to rebuild the Debian Stretch Backports Nginx package (1.14.0) with BoringSSL to enable TLS 1.3 (RFC) support.
Lazy-Loading SVG Sprites… Inline!
SVG sprites are an unquestionable workflow win, however they come with significant performance penalties. Using Javascript to dynamically populate inline SVGs from external sources can decrease page load by hundreds of milliseconds or more.
PHP 7.2 on Debian Stretch
With PHP 7.0 nearing its official End of Life, it is a good idea to upgrade to PHP 7.2 on any Debian 9 (Stretch) servers. Aside from the security benefits, PHP 7.2 offers modest reductions in resource consumption and performance improvements.
Replace GRUB2 with systemd-boot on Ubuntu 18.04
This tutorial covers migrating from GRUB2 to systemd-boot on Linux systems running Ubuntu 18.04 Bionic Beaver. To keep things interesting, the test case covers Secure Boot, custom kernels (and postinstall hooks), and dm-crypt.
On Content-Security-Policy Headers
A detailed look at the "content-security-policy" header, reasons to use it, common pitfalls, and an explanation of the options worth using.
Meltdown/Spectre Vulnerability Checker for Linux
How Linux users can evaluate their vulnerability to various Meltdown- and Spectre-related attacks.
25 Easy PHP7 Micro-Optimizations
Micro-optimizations do not make a lot of sense at the level of an individual project, however any knowledge gained carries over into future projects. This article covers 25 simple micro-optimizations for PHP7 code.
The Art of Database Partitioning
This tutorial demonstrates a use case for database partitioning, which can greatly improve MySQL query performance when dealing with large datasets.
How To Enable SSL For WordPress
Enabling SSL encryption for a WordPress site is not difficult, but there are a few gotchas to be aware of. This article examines different approaches for migrating the environment to SSL.
Nginx Static Compression, Gzip and Brotli
Implementing static Brotli compression at the server level will save bandwidth and decrease page load times for visitors. Though not available by default, this functionality can be added to Nginx by building it from source.
Upgrading from Debian Jessie to Stretch
Each Debian release comes loaded with tons of software updates, but because this only happens once ever few years, upgrading might require a little manual intervention. This post examines common upgrade issues for web servers upgrading from Debian Jessie to Stretch.
How to Science the Shit Out of Your Server
While most users are familiar with the GUI/screensaver version of Boinc, it can also be installed without graphical dependencies and run on web servers.
Fix Linux DNS Issues Caused by Systemd-Resolved
Recent releases of Ubuntu and other major Linux operating systems have seen a lot of networking changes. In many cases, these changes go completely unnoticed by users, but in others, can cause intermittent latency, failed pages, etc. This tutorial shows how to fix issues related to systemd-resolved.
When a Stranger Calls: Sanitizing SVGs
The SVG image format is immensely useful for web designers, but presents endless security challenges for system administrators. This post explores approaches taken by a modern PHP sanitization library to mitigate these dangers.
Climbing MIME Improbable
While the complexity of web content has exploded in recent years, major applications and operating systems have yet to revisit their inadequate MIME type detection functionality. The blob-mimes project aims to solve this problem, at least for applications coded in PHP.
Optimizing SVGs For Web Use
The SVG image format is a web designer's dream, but just like their binary counterparts, they should be optimized before being added to a production environment.
Using Let's Encrypt on Debian
This tutorial shows how to get started with Let's Encrypt on servers running Debian Jessie.
A+ SSL Configuration for Nginx
While there are many guides out there covering SSL server configurations, many of them contain outdated and insecure information. This tutorial shows how to configure SSL for Nginx for maximum security and performance.