HNHacker News
TopNewBestAskShowJobs

evancordell

181 karma · joined June 9, 2014

[ my public key: https://keybase.io/ecordell; my proof: https://keybase.io/ecordell/sigs/CIkzuJihwPz2AXAFvNQ0Npy5G-lNFASw9lAf7DIAdAk ]
submissionscomments
evancordell··on Using the expand and contract pattern for schema changes
We always called these "four-phase migrations". An old Stripe article used similar naming[0].

[0]: https://stripe.com/blog/online-migrations

evancordell··on The U.S. government may finally mandate safer table saws
This video is a great overview of the history and the recent hearings, came here to link it.

Not sure I agree with his conclusion though - once all manufacturers are required to include the technology, surely they will still compete on price and find ways to get cheaper models to market? They will be unencumbered by the risk of patent violation to innovate on cheaper approaches to the same problem.

He also argues for riving knives and blade guards as an alternative, which are great, but not all cuts can be made with them in place.

As a hobby woodworker that sometimes makes mistakes, I've wanted a SawStop for a long time but have been stymied by the cost, so maybe I'm just being optimistic.

evancordell··on DBOS Operating System
At the risk of making a classic "I have a few qualms with this app" blunder, I'm not super clear on what this has over other durable workflow solutions.

It seems to take the durable workflow idea and lock you into a specific language, operating system, and database, when other projects in the same space give you choice over those components.

evancordell··on Macaroons Escalated Quickly
> The community that formed around building open source “standard” Macaroons decided to use untyped opaque blobs to represent candidates.

I assume "candidates" was supposed to be "caveats" - and as an author of a "standard" macaroon implementation, I completely agree that this is the biggest downfall of Macaroons. With no common caveat language (and no independent "dischargers") it really limits their use to within a single org. And at that point you're basically asking everyone to invent their own token format anyway.

Though I don't personally use them much anymore - I think the use-cases for Macaroons are much more limited if you have a Zanzibar! - I appreciate seeing Macaroon discussions pop up and this post and the related discussions it linked out to were a great read.

evancordell··on Macaroons Escalated Quickly
To be fair, this is a mistake that started with the Google paper, and everyone else just copies the mistake.

The paper calls them Macaroons as a play on (browser) Cookies with layers (of caveats) - so clearly they meant macarons as well, since a macaroon doesn't have layers. Or at least, that's always been my interpretation of the name. It's possible it was just an arbitrary play on hMAC cookies and not the layers?

evancordell··on Pitfalls of Helm – Insights from 3 years with the leading K8s package manager
This is interesting, I have the opposite opinion. I dislike helm for public distribution, because everyone wants _their_ thing templated, so you end up making every field of your chart templated and it becomes a mess to maintain.

Internal applications don't have this problem, so you can easily keep your chart interface simple and scoped to the different ways you need to deploy your own stack.

With Kustomize, you just publish the base manifests and users can override whatever they want. Not that Kustomize doesn't have its own set of problems.

evancordell··on You have a right to know why a health insurer denied your claim
> my wife is still receiving bills from the birth of our most recent child, 18 months ago

I've been dealing with this as well, and the uncertainty has been the most frustrating thing.

Medical bills from the same institution should be required to be high watermarks - i.e. if you give me a bill in March, you can't send me a bill in April that has charges from February that _weren't on the bill from March_. It feels like fraud (and maybe it is, but who has time to figure that out?)

evancordell··on The midwit home
Also a happy Lutron fan, but I went with RadioRA2. It's a bit "smarter" but it's very reliable, not connected to the internet, and some basics can even be programmed without the management software.

One thing that stands out with Lutron products is their use of a unique spectrum[0], unlike almost all other smarthome products that share the same noisy bands.

[0]: https://assets.lutron.com/a/documents/clear_connect_technolo...

evancordell··on What happened to Wirecutter?
Quality aside, it's the paywall that grinds my gears.

Wirecutter articles are essentially long, well-researched ads for the products they (affiliate) link to.

I always found these ads useful, at least as a starting point. But putting a paywall in front of the ads rubs me the wrong way, like an unwritten contract was broken.

evancordell··on Policy Engines: Open Policy Agent vs. AWS Cedar vs. Google Zanzibar
The article was comparing OPA/Cedar to Zanzibar, which is why my head went there. I did go looking for info on how OPAL deals with caching and consistency and found these:

- Authz data is kept in memory, so what you can authorize over is limited by the memory of the box you run OPAL/OPA. The docs also mention sharding, but I'm not clear on how you actually do that with OPA. [0] Maybe there's another doc that I missed.

- You can get a token representing the last time data was synced to the cache in an OPAL health check, but I'm not clear on how you'd use it to ensure consistency in your application since hydrating the cache is asynchronous. [1]

Anyway, those are the types of things Zanzibar is concerned with, so that comparison (instead of Cedar) would've made more sense to me. Without spending more time on it, I'm not sure if I've represented OPAL correctly above, that's just what I found when I went looking.

[0]: https://docs.opal.ac/faq/#handling-a-lot-of-data-in-opa

[1]: https://docs.opal.ac/faq/#how-does-opal-guarantee-that-the-p...

evancordell··on Policy Engines: Open Policy Agent vs. AWS Cedar vs. Google Zanzibar
I've seen the sentiment in this article pop up in a few places, which I'd summarize as: Policy languages like OPA and Cedar are fast to evaluate and simple to write, so you should use it for all of your authorization needs.

But policy engines are only really fast and simple if they already have all of the data they need at evaluation time.

If you look at the examples in the Cedar playground[0], they require you to provide a list of "entities" to Cedar at eval-time. These entities are some (potentially large) chunk of your application's data. And while the policy evaluation over that data may be fast, the round trip to your database is probably not. And then you start to think about caching, data consistency, and so on, and suddenly you're thinking about a lot of the problems that Zanzibar was designed to address (but you're on your own to build it out).

IMO policy engines are best suited for ambient request data: things you already know about a request because of a session, a route, or a network path, and policies that make sense to manage on the same lifecycle as your application.

Disclaimer: I work on SpiceDB[1], a Zanzibar implementation, but I do also like policy engines.

[0]: https://www.cedarpolicy.com/en/playground

[1]: https://github.com/authzed/spicedb

evancordell··on Ask HN: Could you share your personal blog here?
https://evancordell.com/
evancordell··on Microwaved plastic containers release microplastics into food
Longer than that; I remember being warned about plasticizers leaching into food if microwaved.

Found this paper from 1982: https://www.jstor.org/stable/44540143

evancordell··on Maximizing CockroachDB Performance: Our Journey to 1M QPS
We're saving some of that for a future blog post - we tested many different configurations and scales (of both SpiceDB and CRDB)
evancordell··on A New Era of Podcast Mergers Is Just Beginning
Do you just mean comedic quality or do you mean production quality as well?

Some that I've listened to are good on both fronts (in my opinion): Mission To Zyxx, Dungeons and Daddies, Beef and Dairy Network.

evancordell··on Learn Makefiles with the Tastiest Examples
I looked at both and came away thinking mage was more convenient for go-only projects. Just looked good and I would probably pick it for something that wasn't go-only (if make didn't make sense instead).
evancordell··on Learn Makefiles with the Tastiest Examples
> Couldn't you have achieved this even more simply by using make with a go shell?

Make is still really about file to file transformations, and `go` already wraps up all of the behavior one would normally use make for. Plus you need make + a shell + go, vs. mage where all that's needed is go.

I can't speak for the author, but I assume they're reacting to how Makefiles tend to be used in go projects and not how make works generally.

evancordell··on Learn Makefiles with the Tastiest Examples
I have long held similar opinions on make, and I've recently started using mage[0] in more and more go projects and have been happy with the result.

It's more task-oriented, the way people tend to write Makefiles with .PHONY rules, but it's all in go. It can be bootstrapped just with go too, and comes with some utilities to do make-like incremental builds if you need to.

[0]: https://magefile.org/

evancordell··on Jsonnet – The Data Templating Language
> But weirdly given its focus on schemas I couldn't find any way for a document to link to a schema in-band!

In cue there's no real distinction between "schemas" and "documents". If you say:

   value: string
   value: "abc"
then cue "unifies" the definitions for `value`, sees that "abc" is a string, and therefore `value` is valid.
evancordell··on Spack – scientific software package manager for supercomputers, Linux, and macOS
There's a good interview with the author in an episode of The Manifest: https://manifest.fm/11

It's been a while since I've listened, but I remember it being pretty interesting.

evancordell··on Writing a Kubernetes Operator
I don't think it's quite as bad as you're suggesting. Operators are control-plane, your other examples are data-plane. You can also only run one Deployment controller in a kube cluster, but many Deployments. And you can run many controllers for a single CRD, see the Gateway APIs for example, but it's not as common and is more work.

That said, I do think the direction that Kube has gone with CRDs, by leaning into making them more like built-in apis instead of allowing them to be differentiated as an external extension point has limited what you can do with them.

When ThirdPartyResrouces just carved out a group and a name in the API it was simple to have multiple copies and multiple versions running together in a cluster. But that has become more difficult with time, especially with ConversionWebhooks - a feature that forces all controllers for an API to agree not just on a version, but on the specific ways versions convert into each other.

evancordell··on Writing a Kubernetes Operator
I get the sentiment. We held off on building an operator until we felt there was actually value in doing so (for the most part, Deployments cover the operational needs pretty well).

Migrations can be run in containers (and they are, even with the operator), but it's actually a lot of work to run them at the right time, only once, with the right flags, in the right order, waiting for SpiceDB to reach a specific spot in phased migrations, etc.

Moving from v1.13.0 to v1.14.0 of SpiceDB requires a multi-phase migration to avoid downtime[0], as could any phased migration for any stateful workload. The operator will walk you through them correctly, without intervention. Users who aren't running on Kubernetes or aren't using the operator often have problems running these steps correctly.

The value is in this automation, but also in the API interface itself. RDS is just some automation and an API on top of EC2, and I think RDS has value over running postgres on EC2 myself directly.

As for helm charts, this is just my opinion, but I don't think they're a good way to distribute software to end users. The interface for a helm chart becomes polluted over time in the same way that most operator APIs become polluted over time, as more and more configuration is pulled up to the top. I think helm is better suited to managing configuration you write yourself to deploy on your own clusters (I realize I'm in the minority here).

[0]: https://github.com/authzed/spicedb/releases/tag/v1.14.0

evancordell··on Writing a Kubernetes Operator
This is a common frustration of mine as well!

In the latest release of the spicedb-operator[0], I added a feature that allows users to specify arbitrary patches over operator-managed resources directly in the API (examples in the link).

There are some other projects like Kyverno and Gatekeeper that try to do this generically with mutating webhooks, but embedding a `patches` API into the operator itself gives the operator a chance to ensure the changes are within some reasonable guardrails.

[0]: https://github.com/authzed/spicedb-operator/releases/tag/v1....

evancordell··on Hermes: An open-source document management system
I saw your comment, enabled Markdown in a Google Doc, tried to write a code block, became immediately frustrated.

Looks like it only supports bold/italic, links, and headers.

evancordell··on Strict-serializability, but at what cost, for what purpose?
That makes more sense, thank you for the explanation.

Are there any plans for accord to permit snapshot queries?

evancordell··on Strict-serializability, but at what cost, for what purpose?
This might just be a language issue, because different sources use different words for consistency guarantees.

> Accord only avoids enforcing an ordering (2) on transactions that are commutative

If the committed state in the database records the transactions in a different order than an external observer could have observed them being accepted by the database, then you don't have what Spanner calls "external consistency" - I thought this is what you mean when you say "global strict serializability", but now I'm not so sure.

Cockroach does enforce this property, but only for transactions that touch the same (key-value layer) keys. They talk about this a bit in their article on "life without atomic clocks"[0].

In SpiceDB[1], we take advantage of this property (when Cockroach is selected as the backing datastore) to give us external consistency by forcing all transactions to overlap. This prevents the New Enemy Problem[2], which is what Google calls the problem of transaction ordering when seen from an authorization perspective.

Your description of Accord sounded very similar to how Cockroach works from this perspective, but there may be some subtlety that I am missing. Cockroach exposes snapshots via "as of system time" queries, which can expose "bad" ordering back to the client in future queries - if Accord doesn't allow snapshot queries then I suppose it wouldn't be an issue.

[0]: https://cockroachlabs.com/blog/living-without-atomic-clocks/...

[1]: https://github.com/authzed/spicedb

[2]: https://authzed.com/blog/prevent-newenemy-cockroachdb/

evancordell··on Strict-serializability, but at what cost, for what purpose?
I’m confused by this as well, it seems to only provide “strict serializability” for overlapping transactions, which other databases like Cockroach also provide.
evancordell··on Ask HN: YouTube Channels for the Intellectually Curious
Hand Tool Rescue is another good channel in the vein of My mechanics: https://www.youtube.com/channel/UCasG9kJWi1eVxM0QkyqKVJQ
evancordell··on Dagger: a new way to build CI/CD pipelines
In the examples it looked as though there is still a CUE unification loop happening during dagger processing:

  deploy: netlify.#Deploy & {
    contents: build.contents.output
  }
It looks like dagger is using cue as a bit more than a YAML replacement; it hydrates cue values as it runs - which is cool! - but that's the part that seemed at odds with CUE's philosophy of pushing nondeterminism into clearly marked files.
evancordell··on Dagger: a new way to build CI/CD pipelines
I played with a similar idea a while ago: https://github.com/ecordell/cuezel/ (cuezel as in: "Bazel but with CUE"), but I was never sure that what I was doing was in the spirit of CUE.

CUE pushes nondeterminism into "_tool.cue"[0] files that are allowed to do things like IO and run external processes. Tool files scratch a similar itch to Makefiles, but they lack an integrated plugin system like Bazel (hence why I played with the idea of CUE + Bazel).

With Dagger you seem to be restricted to the set of things that the dagger tool can interpret, just like with my Cuezel tool you are limited to what I happened to implement.

In CUE `_tool` files you are also limited to the set of things that the tool builtins provide, but the difference is that you know that the rest of the CUE program is deterministic/pure (everything not in a _tool file).

There's clearly value in tooling that reads CUE definitions, and dagger is the first commercial interest in CUE that I've seen, which is exciting.

But I'm most interested in some CUE-interpreter meta-tool that would allow you to import cue definitions + their interpreters and version them together, but for use in `_tool` files to keep the delineation clear. Maybe this is where dagger is heading? (if so it wasn't clear from the docs)

[0]: https://pkg.go.dev/cuelang.org/go@v0.4.2/pkg/tool

Page 1 of 3Next →