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