Skip to main content Tap compare testing for service migration December 13, 2025
Splintered failure modes in Go November 30, 2025
Re-exec testing Go subprocesses November 16, 2025
Revisiting interface segregation in Go November 1, 2025
Avoiding collisions in Go context keys October 22, 2025
Organizing Go tests October 8, 2025
Subtest grouping in Go October 1, 2025
Let the domain guide your application structure September 20, 2025
Test state, not interactions September 14, 2025
Early return and goroutine leak September 7, 2025
Lifecycle management in Go tests August 30, 2025
Gateway pattern for external service calls August 3, 2025
Flags for discoverable test config in Go June 28, 2025
You probably don't need a DI framework May 24, 2025
Preventing accidental struct copies in Go April 21, 2025
Go 1.24's "tool" directive April 13, 2025
Capturing console output in Go tests April 12, 2025
Deferred teardown closure in Go testing March 28, 2025
Three flavors of sorting Go slices March 22, 2025
Nil comparisons and Go interface March 12, 2025
Stacked middleware vs embedded delegation in Go March 6, 2025
Why does Go's io.Reader have such a weird signature? February 8, 2025
Go slice gotchas February 6, 2025
The domain knowledge dilemma January 19, 2025
Hierarchical rate limiting with Redis sorted sets January 12, 2025
Dynamic shell variables January 11, 2025
Link blog in a static site January 6, 2025
Running only a single instance of a process December 31, 2024
Function types and single-method interfaces in Go December 22, 2024
SSH saga December 17, 2024
Injecting Pytest fixtures without cluttering test signatures December 2, 2024
Explicit method overriding with @typing.override November 6, 2024
Quicker startup with module-level __getattr__ November 3, 2024
Docker mount revisited October 22, 2024
Topological sort October 13, 2024
Writing a circuit breaker in Go October 6, 2024
Discovering direnv October 2, 2024
Notes on building event-driven systems September 21, 2024
Bash namerefs for dynamic variable referencing September 20, 2024
Behind the blog September 14, 2024
Shell redirection syntax soup September 12, 2024
Shades of testing HTTP requests in Python September 2, 2024
Taming parametrize with pytest.param August 28, 2024
HTTP requests via /dev/tcp August 8, 2024
Log context propagation in Python ASGI apps August 6, 2024
Please don't hijack my Python root logger August 3, 2024
The *nix install command July 28, 2024
Here-doc headache July 19, 2024
The sane pull request July 14, 2024
I kind of like rebasing June 18, 2024
Protobuffed contracts May 10, 2024
TypeIs does what I thought TypeGuard would do in Python April 27, 2024
ETag and HTTP caching April 10, 2024
Crossing the CORS crossroad March 12, 2024
Dysfunctional options pattern in Go March 6, 2024
Einstellung effect February 24, 2024
Strategy pattern in Go February 17, 2024
Anemic stack traces in Go February 10, 2024
Retry function in Go February 4, 2024
Type assertion vs type switches in Go January 31, 2024
Patching pydantic settings in pytest January 27, 2024
Omitting dev dependencies in Go binaries January 21, 2024
Eschewing black box API calls January 15, 2024
Annotating args and kwargs in Python January 8, 2024
Rate limiting via Nginx January 6, 2024
Statically enforcing frozen data classes in Python January 4, 2024
Planning palooza January 1, 2024
Reminiscing CGI scripts December 25, 2023
Debugging dockerized Python apps in VSCode December 22, 2023
Banish state-mutating methods from data classes December 16, 2023
Finding flow amid chaos November 25, 2023
The diminishing half-life of knowledge November 12, 2023
Oh my poor business logic November 5, 2023
Pesky little scripts October 29, 2023
Footnotes for the win October 7, 2023
Dotfile stewardship for the indolent September 27, 2023
An ode to the neo-grotesque web September 18, 2023
Self-hosted Google Fonts in Hugo September 14, 2023
Configuring options in Go September 5, 2023
Dummy load balancer in a single Go script August 30, 2023
Limit goroutines with buffered channels August 23, 2023
Writing a TOTP client in Go August 20, 2023
Interface guards in Go August 18, 2023
Writing on well-trodden topics August 14, 2023
Go structured logging with slog August 10, 2023
Notes on exit interviews August 7, 2023
Taming conditionals with bitmasks July 29, 2023
Using DNS record to share text data July 17, 2023
Memory leakage in Python descriptors July 16, 2023
Unix-style pipelining with Python's subprocess module July 14, 2023
Enabling repeatable lazy iterations in Python July 13, 2023
Descending into the aether July 9, 2023
Escaping the template pattern hellscape in Python July 1, 2023
Python dependency management redux June 27, 2023
Implementing a simple traceroute clone in Python June 1, 2023
Bulk request Google search indexing with API May 26, 2023
Building a CORS proxy with Cloudflare Workers May 21, 2023
Fixed-time job scheduling with UNIX 'at' command May 14, 2023
Sorting a Django queryset by a custom sequence of an attribute May 9, 2023
Periodic readme updates with GitHub Actions May 4, 2023
Associative arrays in Bash May 3, 2023
Deduplicating iterables while preserving order in Python May 1, 2023
Process substitution in Bash April 30, 2023
Dynamic menu with select statement in Bash April 29, 2023
Simple terminal text formatting with tput April 23, 2023
Building a web app to display CSV file stats with ChatGPT & Observable April 10, 2023
Pushing real-time updates to clients with Server-Sent Events (SSEs) April 8, 2023
Tinkering with Unix domain sockets March 11, 2023
Signal handling in a multithreaded socket server February 26, 2023
Switching between multiple data streams in a single thread February 19, 2023
Skipping the first part of an iterable in Python February 12, 2023
Pausing and resuming a socket server in Python February 5, 2023
Debugging a containerized Django application in Jupyter Notebook January 14, 2023
Manipulating text with query expressions in Django January 7, 2023
Using tqdm with concurrent.fututes in Python January 6, 2023
Colon command in shell scripts December 23, 2022
Faster bulk_update in Django November 30, 2022
Installing Python on macOS with asdf November 13, 2022
Save models with update_fields for better performance in Django November 9, 2022
Python logging quirks in AWS Lambda environment October 20, 2022
Dissecting an outage caused by eager-loading file content October 14, 2022
Auditing commit messages on GitHub October 6, 2022
To quote or not to quote October 5, 2022
Returning values from a shell function September 25, 2022
Verifying webhook origin via payload hash signing September 18, 2022
Recipes from Python SQLite docs September 11, 2022
Prefer urlsplit over urlparse to destructure URLs September 10, 2022
Pick random values from an array in SQL(ite) September 2, 2022
ExitStack in Python August 27, 2022
Compose multiple levels of fixtures in pytest July 21, 2022
Patch where the object is used July 18, 2022
Partially assert callable arguments with 'unittest.mock.ANY' July 17, 2022
When to use 'git pull --rebase' July 14, 2022
Apply constraints with 'assert' in Python July 10, 2022
Automerge Dependabot PRs on GitHub July 7, 2022
Stream process a CSV file in Python July 1, 2022
Bulk operations in Django with process pool June 27, 2022
Read a CSV file from s3 without saving it to the disk June 26, 2022
Distil git logs attached to a single file June 21, 2022
Safer 'operator.itemgetter' in Python June 16, 2022
Guard clause and exhaustiveness checking May 22, 2022
Health check a server with 'nohup $(cmd) &' April 18, 2022
Return JSON error payload instead of HTML text in DRF April 13, 2022
Decoupling producers and consumers of iterables with generators in Python April 3, 2022
Pre-allocated lists in Python March 27, 2022
In favor of sentence case March 26, 2022
Disallow large file download from URLs in Python March 23, 2022
Declaratively transform data class fields in Python March 20, 2022
Caching connection objects in Python March 16, 2022
How not to run a script in Python March 16, 2022
Mocking chained methods of datetime objects in Python March 16, 2022
Declarative payloads with TypedDict in Python March 11, 2022
Parametrized fixtures in pytest March 10, 2022
Modify iterables while iterating in Python March 4, 2022
Github action template for Python based projects March 2, 2022
Self type in Python February 28, 2022
Patching test dependencies via pytest fixture & unittest mock February 27, 2022
Narrowing types with TypeGuard in Python February 23, 2022
Why 'NoReturn' type exists in Python February 21, 2022
Add extra attributes to enum members in Python February 17, 2022
Peeking into the internals of Python's 'functools.wraps' decorator February 14, 2022
Limit concurrency with semaphore in Python asyncio February 10, 2022
Amphibian decorators in Python February 6, 2022
Go Rusty with exception handling in Python February 2, 2022
Variance of generic types in Python January 31, 2022
Create a sub dictionary with O(K) complexity in Python January 30, 2022
Gotchas of early-bound function argument defaults in Python January 27, 2022
Use 'assertIs' to check literal booleans in Python unittest January 24, 2022
Static typing Python decorators January 23, 2022
Inspect docstrings with Pydoc January 22, 2022
Check whether an integer is a power of two in Python January 21, 2022
Uniform error response in Django Rest Framework January 20, 2022
Difference between constrained 'TypeVar' and 'Union' in Python January 19, 2022
Don't wrap instance methods with 'functools.lru_cache' decorator in Python January 15, 2022
Cropping texts in Python with 'textwrap.shorten' January 6, 2022
String interning in Python January 5, 2022
Structural subtyping in Python December 4, 2021
Automatic attribute delegation in Python composition November 28, 2021
Access 'classmethod's like 'property' methods in Python November 26, 2021
Don't add extensions to shell executables November 23, 2021
Use __init_subclass__ hook to validate subclasses in Python November 20, 2021
Running tqdm with Python multiprocessing November 18, 2021
Use daemon threads to test infinite while loops in Python November 18, 2021
Use 'command -v' over 'which' to find a program's executable November 16, 2021
Write git commit messages properly November 11, 2021
Python's 'functools.partial' flattens nestings Automatically November 8, 2021
Use curly braces while pasting shell commands November 8, 2021
Use strict mode while running bash scripts November 8, 2021
Pedantic configuration management with Pydantic July 13, 2020
Interfaces, mixins and building powerful custom data structures in Python July 3, 2020
Deciphering Python's metaclasses June 26, 2020
Implementing proxy pattern in Python June 16, 2020
Effortless API response caching with Python & Redis May 25, 2020
Untangling Python decorators May 13, 2020
Effortless concurrency with Python's concurrent.futures April 21, 2020
No really, Python's pathlib is great April 13, 2020
Running Python linters with pre-commit hooks April 6, 2020
Generic functions with Python's singledispatch April 5, 2020
The curious case of Python's context manager March 26, 2020
Reduce boilerplate code with Python's dataclasses March 12, 2020