Plurrrr

week 13, 2023

Mastering Emacs Together

We have a tiny book club that meets every weekend to read and discuss the book Mastering Emacs, 2022 edition written by Mickey Petersen. We go through a few pages of the book every time we meet, do some demos, and talk about the concepts we learn from the book. In the 36 meetings that we have had so far, we have spent approximately 26 hours together carefully reading every line of the book, trying out the lessons on an actual editor, and experimenting with the new concepts. In the last 3½ months, we have completed four chapters of the book. We are currently reading the fifth chapter. In this post, I'll share what the journey has been like so far and a few interesting things we have learnt.

Source: Mastering Emacs Together, an article by Susam Pal.

Body Of Evidence

A reclusive writer is dead. And her final manuscript has disappeared . . .

Someone is stalking Beryl Madison. Someone who spies on her and makes threatening, obscene phone-calls. Terrified, Beryl flees to Key West - but eventually she must return to her Richmond home. The very night she arrives, Beryl inexplicably invites her killer in . . .

Thus begins for Dr Kay Scarpetta the investigation of a crime that is as convoluted as it is bizarre. Why would Beryl open the door to someone who brutally slashed and then nearly decapitated her? Did she know her killer? Adding to the intrigue is Beryl's enigmatic relationship with a prize-winning author and the disappearance of her own manuscript. As Scarpetta retraces Beryl's footsteps, an investigation that begins in the laboratory with microscopes and lasers leads her deep into a nightmare that soon becomes her own.

In the evening I started in Body Of Evidence, Scarpetta 2, by Patricia Cornwell.

Moving from Rust to C++

I’ve been involved in Rust and the Rust community for many years now. Much of my work has been related to creating infrastructure for building GUI toolkits in Rust. However, I have found my frustrations with the language growing, and pine for the stable, mature foundation provided by C++.

Source: Moving from Rust to C++, an article by Raph Levien.

Tensors and Convolution

I made some strides in the practical understanding of tensors, convolution and how that becomes the foundation of a variety of DNN architectures referred as Convolutional Neural Networks. I then bit the bullet and began extracting the minimal source code I need from the OIDN library. I know there will be more snippets to extract, but hopefully those will be more mathematical in nature, and less structural.

Source: DNND 2: Tensors and Convolution, an article by Max Liani.

Why not tell people to "simply" use pyenv, poetry or anaconda

In “Relieving your Python packaging pain”, I shared what I’ve witnessed to be the most reliable way to avoid many python packaging problems, for a large number of users. This article listed the steps to take without justifying them, delegating this responsability to today’s post.

Among other things, it advised not to use homebrew, pyenv, anaconda, poetry, and other tools. The reason is mostly because they have too many modes of failure, while solving problems that people won’t have as long as they are battling more primitive issues.

Instead, it focused on providing a basic procedure that will let most people do their job and have the highest possible rate of success.

Source: Why not tell people to "simply" use pyenv, poetry or anaconda.

The Difficulty of Fixing Python Indentation Errors

Recently, I fixed the indentation errors in dozens of online Python programs that I didn't write. For each of the Python programs, I knew the expected output. For most of these programs, it was easy to fix the indentation errors. However, some of the programs were difficult to fix, because they had multiple indentation errors (e.g., a program with all the indentation removed!), and because I was unfamiliar with the programs.

Source: The Difficulty of Fixing Python Indentation Errors, an article by Bob Lyons.

Is your Postgres ready for production?

Is your database ready for production?

You've been building your application for months, you've tested with beta users, you've gotten feedback and iterated. You've gone through your launch checklist, email beta users, publish the blog post, post to hacker news and hope the comments are friendly. But is your database ready for whatever may come on launch day or even 2 months in?

Source: Is your Postgres ready for production?, an article by Craig Kerstiens.

CSS Masking

In the design world, masking is a popular technique to achieve unique design effects. As a designer, I’ve used it many times, but my usage of it on the web is rare. I think that the reason that kept me from not using a CSS mask is the browser support, they are partially supported in blink browsers (Chrome and Edge) and fully supported in Safari and Firefox.

The great news is that CSS masking will be part of Interop 2023, which means we should expect cross-browser support (Yay!!).

In this article, I will go through what CSS masking is, how it works, and a few use cases and examples for it.

Source: CSS Masking, an article by Ahmad Shadeed.

Fixing the Next Thousand Deadlocks

Last month, our service was brought down for days by a nasty deadlock bug, and this isn’t the first deadlock we’ve seen - it’s at least the fourth. And just last week, we saw yet another deadlock-induced outage. Fortunately, four of the five deadlocks (including the most recent two) have the same root cause - futures::stream::Buffered is inherently prone to deadlocks. In this post, I will explain the issue and explore ways to prevent this from happening again. The transition won’t be easy, but I think it will pay off for the ecosystem in the long run.

Source: Fixing the Next Thousand Deadlocks: Why Buffered Streams Are Broken and How To Make Them Safer.

Git made easy

Gut is a user-friendly Git CLI for Windows, Mac, and GNU/Linux. With intuitive commands and streamlined workflows, Gut simplifies the process of using Git's complex system, allowing you to focus on your code.

Source: Gut - Ease your journey with Git.

Postgres: The Graph Database You Didn't Know You Had

PostgreSQL (Postgres), is a powerful relational database that can store a wide range of data types and data structures. When it comes to storing graph data structures we might reach for a database marketed for that use case like Neo4J or Dgraph. Hold your horses! While Postgres is not generally thought of when working with graph data structures, it is perfectly capable to store and query graph data efficiently.

Source: Postgres: The Graph Database You Didn't Know You Had, an article by Dylan Paulus.

On writing better error messages

We as developers need to improve our error messages. Try to be helpful, and explain:

  1. Who caused the error?
  2. What happened, and why?
  3. When will it be fixed?
  4. How can the user respond to the error?

Depending on the type of service you run, you'll likely still need request IDs and other diagnostics in your error message to help your support staff debug the issue.

A human-readable error message doesn't have to come at the expense of removing all technical information.

Source: On writing better error messages, an article by Max Rozen.

AWK technical notes

In the previous article Fascination with AWK we discussed why AWK is great for prototyping and is often the best alternative to the shell and Python. In this article I want to show you some interesting technical facts I learned about AWK.

Source: AWK technical notes, an article by Volodymyr Gubarkov.

Go linters configuration, the right version

As for today golangci-lint contains 120+ linters and what I often notice:

  • not everyone is aware of how to configure it
  • what are the pros and cons of some fields
  • what is The Best™ golangci-lint config
  • etc.

In this post, I'm going to share my config and some thoughts on why I prefer this or that. The post might look long due to the big YAML sections (hah, YAML), but most of the stuff is quite simple.

Source: Go linters configuration, the right version, an article by Oleg Kovalov.

Generating Configs with Nix + Cue

I've continued my excursion into improving my local development environment with Nix. In today's post, I want to share the solution I designed to tackle the problem of the root of a repository becoming full of various configuration files.

Source: Generating Configs with Nix + Cue, an article by Joshua Gilman.

Common pitfalls of GitHub Actions

If you create GitHub Actions via GitHub’s UI by going to the URL of the form https://github.com///actions/new, it provides templates for setting up the build. However, the template is broken.

There are four problems with the default template

  1. No dependency caching – so package dependencies will be resolved and reinstalled every time
  2. No cancelation of stale executions – If you pushed a commit and before the tests finish, you decide to push another commit then the stale commits are not canceled. Rather they continue executing!
  3. No path filtering – So a change to README will trigger the execution of, for example, linters and tests!
  4. No timeouts – Rogue tests can run forever leading to resource exhaustion

All these are fixable.

Source: Common pitfalls of GitHub Actions.

CSS-only Widgets Are Inaccessible

Interactive widgets powered with only CSS are relatively common as people are playing with all the ways CSS can respond to, or create, interactions. CodePen contests are a great venue to see these experiments (which hopefully are never moved to a live human-facing project).

The problem with many of these examples is they need to convey their state (such as expanded or not), properties (think of relationships), or values, and (sometimes) dynamic names. While CSS is ideal to show these visually, they need to be passed to accessibility APIs so they can be conveyed to users of assistive technologies.

Not everything that relies on CSS for interaction is inaccessible. There are always going to be exceptions, but those are (and should be) rare.

Source: CSS-only Widgets Are Inaccessible, an article by Adrian Roselli.