The modern web and (alleged) software stagnation in the past few decades

I was recently reading The Great Software Stagnation ( via ), whichputs forward a simple thesis:

Software is eating the world. But progress in software technologyitself largely stalled around 1996. [...]

I have a number of reactions to that, but one of them is that onespecific yet obvious area of software technology has progressedhugely in the last 24 years, or even the last ten, and that is the'application' web (which these days is not just Javascript but


An interesting and puzzling bit of Linux server utilization

Today, due to looking at dashboards in our Prometheus system supplemented with someuse of ' perf top ', I discovered that a person here had managedan interesting performance achievement on one of our SLURM CPUnodes . What initially attractedmy attention was that the node had sustained 100% CPU usage, butit's the details that make it interesting.

This node has a 1 GB Ethernet interface, and it was fully saturatingthat interface with NFS reads from one of our fileservers . However, the 10


GNU Date and several versions of RFC 3339 dates

RFC 3339 is an RFC standardfor time strings, which is to say how to represent a timestamp intextual form. In its RFC form, it says that it is for 'timestampsfor Internet protocol events', but it's been adopted as a timeformat well beyond that; for example, some Prometheus tools useit . In its pure RFC 3339form, it has two advantages: it doesn't use time zone names of anysort, and a RFC 33


Some ways to do a Prometheus query as of a given time

Yesterday, I wrote about my wish for easier ways to evaluate aPrometheus query at a given time . TodayI want to write down a few ways to do this for my future use, partlysince I discovered one more way than I'd known when I went pokingaround after writing that entry.

Prometheus has an ad-hoc query view,which gives you answers either in a table or in a graph. The graphview has always supported adjusting the end time of the graph, inthe same area above


A Prometheus wish: easy ways to evaluate a PromQL query at a given time

To do most things in Prometheus , you use PromQL to make queries against Prometheus' internal time series databasethat holds all of the metrics that your system has collected overhowever long your retention time is. PromQL queries are alwaysevaluated at a given time, with the default for simple queries being'right now' (this is true even for queries that ask for, say, theaverage of something over the past five minutes; those past fiveminutes start at the query's evaluation time).

PromQL has support


A little puzzle with printf() and C argument passing

In The Easy Ones – Three Bugs Hiding in the Open ,Bruce Dawson gave us a little C puzzle in passing:

The variable arguments inprintf formatting means that it is easy to get type mismatches. Thepractical results vary considerably:

  1. printf(“0x%08lx”, p); // Printing a pointer as an int – truncation or worse on 64-bit
  2. printf(“%d, %f”, f, i); // Swapping float and int – could print

It feels like the broad Unix API is being used less these days

A few years ago I wrote about how the practical Unix API is broaderthan system calls and how the valuelocked up in the broad Unix API made it pretty durable . I still believe that in one way, but at thesame time I've wound up feeling that a lot of modern softwaredevelopment and deployment practices are causing the broad Unix APIto be less and less used and useful. What I'm specifically thinkingabout here is containers.

If you're logging in to a Unix machine and using


Our alerts are quiet most of the time (as they should be)

It's the middle of the University of Toronto's winter break rightnow so officially we 're offwork. Unofficially we're checking in on email and we'll probablynotice if something explodes. During this time, one of the thingsthat has made this not much of a burden is that we basically haven'tgotten any alerts from our Prometheus system . This is by design.

One part of the design is that our overall environment is notsupposed to have (significant) problems, and


In Python 3, types are classes (as far as repr() is concerned)

In yesterday's entry , I put in a littleaside, saying 'the distinction between what is considered a 'type'and what is considered a 'class' by repr() is somewhat arbitrary'.It turns out that this is not true in Python 3, which exposes aninteresting difference between Python 2 and Python 3 and a bit ofold Python 1 and Python 2 history too.

(So the sidebar in this old entry of mine isnot applicable to Python 3.)

To start with,


The expiry time of Certificate Authority root certificates can be nominal (or not)

The recent news from Let's Encrypt is Extending Android DeviceCompatibility for Let's Encrypt Certificates ,which covers how Let's Encrypt is going to keep their certificatesworking on old Android devices for a few more years. The core problemfacing Let's Encrypt was that old Android devices don't have Let'sEncrypt's own root certificate, so to trust LE issued certificatesthey rely on a cross-signed intermediate certificate that chainsto IdenTrust's 'DST Root CA X3' certificate