Huey
December 27, 2024

Atoms — brandur.org

Atom #gxq3ewc

River Ruby gets same day support for Ruby 3.4. I like Ruby’s tradition of releasing on Christmas morning. It gives me a ten minute job (and ten minutes only) to feel like I did some coding for the day.

2 days ago

Atoms — brandur.org

Atom #gxnjqac

Publish fragment Go’s maximum time.Duration, on Avoiding overflows with Go’s time.Duration in the presence of exponential algorithms.

6 days ago

Atoms — brandur.org

Atom #gxmwroc

Published sequence 092, Tori Bar. This one was new for me, Tori Bar in Calgary’s Inglewood, a tiny place serving Japanese yakitori off a single grill, the skewers cooked right in front of your eyes. We ended up ordering roughly 3⁄4 of the menu, I can heartily recommend the tako wasabi (octopus) starter, skin-on-thigh yakitori, pork belly, and shishamo (smelt, a tiny fish served well done).

7 days ago

Atoms — brandur.org

Atom #gxmid32

Published sequence 091, Fair’s Fair. I dropped by Fair’s Fair in Inglewood (Calgary) yesterday. It’s a large, rustic bookstore with bare bone furnishing, some real vintage items (in the sense of old rather expensive), and a big sci-fi/fantasy section. I’ve been coming to this place since I was a kid (when used book prices were measured in cents rather than dollars), and was glad that it’s the same Fair’s Fair in spirit as it was all the way back then.

7 days ago

Atoms — brandur.org

Atom #gxmepsk

Published fragment ERROR: invalid byte sequence for encoding UTF8: 0x00 (and what to do about it), on handling a common programming language/database asymmetry around tolerance of zero bytes.

8 days ago

Atoms — brandur.org

Atom #gwjvvv2

Truth is treason in an empire of lies. — Ron Paul

about 2 months ago

Atoms — brandur.org

Atom #gwjhetk

Like a lot of amateur photographers, I’ve had a fascination with fast lenses for quite some time. I only learned recently though that camera companies have been making very fast lenses as early as the 60s. See the Canon 50mm ƒ/0.95 “Dream Lens” for example. While lenses in this vein don’t compare favorably with modern optics on any objective dimension like sharpness, distortion, vignetting, etc., they produce some really pretty bokeh/out-of-focus effects. These days, more artistic statement than pragmatic utility....

2 months ago

Atoms — brandur.org

Atom #gwjgwes

See: Minimalissimo: 2009 → 2024. This is one of the first websites I ever added to my RSS reader, and I must’ve done so right around 2009. It was always one of the good netizens: no ads, popovers, or gimmicks, publishing full posts to RSS, and high quality, on topic content. In a separate post on his blog (a gorgeous website by the way), Minimalissimo’s curator Carl Barenbrug talks about the site’s ascendant trajectory: Between 2011 and 2015, minimalissimo.com was...

2 months ago

Atoms — brandur.org

Atom #gwjgivc

Published fragment the parallel test bundle, a Go convention that we’ve found effective for making subtests parallel-safe, keeping them DRY, and keeping code readable. type testBundle struct { account *dbsqlc.Account svc *playgroundTutorialService team *dbsqlc.Team tx db.Tx }

2 months ago

Atoms — brandur.org

Atom #gwdxua2

Hetzner is launching a new Object Storage storage on November 1st, aimed squarely at competing with S3 (and is S3 API compatible). Their pricing page is quite verbose, so here’s a summary by my interpretation: Storage Transfer out Operations AWS $0.023/GB (tier up to 50 TB) = $23/TB/mo First 100 GB: FreeAfter 100 GB: $0.09/GB (tier up to 10 TB) = $90/TB (!!!) $0.005 per 1k PUT, COPY, POST, LIST requests$0.0004 per 1k GET, SELECT requests Hetzner First TB: €5/mo...

2 months ago

Atoms — brandur.org

Atom #gwac7ts

I’m demoing a new version manager. I’ve been on asdf for a few years. I often use IRB (Ruby’s interactive interpreter) for basic calculations since Ruby makes such a good scripting language. When doing so today, for about the 1,000th time, I got this: $ irb No version is set for command irb Consider adding one of the following versions in your config file at ruby 3.2.1 This sort of lazy error bothers me: In the vast majority of situations,...

2 months ago

Atoms — brandur.org

Atom #gw3j2js

Published fragment Rails World 2024, with a few reflections on this year’s event.

3 months ago

Atoms — brandur.org

Atom #gw3fv5c

Published sequence 088, royal lion hunt. I visited the British Museum in London during my stay there last year. The museum has a wealth of ancient artifacts, including some of the most famous ones in history like the Rosetta Stone, but despite having my camera with me, I took few photos while I was there. All I could think of was the tens of thousands of times each of these objects was photographed every day, contributing to an enormous body...

3 months ago

Atoms — brandur.org

Atom #gw2ydy2

Published sequence 087, Transamerica.

3 months ago

Atoms — brandur.org

Atom #gw254vc

Published fragment TIL: Variables in custom VSCode snippets, on using built-in variables in VSCode snippets to make publishing to this site incrementally faster.

3 months ago

Atoms — brandur.org

APacIa

Of mild interest, Stripe has announced a new API release process. Two named API versions a year will be released, named after plants (e.g. “acacia”), and presumably following an A-Z scheme similar to Ubuntu naming. Previously, API changes roughly followed this procedure: Non-breaking changes went out after they’d been reviewed and whenever they became available. A new API version (named with only its date of release) was cut for breaking changes. If multiple breaking changes happily coincided around the same...

3 months ago

Atoms — brandur.org

Atom #gvtkifc

Published fragment A few secure, random bytes without pgcrypto, on avoiding the pgcrypto extension and its OpenSSL dependency by generating cryptographically secure randomness through gen_random_uuid().

3 months ago

Atoms — brandur.org

Atom #gvsy7h2

Published Real World Performance Gains With Postgres 17 B-tree Bulk Scans, in which we benchmark one of our API endpoints and get a 30% throughput improvement, with 20% drop in response time. As long as you make heavy use of eager loading (which every serious application does to remove N+1s), Postgres 17 looks to be one of these releases where all you have to do is upgrade, and reap a major performance gain for free.

3 months ago

Atoms — brandur.org

Atom #gvsd4h2

Published sequence 086, County Highway.

3 months ago

Atoms — brandur.org

Atom #gvqq6pk

Published fragment Direnv’s source_env, and how to manage project configuration, on how I accidentally stumbled across the source_env directive and dramatically improved my configuration methodology overnight.

3 months ago

Atoms — brandur.org

Atom #gvh4z7c

I pushed a new version of redis-cell today, a project that I still somewhat maintain, but only touch once a year or so. While looking into another issue that someone had filed, I got the bright idea to update the project’s dependencies. That was a mistake, and I ended up sinking hours into fixing calls to the time crate. It wasn’t just that a few breaking changes had been introduced – no, the entire API had changed, and every use...

4 months ago

Atoms — brandur.org

2024 / Aug 11 / 11:52 PST

Published fragment Your Go version CI matrix might be wrong, on how as of Go 1.21, Go fetches toolchains automatically, and it’s easy to not be running the version that you thought you were running.

5 months ago

Atoms — brandur.org

Atom #guqj3zs

After coming off the absolute blight on human consciousness that was The Acolyte, I found myself wanting to go back and watch the original Star Wars trilogy. I was a teen when its “Special Edition” revisions were released, and I remembered that George Lucas had gone on record at the time saying that these were now the definitive versions of the movies. But that was decades ago, and I’d just assumed that the smallest modicum of rationality had won out...

5 months ago

Atoms — brandur.org

Atom #gulfvus

Published fragment Elden Ring, on how I broke my promise never to give FromSoftware money again, and it was okay.

5 months ago

Atoms — brandur.org

Atom #gufciks

Golang Weekly notes that Go has jumped to the 7th position on the TIOBE index, which measures programming language popularity. The rankings are still hard to believe (does anyone actually believe there’s more C++ development happening than JS/TS?), but even so, a positive sign!

5 months ago

Atoms — brandur.org

Atom #guecb42

I’ve updated The Two-phase Data Load and Render Pattern in Go after Roman pointed out that if we swap the position of two generic parameters in Render, another generic parameter can be inferred, and every invocation gets considerably cleaner. Previously, Render looked like this: func Render[TLoadBundle any, TRenderable Renderable[TLoadBundle, TModel, TRenderable], TModel any]( ctx context.Context, e db.Executor, baseParams *pbaseparam.BaseParams, model TModel, ) (TRenderable, error) And was invoked like: resource, err := apiresource.Render[*apiresourcekind.ProductLoadBundle, *apiresourcekind.Product]( ctx, tx, svc.BaseParams, product ) In the...

6 months ago

Atoms — brandur.org

Atom #gubz6g2

River Python is shipped (with a huge assist from Eric Hauser, who contributed all the original code), enabling insertion of jobs in Python that will be worked in Go. It supports all the normal insert features including unique jobs and batch insertion, along with Python-specific stretch goals like exported type signatures, async I/O, and a @dataclass-friendly JobArgs protocol. Here’s roughly what it looks like in action: @dataclass class SortArgs: strings: list[str] kind: str = "sort" def to_json(self) -> str: return...

6 months ago

Atoms — brandur.org

First contact

I’ve been playing around with SQLite the last couple of days. I thought I knew a little about SQLite, but I didn’t, and am getting my remedial education through an accelerated gauntlet. Some of what I’ve learned of its quirks has left me reeling. Top surprises: ALTER COLUMN is not supported. Official recommendation for changing a column? Make a new table. DROP CONSTRAINT is not supported. Official recommendation for removing a constraint? Make a new table. SQLite doesn’t have data...

6 months ago

Atoms — brandur.org

Atom #gua65y2

Updated now, on RBAC and Python.

6 months ago

Atoms — brandur.org

Atom #gu2tzok

From Mike Solana, We Are the Media Now, on his publication, Pirate Wires, and on a new media landscape where journalists do journalism, and don’t hate you: Why are you sharing scoops with journalists who hate you? Do you not understand how this works? I’m realizing it’s possible you don’t understand how this works. New information is the lifeblood of a media company. When you share it with a hostile outlet, you are feeding them. When you withhold it from...

6 months ago

Atoms — brandur.org

Atom #gtyd2w2

I ran a query today to delete two rows that clocked in at just under two hours. A new personal record for time for rows deleted – one hour per row. => DELETE FROM metric WHERE name = 'networkin' OR name = 'networkout'; DELETE 2 Time: 6957592.469 ms (01:55:57.592) metric is a tiny table itself, but it’s referenced by large partitioned tables for metric_point and metric_point_aggregate, both of which need to scanned in their entirety to verify that no rows...

6 months ago

Atoms — brandur.org

Atom #gtw6wd2

River now has a self-hosted web UI to help manage jobs and queues without having to drop down to a psql shell. Paradoxically, it’s mostly written in TypeScript instead of Go, which is more of a testament to the state of Go’s templating system than anything else. It’s still distributed as a single binary thanks to go:embed.

6 months ago

Atoms — brandur.org

Atom #gtro6mc

Published fragment Sqlc 2024: check in, on some quick thoughts on whether sqlc is still the direction for Go projects now that we’ve been using it for three years.

6 months ago

Atoms — brandur.org

Atom #gtifsv2

I was amused to discover that Derek Sivers’ Nownownow.com also publishes its directory as a tab-delimited .txt file. I’ve had pretty good luck randomly finding interesting blogs to add to my reader from Now pages, and the plain text aspect makes it especially easy to search by city or country.

7 months ago

Atoms — brandur.org

Atom #gtie7tc

Published fragment Go: Don’t name packages common nouns, on avoiding naming Go packages after common nouns like rate or server so that they don’t clash with variable names, and how to find a more fitting name for them instead.

7 months ago

Atoms — brandur.org

Atom #gthphn2

Published sequence 085, BER.

7 months ago

Atoms — brandur.org

2024 / Jun 1 / 08:56 PST

Published sequence 084, spherical abberation.

7 months ago

Atoms — brandur.org

2024 / May 28 / 20:50 PST

Published Eradicating N+1s: The Two-phase Data Load and Render Pattern, on using a two-phase data load and render pattern to prevent N+1 queries in a generalized way. Especially useful in Go, but applicable in any language.

7 months ago

Atoms — brandur.org

2024 / May 28 / 08:28 PST

Published fragment The romance of Europe, on a concert in Berlin, correcting for tourist bias, and how smartphones own the planet.

7 months ago

Atoms — brandur.org

2024 / May 27 / 21:41 PST

Published sequence 082, north of Warschauer.

7 months ago

Atoms — brandur.org

2024 / May 27 / 18:35 PST

Published sequence 081, Zschochersche.

7 months ago

Atoms — brandur.org

2024 / May 27 / 13:05 PST

A good post from Observable analyzing their HTTP request latency and producing nice visualizations for them. Doing non-realtime analysis frees up one of the axis (normally X is time) which lets the data be plotted in more creative ways, like histograms that show the entire “shape” of the distribution of request latency rather than an approximation of it using common aggregates like P50/P95/P99. This particular article isn’t instructional on how to repeat this for your own service, but it’s a...

7 months ago

Atoms — brandur.org

2024 / May 24 / 18:55 PST

Published fragment ICQ, on the end of the universe, coming June 26th.

7 months ago

Atoms — brandur.org

2024 / May 23 / 22:12 PST

Published sequence 080, renewal.

7 months ago

Atoms — brandur.org

2024 / May 23 / 17:27 PST

Published fragment Notes on dark mode, which is not a dark mode tutorial, but collects a few notes on some specific refinements of a good dark mode implementation like tri-state instead of bi-state toggle, avoiding page flicker, and responding to theme changes from other tabs or the OS.

7 months ago

Atoms — brandur.org

2024 / May 23 / 10:39 PST

I rebuilt this site’s index page so it’s on the newer template system and can take advantage of dark mode. It’s not amazing, but I didn’t want to agonize over it for too long since likely few people will ever go there, so I just threw something together and published it.

7 months ago

Atoms — brandur.org

2024 / May 22 / 13:50 PST

From Notes on Japan, I found this last point was quite funny: visiting Japan feels like visiting the 2000s CD shops everywhere malls are thriving people use fat laptops You’d have to pry by MacBook from my cold, dead hands, but I dearly miss the greater variety of hardware and form factors that we used to see twenty years ago. Like, I acknowledge that something like the Sony VAIO P (depicted below) probably has ergonomics on par with writing War...

7 months ago

Atoms — brandur.org

2024 / May 21 / 16:46 PST

I implemented dark mode for this website, which you should be able to enable using the toggle in the upper right. I figure that if even Google search can do it given what’s sure to be millions of lines worth of legacy code, then I should be able to as well. I’ll write more about this soon, but by far the hardest part about dark mode is restyling. A site like this one not only has accumulated thousands of pages...

7 months ago

Atoms — brandur.org

2024 / May 19 / 15:29 PST

Published sequence 079, spring in Leipzig.

7 months ago

Atoms — brandur.org

2024 / May 19 / 14:31 PST

Soutaro (major Ruby typing contributor) has launched a new RBS::Inline project that enables Ruby type annotations in comments instead of a companion RBS file: # rbs_inline: enabled class Person attr_reader :name #:: String attr_reader :addresses #:: Array[String] # @rbs name: String # @rbs addresses: Array[String] # @rbs returns void def initialize(name:, addresses:) @name = name @addresses = addresses end def to_s #:: String "Person(name = #{name}, addresses = #{addresses.join(", ")})" end # @rbs yields (String) -> void def each_address(&block) #::...

7 months ago

Atoms — brandur.org

2024 / May 18 / 12:42 PST

Slack is training AI on private customer data. Years ago I had a conversation with a company that was building a Slack killer. I thought they were crazy. Slack was a beloved product that had built itself the perfect moat. Not through some exotic feature set that nobody else had, but by being feature complete, and a little better and a little more refined than any of its competitors. Compared to HipChat (what we’d been using at the time), Slack...

7 months ago

Atoms — brandur.org

2024 / May 18 / 11:56 PST

Thought provoking post from DDH on the broad failure of system tests, defined in this context as web UI tests, driven by a headless browser. A good way to test UIs is a problem that people have been trying to solve since the moment I stepped out of university and into a software engineering job. Back then, despite the evasiveness of a good answer to date, I assumed that someone would eventually figure it out. Now, almost twenty years later...

7 months ago

Atoms — brandur.org

2024 / May 16 / 08:55 PST

Published fragment Use of Go’s cmp.Or for multi-field sorting, on a more elegant way to sort on multiple fields using Go 1.22’s cmp.Or helper.

8 months ago

Atoms — brandur.org

2024 / May 16 / 07:31 PST

I recommend Return YouTube Dislike, a browser extension that brings back the dislike count on YouTube videos, and run as an open source project on GitHub. I had a vague idea that an extension like this might exist, but didn’t do anything about it until recently, when I saw a screenshot from somoene else who still had theirs intact. It shows how much work Google has put into protecting the message from our heroic defenders-of-big-D-Democracy coastal wine-and-cheese chattering class, who...

8 months ago

Atoms — brandur.org

2024 / May 15 / 13:02 PST

Published fragment ValOrDefault, on a pair of helper functions ValOrDefault and ValOrDefaultFunc that can help significantly to clean up Go code around assigning default values. And actually, an update: Go 1.22’s cmp.Or supersedes this custom helper.

8 months ago

Atoms — brandur.org

2024 / May 11 / 11:04 PST

Published fragment Heroku on two standard dynos?, on contemplating whether the Heroku platform would fit on two standard 512 MB dynos if it could be ported from Ruby to Go.

8 months ago

Atoms — brandur.org

2024 / May 10 / 08:44 PST

Published fragment Activating cached feature flags instantly with notify triggers, on reflecting changes made to feature flags immediately, despite a local in-process cache, by firing sync notifications from triggers, and listening with the notifier pattern.

8 months ago

Atoms — brandur.org

2024 / May 9 / 20:35 PST

Published sequence 078, lights over Friedrichshain.

8 months ago

Atoms — brandur.org

2024 / May 9 / 11:29 PST

Published fragment Shiki, on at long last, adding syntax highlighting for code blocks to this website, and what I like about Shiki, a syntax highlighter that uses on the same engine as VSCode.

8 months ago

Atoms — brandur.org

2024 / May 9 / 08:41 PST

Published fragment Plumbing fully typed feature flags from API to UI via OpenAPI, on a pipeline that moves feature flags defined in a backend YAML file through to OpenAPI, then onto generated TypeScript that uses types to see which flags are available and check their state of enablement.

8 months ago

Atoms — brandur.org

2024 / May 8 / 20:27 PST

We published a post to the River blog: Uniqueness with Postgres advisory locks and FNV hashing. It covers how River guarantees job uniqueness using a combination of transactions, advisory locks, and the FNV hashing algorithm to build a string representation of unique properties, then hash it into the 64-bit advisory lock space.

8 months ago

Atoms — brandur.org

2024 / May 8 / 19:43 PST

Published sequence 077, cubes inside cubes.

8 months ago

Atoms — brandur.org

2024 / May 7 / 08:18 PST

Published fragment Digital detox, on my longest period without a smartphone in a long time, and how to have a better relationship with it in the future.

8 months ago

Atoms — brandur.org

2024 / May 6 / 07:54 PST

Published The Notifier Pattern for Applications That Use Postgres, on maximizing Postgres connection econonmy by using a single connection per program to receive and distribute all listen/notify notifications.

8 months ago

Atoms — brandur.org

2024 / May 5 / 18:21 PST

Published sequence 076, Five Elephants.

8 months ago

Atoms — brandur.org

2024 / May 5 / 09:48 PST

Updated now, and published the same photo as sequence 075.

8 months ago

Atoms — brandur.org

2024 / May 5 / 08:21 PST

Published Web APIs: Enriched DX By Disallowing Unknown Fields, on using Go’s DisallowUnknownFields option to improve an API’s integration experience by making parameter naming mistakes faster to resolve.

8 months ago

Atoms — brandur.org

2024 / May 4 / 18:59 PST

How you know you’re at the right coffee place — Walk in. They ask what kind of coffee you’re looking for. Well, let’s start with light roast. We only carry light roast. Perfect.

8 months ago

Atoms — brandur.org

2024 / May 4 / 18:17 PST

Published sequence 074, light roast.

8 months ago

Atoms — brandur.org

2024 / May 4 / 09:21 PST

Want a great life hack? Simple: 5 AM run. As absolutely awful as it is to drag yourself out of bed and across the threshold of your door, from there every aspect of the day gets better. For an hour you enjoy the world at its most peaceful, with the natural world at its most active, and reduced human traffic of all kinds. Afterwards, your mind is tranquil, focused, and clear, and you’ve still got hours to do something creative...

8 months ago

Atoms — brandur.org

2024 / May 4 / 08:51 PST

Published sequence 073, glass and steel.

8 months ago

Atoms — brandur.org

2024 / May 4 / 07:45 PST

Published fragment Histograms worked, following up on the use of histograms to generate metric aggregates that can be used to generate charts over much wider time ranges like a week or a month.

8 months ago

Atoms — brandur.org

2024 / May 3 / 08:25 PST

Published fragment Ruby typing 2024: RBS, Steep, RBS Collections, subjective feelings, on diving into the RBS ecosystem as an alterative to Sorbet for Ruby typing.

8 months ago

Atoms — brandur.org

2024 / Apr 1 / 15:11 PST

Everybody loves dolphins. We do one shore day so we’re not diving within 24 hours of a flight. Our hostess told us they’d take us out on a dolphin watching expedition. We accepted, not having any idea whether to expect any dolphins to show. Our divemaster Tuks motors us for a half hour along the shore, the boat pelted with rain, but the storm causing a surprising stillness on the water, then out to sea, passed a shallow coral reef,...

9 months ago

Atoms — brandur.org

2024 / Mar 31 / 08:54 PST

Engineers and commit/bullshit ratio: You also intuitively know what bullshit is. It’s delays, bad taste, fighting a lot, being dogmatic, complaining, broken code, laziness, cynicism, activism, pedantry, entitlement. Bullshit is everything that makes your coworkers’ life more of a pain than it needs to be. Everybody is allowed a little bullshit because if you only allow zero bullshit you can never work with anyone at all. But bullshit must be paid for with commits. The more bullshit you generate, the...

9 months ago

Atoms — brandur.org

2024 / Mar 31 / 06:38 PST

Vernor Vinge passed away a few weeks ago. I would rate few scifi books as truly great, but the ideas presented in Vinge’s Marooned in Realtime and the concept of a bobble absolutely blew my mind, and they’re not even his most influential work. Below, a photo and a screenshot of his hacker workstation from a 2009 interview. Linux, Emacs, and Org Mode (or something close to it). How can you not love it.

9 months ago

Atoms — brandur.org

2024 / Mar 24 / 01:16 PST

Added a benchmarks page for River. After optimizing job completion so that it’s done in batches, it works about 46k jobs/sec on my M2 MacBook Air.

9 months ago

Atoms — brandur.org

2024 / Mar 5 / 12:54 PST

Published fragment Modals and mysterious macOS failures, on bequeathing cron scripts permission to run.

10 months ago

Atoms — brandur.org

2024 / Mar 2 / 15:36 PST

Published fragment Stubbing degenerate network conditions in Go with DialFunc and net.Conn, on using DialFunc to return a minimal stub for net.Conn that can simulate hard-to-reproduce conditions like an error on Close. type connStub struct { net.Conn closeFunc func() error } func newConnStub(conn net.Conn) *connStub { return &connStub{ Conn: conn, closeFunc: conn.Close, } } func (c *connStub) Close() error { return c.closeFunc() }

10 months ago

Atoms — brandur.org

2024 / Mar 2 / 12:37 PST

River’s received some recent fixes with the aim of stabilizing it for production readiness: Memory leak caused by allocating a new random source on every job execution. Memory leak caused by not always cancelling the context used to enable jobs to be cancelled remotely. Problem in riverpgxv5’s Listener where it wouldn’t unset an internal connection if Close returned an error, making the listener not reusable. We’ve ran some open ended tests with continuous job insertion and work over long periods....

10 months ago

Atoms — brandur.org

2024 / Feb 22 / 08:26 PST

Published fragment Prepared statements for psql operations, on using prepared statements with operational queries to make it easy to replace parameters and save time. PREPARE add_flag_to_team(text, uuid) AS INSERT INTO flag_team ( flag_id, team_id ) VALUES ( (SELECT id FROM flag WHERE name = $1), $2 ) ON CONFLICT DO NOTHING; EXECUTE add_flag_to_team('<flag_name>', '<team_id>');

10 months ago

Atoms — brandur.org

2024 / Feb 7 / 11:37 PST

As I was untangling my Amazon/AWS credentials last night, I did something that I don’t do often, and looked at the details of my AWS bill. The total cost of hosting this site for January: $3.08. That doesn’t seem like a bad deal, but digging in a little, it turned out I was overpaying. Of $3.08, $3.07 was for S3 (I was mildly surprised to see that all my CloudFront use fits in the free tier). And of that, $2.15...

11 months ago

Atoms — brandur.org

2024 / Feb 7 / 08:29 PST

A Go 1.21 feature that I’d previously missed: toolchains. A toolchain consists of a bundled compiler, assembler, and set of standard Go tooling. An installed go command has a bundled toolchain, but is capable of fetching other ones as necessary. Today, to upgrade my project to Go 1.22, all I had to do was change one line in go.mod: $ git diff diff --git a/go.mod b/go.mod index 49a960839..f1b3ff857 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ module github.com/crunchydata/priv-all-platform -go...

11 months ago

Atoms — brandur.org

2024 / Jan 19 / 12:29 PST

Published fragment Thoughts on ONCE + Campire, on ONCE’s $299 self-hosted Basecamp. Is a web app for chat fine nowadays?

11 months ago

Atoms — brandur.org

2024 / Jan 15 / 14:01 PST

A tweet: typing is the secret to using the computer. if you’re not typing, you should be clicking on stuff. if you’re scrolling, then it’s already over… you’re not doing shit A little brash on the surface, but a font of wisdom below. If you’re on a computer scrolling, nothing useful is happening. Best to stop using said computer and go do something better.

12 months ago

Atoms — brandur.org

2024 / Jan 15 / 13:33 PST

Published fragment Hard media, on the disapperance of physical media and the overabundance of its digital counterpart.

12 months ago

Atoms — brandur.org

Running 2023

2023 was an odd fitness year for me, simultaneously being one of victory and of defeat. I did some of my best running distance ever, finishing just over 1,700 km, but still ended the year heavy. A clear indicator that nutrition is at least as important as exercise. I started a daily running streak going into France, and hit 163 consecutive days before it ended with my trip to the John Muir Trail. This was a great habit – wanting...

12 months ago

Atoms — brandur.org

2024 / Jan 13 / 13:26 PST

Published sequence 072, Prairie ridgeline.

12 months ago

Atoms — brandur.org

2024 / Jan 13 / 13:19 PST

SQLite’s Wal2 mode was new to me. Added for high throughput systems to resolve a problem where if a wal file was being continuously written to with new changes, SQLite’s checkpointer could never fully finish its work, and therefore the wal file could grow unbounded. Wal2 fixes the problem by juggling two wal files which its writer and checkpointer alternate between: In wal2 mode, the system uses two wal files instead of one. The files are named “[database]-wal” and “[database]-wal2”,...

12 months ago

Atoms — brandur.org

2024 / Jan 13 / 12:35 PST

Published fragment Discovering histograms, kicking off metric rollups, on a blog post explaining aggregating aggregates doesn’t work, and using histograms to do the job instead. It’s a modest effort, but it’s something to kick off writing for 2024.

12 months ago

Atoms — brandur.org

2024 / Jan 10 / 00:02 PST

Published sequence 071, still water.

12 months ago

Atoms — brandur.org

2024 / Jan 6 / 15:12 PST

Goodhart’s law: When a measure becomes a target, it ceases to be a good measure.

12 months ago

Atoms — brandur.org

2023 / Dec 30 / 10:37 PST

Published sequence 070, bulbs at 101.

12 months ago

Atoms — brandur.org

2023 / Dec 27 / 00:10 PST

The Christmas tree this year. Mom and Dad have been using a real tree for four decades, but with the help of an attractive sale from Costco, this is finally the year they switched to artificial. There’s nothing quite like the smell of an honest-to-God tree on Christmas morning, but these days the fake ones are gorgeous, and win hands down practicality wise with no cleanup and built-in lights.

about 1 year ago

Atoms — brandur.org

2023 / Dec 26 / 16:01 PST

Follow up from yesterday: dumped Goodreads immediately after realizing out that it was not only returning missing information for newly read books, but was tainting my existing archives as records of previously read books started returning corrupted records as well. My book list is now a flat file in TOML instead. More robust, but it’s a shame how one by one, every third party API this site used to ingest for aggregation has disappeared – Goodreads was the last one...

about 1 year ago

Atoms — brandur.org

2023 / Dec 26 / 00:47 PST

Goodreads has been in the process of deprecating their API for years now. As of December 2020 they stopped issuing new API keys, but let existing ones keep working. It’s not documented, but even with an existing API key, somewhere around mid-2022 they crippled the API so that it no longer returns many properties about books being returned – e.g. publication year or number of pages. It’s still possible to extract reviews, but that’s about it. I recently restyled this...

about 1 year ago

Atoms — brandur.org

2023 / Dec 18 / 12:30 PST

Today, I accidentally stumbled across .ovh domains, offered by OVH Cloud, a French VPS provider, which may be the cheapest TLDs available – $2.15/year for initial registrations, and then $3.49/year for renewals. I’m a strong purveyor of the “make it first, register domain second” mantra since spending money on domains is easy while doing is hard, but with that caveat, .ovh may be a good a spot for long-term side projects. .tk domains are technically cheaper because they’re free (something...

about 1 year ago

Atoms — brandur.org

2023 / Dec 18 / 12:01 PST

I enjoyed The “Cheap” Web (potato.cheap), a self-proclaimed solarpunk philosophy of web design. An extract: Large parasocial platforms transformed the internet into a hostile and impersonal place. They feed our FOMO to keep us clicking. They exaggerate our differences for “engagement”. They create engines for stardom to keep us creeping. They bait us into nutritionless and sensationalist content. Humanity cannot subsist on hype alone. Small and sincere communication quietly thrives. It’s easy to find and even easier to make yourself:...

about 1 year ago

Atoms — brandur.org

2023 / Dec 2 / 18:36 PST

Golangci-lint 1.55 bundles in testifylint, which must be the best new linter in years, aiming to make calls to the testify package more consistent. Its best aspect is being able to detect reversed parameters. i.e. require.Equal(t, actual, expected) when it should be require.Equal(t, expected, actual). An example fix from River: - require.Equal(t, cleaner.Config.RescueAfter, RescueAfterDefault) + require.Equal(t, RescueAfterDefault, cleaner.Config.RescueAfter) But there’s many other good ones. Requiring Len instead of using an equality assertion: - require.Len(t, job.Errors, 0) + require.Empty(t, job.Errors) Or...

about 1 year ago

Atoms — brandur.org

2023 / Nov 21 / 18:38 PST

Published sequence 069, limited visibility.

about 1 year ago