An introduction to Cloudflare's ecosystem
How Cloudflare's networking, security, compute, and storage services fit together, with Unblock Syria as a working example and a look at the five-dollar Workers plan.
Articles, notes, and links. Software, AI, calligraphy, politics — in that rough order.
How Cloudflare's networking, security, compute, and storage services fit together, with Unblock Syria as a working example and a look at the five-dollar Workers plan.
One Open Graph image per route, built two ways: HarfBuzz and resvg at build time, satori per request. Then the part that breaks in Arabic — word order, letter joining, and measuring text the font draws differently than it measures.
Syria went on the American terrorism list in 1979 and came off it on Monday. I wrote the careful version for Unblock Syria. This is the one where I'm happy, and still angry.
Arabic handwriting: 0.8% word error. Classical calligraphy: 45%. I went looking for the missing training data behind that gap and found the opposite — rules written down in the tenth century, and encoded in software in the 1980s.
Four and a half months, twenty-five patches carried against VLC's own source, and one feature I still cannot ship. What it takes to own a C engine instead of consuming one.
Add a member to a type you do not own and it lands in that type's namespace, not yours. SwifterSwift hit this past five hundred extensions. Here is the wrapper that fixes it, and why you have to choose it before your first release.
Generate a key, register it, tell SSH which one to use — then have Git rewrite every HTTPS remote to SSH, including the ones inside other people's submodules and lockfiles.
first(where:) instead of filter().first. Comparable tuples instead of nested comparisons. indices.contains instead of a hand-rolled range check.
willSet and didSet already hand you newValue and oldValue without being asked. Then there are three situations where neither observer runs at all.
Name a completion signature once and spell it Handler<Post> at every call site. Readable, and a single place to change the error type. Documentation the compiler spell-checks, and nothing more.
Should an out-of-bounds index crash, or come back nil? It turns on whether you produced the index or someone else did — plus one performance trap on collections that are not arrays.
Nothing here yet.