Sudden braking

By [email protected] (RevK)

I have seen several comments on social media expressing concern about "sudden braking" at side roads.

The concern is that a car, turning in to a side road, may suddenly brake to allow a pedestrian to cross the side road, and this could result in a car from behind failing to stop and cause a collision ("rear ending").

This is obviously not good!

Yes, the car behind should allow enough space, and is in the wrong here, but even so, sudden braking is not good and should be a voided.

So why sudden braking?

The obvious reason for sudden braking is when the driver finds circumstances changing unexpectedly. If they can predict what is happening well enough then they can slow sensibly rather than suddenly brake.

Under the current Highway Code, if a driver turning in to a side road sees a pedestrian on the pavement about to cross, the driver has to make a guess. They have to guess if the pedestrian will wait, or cross. Given the rules for pedestrians expect the pedestrian to look for cars turning, and the "Green Cross Code", etc, the driver may make the reasonable assumption that the pedestrian will wait. The driver proceeds on that assumption, not slowing much, expecting to make a moving turn in to the side road. However, if the pedestrian starts to cross, the driver has to brake suddenly because at that point they are required to give way to the pedestrian (§170 Highway code). This is unexpected and so causes "sudden braking".

As I say, sudden braking is not good.

The solution?

Thankfully, as of Jan 29th 2022, the rules are changing. The new Highway Code rules say §170: "give way to pedestrians crossing or waiting to cross a road into which or from which you are turning".

This is a change, in that you now give way to those "waiting to cross". So now, when turning, if you see a pedestrian waiting to cross you not longer have to guess if they will wait or cross. You have to give way to them, to wait for them.

This means you can cleanly signal, slow, and wait for the pedestrian. No unexpected changes in circumstances. No sudden braking. Safer for everyone.

So yes, the Highway Code changes finally address this "sudden braking" issue, at last.

More on Highway Code (Abergavenny)

By [email protected] (RevK)

I had a very interesting debate on FaceBook over this. So I thought it worthy of a blog post.

[Update: Whilst I don't think this is in any way a grey area, the new Highway Code rules from Jan 2022 make this way more clear with rules about giving way entering or leaving a side road when someone is crossing, or waiting to cross]

This is a junction in Abergavenny that I walk across every day on my way to town. I walk both ways, but frequently (maybe once a week) someone turning in to the side road will drive at me whilst I am crossing. They are usually not in sight when I started to cross, sometimes they are and waiting on traffic when I start to cross. But the rules are really clear, if I have started to cross then they have to give way to me. Oddly, even though I have no trouble with zebra crossings (everyone is really polite and stops even if I have not started to cross), they get annoyed that they have to stop for me, for some reason. Some very annoyed, stopping, getting out of the car, shouting, etc. It is crazy!

Just to be clear, I also have a lot of cases of drivers being sensible, waiting for me to cross, no annoyance, very civil and safe. Thank you - most of the people of Abergavenny are very civil and polite.

The debate came up because of the "island" in the road. This was not something I had considered an issue. Walking in direction shown, I am crossing a road, and get to the island in the "middle", and a car approaching expects me to stop for some reason. The question being should I stop? or should I expect them to give way as I started to cross the road some time before and am still crossing, so I have priority. To be clear, I always try to make eye contact and try to avoid getting run over (so far with success) - I even wear hi-vis on many occasions.

What are the rules?

The rules are all in the Highway Code, and even though many of these are just advice, and recommendations, and even some that are clear rules are not "laws", they do define how we all use the road together and if followed they help ensure things work smoothly. At the end of the day, the rules can say which of us was right and which was wrong in a case such as this where the car driver has to stop for a pedestrian that is crossing.

So that is pretty clear, both for a driver and a pedestrian, if you have started to cross (just like a zebra crossing) cars have to give way.

So where does the island come in?

The confusion comes about because of rule 20: "Where there is an island in the middle of a zebra crossing, wait on the island and follow Rule 19 before you cross the second half of the road – it is a separate crossing."

This makes it clear that where there is an island in a zebra crossing, each half of the road is a "separate crossing". So "starting to cross" the crossing (not the road) is not automatically priority over cars for the other "crossing" on the other half of the road.

However, rule 30 is not the same: "Where there are no controlled crossing points available it is advisable to cross where there is an island in the middle of the road. Use the Green Cross Code (see Rule 7) to cross to the island and then stop and use it again to cross the second half of the road."

Both rules make it clear that the road may have two halves, but unlike rule 20, this rule does not say that makes it two separate "crossings" or "roads". Rules 8 and 170 talk of having priority once you have started to cross "the road" or "a road", not "a half of a road" or "a part of a road" or even a "crossing".

So, to me, rule 30 actually clarifies the this is not like a zebra crossing, it is one road, and starting to cross it at all gives the pedestrian priority. As such, when getting to the middle of the road, island or not, they still have priority, and so can reasonably expect the cars turning in to the road to give way as required by rule 170.

The island makes no difference in a side road, even though it does for a zebra crossing. Otherwise the rules are almost the same. Notably a zebra crossing would have a much more serious "island" with the orange globe lights in the middle of the road. For a side road it can be little more that something to support a keep left sign, such as the above. So sort of makes sense.

Just to be clear, the same problem happens when going the other way, where the island is not relevant, and on side roads with no island, but they are not used as much and hence it is much rarer.

Why are people even mentioning the island?

I was also surprised that the whole issue of the island came up. I think people are reading rule 30 and saying that because the pedestrian crosses to the island, stops, and then crosses to the other side of the road, the stopping means they have stopped crossing the road, and start again afterwards, so while stopped they don't have priority. I think that is what people are saying. That may have some validity.

But even if that is how rule 30 can be read, the second someone takes a step from the island they have priority anyway, so in practice cars have to expect to have to give way.

Also, rule 30 is "advice" to pedestrians only. If a pedestrian does not take the advice and crosses where there is no island, and so does not "stop", then the priority clearly starts when they start crossing (the first half of) the road all the way to the other side. Again, cars have to expect to give way to the pedestrian.

Similarly if they decide to only take part of the "advice", cross where there is an island, but do not choose to do the "stop" part. Rule 30 is only advice.

This particular crossing has two small "islands", one in front of the other, holding street furniture, and a gap between them. The gap actually looks placed for pedestrians crossing, and as the islands have no dropped kerb, the gap is the route anyone with any sort of biggie would take, so in practice I am never crossing to the island and stopping.

Does any of this matter?

Drivers and pedestrians have to be careful, and the rules help them know what to expect. If they reach a different conclusion then that can, obviously, lead to an incident. So it is important that they both come to the same conclusion, that is why it matters. It also helps resolve who was "wrong" if there is an incident (which is no consolation if the pedestrian is squished). Both have to be very careful to avoid any squishing being involved. Understanding the rules clearly helps with that.

The good news is that the Highway Code is being changed to make it so you have to give way to someone "about to cross" the road (side road or zebra crossing). Once that change is in place the whole question of the island is moot, as someone on the island in the middle of a side road is clearly about to cross the "second half of the road" and so a car has to give way anyway, even if they consider somehow each side of the road to be a separate road for the purposes of rule 8 and 170.


I had no idea that there would be a debate over the "island", or that there was any ambiguity or confusion over this. As above, it seemed clear to me, so interesting. This makes the changes that are coming to the rules a welcome clarification as it will cover giving way to someone waiting to cross even if they are on an island in the middle of the road.

Even now, before the change, motorists need to basically give way to anyone crossing a side road as if a zebra crossing was there - they already cope if crossing cars coming the other way - but the rules are changing to make this even clearer. Pedestrians are king when crossing a side road...

P.S. given the confusion caused by the "island", which is all pretty irrelevant, I wish I had started with this image, which also is a cause of problems on that junction.

colour cycle lanes rather than bus lanes

By danny

Oxfordshire is still colouring bus lanes - as this newly painted example from just north of Folly Bridge shows - while refusing to paint cycle lanes. This prioritises helping a few inattentive or blind drivers avoid fines over safety for people cycling. the "bus gate" approaching St Aldates from Folly Bridge There is good evidence […]

Captain Picard Tea Order

We can ask the Earl for his order once he's fully extruded from the dispenser.

Power to the people

By [email protected] (RevK)

This is an initial post on a little project I have with monitoring the power (electricity) usage here at home. But first, a bit of background, and smart meters.

Smart meters

In my last house I was, like most people, constantly badgered to have a smart meter. I did have one installed eventually, as it happens. But what is especially odd is the way they are marketed - as "money saving". From what I can tell the main "money saving" aspect is simply that you know how much power you are using in real time, and so can make savings by using less power. You don't need a smart meter for that (as you will see below).

Now, there are other aspects - notably there are now some companies with some special tariffs. My son's is a good example as he has a period over night with very cheap (5p) electricity for charging his car. That alone could be done with a classic "economy 7" type meter, but some of these tariffs are more dynamic, and even link to the car to tell it when it can charge, offering even better tariffs. So yes, there are some ways a smart meter can be advantageous. If you don't have an EV, then maybe less so, just saving using a night tariff for washing machine, tumble dryer, or other high usage stuff, but that is not always as simple as it sounds.

Of course the big downside, that they don't mention, is that the smart meter has a contactor that means the power can be remotely turned off. This is a danger because it can happen by mistake (people mistakenly switched to pre-pay tariff without any means to pre-pay), or because of hacking, which is always a risk. I suspect if that was explained there would be a lot less take up.

But what really does annoy me is how smart meters can so easily become dumb. Shortly after getting one, I switched to another energy provider who simply could not use the smart meter - so no special tariffs, and having to submit meter readings.

When I moved to my new house, there was already a smart meter in place (only for electricity though), and surprise surprise it too was dumb, with the power company I was using (a different one again) unable to read it, and so I have to submit readings.

So, without the detailed live reporting, and finding that the electricity bill is quite high here, and expecting a significant increase in per unit costs, I decided to look in to our usage and see how to make some savings.

Energy monitoring

It turns out that a bit of energy monitoring is not that hard. I have seen projects to watch the blinking light on the meter, but that means power to such as device, and our meter is in a cupboard on the outside, so not easy. What is simple is using a current clamp.

I am using the Shelly EM devices, these can take two clamps per device.

As usual, the Shelly software that comes with it is perfectly adequate. There is also software you can get that integrates with Apple HomeKit. However, for consistency of the various IoT devices I have (over 100), I re-flashed with tasmota software.

The energy metering is logged to MQTT nicely, and so easy for me to code logging and graphing of the data.

Using one of these, and the 120A clamp (there are 50A and 120A which are simply for different size cables) it is easy to clamp the main incoming tail, and get total electricity usage. But that would only give me as much detail as a smart meter, and I wanted more. So I put five of the Shelly EM, a total of 10 clamps, in a deep two gang back box below my consumer unit, and fitted 10 clamps.

This is not quite enough to monitor all usage, and in some cases multiple circuits go via one clamp, but it has allowed me to break down my usage pretty cleanly in to different areas of usage in the house, and so make some changes.

Making some graphs

Having data sent to MQTT made it easy to log the usage to a database, and so make graphs (in SVG), which can be for multiple sensors, for a day, a month, a year, etc. So the graph above is one day. By colour coding each area some usage really does stand out.


The first thing I wanted to do was make sure the metering was consistent. The hatched area is the total, from the incoming tail, and shows at the top where the various other values add up to less than the total. This initially puzzled me as only the lights were not being monitored and it was around 500W difference which was way too much for that. It also seemed to be all day and night.

It turned out one wire was missing on the air con clamp, meaning that (over night) was missed, and also one set of sockets was missed out, impacting all day. Once these were fixed (part way through that day) the discrepancy is nice and clean - almost zero over night as typically one light is on, and a very sane low level for the lights during the day. So I am happy the measurements are consistent now.

Just looking at that one day, you will note some big green blocks on the left, some purple, and a lot of dark blue. These are hot tub, heated floor, and bat cave respectively. But let's break down some of the usage in more detail.

Hot tub

The hot tub is one concern we already had. Shutting down a hot tub is not a simple matter, especially if it is outside where things could freeze. Also, there is no reason not to use it in the winter (even though it is outside), but perhaps not as often. So saving money is not so simple - but understanding how much it uses is useful.

The usage will depend on the temperature, and is mostly just keeping it to temperature with the heater. It is well insulated. When idle, its usage is around 14kWh/day (i.e. around 580W average). At present that is about £70/month, but will go up soon. Not ideal, and clearly something we could consider shutting down if ever we needed to.

One idea was keep it running but at a lower temperature. That does work, indeed it was tested during that day hence the usage mostly being in the morning. The impact was half a day of no heating as the temperature dropped (we set 5C lower), but then the ongoing heating the next day was very similar to that at the higher temperature (only slightly longer gaps). I suspect if we lowered it as low as is sensible we could indeed save power, but if we are still using it some of the time, that is not really going to help. It can take a couple of hours solidly heating to get back to temperature, so using every couple of days it will probably negate a lot of the savings made.

FYI, we noted it only uses 11A heating, and were surprised at the rather beefy installation. This is until we turned on the pumps! It has several jets, and when all on, and the heater on, it can, indeed, pull over 28A. I guess pumping water takes a lot of power. Worth noting. It also has some low usage for circulation pumps that it runs twice a day (and also whilst heating, by the look of it).

Heated floor

The other obvious high user was the fact we have an electric heated floor in the kitchen. It is slate tiles, but this is also the only heating in that room if the door is closed, which is not very efficient.

The graphs made it clear that the floor was using a lot of power. It pulls 16A, and was, in the morning, using a lot.

A very small change of leaving the kitchen door over night left the kitchen warmed from the gas central heating in the house, and made this a lot less demanding. But I also found the temperature sensors were not remotely calibrated, and several degrees out, and also it has an "eco" mode, which is not that clear but did change the usage, and even the clock was wrong and starting far too early in the day.

I expect some more tinkering can save some more without the floor being cold, and it depends, once again, on environmental temperature. We have got it from a worst case measured so far of 28kWh/day down to 8kWh/day now.

Bat cave

The bat cave is simple, it is an outbuilding we have, and the only thing in it is a light (switched off), a temperature sensor, and a freezer, so yes, the usage is very low all day. 0.47kWh/day (20W).

But you will have noticed on my first graph a big dark blue block... It looks like this :-

From this you can probably work out exactly when, and for how long, my son, with his EV, visited, and used the charger on the wall of the bat cave :-)

Other usage

Obviously a number of other things stand out, when used, notably the washing machine and tumble dryer. Even without separate sensors for all of these, it is very simple to see the individual use cases and get an idea of the cost of their use.

My network

I also have, in my loft, on its own circuits, a server, a NAS, fibre termination, firewalls, and switches that PoE all the access points and CCTV cameras, and various other things. This is a simple steady 8½kWh/day (350W). Not insignificant (£40/month) but worth knowing.


I will post more once I have some months of data, I am sure. One of the things I am doing is fitting more of the nice Shelly Plus 1PM switches for lights and some specific devices to get more fine tuned break down of usage. I am also planning solar/battery soon, and will post on that.

The linux tools (taspowerlog and taslowersvg) are on GitHub.

Important Banking Update

By Simwood

By Simon Woodhead TLDR: We’ve changed bank details. Please update your records immediately as payments sent to old accounts may not reach us. You can find new details in our knowledgebase (you will need to log in).  We seem to change payment accounts a lot and it is pretty unsatisfactory doing so and having to […]

Hypothesis Generation

Frazzled scientists are requesting that everyone please stop generating hypotheses for a little bit while they work through the backlog.

Boot Guard and PSB have user-hostile defaults

Compromising an OS without it being detectable is hard. Modern operating systems support the imposition of a security policy or the launch of some sort of monitoring agent sufficient early in boot that even if you compromise the OS, you're probably going to have left some sort of detectable trace[1]. You can avoid this by attacking the lower layers - if you compromise the bootloader then it can just hotpatch a backdoor into the kernel before executing it, for instance.

This is avoided via one of two mechanisms. Measured boot (such as TPM-based Trusted Boot) makes a tamper-proof cryptographic record of what the system booted, with each component in turn creating a measurement of the next component in the boot chain. If a component is tampered with, its measurement will be different. This can be used to either prevent the release of a cryptographic secret if the boot chain is modified (for instance, using the TPM to encrypt the disk encryption key), or can be used to attest the boot state to another device which can tell you whether you're safe or not. The other approach is verified boot (such as UEFI Secure Boot), where each component in the boot chain verifies the next component before executing it. If the verification fails, execution halts.

In both cases, each component in the boot chain measures and/or verifies the next. But something needs to be the first link in this chain, and traditionally this was the system firmware. Which means you could tamper with the system firmware and subvert the entire process - either have the firmware patch the bootloader in RAM after measuring or verifying it, or just load a modified bootloader and lie about the measurements or ignore the verification. Attackers had already been targeting the firmware (Hacking Team had something along these lines, although this was pre-secure boot so just dropped a rootkit into the OS), and given a well-implemented measured and verified boot chain, the firmware becomes an even more attractive target.

Intel's Boot Guard and AMD's Platform Secure Boot attempt to solve this problem by moving the validation of the core system firmware to an (approximately) immutable environment. Intel's solution involves the Management Engine, a separate x86 core integrated into the motherboard chipset. The ME's boot ROM verifies a signature on its firmware before executing it, and once the ME is up it verifies that the system firmware's bootblock is signed using a public key that corresponds to a hash blown into one-time programmable fuses in the chipset. What happens next depends on policy - it can either prevent the system from booting, allow the system to boot to recover the firmware but automatically shut it down after a while, or flag the failure but allow the system to boot anyway. Most policies will also involve a measurement of the bootblock being pushed into the TPM.

AMD's Platform Secure Boot is slightly different. Rather than the root of trust living in the motherboard chipset, it's in AMD's Platform Security Processor which is incorporated directly onto the CPU die. Similar to Boot Guard, the PSP has ROM that verifies the PSP's own firmware, and then that firmware verifies the system firmware signature against a set of blown fuses in the CPU. If that fails, system boot is halted. I'm having trouble finding decent technical documentation about PSB, and what I have found doesn't mention measuring anything into the TPM - if this is the case, PSB only implements verified boot, not measured boot.

What's the practical upshot of this? The first is that you can't replace the system firmware with anything that doesn't have a valid signature, which effectively means you're locked into firmware the vendor chooses to sign. This prevents replacing the system firmware with either a replacement implementation (such as Coreboot) or a modified version of the original implementation (such as firmware that disables locking of CPU functionality or removes hardware allowlists). In this respect, enforcing system firmware verification works against the user rather than benefiting them.
Of course, it also prevents an attacker from doing the same thing, but while this is a real threat to some users, I think it's hard to say that it's a realistic threat for most users.

The problem is that vendors are shipping with Boot Guard and (increasingly) PSB enabled by default. In the AMD case this causes another problem - because the fuses are in the CPU itself, a CPU that's had PSB enabled is no longer compatible with any motherboards running firmware that wasn't signed with the same key. If a user wants to upgrade their system's CPU, they're effectively unable to sell the old one. But in both scenarios, the user's ability to control what their system is running is reduced.

As I said, the threat that these technologies seek to protect against is real. If you're a large company that handles a lot of sensitive data, you should probably worry about it. If you're a journalist or an activist dealing with governments that have a track record of targeting people like you, it should probably be part of your threat model. But otherwise, the probability of you being hit by a purely userland attack is so ludicrously high compared to you being targeted this way that it's just not a big deal.

I think there's a more reasonable tradeoff than where we've ended up. Tying things like disk encryption secrets to TPM state means that if the system firmware is measured into the TPM prior to being executed, we can at least detect that the firmware has been tampered with. In this case nothing prevents the firmware being modified, there's just a record in your TPM that it's no longer the same as it was when you encrypted the secret. So, here's what I'd suggest:

1) The default behaviour of technologies like Boot Guard or PSB should be to measure the firmware signing key and whether the firmware has a valid signature into PCR 7 (the TPM register that is also used to record which UEFI Secure Boot signing key is used to verify the bootloader).
2) If the PCR 7 value changes, the disk encryption key release will be blocked, and the user will be redirected to a key recovery process. This should include remote attestation, allowing the user to be informed that their firmware signing situation has changed.
3) Tooling should be provided to switch the policy from merely measuring to verifying, and users at meaningful risk of firmware-based attacks should be encouraged to make use of this tooling

This would allow users to replace their system firmware at will, at the cost of having to re-seal their disk encryption keys against the new TPM measurements. It would provide enough information that, in the (unlikely for most users) scenario that their firmware has actually been modified without their knowledge, they can identify that. And it would allow users who are at high risk to switch to a higher security state, and for hardware that is explicitly intended to be resilient against attacks to have different defaults.

This is frustratingly close to possible with Boot Guard, but I don't think it's quite there. Before you've blown the Boot Guard fuses, the Boot Guard policy can be read out of flash. This means that you can drop a Boot Guard configuration into flash telling the ME to measure the firmware but not prevent it from running. But there are two problems remaining:

1) The measurement is made into PCR 0, and PCR 0 changes every time your firmware is updated. That makes it a bad default for sealing encryption keys.
2) It doesn't look like the policy is measured before being enforced. This means that an attacker can simply reflash modified firmware with a policy that disables measurement and then make a fake measurement that makes it look like the firmware is ok.

Fixing this seems simple enough - the Boot Guard policy should always be measured, and measurements of the policy and the signing key should be made into a PCR other than PCR 0. If an attacker modified the policy, the PCR value would change. If an attacker modified the firmware without modifying the policy, the PCR value would also change. People who are at high risk would run an app that would blow the Boot Guard policy into fuses rather than just relying on the copy in flash, and enable verification as well as measurement. Now if an attacker tampers with the firmware, the system simply refuses to boot and the attacker doesn't get anything.

Things are harder on the AMD side. I can't find any indication that PSB supports measuring the firmware at all, which obviously makes this approach impossible. I'm somewhat surprised by that, and so wouldn't be surprised if it does do a measurement somewhere. If it doesn't, there's a rather more significant problem - if a system has a socketed CPU, and someone has sufficient physical access to replace the firmware, they can just swap out the CPU as well with one that doesn't have PSB enabled. Under normal circumstances the system firmware can detect this and prompt the user, but given that the attacker has just replaced the firmware we can assume that they'd do so with firmware that doesn't decide to tell the user what just happened. In the absence of better documentation, it's extremely hard to say that PSB actually provides meaningful security benefits.

So, overall: I think Boot Guard protects against a real-world attack that matters to a small but important set of targets. I think most of its benefits could be provided in a way that still gave users control over their system firmware, while also permitting high-risk targets to opt-in to stronger guarantees. Based on what's publicly documented about PSB, it's hard to say that it provides real-world security benefits for anyone at present. In both cases, what's actually shipping reduces the control people have over their systems, and should be considered user-hostile.

[1] Assuming that someone's both turning this on and actually looking at the data produced

comment count unavailable comments

Weekly Update 278

By Troy Hunt

Presently sponsored by: Kolide provides endpoint security for teams that value privacy, transparency, and employee productivity. Try Kolide for free today!

I recorded this a week after Charlotte appeared with me, fresh out of isolation with a negative COVID test. However... 9 year old Elle had tested positive on Monday (albeit entirely asymptomatic, so no idea how long she'd been positive) but hey, hopefully she'd be clear


Other high scorers are melt-in-your-hand aluminum-destroying gallium and tritium-powered glowsticks. Lawn darts are toward the other end.

Do you want chips with that?

By [email protected] (RevK)

(for the help of Americans, "chips" mean "french fries" in the context of asking someone if they want "fries with that", but also mean "microchips" in context of electronics, sorry to have to explain that)

For a lot of my little PCB designs I need a voltage regulator, something to provide a clean 3.3V DC power for things like an ESP32, which means over 0.5A peaks for WiFi. In this case I have a nice PCB footprint using an LMR16006 which is 600mA at 3.3V, and has proved very reliable and easy to use.

There are many reasons for picking this, even though a slightly pricey solution. For a start it is a leaded chip so can be hand soldered. To be honest I am doing things using solder paste and a stencil much more now, so far less critical. But it is small - the whole footprint for the regulator is small.

Some time ago I got 100 off of the parts and put in a draw and have used on various boards, but I am running out. It is only a few pounds for the parts. What none of us knew is chips would become somewhat hard to get all of a sudden. Had I had any clue I'd have got several hundred and even kept them on tapes so could be used for production. Hindsight.

So now I am stuck. I have limited supplies and nobody has stock until late 2023 now. So I need to find an alternative. Something small and easy to use. Something available that won't run out! Something offering at least 600mA of 3.3V. Something with a nice wide input voltage range. Something easy to hand solder, or at least easy to solder paste and cook by hand. Also, as some boards are battery based, we want very low idle current, which this manages quite well and automatically.

I saw a LTC7103 suggested by someone - way overkill, but very cool. Also rather pricey. I looked a little while ago, and thought that it was good that you can still get them. Today I thought I would try this out, and get some, and make some boards, only to find Mouser have 7 of them, and a silly price, and no more until August at the soonest.

So I need to find something else. I am not an electronics engineer, honest. I know that whatever I get means new PCB layouts for various boards. I am starting to get a feel of how much hassle this all is right now. Oh! to be back in the "normal" days of next day whatever chips you want from a range of suppliers.

I expect I'll pick another solution some time soon, and make some boards, and maybe even hoard a few hundred of whatever I pick!

Of course the same is happening to the new FB9000 FireBricks, which are also waiting on chips. All fun and games.

Air-con, second attempt

By [email protected] (RevK)

Sadly it has become clear that the system installed is simply not going to work. So we are having it taken out, but keeping the Lossnay for fresh air.

Why on earth Mitsubishi would have a system supplied with dedicated controllers that have a thermistor in them, and a setting to use the controller temperature, but not actually support that, is beyond me. It does not even give an error, it shows a plausible, but wrong, temperature. But apparently they cannot support controlling from the controller, and so the two rooms off each system approach is just not going to work.

So now I have to start again with another air-con company. Maybe we'll get something before the summer.

All good fun. But they have sent interesting pictures of previous installations, which look cool.

So I'll post more when I have it...

Language Development

The worst is the Terrible Twos, when they're always throwing things and shrieking, "forsooth, to bed thou shalt not take me, cur!"

You Can Build a Skyscraper Anywhere in Davis Right Now

By kevin

Right now it's legal to build a skyscraper anywhere in Davis, California (a college town outside of Sacramento). Unlimited height, anywhere in city limits, as long as you promise to dedicate 20% of the apartments to people with lower incomes. Well, it's legal in theory, no one has ever tested it. But you could be […]

Pluton is not (currently) a threat to software freedom

At CES this week, Lenovo announced that their new Z-series laptops would ship with AMD processors that incorporate Microsoft's Pluton security chip. There's a fair degree of cynicism around whether Microsoft have the interests of the industry as a whole at heart or not, so unsurprisingly people have voiced concerns about Pluton allowing for platform lock-in and future devices no longer booting non-Windows operating systems. Based on what we currently know, I think those concerns are understandable but misplaced.

But first it's helpful to know what Pluton actually is, and that's hard because Microsoft haven't actually provided much in the way of technical detail. The best I've found is a discussion of Pluton in the context of Azure Sphere, Microsoft's IoT security platform. This, in association with the block diagrams on page 12 and 13 of this slidedeck, suggest that Pluton is a general purpose security processor in a similar vein to Google's Titan chip. It has a relatively low powered CPU core, an RNG, and various hardware cryptography engines - there's nothing terribly surprising here, and it's pretty much the same set of components that you'd find in a standard Trusted Platform Module of the sort shipped in pretty much every modern x86 PC. But unlike Titan, Pluton seems to have been designed with the explicit goal of being incorporated into other chips, rather than being a standalone component. In the Azure Sphere case, we see it directly incorporated into a Mediatek chip. In the Xbox Series devices, it's incorporated into the SoC. And now, we're seeing it arrive on general purpose AMD CPUs.

Microsoft's announcement says that Pluton can be shipped in three configurations:as the Trusted Platform Module; as a security processor used for non-TPM scenarios like platform resiliency; or OEMs can choose to ship with Pluton turned off. What we're likely to see to begin with is the former - Pluton will run firmware that exposes a Trusted Computing Group compatible TPM interface. This is almost identical to the status quo. Microsoft have required that all Windows certified hardware ship with a TPM for years now, but for cost reasons this is often not in the form of a separate hardware component. Instead, both Intel and AMD provide support for running the TPM stack on a component separate from the main execution cores on the system - for Intel, this TPM code runs on the Management Engine integrated into the chipset, and for AMD on the Platform Security Processor that's integrated into the CPU package itself.

So in this respect, Pluton changes very little; the only difference is that the TPM code is running on hardware dedicated to that purpose, rather than alongside other code. Importantly, in this mode Pluton will not do anything unless the system firmware or OS ask it to. Pluton cannot independently block the execution of any other code - it knows nothing about the code the CPU is executing unless explicitly told about it. What the OS can certainly do is ask Pluton to verify a signature before executing code, but the OS could also just verify that signature itself. Windows can already be configured to reject software that doesn't have a valid signature. If Microsoft wanted to enforce that they could just change the default today, there's no need to wait until everyone has hardware with Pluton built-in.

The two things that seem to cause people concerns are remote attestation and the fact that Microsoft will be able to ship firmware updates to Pluton via Windows Update. I've written about remote attestation before, so won't go into too many details here, but the short summary is that it's a mechanism that allows your system to prove to a remote site that it booted a specific set of code. What's important to note here is that the TPM (Pluton, in the scenario we're talking about) can't do this on its own - remote attestation can only be triggered with the aid of the operating system. Microsoft's Device Health Attestation is an example of remote attestation in action, and the technology definitely allows remote sites to refuse to grant you access unless you booted a specific set of software. But there are two important things to note here: first, remote attestation cannot prevent you from booting whatever software you want, and second, as evidenced by Microsoft already having a remote attestation product, you don't need Pluton to do this! Remote attestation has been possible since TPMs started shipping over two decades ago.

The other concern is Microsoft having control over the firmware updates. The context here is that TPMs are not magically free of bugs, and sometimes these can have security consequences. One example is Infineon TPMs producing weak RSA keys, a vulnerability that could be rectified by a firmware update to the TPM. Unfortunately these updates had to be issued by the device manufacturer rather than Infineon being able to do so directly. This meant users had to wait for their vendor to get around to shipping an update, something that might not happen at all if the machine was sufficiently old. From a security perspective, being able to ship firmware updates for the TPM without them having to go through the device manufacturer is a huge win.

Microsoft's obviously in a position to ship a firmware update that modifies the TPM's behaviour - there would be no technical barrier to them shipping code that resulted in the TPM just handing out your disk encryption secret on demand. But Microsoft already control the operating system, so they already have your disk encryption secret. There's no need for them to backdoor the TPM to give them something that the TPM's happy to give them anyway. If you don't trust Microsoft then you probably shouldn't be running Windows, and if you're not running Windows Microsoft can't update the firmware on your TPM.

So, as of now, Pluton running firmware that makes it look like a TPM just isn't a terribly interesting change to where we are already. It can't block you running software (either apps or operating systems). It doesn't enable any new privacy concerns. There's no mechanism for Microsoft to forcibly push updates to it if you're not running Windows.

Could this change in future? Potentially. Microsoft mention another use-case for Pluton "as a security processor used for non-TPM scenarios like platform resiliency", but don't go into any more detail. At this point, we don't know the full set of capabilities that Pluton has. Can it DMA? Could it play a role in firmware authentication? There are scenarios where, in theory, a component such as Pluton could be used in ways that would make it more difficult to run arbitrary code. It would be reassuring to hear more about what the non-TPM scenarios are expected to look like and what capabilities Pluton actually has.

But let's not lose sight of something more fundamental here. If Microsoft wanted to block free operating systems from new hardware, they could simply mandate that vendors remove the ability to disable secure boot or modify the key databases. If Microsoft wanted to prevent users from being able to run arbitrary applications, they could just ship an update to Windows that enforced signing requirements. If they want to be hostile to free software, they don't need Pluton to do it.

(Edit: it's been pointed out that I kind of gloss over the fact that remote attestation is a potential threat to free software, as it theoretically allows sites to block access based on which OS you're running. There's various reasons I don't think this is realistic - one is that there's just way too much variability in measurements for it to be practical to write a policy that's strict enough to offer useful guarantees without also blocking a number of legitimate users, and the other is that you can just pass the request through to a machine that is running the appropriate software and have it attest for you. The fact that nobody has actually bothered to use remote attestation for this purpose even though most consumer systems already ship with TPMs suggests that people generally agree with me on that)

comment count unavailable comments

No Amount of Alcohol Is Good for the Heart, Says World Heart Federation

Comments accounts had unauthorized withdrawals


Our Take on NFTs


Pine64 should re-evaluate their community priorities


Profound CTO Learnings of 2021


Patents are out of control, and they’re hurting innovation (2017)


RTM-Z80: Retro Tiny Multitasking System for Z80 Based Computers


Topic-Oriented Authoring (2010)


A note for LWN subscribers


Show HN: Game Changing Typed GraphQL


Centers of Population


Bad Emacs Advice


Motorola 68k Application Binary Interface (ABI)


How to grow monosodium glutamate (MSG) crystals


Streak (YC W22) is hiring front end engineering roles


Working overtime? Those extra hours might not be hurting your wellbeing after all – just don't tell Jeff Bezos or Jack Ma

By Paul Kunert

If you love your job, going the extra mile might not be stressful or cause depression

Working too hard? Is that overtime making you feel like you're caught in the vice-like jaws of burnout? Well, keep on carrying on because far from negatively impacting your well-being, it might actually be good for you if you love your job.…

Boris Johnson: I've seen no evidence of plotters being blackmailed

The PM rejects the claims of a Tory MP, who says rebels face intimidation from ministers.

UK refuses permission for £1.2bn cross-Channel cable

Aquind Ltd is denied permission for a £1.2bn electricity link between Portsmouth and Normandy.

Privacy is for paedophiles, UK government seems to be saying while spending £500k demonising online chat encryption

By Gareth Corfield

So far we've got a pisspoor video and... er, that's it

Opinion  The British government's PR campaign to destroy popular support for end-to-end encryption on messaging platforms has kicked off, under the handle "No Place To Hide", and it's as broad as any previous attack on the safety-guaranteeing technology.…

Bankers told to come back to desks as restrictions end

Standard Chartered and HSBC ask staff to come back as business groups welcome end of home working.

Dozens of blocks still have Grenfell-type cladding

The flammable panels have been blamed for the rapid spread of the 2017 fire, which led to 72 deaths.

After Life 3: How TikTok took a Ricky Gervais fan to Netflix

Cole Anderson-James was cast by his comedy hero after impersonating him on social media.

'Now' would be the right time to patch Ubuntu container hosts and ditch 21.04 thanks to heap buffer overflow bug

By Liam Proven

Red Hat agrees

The CVE-2022-0185 vulnerability in Ubuntu is severe enough that Red Hat is also advising immediate patching.…

Cancer: Mum diagnosed months after daughter

Alison refuses treatment so she can support her daughter, who has leukaemia.

Australian Open 2022: Emma Raducanu beaten in three sets by Danka Kovinic

Emma Raducanu says she was warned by her team not to play in the Australian Open second round because of a blister that hampered her in the defeat by Danka Kovinic.

Subdued Murray 'frustrated' and 'disappointed' by Australian Open defeat

Britain's former world number one Andy Murray produces a subdued display as he loses to Japan's Taro Daniel in the Australian Open second round.

Former Pope Benedict failed to act over abuse, new report finds

Benedict XVI is incriminated in a report into child sex abuse in Munich in the 70s and 80s.

Dog rescue: Reggie saved after falling down 10ft crevice

Reggie "came out a new dog" after the 34-hour mountain rescue.

Criminal prosecution delays hit record 708 days

Figures show the average time to deal with a crime rose by 15%, adding to a massive backlog.

Teenage pilot Zara Rutherford completes solo round-world record

Zara Rutherford endured extreme conditions during a trip that took two months longer than planned.

This sub is on Fox News this morning

By /u/Adventurous_Doubt257

They’re saying people here don’t have work ethic. Fox fails to mention people are sick and fucking tired of corporations that exploit workers. No pensions, no hope for retirement, no living wage that pays for your own shelter so you have a decent place to sleep and shower after a 12 hour shift.

They should just be glad workers aren’t destroying the C-suites and fucking up the greedy elites.

Tired of the fucking abuse and toxic working environments!

submitted by /u/Adventurous_Doubt257 to r/antiwork
[link] [comments]

TIFU by thinking red and white color is normal for sperm

By /u/keeev1n

Before any judgement consider that I came from a family where even pronouncing the word "condom" is undisputed. So the sex education and everything that comes to private parts are a big no no in our house, for some reason.

So, the thing happen 2 hours ago in the kitchen. I was with my sister (19F) and, because of the strict household, we often make jokes stealthily. We don't see any problem with this, thanks for reddit and internet in general. My mom used to cook very often cakes and the most common thing in our refrigerator is the white part of the egg, the uncook white part of the egg.

So I was eating a sandwitch and my sister went to the fridge to grab a soda and grab the cup where the white thing is and says: "I always think this cup would be full of cum" and started laughing.
And here comes the FU, I (21M) didn't think for some reason and said "No, it doesn't look like cum, it doesn't have red in color or sometimes yellow" and she stared dead at me and more like a whisper said "Whaaat? Dude, go see a doctor, you are not ok".

And since then, I started searching the internet for answers, because I am too afraid to ask my dad, or even my mom. And I've never been through this before... Any advice? Can I book alone an appointment to see a doctor by myself? Because I don't want to imply my parents into this...

TL;DR : I was eating a sandwitch and my sister told me that red and white color for sperm is not normal and now I need some help.

submitted by /u/keeev1n to r/tifu
[link] [comments]

London, £1,800 pcm exc bills. Well ventilated. 10 minute walk from train station. No pets.

By /u/Appropriate_Ad7085

London, £1,800 pcm exc bills. Well ventilated. 10 minute walk from train station. No pets. submitted by /u/Appropriate_Ad7085 to r/london
[link] [comments]

What do you put on the leaving cars of someone who is dying?

By /u/ButtonMashingPickle

My colleague has cancer, all treatment options have been exhausted so just palliative care now. She has resigned from work and we are doing a collection and card. I have no idea what to write on her card. Everything I would normally put seems wrong - good luck, sorry you are leaving, so happy for your new adventure, keep in touch, etc. They all seem crass or hold a darker sentiment. I really like this lady and want to write something lovely bit feel totally stuck.

submitted by /u/ButtonMashingPickle to r/AskUK
[link] [comments]

French lawmakers officially recognise China’s treatment of Uyghurs as ‘genocide’

By /u/Tiennus_Khan

submitted by /u/Tiennus_Khan to r/worldnews
[link] [comments]

I am the "Whisk Guy" from Come Dine With Me. AMA!

By /u/TheWhiskGuy

Hi all!

My name is Kev. I'm the kitchen utensil enthusiast from Channel 4's Come Dine With Me.

I heard you all enjoyed seeing me on TV and, judging from some of the comments I read in u/Cyrinic's post last week, you all seemed to have some burning questions, so I'm here to answer them!

Here I am! So, what do you want to ask me?

I can't promise I'll be here all day but I will try and answer as many questions as I can!

Obligagtory verification picture?

Edit: 2:13pm - I'm still trying to answer all your questions! I do have a day job but the AMA isn't over yet! And thank you to everyone who's popped up so far!

submitted by /u/TheWhiskGuy to r/CasualUK
[link] [comments]

What made you realise your girlfriend isn’t the one for you?

By /u/lukegum69

submitted by /u/lukegum69 to r/AskMen
[link] [comments]

Hong Kong protesters completely dismantle a road barricade in 22 seconds so as to let the fire truck to access

By /u/regian24

Hong Kong protesters completely dismantle a road barricade in 22 seconds so as to let the fire truck to access submitted by /u/regian24 to r/BeAmazed
[link] [comments]

My Medical Bill after an Aneurysm Burst in my cerebellum and I was in Hospital for 10 month.

By /u/_LOGA_

My Medical Bill after an Aneurysm Burst in my cerebellum and I was in Hospital for 10 month. submitted by /u/_LOGA_ to r/pics
[link] [comments]

As a non Brit, Is this the fabled British Humor?

By /u/KaamDeveloper

As a non Brit, Is this the fabled British Humor? submitted by /u/KaamDeveloper to r/CasualUK
[link] [comments]

Just a humble thank you for the weapons for Ukraine.

By /u/Neborodat

A Ukrainian here, recently Germany has blocked the delivery of 10 anti-drone jamming guns from Lithuania to Ukraine which were already paid for by Kyiv, while a few days ago the UK sent a little over 1000 units of NLAW, Anti-tank Weapon for free.

Want to say a big thank you for your support! We greatly appreciate this move!

submitted by /u/Neborodat to r/unitedkingdom
[link] [comments]

Don't leave your ice cream out in the open

By /u/kohiii-

Don't leave your ice cream out in the open submitted by /u/kohiii- to r/Unexpected
[link] [comments]

daughter plays with her father while he prays

By /u/aboidaz

daughter plays with her father while he prays submitted by /u/aboidaz to r/MadeMeSmile
[link] [comments]

I just can't keep up with the opinion of some people 🤦‍♂️

By /u/ForeignerLove

I just can't keep up with the opinion of some people 🤦‍♂️ submitted by /u/ForeignerLove to r/facepalm
[link] [comments]

Walking home last night I managed to get a picture of the Shambles in York without any tourists in it.

By /u/TechnicallyRon_

Walking home last night I managed to get a picture of the Shambles in York without any tourists in it. submitted by /u/TechnicallyRon_ to r/CasualUK
[link] [comments]

How to Add a Favicon to Your Django Site

How to Add a Favicon to Your Django Site

Adam Johnson did the research on the best way to handle favicons - Safari still doesn't handle SVG icons so the best solution today is a PNG served from the /favicon.ico path. This article inspired me to finally add a proper favicon to Datasette.

Via @adamchainz

Tricking Postgres into using an insane – but 200x faster – query plan

Tricking Postgres into using an insane – but 200x faster – query plan

Jacob Martin talks through a PostgreSQL query optimization they implemented at Spacelift, showing in detail how to interpret the results of EXPLAIN (FORMAT JSON, ANALYZE) using the visualization tool.

Weeknotes: s3-credentials prefix and Datasette 0.60

A new release of s3-credentials with support for restricting access to keys that start with a prefix, Datasette 0.60 and a write-up of my process for shipping a feature.

s3-credentials --prefix

s3-credentials is my tool for creating limited scope AWS credentials that can only read and write from a specific S3 bucket. I introduced it in this blog entry in November, and I've continued to iterate on it since then.

I released s3-credentials 0.9 today with a feature I've been planning since I first built the tool: the ability to specify a --prefix and get credentials that are only allowed to operate on keys within a specific folder within the S3 bucket.

This is particularly useful if you are building multi-tenant SaaS applications on top of AWS. You might decide to create a bucket per customer... but S3 limits you to 100 buckets for your by default, with a maximum of 1,000 buckets if you request an increase.

So a bucket per customer won't scale above 1,000 customers.

The sts.assume_role() API lets you retrieve temporary credentials for S3 that can have limits attached to them - including a limit to access keys within a specific bucket and under a specific prefix. That means you can create limited duration credentials that can only read and write from a specific prefix within a bucket.

Which solves the problem! Each of your customers can have a dedicated prefix within the bucket, and your application can issue restricted tokens that greatly reduce the risk of one customer accidentally seeing files that belong to another.

Here's how to use it:

s3-credentials create name-of-bucket --prefix user1410/

This will return a JSON set of credentials - an access key and secret key - that can only be used to read and write keys in that bucket that start with user1410/.

Add --read-only to make those credentials read-only, and --write-only for credentials that can be used to write but not read records.

If you add --duration 15m the returned credentials will only be valid for 15 minutes, using sts.assume_role(). The README includes a detailed description of the changes that will be made to your AWS account by the tool.

You can also add --dry-run to see a text summary of changes without applying them to your account. Here's an example:

% s3-credentials create name-of-bucket --prefix user1410/ --read-only --dry-run --duration 15m
Would create bucket: 'name-of-bucket'
Would ensure role: 's3-credentials.AmazonS3FullAccess'
Would assume role using following policy for 900 seconds:
  "Version": "2012-10-17",
  "Statement": [
      "Effect": "Allow",
      "Action": [
      "Resource": [
      "Effect": "Allow",
      "Action": [
      "Resource": [
      "Condition": {
        "StringLike": {
          "s3:prefix": [
      "Effect": "Allow",
      "Action": [
      "Resource": [

As with all things AWS, the magic is in the details of the JSON policy document. The README includes details of exactly what those policies look like. Getting them right was by far the hardest part of building this tool!

s3-credentials integration tests

When writing automated tests, I generally avoid calling any external APIs or making any outbound network traffic. I want the tests to run in an isolated environment, with no risk that some other system that's having a bad day could cause random test failures.

Since the hardest part of building this tool is having confidence that it does the right thing, I decided to also include a suite of integration tests that actively exercise Amazon S3.

By default, running pytest will skip these:

% pytest
================ test session starts ================
platform darwin -- Python 3.10.0, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: /Users/simon/Dropbox/Development/s3-credentials
plugins: recording-0.12.0, mock-3.6.1
collected 61 items                                  

tests/ ....                    [  6%]
tests/ ssssssss            [ 19%]
tests/ ................ [ 45%]
.................................             [100%]

=========== 53 passed, 8 skipped in 1.21s ===========

Running pytest --integration runs the test suite with those tests enabled. It expects the computer they are running on to have AWS credentials with the ability to create buckets and users - I'm too nervous to add these secrets to GitHub Actions, so I currently only run the integration suite on my own laptop.

These were invaluable for getting confident that the new --prefix option behaved as expected, especially when combined with --read-only and --write-only. Here's the test_prefix_read_only() test which exercises the --prefix --read-only combination.

s3-credentials list-bucket

One more new feature: the s3-credentials list-bucket name-of-bucket command lists all of the keys in a specific bucket.

By default it returns a JSON array, but you can add --nl to get back newline delimited JSON or --csv or --tsv to get back CSV or TSV.

So... a fun thing you can do with the command is pipe the output into sqlite-utils insert to create a SQLite database file of your bucket contents... and then use Datasette to browse it!

% s3-credentials list-bucket --nl \
  | sqlite-utils insert s3.db keys - --nl
% datasette s3.db -o

This will create a s3.db SQLite database with a keys table containing your bucket contents, then open Datasette to let you interact with the table.

A screenshot of the keys table running in Datasette

Datasette 0.60

I shipped several months of work on Datasette a few days ago as Datasette 0.60. I published annotated release notes for that release which describe the background of those changes in detail.

I also released new versions of datasette-pretty-traces and datasette-leaflet-freedraw to take advantage of new features added to Datasette.

How I build a feature

My other big project this week was a blog post: How I build a feature, which goes into detail about the process I use for adding new features to my various projects. I've had some great feedback about this, so I'm tempted to write more about general software engineering process stuff here in the future.

Releases this week

TIL this week

SQLime: SQLite Playground

SQLime: SQLite Playground

Anton Zhiyanov built this useful mobile-friendly online playground for trying things out it SQLite. It uses the sql.js library which compiles SQLite to WebAssembly, so it runs everything in the browser - but it also supports saving your work to Gists via the GitHub API. The JavaScript source code is fun to read: the site doesn't use npm or Webpack or similar, opting instead to implement everything library-free using modern JavaScript modules and Web Components.

Via Anton Zhiyanov

Abusing AWS Lambda to make an Aussie Search Engine

Abusing AWS Lambda to make an Aussie Search Engine

Ben Boyter built a search engine that only indexes .au Australian websites, with the novel approach of directly compiling the search index into 250 different ~40MB large lambda functions written in Go, then running searches across 12 million pages by farming them out to all of the lambdas and combining the results. His write-up includes all sorts of details about how he built this, including how he ran the indexer and how he solved the surprisingly hard problem of returning good-enough text snippets for the results.

Via David Humphrey

Favourite films of 2021

In my four most recent posts, I went over the memoirs and biographies, the non-fiction, the fiction and the 'classic' novels that I enjoyed reading the most in 2021. But in the very last of my 2021 roundup posts, I'll be going over some of my favourite movies. (Saying that, these are perhaps less of my 'favourite films' than the ones worth remarking on — after all, nobody needs to hear that The Godfather is a good movie.)

It's probably helpful to remark you that I took a self-directed course in film history in 2021, based around the first volume of Roger Ebert's The Great Movies. This collection of 100-odd movie essays aims to “make a tour of the landmarks of the first century of cinema,” and I watched all but a handul before the year was out. I am slowly making my way through volume two in 2022. This tome was tremendously useful, and not simply due to the background context that Ebert added to each film: it also brought me into contact with films I would have hardly come through some other means. Would I have ever discovered the sly comedy of Trouble in Paradise (1932) or the touching proto-realism of L'Atalante (1934) any other way? It also helped me to 'get around' to watching films I may have put off watching forever — the influential Battleship Potemkin (1925), for instance, and the ur-epic Lawrence of Arabia (1962) spring to mind here.

Choosing a 'worst' film is perhaps more difficult than choosing the best. There are first those that left me completely dry (Ready or Not, Written on the Wind, etc.), and those that were simply poorly executed. And there are those that failed to meet their own high opinions of themselves, such as the 'made for Reddit' Tenet (2020) or the inscrutable Vanilla Sky (2001) — the latter being an almost perfect example of late-20th century cultural exhaustion.

But I must save my most severe judgement for those films where I took a visceral dislike how their subjects were portrayed. The sexually problematic Sixteen Candles (1984) and the pseudo-Catholic vigilantism of The Boondock Saints (1999) both spring to mind here, the latter of which combines so many things I dislike into such a short running time I'd need an entire essay to adequately express how much I disliked it.


Dogtooth (2009)

A father, a mother, a brother and two sisters live in a large and affluent house behind a very high wall and an always-locked gate. Only the father ever leaves the property, driving to the factory that he happens to own. Dogtooth goes far beyond any allusion to Josef Fritzl's cellar, though, as the children's education is a grotesque parody of home-schooling. Here, the parents deliberately teach their children the wrong meaning of words (e.g. a yellow flower is called a 'zombie'), all of which renders the outside world utterly meaningless and unreadable, and completely mystifying its very existence. It is this creepy strangeness within a 'regular' family unit in Dogtooth that is both socially and epistemically horrific, and I'll say nothing here of its sexual elements as well.

Despite its cold, inscrutable and deadpan surreality, Dogtooth invites all manner of potential interpretations. Is this film about the artificiality of the nuclear family that the West insists is the benchmark of normality? Or is it, as I prefer to believe, something more visceral altogether: an allegory for the various forms of ontological violence wrought by fascism, as well a sobering nod towards some of fascism's inherent appeals? (Perhaps it is both. In 1972, French poststructuralists Gilles and Félix Guattari wrote Anti-Oedipus, which plays with the idea of the family unit as a metaphor for the authoritarian state.) The Greek-language Dogtooth, elegantly shot, thankfully provides no easy answers.


Holy Motors (2012)

There is an infamous scene in Un Chien Andalou, the 1929 film collaboration between Luis Buñuel and famed artist Salvador Dalí. A young woman is cornered in her own apartment by a threatening man, and she reaches for a tennis racquet in self-defence. But the man suddenly picks up two nearby ropes and drags into the frame two large grand pianos... each leaden with a dead donkey, a stone tablet, a pumpkin and a bewildered priest.

This bizarre sketch serves as a better introduction to Leos Carax's Holy Motors than any elementary outline of its plot, which ostensibly follows 24 hours in the life of a man who must play a number of extremely diverse roles around Paris... all for no apparent reason. (And is he even a man?) Surrealism as an art movement gets a pretty bad wrap these days, and perhaps justifiably so. But Holy Motors and Un Chien Andalou serve as a good reminder that surrealism can be, well, 'good, actually'. And if not quite high art, Holy Motors at least demonstrates that surrealism can still unnerving and hilariously funny. Indeed, recalling the whimsy of the plot to a close friend, the tears of laughter came unbidden to my eyes once again. ("And then the limousines...!")

Still, it is unclear how Holy Motors truly refreshes surrealism for the twenty-first century. Surrealism was, in part, a reaction to the mechanical and unfeeling brutality of World War I and ultimately sought to release the creative potential of the unconscious mind. Holy Motors cannot be responding to another continental conflagration, and so it appears to me to be some kind of commentary on the roles we exhibit in an era of 'post-postmodernity': a sketch on our age of performative authenticity, perhaps, or an idle doodle on the function and psychosocial function of work.

Or perhaps not. After all, this film was produced in a time that offers the near-universal availability of mind-altering substances, and this certainly changes the context in which this film was both created. And, how can I put it, was intended to be watched.


Manchester by the Sea (2016)

An absolutely devastating portrayal of a character who is unable to forgive himself and is hesitant to engage with anyone ever again. It features a near-ideal balance between portraying unrecoverable anguish and tender warmth, and is paradoxically grandiose in its subtle intimacy. The mechanics of life led me to watch this lying on a bed in a chain hotel by Heathrow Airport, and if this colourless circumstance blunted the film's emotional impact on me, I am probably thankful for it. Indeed, I find myself reduced in this review to fatuously recalling my favourite interactions instead of providing any real commentary. You could write a whole essay about one particular incident: its surfaces, subtexts and angles... all despite nothing of any substance ever being communicated. Truly stunning.


McCabe & Mrs. Miller (1971)

Roger Ebert called this movie “one of the saddest films I have ever seen, filled with a yearning for love and home that will not ever come.” But whilst it is difficult to disagree with his sentiment, Ebert's choice of “sad” is somehow not quite the right word. Indeed, I've long regretted that our dictionaries don't have more nuanced blends of tragedy and sadness; perhaps the Ancient Greeks can loan us some.

Nevertheless, the plot of this film is of a gambler and a prostitute who become business partners in a new and remote mining town called Presbyterian Church. However, as their town and enterprise booms, it comes to the attention of a large mining corporation who want to bully or buy their way into the action. What makes this film stand out is not the plot itself, however, but its mood and tone — the town and its inhabitants seem to be thrown together out of raw lumber, covered alternatively in mud or frozen ice, and their days (and their personalities) are both short and dark in equal measure.

As a brief aside, if you haven't seen a Roger Altman film before, this has all the trappings of being a good introduction. As Ebert went on to observe: “This is not the kind of movie where the characters are introduced. They are all already here.” Furthermore, we can see some of Altman's trademark conversations that overlap, a superb handling of ensemble casts, and a quietly subversive view of the tyranny of 'genre'... and the latter in a time when the appetite for revisionist portrays of the West was not very strong. All of these 'Altmanian' trademarks can be ordered in much stronger measures in his later films: in particular, his comedy-drama Nashville (1975) has 24 main characters, and my jejune interpretation of Gosford Park (2001) is that it is purposefully designed to poke fun those who take a reductionist view of 'genre', or at least on the audience's expectations. (In this case, an Edwardian-era English murder mystery in the style of Agatha Christie, but where no real murder or detection really takes place.)

On the other hand, McCabe & Mrs. Miller is actually a poor introduction to Altman. The story is told in a suitable deliberate and slow tempo, and the two stars of the film are shown thoroughly defrocked of any 'star status', in both the visual and moral dimensions. All of these traits are, however, this film's strength, adding up to a credible, fascinating and riveting portrayal of the old West.


Detour (1945)

Detour was filmed in less than a week, and it's difficult to decide — out of the actors and the screenplay — which is its weakest point.... Yet it still somehow seemed to drag me in.

The plot revolves around luckless Al who is hitchhiking to California. Al gets a lift from a man called Haskell who quickly falls down dead from a heart attack. Al quickly buries the body and takes Haskell's money, car and identification, believing that the police will believe Al murdered him. An unstable element is soon introduced in the guise of Vera, who, through a set of coincidences that stretches credulity, knows that this 'new' Haskell (ie. Al pretending to be him) is not who he seems. Vera then attaches herself to Al in order to blackmail him, and the world starts to spin out of his control.

It must be understood that none of this is executed very well. Rather, what makes Detour so interesting to watch is that its 'errors' lend a distinctively creepy and unnatural hue to the film. Indeed, in the early twentieth century, Sigmund Freud used the word unheimlich to describe the experience of something that is not simply mysterious, but something creepy in a strangely familiar way. This is almost the perfect description of watching Detour — its eerie nature means that we are not only frequently second-guessed about where the film is going, but are often uncertain whether we are watching the usual objective perspective offered by cinema.

In particular, are all the ham-fisted segues, stilted dialogue and inscrutable character motivations actually a product of Al inventing a story for the viewer? Did he murder Haskell after all, despite the film 'showing' us that Haskell died of natural causes? In other words, are we watching what Al wants us to believe? Regardless of the answers to these questions, the film succeeds precisely because of its accidental or inadvertent choices, so it is an implicit reminder that seeking the director's original intention in any piece of art is a complete mirage. Detour is certainly not a good film, but it just might be a great one. (It is a short film too, and, out of copyright, it is available online for free.)


Safe (1995)

Safe is a subtly disturbing film about an upper-middle-class housewife who begins to complain about vague symptoms of illness. Initially claiming that she “doesn't feel right,” Carol starts to have unexplained headaches, a dry cough and nosebleeds, and eventually begins to have trouble breathing. Carol's family doctor treats her concerns with little care, and suggests to her husband that she sees a psychiatrist.

Yet Carol's episodes soon escalate. For example, as a 'homemaker' and with nothing else to occupy her, Carol's orders a new couch for a party. But when the store delivers the wrong one (although it is not altogether clear that they did), Carol has a near breakdown. Unsure where to turn, an 'allergist' tells Carol she has "Environmental Illness," and so Carol eventually checks herself into a new-age commune filled with alternative therapies.

On the surface, Safe is thus a film about the increasing about of pesticides and chemicals in our lives, something that was clearly felt far more viscerally in the 1990s. But it is also a film about how lack of genuine healthcare for women must be seen as a critical factor in the rise of crank medicine. (Indeed, it made for something of an uncomfortable watch during the coronavirus lockdown.) More interestingly, however, Safe gently-yet-critically examines the psychosocial causes that may be aggravating Carol's illnesses, including her vacant marriage, her hollow friends and the 'empty calorie' stimulus of suburbia. None of this should be especially new to anyone: the gendered Victorian term 'hysterical' is often all but spoken throughout this film, and perhaps from the very invention of modern medicine, women's symptoms have often regularly minimised or outright dismissed. (Hilary Mantel's 2003 memoir, Giving Up the Ghost is especially harrowing on this.)

As I opened this review, the film is subtle in its messaging. Just to take one example from many, the sound of the cars is always just a fraction too loud: there's a scene where a group is eating dinner with a road in the background, and the total effect can be seen as representing the toxic fumes of modernity invading our social lives and health. I won't spoiler the conclusion of this quietly devasting film, but don't expect a happy ending.


The Driver (1978)

Critics grossly misunderstood The Driver when it was first released. They interpreted the cold and unemotional affect of the characters with the lack of developmental depth, instead of representing their dissociation from the society around them. This reading was encouraged by the fact that the principal actors aren't given real names and are instead known simply by their archetypes instead: 'The Driver', 'The Detective', 'The Player' and so on. This sort of quasi-Jungian erudition is common in many crime films today (Reservoir Dogs, Kill Bill, Layer Cake, Fight Club), so the critics' misconceptions were entirely reasonable in 1978.

The plot of The Driver involves the eponymous Driver, a noted getaway driver for robberies in Los Angeles. His exceptional talent has far prevented him from being captured thus far, so the Detective attempts to catch the Driver by pardoning another gang if they help convict the Driver via a set-up robbery. To give himself an edge, however, The Driver seeks help from the femme fatale 'Player' in order to mislead the Detective.

If this all sounds eerily familiar, you would not be far wrong. The film was essentially remade by Nicolas Winding Refn as Drive (2011) and in Edgar Wright's 2017 Baby Driver. Yet The Driver offers something that these neon-noir variants do not. In particular, the car chases around Los Angeles are some of the most captivating I've seen: they aren't thrilling in the sense of tyre squeals, explosions and flying boxes, but rather the vehicles come across like wild animals hunting one another. This feels especially so when the police are hunting The Driver, which feels less like a low-stakes game of cat and mouse than a pack of feral animals working together — a gang who will tear apart their prey if they find him. In contrast to the undercar neon glow of the Fast & Furious franchise, the urban realism backdrop of the The Driver's LA metropolis contributes to a sincere feeling of artistic fidelity as well.

To be sure, most of this is present in the truly-excellent Drive, where the chase scenes do really communicate a credible sense of stakes. But the substitution of The Driver's grit with Drive's soft neon tilts it slightly towards that common affliction of crime movies: style over substance. Nevertheless, I can highly recommend watching The Driver and Drive together, as it can tell you a lot about the disconnected socioeconomic practices of the 1980s compared to the 2010s. More than that, however, the pseudo-1980s synthwave soundtrack of Drive captures something crucial to analysing the world of today. In particular, these 'sounds from the past filtered through the present' bring to mind the increasing role of nostalgia for lost futures in the culture of today, where temporality and pop culture references are almost-exclusively citational and commemorational.


The Souvenir (2019)

The ostensible outline of this quietly understated film follows a shy but ambitious film student who falls into an emotionally fraught relationship with a charismatic but untrustworthy older man. But that doesn't quite cover the plot at all, for not only is The Souvenir a film about a young artist who is inspired, derailed and ultimately strengthened by a toxic relationship, it is also partly a coming-of-age drama, a subtle portrait of class and, finally, a film about the making of a film.

Still, one of the geniuses of this truly heartbreaking movie is that none of these many elements crowds out the other. It never, ever feels rushed. Indeed, there are many scenes where the camera simply 'sits there' and quietly observes what is going on. Other films might smother themselves through references to 18th-century oil paintings, but The Souvenir somehow evades this too. And there's a certain ring of credibility to the story as well, no doubt in part due to the fact it is based on director Joanna Hogg's own experiences at film school. A beautifully observed and multi-layered film; I'll be happy if the sequel is one-half as good.


The Wrestler (2008)

Randy 'The Ram' Robinson is long past his prime, but he is still rarin' to go in the local pro-wrestling circuit. Yet after a brutal beating that seriously threatens his health, Randy hangs up his tights and pursues a serious relationship... and even tries to reconnect with his estranged daughter. But Randy can't resist the lure of the ring, and readies himself for a comeback.

The stage is thus set for Darren Aronofsky's The Wrestler, which is essentially about what drives Randy back to the ring. To be sure, Randy derives much of his money from wrestling as well as his 'fitness', self-image, self-esteem and self-worth. Oh, it's no use insisting that wrestling is fake, for the sport is, needless to say, Randy's identity; it's not for nothing that this film is called The Wrestler.

In a number of ways, The Sound of Metal (2019) is both a reaction to (and a quiet remake of) The Wrestler, if only because both movies utilise 'cool' professions to explore such questions of identity. But perhaps simply when The Wrestler was produced makes it the superior film. Indeed, the role of time feels very important for the Wrestler. In the first instance, time is clearly taking its toll on Randy's body, but I felt it more strongly in the sense this was very much a pre-2008 film, released on the cliff-edge of the global financial crisis, and the concomitant precarity of the 2010s.

Indeed, it is curious to consider that you couldn't make The Wrestler today, although not because the relationship to work has changed in any fundamentalway. (Indeed, isn't it somewhat depressing the realise that, since the start of the pandemic and the 'work from home' trend to one side, we now require even more people to wreck their bodies and mental health to cover their bills?) No, what I mean to say here is that, post-2016, you cannot portray wrestling on-screen without, how can I put it, unwelcome connotations. All of which then reminds me of Minari's notorious red hat...

But I digress. The Wrestler is a grittily stark darkly humorous look into the life of a desperate man and a sorrowful world, all through one tragic profession.


Thief (1981)

Frank is an expert professional safecracker and specialises in high-profile diamond heists. He plans to use his ill-gotten gains to retire from crime and build a life for himself with a wife and kids, so he signs on with a top gangster for one last big score. This, of course, could be the plot to any number of heist movies, but Thief does something different. Similar to The Wrestler and The Driver (see above) and a number of other films that I watched this year, Thief seems to be saying about our relationship to work and family in modernity and postmodernity.

Indeed, the 'heist film', we are told, is an understudied genre, but part of the pleasure of watching these films is said to arise from how they portray our desired relationship to work. In particular, Frank's desire to pull off that last big job feels less about the money it would bring him, but a displacement from (or proxy for) fulfilling some deep-down desire to have a family or indeed any relationship at all. Because in theory, of course, Frank could enter into a fulfilling long-term relationship right away, without stealing millions of dollars in diamonds... but that's kinda the entire point: Frank needing just one more theft is an excuse to not pursue a relationship and put it off indefinitely in favour of 'work'. (And being Federal crimes, it also means Frank cannot put down meaningful roots in a community.) All this is communicated extremely subtly in the justly-lauded lowkey diner scene, by far the best scene in the movie.

The visual aesthetic of Thief is as if you set The Warriors (1979) in a similarly-filthy Chicago, with the Xenophon-inspired plot of The Warriors replaced with an almost deliberate lack of plot development... and the allure of The Warriors' fantastical criminal gangs (with their alluringly well-defined social identities) substituted by a bunch of amoral individuals with no solidarity beyond the immediate moment. A tale of our time, perhaps.

I should warn you that the ending of Thief is famously weak, but this is a gritty, intelligent and strangely credible heist movie before you get there.


Uncut Gems (2019)

The most exhausting film I've seen in years; the cinematic equivalent of four cups of double espresso, I didn't even bother even trying to sleep after downing Uncut Gems late one night. Directed by the two Safdie Brothers, it often felt like I was watching two films that had been made at the same time. (Or do I mean two films at 2X speed?)

No, whatever clumsy metaphor you choose to adopt, the unavoidable effect of this film's finely-tuned chaos is an uncompromising and anxiety-inducing piece of cinema. The plot follows Howard as a man lost to his countless vices — mostly gambling with a significant side hustle in adultery, but you get the distinct impression he would be happy with anything that will give him another high. A true junkie's junkie, you might say. You know right from the beginning it's going to end in some kind of disaster, the only question remaining is precisely how and what.

Portrayed by an (almost unrecognisable) Adam Sandler, there's an uncanny sense of distance in the emotional chasm between 'Sandler-as-junkie' and 'Sandler-as-regular-star-of-goofy-comedies'. Yet instead of being distracting and reducing the film's affect, this possibly-deliberate intertextuality somehow adds to the masterfully-controlled mayhem. My heart races just at the memory. Oof.


Woman in the Dunes (1964)

I ended up watching three films that feature sand this year: Denis Villeneuve's Dune (2021), Lawrence of Arabia (1962) and Woman in the Dunes. But it is this last 1964 film by Hiroshi Teshigahara that will stick in my mind in the years to come. Sure, there is none of the Medician intrigue of Dune or the Super Panavision-70 of Lawrence of Arabia (or its quasi-orientalist score, itself likely stolen from Anton Bruckner's 6th Symphony), but Woman in the Dunes doesn't have to assert its confidence so boldly, and it reveals the enormity of its plot slowly and deliberately instead. Woman in the Dunes never rushes to get to the film's central dilemma, and it uncovers its terror in little hints and insights, all whilst establishing the daily rhythm of life.

Woman in the Dunes has something of the uncanny horror as Dogtooth (see above), as well as its broad range of potential interpretations. Both films permit a wide array of readings, without resorting to being deliberately obscurantist or being just plain random — it is perhaps this reason why I enjoyed them so much. It is true that asking 'So what does the sand mean?' sounds tediously sophomoric shorn of any context, but it somehow applies to this thoughtfully self-contained piece of cinema.


A Quiet Place (2018)

Although A Quiet Place was not actually one of the best films I saw this year, I'm including it here as it is certainly one of the better 'mainstream' Hollywood franchises I came across. Not only is the film very ably constructed and engages on a visceral level, I should point out that it is rare that I can empathise with the peril of conventional horror movies (and perhaps prefer to focus on its cultural and political aesthetics), but I did here.

The conceit of this particular post-apocalyptic world is that a family is forced to live in almost complete silence while hiding from creatures that hunt by sound alone. Still, A Quiet Place engages on an intellectual level too, and this probably works in tandem with the pure 'horrorific' elements and make it stick into your mind. In particular, and to my mind at least, A Quiet Place a deeply American conservative film below the surface: it exalts the family structure and a certain kind of sacrifice for your family. (The music often had a passacaglia-like strain too, forming a tombeau for America.) Moreover, you survive in this dystopia by staying quiet — that is to say, by staying stoic — suggesting that in the wake of any conflict that might beset the world, the best thing to do is to keep quiet. Even communicating with your loved ones can be deadly to both of you, so not emote, acquiesce quietly to your fate, and don't, whatever you do, speak up. (Or join a union.)

I could go on, but The Quiet Place is more than this. It's taut and brief, and despite cinema being an increasingly visual medium, it encourages its audience to develop a new relationship with sound.

Writing a minimal Lua implementation with a virtual machine from scratch in Rust

Writing a minimal Lua implementation with a virtual machine from scratch in Rust

Phil Eaton implements a subset of Lua in a Rust in this detailed tutorial.

Datasette 0.60: The annotated release notes

I released Datasette 0.60 today. It's a big release, incorporating 61 commits and 18 issues. Here are the annotated release notes.

filters_from_request plugin hook

The inspiration for this hook was my ongoing quest to simplify and refactor Datasette's TableView, the most complex page in the project which provides an interface for filtering and paginating through a table of data.

The main job of that page is to convert a query string - with things like ?country_long=China and &capacity_mw__gt=200 in it - into a SQL query.

So I extracted part of that logic out into a new plugin hook. I've already started using it in datasette-leaflet-freedraw to help support filtering a table by drawing on a map, demo here.

I also used the new hook to refactor Datasette itself. The module now registers where_filters(), search_filters() and through_filters() implementations against that hook, to support various core pieces of Datasette functionality.

Tracing, write API improvements and performance

I built a new plugin called datasette-pretty-traces to help with my refactoring. It takes Datasette's existing ?_trace=1 feature, which dumps out a big blob of JSON at the bottom of the page, and turns it into something that's a bit easier to understand.

The plugin quickly started highlighting all sorts of interesting potential improvements!

After I added tracing to write queries it became apparent that Datasette's schema introspection code - which runs once when the server starts, and then re-runs any time it notices a change to a database schema - was painfully inefficient.

It writes information about the schema into an in-memory database, which I hope to use in the future to power features like search of all attached tables.

I ended up adding two new documented internal methods for speeding up those writes: db.execute_write_script() and db.execute_write_many(). These are now available for plugins to use as well.

  • The db.execute_write() internal method now defaults to blocking until the write operation has completed. Previously it defaulted to queuing the write and then continuing to run code while the write was in the queue. (#1579)

Spending time with code that wrote to the database highlighted a design flaw in Datasette's original write method. I realized that every line of code I had written that used it looked like this:

db.execute_write("insert into ...", block=True)

The block=True parameter means "block until the write has completed". Without it, the write goes into a queue and code continues executing whether or not the write has been made.

This was clearly the wrong default. I used GitHub code search to check if changing it would be disruptive - it would not - and made the change. I'm glad I caught this before Datasette 1.0!

I noticed that writes to a database with SpatiaLite were failing with an error, because the SpatiaLite module was not being correctly loaded. This fixes that.


A bunch of different fixes for Datasette's Faceting made it into this release:

  • The number of unique values in a facet is now always displayed. Previously it was only displayed if the user specified ?_facet_size=max. (#1556)
  • Facets of type date or array can now be configured in metadata.json, see Facets in metadata.json. Thanks, David Larlet. (#1552)
  • New ?_nosuggest=1 parameter for table views, which disables facet suggestion. (#1557)
  • Fixed bug where ?_facet_array=tags&_facet=tags would only display one of the two selected facets. (#625)

Other, smaller changes

  • The Datasette() constructor no longer requires the files= argument, and is now documented at Datasette class. (#1563)

A tiny usability improvement, mainly for tests. It means you can write a test that looks like this:

import pytest
from import Datasette

async def test_datasette_homepage():
    ds = Datasette()
    response = await ds.client.get("/")
    assert "<title>Datasette" in response.text

Previously the files= argument was required, so you would have to use Datasette(files=[]).

  • The query string variables exposed by request.args will now include blank strings for arguments such as foo in ?foo=&bar=1 rather than ignoring those parameters entirely. (#1551)

This came out of the refactor - this commit tells the story.

  • Upgraded Pluggy dependency to 1.0. (#1575)

I needed this because Pluggy 1.0 allows multiple implementations of the same hook to be defined within the same file, like this:

def where_filters(request, database, datasette):
    # ...

def search_filters(request, database, table, datasette):
    # ...

I really like Plausible as an analytics product. It does a great job of respecting user privacy while still producing useful numbers. It's cookie-free, which means it doesn't trigger a need for GDPR banners in Europe. I'm increasing using it on all of my projects.

  • New CLI reference page showing the output of --help for each of the datasette sub-commands. This lead to several small improvements to the help copy. (#1594)

I first built this for sqlite-utils and liked it so much I brought it to Datasette as well. It's generated by cog, using this inline script in the reStructuredText.

And the rest

  • Label columns detected for foreign keys are now case-insensitive, so Name or TITLE will be detected in the same way as name or title. (#1544)
  • explain query plan is now allowed with varying amounts of whitespace in the query. (#1588)
  • Fixed bug where writable canned queries could not be used with custom templates. (#1547)
  • Improved fix for a bug where columns with a underscore prefix could result in unnecessary hidden form fields. (#1527)

Announcing Parcel CSS: A new CSS parser, compiler, and minifier written in Rust!

Announcing Parcel CSS: A new CSS parser, compiler, and minifier written in Rust!

An interesting thing about tools like this being written in Rust is that since the Rust-to-WASM pipeline is well trodden at this point, the live demo that this announcement links to runs entirely in the browser.

How I build a feature

I'm maintaining a lot of different projects at the moment. I thought it would be useful to describe the process I use for adding a new feature to one of them, using the new sqlite-utils create-database command as an example.

I like each feature to be represented by what I consider to be the perfect commit - one that bundles together the implementation, the tests, the documentation and a link to an external issue thread.

The sqlite-utils create-database command is very simple: it creates a new, empty SQLite database file. You use it like this:

% sqlite-utils create-database empty.db

Everything starts with an issue

Every piece of work I do has an associated issue. This acts as ongoing work-in-progress notes and lets me record decisions, reference any research, drop in code snippets and sometimes even add screenshots and video - stuff that is really helpful but doesn't necessarily fit in code comments or commit messages.

Even if it's a tiny improvement that's only a few lines of code, I'll still open an issue for it - sometimes just a few minutes before closing it again as complete.

Any commits that I create that relate to an issue reference the issue number in their commit message. GitHub does a great job of automatically linking these together, bidirectionally so I can navigate from the commit to the issue or from the issue to the commit.

Having an issue also gives me something I can link to from my release notes.

In the case of the create-database command, I opened this issue in November when I had the idea for the feature.

I didn't do the work until over a month later - but because I had designed the feature in the issue comments I could get started on the implementation really quickly.

Development environment

Being able to quickly spin up a development environment for a project is crucial. All of my projects have a section in the README or the documentation describing how to do this - here's that section for sqlite-utils.

On my own laptop each project gets a directory, and I use pipenv shell in that directory to activate a directory-specific virtual environment, then pip install -e '.[test]' to install the dependencies and test dependencies.

Automated tests

All of my features are accompanied by automated tests. This gives me the confidence to boldly make changes to the software in the future without fear of breaking any existing features.

This means that writing tests needs to be as quick and easy as possible - the less friction here the better.

The best way to make writing tests easy is to have a great testing framework in place from the very beginning of the project. My cookiecutter templates (python-lib, datasette-plugin and click-app) all configure pytest and add a tests/ folder with a single passing test, to give me something to start adding tests to.

I can't say enough good things about pytest. Before I adopted it, writing tests was a chore. Now it's an activity I genuinely look forward to!

I'm not a religious adherent to writing the tests first - see How to cheat at unit tests with pytest and Black for more thoughts on that - but I'll write the test first if it's pragmatic to do so.

In the case of create-database, writing the test first felt like the right thing to do. Here's the test I started with:

def test_create_database(tmpdir):
    db_path = tmpdir / "test.db"
    assert not db_path.exists()
    result = CliRunner().invoke(
        cli.cli, ["create-database", str(db_path)]
    assert result.exit_code == 0
    assert db_path.exists()

This test uses the tmpdir pytest fixture to provide a temporary directory that will be automatically cleaned up by pytest after the test run finishes.

It checks that the test.db file doesn't exist yet, then uses the Click framework's CliRunner utility to execute the create-database command. Then it checks that the command didn't throw an error and that the file has been created.

The I run the test, and watch it fail - because I haven't built the feature yet!

% pytest -k test_create_database

============ test session starts ============
platform darwin -- Python 3.8.2, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /Users/simon/Dropbox/Development/sqlite-utils
plugins: cov-2.12.1, hypothesis-6.14.5
collected 808 items / 807 deselected / 1 selected                           

tests/ F                                                   [100%]

================= FAILURES ==================
___________ test_create_database ____________

tmpdir = local('/private/var/folders/wr/hn3206rs1yzgq3r49bz8nvnh0000gn/T/pytest-of-simon/pytest-659/test_create_database0')

    def test_create_database(tmpdir):
        db_path = tmpdir / "test.db"
        assert not db_path.exists()
        result = CliRunner().invoke(
            cli.cli, ["create-database", str(db_path)]
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = <Result SystemExit(1)>.exit_code

tests/ AssertionError
========== short test summary info ==========
FAILED tests/ - assert 1 == 0
===== 1 failed, 807 deselected in 0.99s ====

The -k option lets me run any test that match the search string, rather than running the full test suite. I use this all the time.

Other pytest features I often use:

Implementing the feature

Test in place, it's time to implement the command. I added this code to my existing module:

    type=click.Path(file_okay=True, dir_okay=False, allow_dash=False),
def create_database(path):
    "Create a new empty database file."
    db = sqlite_utils.Database(path)

(I happen to know that the quickest way to create an empty SQLite database file is to run VACUUM against it.)

The test now passes!

I iterated on this implementation a little bit more, to add the --enable-wal option I had designed in the issue comments - and updated the test to match. You can see the final implementation in this commit: 1d64cd2e5b402ff957f9be2d9bb490d313c73989.

If I add a new test and it passes the first time, I’m always suspicious of it. I’ll deliberately break the test (change a 1 to a 2 for example) and run it again to make sure it fails, then change it back again.

Code formatting with Black

Black has increased my productivity as a Python developer by a material amount. I used to spend a whole bunch of brain cycles agonizing over how to indent my code, where to break up long function calls and suchlike. Thanks to Black I never think about this at all - I instinctively run black . in the root of my project and accept whatever style decisions it applies for me.


I have a few linters set up to run on every commit. I can run these locally too - how to do that is documented here - but I'm often a bit lazy and leave them to run in CI.

In this case one of my linters failed! I accidentally called the new command function create_table() when it should have been called create_database(). The code worked fine due to how the cli.command(name=...) decorator works but mypy complained about the redefined function name. I fixed that in a separate commit.


My policy these days is that if a feature isn't documented it doesn't exist. Updating existing documentation isn't much work at all if the documentation already exists, and over time these incremental improvements add up to something really comprehensive.

For smaller projects I use a single which gets displayed on both GitHub and PyPI (and the Datasette website too, for example on

My larger projects, such as Datasette and sqlite-utils, use Read the Docs and reStructuredText with Sphinx instead.

I like reStructuredText mainly because it has really good support for internal reference links - something that is missing from Markdown, though it can be enabled using MyST.

sqlite-utils uses Sphinx. I have the sphinx-autobuild extension configured, which means I can run a live reloading server with the documentation like so:

cd docs
make livehtml

Any time I'm working on the documentation I have that server running, so I can hit "save" in VS Code and see a preview in my browser a few seconds later.

For Markdown documentation I use the VS Code preview pane directly.

The moment the documentation is live online, I like to add a link to it in a comment on the issue thread.

Committing the change

I run git diff a LOT while hacking on code, to make sure I haven’t accidentally changed something unrelated. This also helps spot things like rogue print() debug statements I may have added.

Before my final commit, I sometimes even run git diff | grep print to check for those.

My goal with the commit is to bundle the test, documentation and implementation. If those are the only files I've changed I do this:

git commit -a -m "sqlite-utils create-database command, closes #348"

If this completes the work on the issue I use "closes #N", which causes GitHub to close the issue for me. If it's not yet ready to close I use "refs #N" instead.

Sometimes there will be unrelated changes in my working directory. If so, I use git add <files> and then commit just with git commit -m message.

Branches and pull requests

create-database is a good example of a feature that can be implemented in a single commit, with no need to work in a branch.

For larger features, I'll work in a feature branch:

git checkout -b my-feature

I'll make a commit (often just labelled "WIP prototype, refs #N") and then push that to GitHub and open a pull request for it:

git push -u origin my-feature 

I ensure the new pull request links back to the issue in its description, then switch my ongoing commentary to comments on the pull request itself.

I'll sometimes add a task checklist to the opening comment on the pull request, since tasks there get reflected in the GitHub UI anywhere that links to the PR. Then I'll check those off as I complete them.

An example of a PR I used like this is #361: --lines and --text and --convert and --import.

I don't like merge commits - I much prefer to keep my main branch history as linear as possible. I usually merge my PRs through the GitHub web interface using the squash feature, which results in a single, clean commit to main with the combined tests, documentation and implementation. Occasionally I will see value in keeping the individual commits, in which case I will rebase merge them.

Another goal here is to keep the main branch releasable at all times. Incomplete work should stay in a branch. This makes turning around and releasing quick bug fixes a lot less stressful!

Release notes, and a release

A feature isn't truly finished until it's been released to PyPI.

All of my projects are configured the same way: they use GitHub releases to trigger a GitHub Actions workflow which publishes the new release to PyPI. The sqlite-utils workflow for that is here in publish.yml.

My cookiecutter templates for new projects set up this workflow for me. I just need to create a PyPI token for the project and assign it as a repository secret. See the python-lib cookiecutter README for details.

To push out a new release, I need to increment the version number in and write the release notes.

I use semantic versioning - a new feature is a minor version bump, a breaking change is a major version bump (I try very hard to avoid these) and a bug fix or documentation-only update is a patch increment.

Since create-database was a new feature, it went out in release 3.21.

My projects that use Sphinx for documentation have changelog.rst files in their repositories. I add the release notes there, linking to the relevant issues and cross-referencing the new documentation. Then I ship a commit that bundles the release notes with the bumped version number, with a commit message that looks like this:

git commit -m "Release 3.21

Refs #348, #364, #366, #368, #371, #372, #374, #375, #376, #379"

Here's the commit for release 3.21.

Referencing the issue numbers in the release automatically adds a note to their issue threads indicating the release that they went out in.

I generate that list of issue numbers by pasting the release notes into an Observable notebook I built for the purpose: Extract issue numbers from pasted text. Observable is really great for building this kind of tiny interactive utility.

For projects that just have a README I write the release notes in Markdown and paste them directly into the GitHub "new release" form.

I like to duplicate the release notes to GiHub releases for my Sphinx changelog projects too. This is mainly so the website will display the release notes on its homepage, which is populated at build time using the GitHub GraphQL API.

To convert my reStructuredText to Markdown I copy and paste the rendered HTML into this brilliant Paste to Markdown tool by Euan Goddard.

A live demo

When possible, I like to have a live demo that I can link to.

This is easiest for features in Datasette core. Datesette’s main branch gets deployed automatically to so I can often link to a demo there.

For Datasette plugins, I’ll deploy a fresh instance with the plugin (e.g. this one for datasette-graphql) or (more commonly) add it to my big instance - which tries to demonstrate what happens to Datasette if you install dozens of plugins at once (so far it works OK).

Here’s a demo of the datasette-copyable plugin running there:

Tell the world about it

The last step is to tell the world (beyond the people who meticulously read the release notes) about the new feature.

Depending on the size of the feature, I might do this with a tweet like this one - usually with a screenshot and a link to the documentation. I often extend this into a short Twitter thread, which gives me a chance to link to related concepts and demos or add more screenshots.

For larger or more interesting feature I'll blog about them. I may save this for my weekly weeknotes, but sometimes for particularly exciting features I'll write up a dedicated blog entry. Some examples include:

I may even assemble a full set of annotated release notes on my blog, where I quote each item from the release in turn and provide some fleshed out examples plus background information on why I built it.

If it’s a new Datasette (or Datasette-adjacent) feature, I’ll try to remember to write about it in the next edition of the Datasette Newsletter.

Finally, if I learned a new trick while building a feature I might extract that into a TIL. If I do that I'll link to the new TIL from the issue thread.

More examples of this pattern

Here are a bunch of examples of commits that implement this pattern, combining the tests, implementation and documentation into a single unit:

What's new in sqlite-utils

sqlite-utils is my combined CLI tool and Python library for manipulating SQLite databases. Consider this the annotated release notes for sqlite-utils 3.20 and 3.21, both released in the past week.

sqlite-utils insert --convert with --lines and --text

The sqlite-utils insert command inserts rows into a SQLite database from a JSON, CSV or TSV file, creating a table with the necessary columns if one does not exist already.

It gained three new options in v3.20:

  • sqlite-utils insert ... --lines to insert the lines from a file into a table with a single line column, see Inserting unstructured data with --lines and --text.
  • sqlite-utils insert ... --text to insert the contents of the file into a table with a single text column and a single row.
  • sqlite-utils insert ... --convert allows a Python function to be provided that will be used to convert each row that is being inserted into the database. See Applying conversions while inserting data, including details on special behavior when combined with --lines and --text. (#356)

These features all evolved from an idea I had while re-reading my blog entry from last year, Apply conversion functions to data in SQLite columns with the sqlite-utils CLI tool. That blog entry introduced the sqlite-utils convert comand, which can run a custom Python function against a column in a table to convert that data in some way.

Given a log file log.txt that looks something like this:

2021-08-05T17:58:28.880469+00:00 app[web.1]: measure#nginx.service=4.212 request="GET /search/?type=blogmark&page=2&tag=highavailability HTTP/1.1" status_code=404 request_id=25eb296e-e970-4072-b75a-606e11e1db5b remote_addr="" forwarded_for="," forwarded_proto="http" via="1.1 vegur" body_bytes_sent=179 referer="-" user_agent="Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+" request_time="4.212" upstream_response_time="4.212" upstream_connect_time="0.000" upstream_header_time="4.212";

I provided this example code to insert lines from a log file into a table with a single line column:

cat log.txt | \
    jq --raw-input '{line: .}' --compact-output | \
    sqlite-utils insert logs.db log - --nl

Since sqlite-utils insert requires JSON, this example first used jq to convert the lines into {"line": "..."} JSON objects.

My first idea was to improve this with the new --lines option, which lets you replace the above with this:

sqlite-utils insert logs.db log log.txt --lines

Using --lines will create a table with a single lines column and import every line from the file as a row in that table.

In the article, I then demonstrated how --convert could be used to convert those imported lines into structured rows using a regular expression:

sqlite-utils convert logs.db log line --import re --multi "$(cat <<EOD
    r = re.compile(r'([^\s=]+)=(?:"(.*?)"|(\S+))')
    pairs = {}
    for key, value1, value2 in r.findall(value):
        pairs[key] = value1 or value2
    return pairs

The new --convert option to sqlite-utils means you can now achieve the same thing using:

sqlite-utils insert logs.db log log.txt --lines \
  --import re --convert "$(cat <<EOD
    r = re.compile(r'([^\s=]+)=(?:"(.*?)"|(\S+))')
    for key, value1, value2 in r.findall(line):
        pairs[key] = value1 or value2
    return pairs

Since the --lines option allows you to consume mostly unstructured files split by newlines, I decided to also add an option to consume an entire unstructured file as a single record. I originally called that --all but found the code got messy because it conflicted with Python's all() built-in, so I renamed it to --text.

Used on its own, --text creates a table with a single column called text:

% sqlite-utils insert logs.db fulllog log.txt --text
% sqlite-utils schema logs.db
CREATE TABLE [fulllog] (
   [text] TEXT

But with --convert you can pass a snippet of Python code which can take that text value and convert it into a list of dictionaries, which will then be used to populate the table.

Here's a fun example. The following one-liner uses the classic feedparser library to parse the Atom feed for my blog and load it into a database table:

curl '' | \
  sqlite-utils insert feed.db entries --text --convert '
    feed = feedparser.parse(text)
    return feed.entries' - --import feedparser

The resulting database looks like this:

% sqlite-utils tables feed.db --counts -t
table      count
-------  -------
feed          30

% sqlite-utils schema feed.db
   [title] TEXT,
   [title_detail] TEXT,
   [links] TEXT,
   [link] TEXT,
   [published] TEXT,
   [published_parsed] TEXT,
   [updated] TEXT,
   [updated_parsed] TEXT,
   [id] TEXT,
   [guidislink] INTEGER,
   [summary] TEXT,
   [summary_detail] TEXT,
   [tags] TEXT

Not bad for a one-liner!

This example uses the --import option to import that feedparser library. This means you'll need to have that library installed in the same virtual environment as sqlite-utils.

If you run into problems here (maybe due to having installed sqlite-utils via Homebrew) one way to do this is to use the following:

python3 -m pip install feedparser sqlite-utils

Then use python3 -m sqlite_utils in place of sqlite-utils - this will ensure you are running the command from the same virtual environment where you installed the library.

--convert for regular rows

The above examples combine --convert with the --lines and --text options to parse unstructured text into database tables.

But --convert works with the existing sqlite-utils insert options as well.

To review, those are the following:

You can now use --convert to define a Python function that accepts a row dictionary representing each row from the import and modifies that dictionary or returns a fresh one with changes.

Here's a simple example that produces just the capitalized name, the latitude and the longitude from the WRI's global power plants CSV file:

curl | \
  sqlite-utils insert plants.db plants - --csv --convert '
  return {
      "name": row["name"].upper(),
      "latitude": float(row["latitude"]),
      "longitude": float(row["longitude"]),

The resulting database looks like this:

% sqlite-utils schema plants.db
CREATE TABLE [plants] (
   [name] TEXT,
   [latitude] FLOAT,
   [longitude] FLOAT

~ % sqlite-utils rows plants.db plants | head -n 3
[{"name": "KAJAKI HYDROELECTRIC POWER PLANT AFGHANISTAN", "latitude": 32.322, "longitude": 65.119},
 {"name": "KANDAHAR DOG", "latitude": 31.67, "longitude": 65.795},
 {"name": "KANDAHAR JOL", "latitude": 31.623, "longitude": 65.792},

sqlite-utils bulk

  • New sqlite-utils bulk command which can import records in the same way as sqlite-utils insert (from JSON, CSV or TSV) and use them to bulk execute a parametrized SQL query. (#375)

With the addition of --lines, --text, --convert and --import the sqlite-utils insert command is now a powerful tool for turning anything into a list of Python dictionaries, which can then in turn be inserted into a SQLite database table.

Which gave me an idea... what if you could use the same mechanisms to execute SQL statements in bulk instead?

Python's SQLite library supports named parameters in SQL queries, which look like this:

insert into plants (id, name) values (:id, :name)

Those :id and :name parameters can be populated from a Python dictionary. And the .executemany() method can efficiently apply the same SQL query to a big list (or iterator or generator) of dictionaries in one go:

cursor = db.cursor()
    "insert into plants (id, name) values (:id, :name)",
    [{"id": 1, "name": "One"}, {"id": 2, "name": "Two"}]

So I implemented the sqlite-utils bulk command, which takes the same import options as sqlite-utils but instead of creating and populating the specified table requires a SQL argument with a query that will be executed using the imported rows as arguments.

% sqlite-utils bulk demo.db \
  'insert into plants (id, name) values (:id, :name)' \
  plants.csv --csv

This feels like a powerful new feature, which was very simple to implement because the hard work of importing the data had already been done by the insert command.


This idea came from Forest Gregg, who initially suggested running ANALYZE automatically as part of the sqlite-utils create-index command.

I have to confess: in all of my years of using SQLite, I'd never actually explored the ANALYZE command.

When run, it builds a new table called sqlite_stats1 containing statistics about each of the indexes on the table - indicating how "selective" each index is - effectively how many rows on average you are likely to filter down to if you use the index.

The SQLite query planner can then use this to decide which index to consult. For example, given the following query:

select * from ny_times_us_counties
where state = 'Missouri' and county = 'Greene'

(Try that here.)

If there are indexes on both columns, should the query planner use the state column or the county column?

In this case the state column will filter down to 75,209 rows, while the county column filters to 9,186 - so county is clearly the better query plan.

Impressively, SQLite seems to make this kind of decision perfectly well without the sqlite_stat1 table being populated: explain query plan select * from ny_times_us_counties where "county" = 'Greene' and "state" = 'Missouri' returns the following:

SEARCH TABLE ny_times_us_counties USING INDEX idx_ny_times_us_counties_county (county=?)

I've not actually found a good example of a query where the sqlite_stat1 table makes a difference yet, but I'm confident such queries exist!

Using SQL, you can run ANALYZE against an entire database by executing ANALYZE;, or against all of the indexes for a specific table with ANALYZE tablename;, or against a specific index by name using ANALYZE indexname;.

There's one catch with ANALYZE: since running it populates a static sqlite_stat1 table, the data in that table can get out of date. If you insert another million rows into a table for example your analyzye statistics might no longer reflect ground truth to the point that the query planner starts to make bad decisions.

For sqlite-utils I decided to make ANALYZE an explicit operation. In the Python library you can now run the following:

db.analyze() # Analyze every index in the database
db.analyze("indexname") # Analyze a specific index
db.analyze("tablename") # Analyze every index for that table
# Or the same thing using a table object:

I also added an optional analyze=True parameter to several methods, which you can use to trigger an ANALZYE once that operation completes:

db["tablename"].create_index(["column"], analyze=True)
db["tablename"].insert_rows(rows, analyze=True)

The sqlite-utils CLI command has equivalent functionality:

# Analyze every index in a database:
% sqlite-utils analyze database.db
# Analyze a specific index:
% sqlite-utils analyze database.db indexname
# Analyze all indexes for a table:
% sqlite-utils analyze database.db tablename

And an --analyze option for various commands:

% sqlite-utils create-index ... --analyze
% sqlite-utils insert ... --analyze
% sqlite-utils upsert ... --analyze

Other smaller changes

  • New sqlite-utils create-database command for creating new empty database files. (#348)

Most sqlite-utils commands such as insert or create-table create the database file for you if it doesn't already exist, but I decided it would be neat to have an explicit create-database command for deliberately creating an empty database.

Update 13th January 2022: I wrote a detailed description of my process building this command in How I build a feature.

  • The CLI tool can now also be run using python -m sqlite_utils. (#368)

I initially added this to help write a unit test that exercised the tool through a subprocess (see TIL Testing a Click app with streaming input) but it's a neat pattern in general. datasette gained this through a contribution from Abdussamet Koçak a few years ago.

  • Using --fmt now implies --table, so you don't need to pass both options. (#374)

A nice tiny usability enhancement. You can now run sqlite-utils rows my.db mytable --fmt rst to get back a reStructuredText table - previously you also needed to add --table.

I sometimes re-read the documentation for older features to remind me what they do, and occasionally an idea for a feature jumps out from that. Implementing these was a very small change.

  • The --nl import option now ignores blank lines in the input. (#376)
  • Fixed bug where streaming input to the insert command with --batch-size 1 would appear to only commit after several rows had been ingested, due to unnecessary input buffering. (#364)

That --nl improvement came from tinkering around trying to fix the bug.

The bug itself was interesting: I initially thought that my entire mechanism for comitting on every --batch-size chunk was broken, but it turned out I was unnecessarily buffering data from standard input in order to support the --sniff option for detecting the shape of incoming CSV data.

  • db.supports_strict property showing if the database connection supports SQLite strict tables.
  • table.strict property (see .strict) indicating if the table uses strict mode. (#344)

See previous weeknotes: this is the first part of my ongoing support for the new STRICT tables in SQLite.

I'm currently blocked on implementing more due to the need to get a robust mechanism up and running for executing sqlite-utils tests in CI against specific SQLite versions, see issue #346.

Releases this week

TILs this week

Quoting MetaMask Support

Before May 2021, the master key in MetaMask was called the “Seed Phrase”. Through user research and insights from our customer support team, we have concluded that this name does not properly convey the critical importance that this master key has for user security. This is why we will be changing our naming of this master key to “Secret Recovery Phrase”. Through May and June of 2021, we will be phasing out the use of “seed phrase” in our application and support articles, and eventually exclusively calling it a “Secret Recovery Phrase.” No action is required, this is only a name change. We will be rolling this out on both the extension and the mobile app for all users.

MetaMask Support



Confusingly named because it's not really a hash - this library (available in 40+ languages) offers a way to convert integer IDs to and from short strings of text based on a salt which, if kept secret, should help prevent people from deriving the IDs and using them to measure growth of your service. It works using a base62 alphabet that is shuffled using the salt.

Via Tom MacWright

Quoting Laurie Voss

Crypto creates a massively multiplayer online game where the game is "currency speculation", and it's very realistic because it really is money, at least if enough people get involved. [...] NFTs add another layer to the game. Instead of just currency speculation, you're now simulating art speculation too! The fact that you don't actually own the art and the fact that the art is randomly generated cartoon images of monkeys is entirely beside the point: the point is the speculation, and winning the game by making money. This is, again, a lot of fun to some people, and in addition to the piles of money they also in some very limited sense own a picture of a cartoon monkey that some people recognize as being very expensive, so they can brag without having to actually post screenshots of their bank balance, which nobody believed anyway.

Laurie Voss

Weeknotes: Taking a break in Moss Landing

Took some time off. Saw some whales and sea otters. Added a new spot to Niche Museums.

Natalie took me to Moss Landing for a few days for my birthday. I now think Moss Landing may be one of California's best kept secrets, for a whole bunch of reasons.

Most importantly, Moss Landing has Elkhorn Sloug, California's second largest estuary and home to 7% of the world's population of sea otters. And you can kayak there!

We rented a kayak from Kayak Connection and headed out for three hours on the water.

The rules are to stay eight boat lengths (100 feet) away from the otters, or to stop paddling and wait for them to leave if they pop up near your boat. And they pop up a lot!

We saw at least twenty sea otters. The largest can weigh 90lbs (that's two Cleos) and they were quite happy to ignore us and get on with otter stuff: floating on their backs, diving into the water and playing with each other.

We also saw harbor seals, egrets, herons, avocets and both brown and white pelicans.

A harbour seal in the estuary, making a funny U shape with its body

A beautiful great egret

Moss Landing also sits at the edge of Monterey Bay, which contains the Monterey Submarine Canyon, one of the largest such canyons in the world. Which means cold water and warm water mixing in interesting ways. Which means lots of nutritious tiny sea creatures. Which means whales!

We went whale watching with Blue Ocean Whale Watching, who came recommended by several naturalist friends. They were brilliant - they had an obvious passion for the ocean, shared great information and answered all of our increasingly eccentric questions. Did you know a Blue Whale can use a thousand calories of energy just opening its mouth?

A gray whale in the water

We saw gray whales - expected at this time of year due to their migration from the arctic down south to their breeding lagoons in Baja, and humpback whales - not a usual occurrence at this time of year but evidently the younger whales don't necessarily stick to the official calendar.

The tail of a humpback whale as it dives down for food

Moss Landing also has a large number of noisy sea lions. This one was asleep on the dock when our ship returned.

A sleeping sea lion

A sea otter floating on its back in the water eating a crab

Then yesterday morning we went for a walk around this pensinsula and saw sea otters fishing for crabs just yards away from shore! Plus a juvenile elephant seal who had hauled itself onto the beach.

An exceptionally round juvenile elephant seal, asleep on the beach

We also dropped in to the Shakespeare Society of America - my first niche museum visit of 2022. I wrote about that for Niche Museums.

TIL this week

Planning A Van

The first step in building a camper van is, well, choosing the van. But how are they different, and which should you pick?

Mini Hovercraft

I challenged myself to build a mini hovercraft in only a few days as part of a new video series!

Aviation Weather Map

Sure, you could look outside for the current weather, but isn't it a lot more fun to build a live-updating map instead?

E-Paper Weather Display

What happens when you combine two-colour e-paper with bad Python? Weather! Well, weather displays.

The RFID Checklist

What do you do when you want to massively over-engineer a solution to forgetting your phone charger?

The Long Drive

Over a thousand miles over some of the loneliest areas of the USA. What's not to love?

Travel Equipment: 2019 Edition

Taking a look at some of the key travelling equipment I've grown to like in the last year of travel.

ASGI 3.0

Upgrading the ASGI spec to simplify it, while keeping backwards compatibility.

A Django Async Roadmap

Taking a look at what it would take to make Django async-native, what it enables, and if we should even do it at all.

Python & Async Simplified

Event loops, coroutines and awaits, oh my!

CodeSOD: Commentary

By Remy Porter

"Include descriptive comments for each method," isn't bad advice. I mean, ideally, the method name and parameters would be descriptive enough that you don't need to add lots of comments, but more comments is rarely going to hurt things. Unfortunately, "include descriptive comments" usually decays into "include comments". And that's how we get piles of code like this one, from Patrick:

// // Function name : CZiArecaRaidController::ReadAllRaidsetInfo // Machine : w7gre7 // Environment : Visual Studio .Net 2008 // doxygen : /// \fn CZiArecaRaidController::ReadAllRaidsetInfo(BSTR ContextInfo, IZiArecaDataCollection *pRaidsetInfoCollection, IZiArecaDataCollection *pVolumesetInfoCollection, IZiArecaDataCollection *pPhysicalDriveInfoCollection) /// \brief /// \details /// \param ContextInfo /// \param *pRaidsetInfoCollection /// \param *pVolumesetInfoCollection /// \param *pPhysicalDriveInfoCollection /// \return STDMETHODIMP /// \author (redacted) /// \date 24.01.2011 09:59:10 // STDMETHODIMP CZiArecaRaidController::ReadAllRaidsetInfo(BSTR ContextInfo, IZiArecaDataCollection **pRaidsetInfoCollection, IZiArecaDataCollection **pVolumesetInfoCollection, IZiArecaDataCollection **pPhysicalDriveInfoCollection) { // ... } // // Function name : CZiArecaRaidController::GetArecaErrorMessage // Description : // Return type : string // Argument : ARC_STATUS stat // Author : (redacted) // Machine : Lapgre5 // Environment : Visual Studio .Net 2005 // Date/Time : 05.06.2007 15:24:53 // string CZiArecaRaidController::GetArecaErrorMessage(ARC_STATUS stat) { // ... }

This is the secret sauce of bad documentation: just repeat information already in the code, include information that absolutely doesn't need to be there, and make the whole thing take up more space than the code itself. The only way to make this documentation worse is to make it wrong.

It's the useless information which mystifies me. While knowing what environment was used to build the code is useful, why tag that onto individual methods? Why track which machine made the change? Why do source control by comment when the team was already using Subversion?

There is one thing that the documentation includes, though, that's useful to us. Sometime between 2007 and 2011 they added Doxygen to their toolchain. Perhaps between 2011 and 2022 they've also added meaningful documentation which would make Doxygen useful, but probably not.

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

Document Soup

By Remy Porter

An Enterprise Resource Planning system needs to keep track of your enterprise resources. Many of those resources, especially the expensive ones, need lots of documents tracked about them- inspections, service reports, maintenance bills, etc. So the ERP and the Document Management System need to talk.

Years ago, for Coyne, this presented a few problems. First, the ERP was a mainframe application running on an IBM mainframe. Second, it was getting retired. Third, the DMS didn't talk directly to it, but instead communicated through a terminal emulator and used configuration files to correctly parse the screen contents coming back from the mainframe.

The final, and key problem, was that, when examining the documents stored in the DMS, were that there were big confused piles of unrelated documents getting stored together. Specifically, if you looked for documents for the asset tagged 490, it'd fetch those, and also 49, 4900, 49000, or 490000. And vice versa, searches for 490000 would return all the other documents as well.

Now, within the mainframe, the same data might get displayed on multiple panels. So, for example, the tag for a requisition document might be displayed in RQ01 on one panels, RQ02 in another, and RQ03 in yet another. And each of these fields could display the field differently, "depending on design, whim, programmer laziness and phases of the moon," as Coyne writes.

RQ01: [0000000049] RQ02: [ 49] RQ03: [49 ]

Now, the DMS configuration file had a few flags meant to help parse this. For any field, you could set it to strip leading zeros, justify to the left, right or not at all, and whether or not to pad back with zeroes.

The people who designed the module for handling the "fixed assets" documents, the specific documents giving Coyne issues, opted to strip leading zeroes, justify left, and then fill back with zeroes. They deployed this solution, and it had been running for years.

Let's see how it handles common situations:

Key field ⇒ Normalized key [49 ] ⇒ [4900000000] [ 490] ⇒ [4900000000] [4900 ] ⇒ [4900000000] [0000049000] ⇒ [4900000000]

Coyne sums it up:

Presto: document soup. Since there were a three-quarters of a million tags in fixed-assets, a whole lot of document soup.

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

The Tech Lead

By Remy Porter

Years ago, Karthika was working as a contractor. She got hired on to develop an intranet application for a small government project. The website in question was already in use, and was absolutely mission critical for the organization, but it also had a very small user base- roughly five users depended on this application.

When Karthika started, she immediately encountered a few surprises. The first was the size of the team- 8 developers, including a Team Lead. That seemed like a large team for that small number of users, and that didn't even include the management overhead. The code base itself was similarly oversized; while the product was important, it was a pretty prosaic CRUD app with a few tricky financial calculations involved.

The core surprise was how awful the application was to use. It was slow to the point of sometimes timing out in the browser, even when running on your local machine. It was buggy, and even when Karthika patched those bugs, there was so much duplicated code in the system that the same bug would linger hidden in other screens for months. "I thought you said you'd fixed this," was a common refrain from the users.

This was long enough ago that the UI was built in ASP.Net WebForms, but new enough that the data access was handled by Entity Framework. And it was one specific feature of WebForms that they were abusing that made everything terrible: UserControls.

UserControls were designed to let developers create reusable widgets. For example a "User Information" screen may group the "User Name" and "Password" fields into a single "Credentials" UserControl, while the address fields would all get grouped together in an "Address" UserControl. That same "Credentials" control could then be dropped into other pages.

When the user interacts with this data, Entity Framework can lookup a User object, hand it off to the UserControls, who allow the user to manipulate it, and then the controls can invoke the save on the User.

The Tech Lead had encountered a problem with this. You see, he didn't want to share the same reference across controls because of "separation of concerns". So instead, each UserControl would create its own User object, populate it with database values, and then let the user interact with it. This meant when each UserControl had its own picture of the user object, and when it was time to save the data on the page, one control could overwrite the changes made by another control.

So the Tech Lead invented CopyOldValues, a method which, during a save operation, would go out to the database, fetch the current data, and then compare it to the object being saved. Any NULL values in the object being saved would be updated to the database values, and then the object would be saved. This way, a UserControl could have a whole User object, but only populate the fields it was responsible for, leaving the rest as null. So yes, this meant that to save an object to the database, it required two round-trips to the database, per UserControl. And each page could have multiple UserControls.

Karthika saw this, and put together a simple plan to fix this problem: just use the frameworks like they were meant to be used and cut this whole CopyOldValues nonsense out. She went to the Tech Lead and laid out a plan.

"This isn't an issue," he said. "You're wrong to be worrying about this. Stop wasting my time, and stop wasting yours. Instead, you should look into the date bug."

So, Karthika tracked down the issue related to the date bug. Specifically, the database and the application were supposed to allow certain date fields to be NULL. But, since CopyOldValues used NULLs to decide which data to save, it was impossible to update a stored value to a NULL. Once again, the fix was obvious: just stop doing this weird intermediate step.

"Wrong," the Team Lead said. "That's totally not the correct way to do it. I have a better plan already."

The "better plan" was to create a custom save method for each UserControl- of which there were hundreds. Each one of these would define an array which used the string names of each field it was responsible for, and then the object and the array would get passed to a new method, FindDifferences, which would use reflection to inspect the object, copy the updated values to a new object, and prepare to save to the database.

The shocking end result of this, however, is that this made the application even slower. It didn't reduce the number of database round trips, and it added this whole reflection step which made accessing properties even slower. Despite only having five users, and running on a decently powerful machine, it was nigh unusuable. The Team Lead knew what the problem was though: the machine wasn't powerful enough.

Strangely, however, throwing hardware at the problem didn't fix it. So the Team Lead invented his own caching solution, which made things worse. He started reinventing more wheels of Entity Framework and made things worse. He started copy/pasting utility functions into the places they were used to "reduce overhead", which didn't make things worse but made every developer's life demonstrably worse as the repeated code just multiplied.

These problems made the customer angry, and that anger eventually turned into an all hands meeting, with representatives from the client side and the project manager as well. After the venting and complaining was over, the project manager wanted explanations.

"Why," she said, "aren't we able to fix this?"

A round of blamestorming followed, but eventually, Karthika had to get specific and concrete: "We have a set of fixes that could address many of these problems, but the Tech Lead isn't letting us implement them and isn't giving us a good reason why we can't."

The project manager blinked, puzzled. "Who? There's no defined tech lead on this project. You're a team of peers."

"Well," the 'Tech Lead' said, "I… uh… have seniority."

"Seniority?" the project manager asked, no less confused. "You started two weeks earlier, and that was just because you were the one contractor on the bench and we needed someone to knowledge-transfer from the outgoing team."

The Project Manager had been overwhelmed by handling customer complaints, and hadn't been able to carve out time to attend any of the development team meetings. This meant that the Tech Lead's self-appointed promotion went unnoticed for eight months. At this point, the project was too far off the rails for any hope of recovery. The government office "fired" the contracting firm the next week, and all the developers, including Karthika, were fired from the contracting firm the week after that.

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

CodeSOD: Classic WTF: The Old Ways

By Erik Gern

It's a holiday in the US today, so we're taking a trip into the past for a haunting classic about how things used to be. Original. -- Remy

Greg never thought he’d meet a real-life mentat.

“We’re so happy to have you aboard,” said Jordan, the CEO of IniTech. She showed Greg to the back end of the office, to a closed door marked with just one word: Frank. Jordan, not bothering to knock, opening the door.

A mentat from the film Dune

Greg was overwhelmed with the stench of burned coffee and old-man smell. The office was unadorned and dark, the blinds drawn, illuminated by the blue light coming from an aging CRT screen. He saw a wrinkled scalp behind a tall, black office chair.

“I’m busy,” Frank said.

Jordan cleared her throat. “This is your new programming partner.”

“I’m Greg. It’s nice to meet you–” Greg offered his hand, but a wrinkled appendage slapped it away.

“Get yourself a chair. I know where everything is. You just show me you can type.”

Greg shot Jordan a glance as they left Frank’s office.

“He’s been with us 22 years,” she said. “He knows everything about our code. But his typing’s not what it used to be. Just do what he says. With some luck he’ll be retiring in a few months.”

Total Recall

Greg pulled a spare office chair into Frank’s den. He could see Frank’s face in profile now, resembling the mummy of Rameses II. Frank slid his keyboard to Greg. “Open C:\project.make in Vim,” Frank said, “and go to line 22.”

Greg thought it was odd that a makefile would right under C:\, but he did so. He moved the cursor to line 22.

“Increment $VERSION to 8.3.3.”

Greg noticed that Frank had his eyes shut, but humored him. In fact, line 22 did declare a $VERSION constant, and Greg changed it to 8.3.3.

“You’ll be suitable,” Frank said, crossing his arms. “You’ll do your work from the SMB server. Don’t make any changes without my authorization first.”

Change Management

Back at his desk, Greg found the SMB server where Frank kept all of his code. Or rather, the SMB mapped all of the files on Frank’s hard drive. Curious, Greg searched for .pas, .make, and other source files, wondering why Frank would keep his principle makefile under C:\.

There were 440 source files, about 200 megabytes, spread out all over the directory strucure. C:\Windows\System32, C:\Users\Shared\Project, C:\Program Files\… Frank’s entire computer was the de facto source repository.

Greg knew if he ever had to make an on-the-fly change to the source, it would take hours just tracking down the right file on SMB. Surely they had a repository he could check changes into. Greg took a deep breath and re-entered Frank’s den.

“Frank, do we have any of this in a repo somewhere? I don’t want to SMB onto your computer every time we make a change. What if we have to patch something overnight?”

“What?!” Frank rose from his office chair, unsteady on his disused legs. “There will be no code changes without my direct supervision! It’s worked just fine for 22 years. Is that understood?”

In Memory

Greg endured this for several months. Frank would harbor no suggestions of version control or repos. Everything, Frank said, was in his head. As long as no one changed the source without his permission, he would know where everything was.

Despite his frustrations, it greatly impressed Greg. Especially when Frank had memorized loop variables such as these:

for RecursiveWaypointCompressionThreadModuleIndexVerifierPropertyHandleIndex := 1 to 99 do ...  

Less amusing was Frank’s insistence on using HEX constants for any encoded string. “You can’t trust any string encoding,” Frank said. It even extended to embedded web pages in their embedded manual:

    ThirdWebPage : array of byte = [ $2d, $20, ... 660k OF HEX CONSTS..... ];
    JQuery33WebPage : array of byte = [ $2d, $20, ... 3,660k OF HEX CONSTS..... ];  

But Greg wondered. What would happen if he slipped in just a little change? How long would it take before Frank found out?

One night, he came into the office and logged into Frank’s SMB server. He opened a file and found an innocuous for-loop block. He replaced the twenty-something variable name with i, saved a backup on his own machine, and went home.

Greg arrived in the office late that morning, stuck in traffic, and was met by Jordan at the door. “Keep this quiet, but Frank just passed away.”

“Was it last night?”

“Brain aneurysm in his sleep.”

Frank probably died before he had a chance to see Greg’s unauthorized change. Greg would never know if Frank actually had the entire codebase memorized. Sometimes Greg would memorize a line or two, or find himself looking up mnemonic tricks to remember long sequences of characters. But it wasn’t like Frank rubbed off on him. Not really.

[Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

Error'd: Up Up Down Down Left Right Left...

By Lyle Seaman

...Right B A. Right? Every so often, someone sends us a submission with a hidden agenda. Of course we get the usual solicitations for marriageable exotic beauties and offers to trade linkspam locations. But then there are the really interesting ones. Maybe they're legitimate, maybe they're photoshopped or otherwise faked, and maybe they're an attempt to bypass someone's ban on political propaganda or quack science. In any case, there isn't any of that here this week, but we're saving them up and maybe we'll feature a future issue of spot the fraud for you.

First up is dog lover George with a hysterical spam-blocking email address, sharing a help message that must have been crafted by Catbert himself. "My sixty seconds of glory awaits!" he howls, but then whimpers "I will be real disappointed if the agent isn't [Gone in Sixty Seconds headliner] Nicolas Cage."



Not to single out Insperity, though. Job hunter Quentin G. growls at iCIMS "I suppose since they don't have an email that does make them pretty unavailable." Anybody want to argue that at least "unvailable variable" is a better failure mode than "undefined"? I'm on the fence.



Music fan Joel has sent us a rash of submissions. His explanation is that "While either the image or the text are obviously a reasonable result for the search terms, the combination is... interesting."
We suggest trying a different laundry detergent.



Bug Hunter David B. screenshots this from his iPhone. "I was just checking for a potential version error. I didn't find the one I was expecting."



One of the most famous rivers in Western history has been famously lost for centuries. How do you lose a river? Historians recently have declared it found, but even so, it is scarcely safe home and dry.
Reader Jeremy Pereira reckons it's been smuggling messages through the Web. "A fairly run of the mill error on a Wikipedia page, but it ends with a heartbreaking plea." Can't somebody do something?



[Advertisement] Otter - Provision your servers automatically without ever needing to log-in to a command prompt. Get started today!

CodeSOD: A Pointer to your References

By Remy Porter

John C works at a defense contractor, and his peers are well versed in C. Unfortunately, many years ago, a lot of their software started being developed in Java. While references are often described as "pointers, but safer," they are not pointers, so your intuitions about how memory gets allocated and released are likely to be wrong.

Which is definitely the case for John's peers. For example, in C, you generally want really clear understandings of who owns a given block of memory. You don't want to allocate memory and hand it off to another module without being really clear about who is responsible for cleaning it up later. This means that you'll often write methods that expect buffers and other blocks of memory passed into them, so that they don't have to worry about memory ownership.

Which is how we get this block of code:

Set<UniqueArray> myArrays = UniqueArrayUtils.getUniqueArrays(new LinkedHashSet<UniqueArray>()); public static Set<UniqueArray> getUniqueArrays(Set<UniqueArray> pUniqueArraySet) { ... for (sensor in getSomeSensors()) { if (blah == blahblah) { pUniqueArraySet.add(new UniqueArray(sensor.special_id, sensor...)); } } ... return pUniqueArraySet; }

"Arrays" here don't refer to arrays in the programming sense, but instead to arrays in the "sensor array" sense. This method is called only once, like you see it here, and could easily have been private.

But what you can see here is some vestige of "who owns the memory". getUniqueArrays could easily create its own Set, return it, and be done. But no, it needs to accept a Set as its input, to manipulate it.

In the scheme of things, this isn't terrible, but this pattern reasserts itself again and again. Methods which could easily construct and return objects instead expect empty objects passed into them.

As John writes:

I imagine an angry C programmer saying, "What do you MEAN there's no pointers?!"

[Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

A Basic Print Algorithm

By Ellis Morning

Common snail

In the late 90s, Aaron was employed at a small software company. When his coworker Mark submitted a letter of resignation, Aaron was assigned to maintaining the vast system Mark had implemented for an anonymous worldwide company. The system was built in the latest version of Visual Basic at the time, and connected to an Oracle database. Aaron had never written a single line of VB, but what did that matter? No one else in the company knew a thing about it, either.

Before Mark parted ways with the company, he and Aaron traveled to their customer's headquarters so that Aaron could meet the people he'd be supporting and see the system perform in its live environment. A fellow named Boris met them and gave a demo at his cubicle. At one point, he pressed the Print button to print out a report of certain records. After some serious hourglassing, the system displayed a dialog box asking, Do you want to print page 1?, with Yes and No as options. Boris chose No.

More hourglassing. Do you want to print page 2?

And on it went. Not only did Boris have to choose Yes or No for every page, the time to display each prompt was ridiculous, anywhere from 30 to 90 seconds per page.

By the time they crawled to page 30, Aaron was dying inside and could no longer restrain himself. "Why is it like this?!" he half-asked, half-accused Mark.

"The customer wanted it this way," Mark replied, either unaware or indifferent to his coworker's frustration.

"This is the way we want it," Boris chimed in. "We don’t always want to print every page. Sometimes we just want one page, could be page 73."

"But why not give one prompt where the user can type in the specific pages they want?" Aaron asked.

"Is that possible?" Wide-eyed, Boris turned to Mark. "You told us it wasn't possible!"

"It isn't," Mark said with conviction.

Aaron flushed with embarrassment. He assumed he'd put his foot in his mouth in front of an important customer. "Sorry. You're the expert."

Still, the issue niggled at Aaron long after they returned from the customer's site. Once Mark had packed up his cube and departed for good, Aaron tracked down the report-printing code. He found a loop that started off something like this:


So, for every single page to be printed, the max page number was re-queried and every single record for the report was retrieved anew, never to be retained in memory.

Aaron didn't have to be a VB genius to realize how much this was killing performance. With a little experimentation, he figured out how to implement a dialog box more like the one he'd described in front of the customer. Boris and the other users were thrilled to receive the "impossible" time-saving fix, and Aaron learned an important lesson about how an Expert's word isn't necessarily gospel.

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

CodeSOD: The Correct Browser

By Remy Porter

Sometimes, it's not the code that's bad, but what the code costs. For Elizabeth's company, that cost was significant in terms of dollars and cents. They needed to staff up to accomplish some major Java Enterprise work, so they went with the highest of the highly paid consultants they could find. These consultants came from a big name firm, and were billed at an eye-watering hourly rate.

Elizabeth warns us that the Java code is a behemoth of WTFs that is "too difficult to describe", but one particular WTF leapt out at her. Specifically, included in the application was a file called nonIEUser.html. This project was happening circa 2012, which is after Microsoft finally admitted standards might need to be a thing, and definitely well outside of the time when your web application should only work in Internet Explorer. For a greenfield project, there was no reason to do anything IE only, and fortunately, they didn't- aside from forcing a check to yell at you if you didn't use IE.

This is the error page that it would display:

<!-- View-Page for errors --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <head> <title>Technical error</title> <meta http-equiv="expires" content="0"> <meta http-equiv="Cache-Control" CONTENT="no-store,no-cache,must-revalidate,post-check=0,pre-check=0"> <meta http-equiv="Pragma" CONTENT="no-cache"> <!--<META name="GENERATOR" content="IBM WebSphere Studio">--> <link rel="STYLESHEET" type="text/css" href="../css/initech.css"> </head> <body> <html lang="en"> <!-- 100 lines omitted --> <p><strong><h2>This application can only be used with Internet Explorer!</h2></strong></p> <p>&nbsp;</p> <p><strong><h2>Other browsers are not supported.</h2></strong></p> <!-- 100 lines omitted --> </html> </body>

The "fun" part of this is that the page isn't wrapped in an <html> tag, and instead the tag is embedded inside the <body>. In the omitted sections is a pile of JavaScript that didn't work in any browser, IE included.

The real killer, though, is that the consultants billed 32 hours on "enforcing IE only compatibility". As it usually goes with consultant-driven projects, nobody in Elizabeth's management blinked twice at paying through the nose for a feature they didn't need, implemented badly.

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

The New Management

By Remy Porter

For a young college graduate in the early 80s, Argle was fortunate to already have some real-world experience. That served him well, because businesses which were looking towards the future were already looking into how they could improve their automation with the new and relatively cheap computer systems that were hitting the market.

One such company was a family-owned, multi-generational manufacturing company. They had a vision for the future, and the future involved the latest in CNC milling machines and robotic manufacturing. They needed the team that could send them into the future, and were hiring to build that team.

Argle was one of those hires, brought on as a junior developer. His mentor, Stanley, was an old Texas Instruments guy who had helped design many of the chips that were driving the fancy robots. Stanley leaned into his mentor role, both in terms of being a good mentor, but also in terms of the aesthetic: he was a bearded pipe smoker in a tweed jacket with patches on the elbows, and a pocket protector loaded with pens and a compact slide rule.

For a small manufacturing firm, the owner was happy to invest in this team. He brought on vets from JPL or mechanical engineers who had helped automate German auto plants. The owner himself heavily recruited from the same college that Argle attended, giving talks about the future of automation and reinforcing his company's commitment to the future. Interns and junior developers bulked out the team.

The owner walked the walk, talked the talk, and was putting money where it needed to go. The job was an absolute delight for Argle and the rest of the team. He learned a lot from Stanley, and also from the work itself.

And then, one day, the owner introduced Gordon. "This, is our new President, Gordon. He'll be handling the overall operations of the company while I focus on our vision and direction."

Now, for most employees, the introduction of Gordon was barely worth commenting on. New management slotting into leadership positions was just background noise and didn't really impact the work. Except for Argle. Argle actually knew Gordon, at least by reputation, because Gordon was the VP at the local public broadcasting company.

Now you might wonder, "how does experience in broadcasting help someone oversee a manufacturing company?" Well, Argle had the inside scoop on exactly how Gordon would lead. Argle's father worked at the local PBS affiliate, and had regaled Argle with all sorts of stories about Gordon's style. That style was a blend of bullying and cronyism.

Now, up to this point, Argle's team had acted more or less like a leaderless collective. They all had a goal, they all understood the goal, and they all pushed together to achieve the goal. There was no manager. They'd defer to the senior members on matters of disagreement, but even then it was never "Stanley said so," and more "Stanley will explain this so everyone comes to an agreement."

That, of course, couldn't stand under Gordon's leadership. So Gordon hired Dave to provide management. Like Gordon, Dave also had no background in manufacturing, technology, automation or robotics. Or, in actuality, project management, as Dave illustrated in his first project meeting.

As this was the 80s, the conference room was a nicotine stained room with a transparency projector. Stanley sat in a corner, puffing away at his pipe. Dave had a stack of transparencies and a red dry erase marker to scribble on them with.

"So, Stanley," Dave said as he slapped one of the estimates Stanley had assembled onto the projector. "How long did you think this effort would take?"

Stanley pointed his pipe stem at the numbers Dave was projecting. "An effort like this will take a year."

"That's much too long," Dave said. "I was looking this over, and you had 6 weeks for milling these parts, but I think we can outsource that and get them back in three weeks. I have a vendor already committed." Dave edited the numbers with his red pen. "And then development time, you've got poor Argle booked for six months, after the hardware design is finalized, but we can start development earlier than that…"

People around the room started raising their objections. Dave had no time for these naysayers. "You would think that, but you haven't even finished with college," he told an intern. "Maybe things worked that way at JPL, but we live in the real world here." "If TI was such a good company, you'd probably still work there- either they suck or you're an idiot."

By the time Dave finished his tirade, he had individually insulted everyone on the team, and had cut the project time down to six months. "You see? We can totally do this project in six months."

Stanley took a few puffs of his pipe and said, "You can say it will take six months, but it will still take a year."

As Dave started piloting the team straight into the ground, Argle got an offer. A few of his college friends had moved out to another state, launched a startup, and were offering him a 40% wage increase plus moving expenses. Add into the fact that Dave had explained that nobody on the team would be eligible for a raise for five years, Argle was halfway out the door.

But only halfway. Argle was young, still had some optimism, and wanted to be loyal to his team, even if he wasn't loyal to the company. So he talked it over with Stanley.

"I like this team, and I like the work that we're doing, and I'd hate to leave the team in a lurch."

Stanley puffed on his pipe, and then answered. "The company will be sad to see you go. I'll be sad to see you go. But the company could lay you off tomorrow, and they'd be just as sad about it too. But they'd do it if they thought it was necessary. You don't owe this company anything more than that."

So Argle submitted his notice. By coincidence, it was on April First, which Dave tried to use as an excuse to bully Argle into feeling guilty about either a bad prank or bad timing for quitting. Dave wanted to make a counter offer, but he couldn't do it without insulting Argle on the way to offering him a raise, which made Argle's choice very easy.

Two weeks later, he was loading a truck with all his worldly possessions, and two weeks after that he was settled into a new house, and a new job, and even happier than he'd been at the manufacturing company.

Over a year later, Argle went back to visit family, and swung by the old company to see how the team was doing. Stanley was still there, but Dave and Gordon were long gone. The owner was fooled for a bit, but was too smart to stay fooled. Dave and Gordon were out the door only a few months after Argle left.

"So," he asked Stanley, "how'd that project go? How long did it take?"

Stanley puffed on his pipe and chuckled. "Oh, about a year."

[Advertisement] Continuously monitor your servers for configuration changes, and report when there's configuration drift. Get started with Otter today!

Error'd: Everything Old is New Again

By Lyle Seaman

Whenever there's a major change in the world, it always takes application developers a little time to adjust. Remember when the US government thought it would be a great idea to mess around with their Daylight Saving Time schedule with only two years warning? (I'm guessing nobody remembers the fiddling done by earlier administrations because they were too young to care, or not born yet.) Two years warning probably seemed like plenty to non-technical legislators, not thinking about all the software that was in place with built-in calendars. Well, someone has apparently decided to one-up a measly time change, by inventing something called a New YEAR. This resets the entire calendar, and it must be a novel practice because surely websites wouldn't break due to some routine event that has been happening for at least a dozen years or more, right? Right?

Aspiring Poké trainer Valts S. began a long long time ago far far away.



Resubmitter David B. is strong with the zero balances. "My friend was notified that his brand new insurance policy for 2022 is already past due. The interest is going to be killer."



Unlike David's friend, contributor JP is getting a head start. "I'll sign up with Netflix in a year, but I'm paying now."



While an anonymous contributor is way, way, way ahead of the game. Anonymous EA predicts Apex Legends will be very popular in 10 years.



Finally, if you're sick of all the weak puns, Ron K. has a favored medical provider. Good luck scheduling an appointment.



[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

CodeSOD: Well Trained

By Remy Porter

Mandatory compliance training is a thing. The reasons behind it range from companies trying to reduce civil liabilities to actual legal mandates which require the training. The quality of mandatory training ranges from "useless" to "actively awful", and it's mostly PowerPoint-style slides interspersed with quizzes to make sure you were "paying attention". The worse ones will usually have timers on the slides so you can't just click past, and have to actually idle to "force" you to read it.

Also, since legal compliance tends to move slower than technology, training built years ago is frequently still relevant. So, for example, Duncan's company built training back when you could reasonably expect Flash to run in the browser. Building the training and the content cost money, so once Flash got deprecated, they weren't just going to throw that money away- they found a contractor who'd convert it to "HTML5".

Now, this means that the code quality is garbage, which is fine. We can't really fault the tool. But there are some assumptions about the very use of the tool that render these quizzes even more useless than the usual fare:

function checkQuestions( bFeedback, bForce ) { if( !bForce ) if( bFeedback && !forceCheckQuestions() ) return 0; var ans_VarQuestion_05 = VarQuestion_05.getValue() if( bFeedback && currFeedbackIdx == 0 && !qu84909.hasBeenProcessed) { if( ans_VarQuestion_05 == 'A. ' ) { settings = 'height=300,width=400,top='+(screen.height-300)/2+',left='+(screen.width-400)/2 if( is.ns ) settings += ",modal=yes,dialog=yes" trivWndFeedback = new jsDlgBox( '84909', '20013', 'page81719.html', function(){ trivWndFeedback=null; setTimeout( 'checkLeavePage()', 100); }, 400, 300 ); trivWndFeedback.create(); return 0; } else if( ans_VarQuestion_05 == 'B. ' ) { settings = 'height=300,width=400,top='+(screen.height-300)/2+',left='+(screen.width-400)/2 if( is.ns ) settings += ",modal=yes,dialog=yes" trivWndFeedback = new jsDlgBox( '84909', '20013', 'page81714.html', function(){ trivWndFeedback=null; setTimeout( 'checkLeavePage()', 100); }, 400, 300 ); trivWndFeedback.create(); return 0; } else if( ans_VarQuestion_05 == 'C. ' ) { settings = 'height=300,width=400,top='+(screen.height-300)/2+',left='+(screen.width-400)/2 if( is.ns ) settings += ",modal=yes,dialog=yes" trivWndFeedback = new jsDlgBox( '84909', '20013', 'page81719.html', function(){ trivWndFeedback=null; setTimeout( 'checkLeavePage()', 100); }, 400, 300 ); trivWndFeedback.create(); return 0; } else if( ans_VarQuestion_05 == 'D. ' ) { settings = 'height=300,width=400,top='+(screen.height-300)/2+',left='+(screen.width-400)/2 if( is.ns ) settings += ",modal=yes,dialog=yes" trivWndFeedback = new jsDlgBox( '84909', '20013', 'page81719.html', function(){ trivWndFeedback=null; setTimeout( 'checkLeavePage()', 100); }, 400, 300 ); trivWndFeedback.create(); return 0; } } if( !bFeedback ) currFeedbackIdx = 1; return 1 }

Now, the page quite "securely" disabled right click, so it was "impossible" to open debugging tools or view source, short of knowing how to navigate menus or use keyboard shortcuts.

If one reads the code carefully, we know that B. is the correct answer- the other three answers all go to the same page, but B. is the odd one out.

Now, is this actually easier than just using common sense, because these trainings aren't designed to actually test people and instead just provide a veneer of plausible "we made them take a quiz" logic?

Probably not. But at least Duncan was more entertained than he would be by actually doing the training.

[Advertisement] Otter - Provision your servers automatically without ever needing to log-in to a command prompt. Get started today!

CodeSOD: Do Nothing

By Remy Porter

Ivan encountered a strange bug. His organization uses the R language, which has a handy-dandy documentation language attached to it, for Rd files. The language itself is an organically grown hodge-podge of R and LaTeX, built to make it easy to format both plain text and R code within the documentation. It lets you use LaTeX-like commands, but also mix in R code to control the output.

Ivan's problem was that one of his macros, which we'll call \mymacro, only worked sometimes. The specific cases where it failed were where the macro expanded into multi-line output, which once upon a time wasn't a thing that Rd supported, but is supported, and clearly wasn't the problem. Ivan poked at it from that direction, suspecting there was maybe a regression, and then spent a lot of time trying to understand the places where the macro did and didn't work.

It took some time, but eventually the key difference was that the pages that worked also called another macro, \doi{}, which itself called \Sexpr[stage=build]{...}. Now, there's one important thing to note about the \Sexpr macro: it's meant to invoke R code inside of your documentation. And that made all the difference.

The documentation which didn't contain R code would be stored as a raw documentation file in the package. Before rendering the documentation, the parseRd tool would need to parse the file and generate the documentation output. This would happen after the package was built and distributed. Since the \mymacro might expand into nothing, this was technically unparseable at that point, and would cause the documentation render to fail.

On the other hand, documentation which did contain R code would be parsed and the parse tree would be stored in the package. There would be no parse step when the documentation got rendered. The whole "expanding to nothing" problem didn't exist in this situation.

So the fix was obvious, at least to Ivan:

--- man/macros/macros.Rd +++ man/macros/macros.Rd @@ -1,2 +1,3 @@ +\newcommand{\mustbuild}{\Sexpr[results=hide,stage=build]{}} -\newcommand{\mymacro}{\ifelse{html}{\out{...}}{...}} +\newcommand{\mymacro}{\mustbuild\ifelse{html}{\out{...}}{...}}

He added a \mustbuild macro which hides the results of a null operation, then added a call to that macro inside \mymacro. Now the documentation generates properly, even in older version of R which don't support some of the macro techniques being used (since the parse tree itself is cached, after macro expansion is complete).

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

CodeSOD: Cloudy Optimizations

By Remy Porter

Search engine optimization is both a dark art and a corrupt industry. Search providers work hard to keep their algorithms opaque. SEO is a mix of guessing and snake oil and sometimes outright lying.

For example, Mark M recently inherited a rather… bad PHP website. One of its notable SEO tweaks was that it had a tag cloud that slapped a bunch of keywords together to give a sense of what kinds of articles had been posted recently. At least, that was the idea. But when Mark dug into the code, there was no sign that there was any source of tags in the database. In fact, articles didn't get tagged at all. So where was the tag cloud coming from?

<div id="tag_cloud"> <h2>Popular tags</h2> <p> <?php $last_rand = ''; $words[0] = 'Raffle'; $words[1] = 'Skill'; $words[2] = 'Game'; $words[3] = 'Win'; $words[4] = 'Cars'; $words[5] = 'Bikes'; $words[6] = 'Holidays'; $words[7] = 'Competition'; $words[8] = 'Electronics'; $words[9] = 'Fun'; $words[10] = 'Ferrari'; $words[12] = 'Lamborgini'; $words[13] = 'Maserati'; $words[14] = 'Ducati'; $words[15] = 'Barbados'; $words[16] = 'MacBook Air'; $words[17] = 'Triumph'; $words[18] = 'Sri-Lanka'; $words[19] = 'Bentley'; $words[20] = 'Rolls Royce'; for ($i=1; $i < count($words); $i++) { $rand = random(1, 10, $last_rand); $last_rand = $rand; ?> <span class="tag_<?php eh($rand); ?>"><?php eh($words[$i]); ?></span> <?php } ?> </p> </div><!-- tag_cloud -->

Yes, they just hard coded a bunch of tags that they presumed would drive clicks, then dump them into the document while applying a randomly selected CSS class to style them all differently.

It's… a choice. A series of choices, really. A series of bad choices, and I don't like any of it.

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

My Many Girlfriends

By Remy Porter

In the long ago, wild-west days of the late 90s, there was an expectation that managers would put up with a certain degree of eccentricity from their software developers. The IT and software boom was still new, people didn't quite know what worked and what didn't, the "nerds had conquered the Earth" and managers just had to roll with this reality. So when Barry D gave the okay to hire Sten, who came with glowing recommendations from his previous employers, Barry and his team were ready to deal with eccentricities.

Of course, on the first day, building services came to Barry with some concerns about Sten's requests for his workspace. No natural light. No ventilation ducts that couldn't be closed. And then the co-workers who had interacted with Sten expressed their concerns.

During the hiring process, Sten had come off as a bit odd, but this seemed unusual. So Barry descended the stairs into the basement, to find Sten's office, hidden between a janitorial closet and the breaker box for the building. Barry knocked on the door.

"Sten awaits you. Enter."

Barry entered, and found Sten precariously perched on an office chair, removing several of the fluorescent bulbs from the ceiling fixture. The already dark space was downright cave-like with Sten's twilight lighting arrangement. "He welcomes you," Sten said.

"Uh, yeah, hi. I'm Barry, I'm working on the Netware 3.x portion of the product, and Carl just wanted be to check in. Everything okay?

"This is acceptable to Sten," Sten said, gesturing at the dim office as he descended from the chair. Sten's watched beeped on the hour, and Sten carefully placed the fluorescent bulb off to the side, in a stack of similarly removed bulbs, and then went to his desk. In rapid succession, he popped open a few pill containers- 5000mg of vitamin C, a handful of herbal and homeopathic pills- and gulped them down. He then washed the pills down with a tea that smelled like a mixture of kombucha and a dead raccoon buried in a dumpster.

"He is pleased to meet you," Sten said, with a friendly nod. Barry blinked, trying to track the conversation. "And he is pleased with it, and has made great progress on building it. You will like his things, yes?"

"Uh… yes?"

"He is pleased, and I hope you can go to him and tell him that he is pleased with this, and set his mind at ease about Sten."

So it went with Sten. He strictly referred to himself in the third person. He frequently spoke in sentences with nothing but pronouns, and frequently reused the same pronoun to refer to different people. The vagueness was confounding, but Sten's skill was in Netware 2.x- a rare and difficult set of skills to find. So long as the code was clear, everything would be fine.

Everything was not fine. While Sten's code didn't have the empty vagueness of unclear pronouns, it also didn't have the clarity of meaningful variable names. Every variable and every method name was given a female first name. "Each of these is named for one of Sten's girlfriends." Given the number of names required, it was improbable that these were real girlfriends, but Sten gave no hint about this being fiction.

There was some consistency about the names. Instead of i, j, and k loop variables, you had Ingrid, Jane, and Katy. Zaria seemed to be only used as a parameter to methods. Karla seemed to be a temporary variable to hold intermediate results. None of these conventions were documented, obviously, and getting Sten to explain them was an exercise in confusion.

It led to some entertaining code reviews. "Michelle here talks to Nancy about Francine, and then Ingrid goes through Francine's purse to find Stacy." This described a method (Michelle) which called another method (Nancy), passing an array (Francine). Nancy iterates across the array (using Ingrid), to find a specific entry in the array (Stacy).

Sten lasted a few weeks at the job. It wasn't a very successful period of time for anyone. Peculiarities aside, the final straw wasn't the odd personal habits or the strange coding conventions- Sten just couldn't produce working code quickly enough to keep up with the rest of the team. Sten had to be let go.

A few weeks later, Barry got a call from a hiring manager at Initrode. Sten had applied, and they were checking the reference. "Yes, Sten worked here," Barry confirmed. After a moment's thought, he added, "I suggest that you bring him in for a second interview, and have him walk you through some code that he's written."

A few weeks after that, Barry got a gift basket from the manager at Initrode.

Thanks for the tip

Sten did not get hired at Initrode.

[Advertisement] Otter - Provision your servers automatically without ever needing to log-in to a command prompt. Get started today!

Updating The Single Most Influential Book of the BASIC Era

By Jeff Atwood

In a way, these two books are responsible for my entire professional career.


With early computers, you didn't boot up to a fancy schmancy desktop, or a screen full of apps you could easily poke and prod with your finger. No, those computers booted up to the command line.



Back to the Bordelais

By Jon North ([email protected])



We'd been planning our late November mini break westwards for several weeks.  So at the end of the month we settled into our comfy hotel in Cadillac, after the first of 3 wine visits we'd planned. This was our first to the Entre Deux Mers area north of Langon.  I'd chosen from the Guide Hachette an old fashioned unpretentious château deep in the countryside near the tiny commune of Mourens, vines all around. Magnificent autumnal colours, staked vines across the rolling hillsides all around, a friendly welcome despite our lack of advance notice from the mum who showed us round and provided the wines for tasting, and her two winemaker sons who popped in and out to help it all along. And what wines! All at under 7€ a bottle, a sumptuous white Entre Deux Mers ‘haut Benauge’ and a very well-made red 2014 Bordeaux Supérieur. 

The following day, Wednesday was one of two contrasting but geographically closely linked visits to winemakers we’d met on previous occasions in the Bordelais. The morning we were in Ste Croix du Mont to meet Geneviève Ricard-Durand, who runs her old family vineyards, Vignobles Ricard,  with her husband. The Château de Vertheuil is one of 3 domaines they run, and though there are whites (dry and sweet), here it is the reds which are of special interest - the merlot-dominated Vertheuil was most appealing but we plan to contrast all 3 domaines in a future tasting. She also has a dark pink clairet we bought to try later : I really like this style of wine in the Bordelais, which we’ve found also from Spain’s Ribera del Duero region (as Clarete).  Although we had no time to visit them this time we had good memories of the incredible oyster shell cliffs in the village.

But in the afternoon it was the liquoreux (botrytised) whites at Clos Jean in nearby Loupiac which were stunningly presented by the proprietor (M Bord I think - the enterprices is certainly Vignobles Bord) a charming man whom we’d previously met in the Maison des Vins in Cadillac. The final tasting he offered us, not on sale, was a fabulous 60-year-old and amber coloured Loupiac which lingered long on the palate after our visit. We headed home with heads full of good memories and a car quite well stacked too!
 Several things struck us - first, the prices which were almost all modest (apart from the older sweet Loupiacs which rightly carry a higher price), far from the inflated ones Bordeaux often evokes.  Then, the lack of pretension and  the warmth of the welcome we had in all three domaines, all of which were family concerns.  And then the beautiful autumn colours all around, which I hope these photos convey.  After two wonderful days the rain set in as we drove back with a care well-stocked with the spoils of our trip.  We and many of the family have sampled these wines over the Christmas week.

Christmas with family

By [email protected] (Jon North)

 It is wet in Derbyshire.  Happily the warmth of our family more than makes up for the rain and gloom.  Our first trip outside France for two years has been a success so far.  In this Covid chaos that is far from certain.  Elvire and Edmond the dogs are well cared for during our absence in the kennels we know and love nearby - the owners are professional breeders of hunting dogs  and know how to treat animals.

This blog is again in the format people are used to, although the content would be the same if I sent it in an email.  This way though the photos can be put alongside the text.  There is a little repetition of the email I sent before Christmas but this is a different slant just as the year finishes,

Before we set out from France there were formal things to go through.  We were well ahead with out 3 vaccine shots, but the forms and timing of following the regulations needed careful attention.  One thing I realised early, since France and England have different requirements, is that you should always follow official advice for the country you are travelling to.  Lots of Anglophone people in our area get dodgy information from their French pharmacist about the rules for travelling to England.  Then, several things cannot be done until 48 hours, sometimes 24 hours, before the moment you get on the train or board the ferry.  But having taken our virus tests, booked the one we needed just after arrival in England, and filled in the tracker form the UK Govt needs, we set out to drive to Calais and the tunnel.

Misty Wirksworth  





The Tunnel terminal was nearly deserted, and the people at the border checks were not really worried about the pile of  Covid and immigration documents we had slaved so hard over.  So after a trouble-free journey and some carol singing in Walton we drove north to a fortnight shared between sons Jeff and Sam and their lovely families.


As we approach the end of 2021, among all the festivities several of our plans this week have been disrupted by Covid, and although we ourselves are still well an unexpectedly closed restaurant kitchen and a cancelled evening with friends in Wirksworth have reminded us (if we needed it) that learning to live with the virus is  still tricky.  After new year, when we'll move back to Jeff's, we have to complete the formalities for our trip home, and although French regulations are different in detail, we need to be sure we have all the checks and paperwork in place. But before all that we shall need to look behind us as we go to the panto  Beauty and the Beast  at the New Vic, Stoke, Fi's place of work.  We are very proud of her as always.

And there are serious things afoot in the wider world. We have mourned the death of some of our own friends in the past year, and I have been moved this week by that of Desmond Tutu, whose life and striving for peace and reconciliation led him to confront injustice again and again.  I've chosen pictures and one of many, many articles I've seen to honour his memory.  A great and unique man. I've also found a tragic story of a refugee family to mark one of the great injustices of our time, the death of people in inadequate boats at sea as they try to reach a safer place - a preventable horror. 

There are so many difficulties around us, and yet we - Mary and I and our lovely family - have mercifully survived to enjoy a great festive time together.  This is to wish you all a peaceful and positive new year 2022 from us all.  No snow here yet - we just hope it keeps away from the roads we shall be driving back on next week.

A quiet October

By [email protected] (Jon North)

After the short stormy interlude, autumn is drifting in with sunshine across the garden, late flowers (these are pomegranate or grenadier) and ripening fruits (these from our always productive kaki or persimmon - the tree is known as a plaqumenier).  Although things are becoming more active in our lives - choir reorganisation and Anglophone library stockchecking on the horizon for me, and lots of cello practice for Mary - it is a tranquil time, so I have mainly photos to share this time on the blog.

Canalside walks are regular pleasures in the sunshine, reflections from the water, and various exotic plants along the streets.

And when activities are over, there are always messages to catch up with, and things to watch and listen to on tv and podcasts.  Elvire and Edmond in attendance!

It never rains but it pours

By [email protected] (Jon North)

Tuesday's very local storm - we were driving towards Calvisson at the time!!

I started this post last Tuesday morning, a couple of hours after one of the most spectacular storms I can remember.   We had set out for our Tuesday conversation group in Congénies, about 20 km away, and it had just started to rain, but thunder and forked lightning were soon overhead.  By the time we'd travelled over halfway the heavens opened even more and we were forced to stop, with rain lashed by high winds and bits of ice banging the car.  After about a quarter of an hour we decided to turn back and barely made it past bad flooding in several dips in the road, including back in the centre of Lunel, but as we arrived home the rain had all but stopped.  The power was off but thankfully just via the house trip switch and now everything is back on and calm reigns.  Others who had hoped to join us for the morning set apologies, luckily having cancelled their plans sooner.

It was the beginning of a few days of wet weather - 95 mm of rain all told - but above all (seeing the reports of hundreds stranded in their cars and washed sideways by the floods very close to our point of turning round) we feel very lucky to have escaped any bad consequences.  Now the sun is shining again.  We are also lucky to live surrounded by large gardens so that water mostly drains away quickly.  This area is notorious for severe floods from the rivers that flow down from the Cevennes, but the rain that falls actually on us causes problems for a few hours then sinks away.  No thanks to drains in the past - generally they have not been a high priority in towns around here because rain is relatively rare - but more recently they have started to install adequate drains.

We were glad to be back safely because Mary had her latest eye operation that afternoon.  After 2 successful cataract ops, this one was to lift her eyelids which had begun to hood her vision a little.  She thought this might count as cosmetic, but he surgeon assured her that is was medical need and so can be covered by the usual health service provisions.  The procedure was successful and, once the bruising fades, will be a real improvement.  Once again we are grateful and impressed at the quality of health care here.

We had just returned from a wonderful birthday trip to Burgundy.  Of course this was partly about wine, and probably will feature in the wine blog in due course.  We stayed a few nights in a really nice hotel in Vougeot, visited Beaune, saw winemakers we know well and had an impromptu drive across a very rural part of the countryside away from the vines after a friend we'd hoped to see was in hospital for a heart emergency (she's thankfully recovered now).  She lives near Châteauneuf, NW of Beaune, pictured here.  Altogether an enjoyable trip. 

La rentrée chez North

By [email protected] (Jon North)

September, and the internet in France is as ever full of ads for school goods - French students are obliged to stock up on a whole list of supplies, and stationery businesses and supermarkets alike want you to believe that theirs are the best pencils, calculators, school bags or whatever at reasonable prices.  For us older folk, it is a time when all sorts of activities restart - in the next three weeks my choir, Mary's chamber music and cello lessons and our SEVE network (which includes our Tuesday language groups) all restart and the Anglophone Library in Montpellier reopens.  And we need to check our diaries more often to avoid missing appointments in a still uncrowded week.

An old library layout now being changed
The latter is now under new management after the kind of enforced committee reshuffle I was familiar with in England - old hands and practices became creaky and cracks showed in organisation.  Inevitably (as a retired librarian among other things) I have been drafted in to help, but it is a pleasure - I have already staffed the library on a few of its twice weekly openings - and there is a big job to do in reviving and broadening the book selection process.  These days I do most of my reading on the Kindle, but I still have an affection for physical books.

This blog has often been about health.  As I write Mary is at the ophthalmologists for a checkup following two apparently successful cataract operations.  When cleared she has promised herself new glasses, though her consultant says the prescription has not changed much.  I meanwhile am on a plateau of manageable pain with my new doctor (a 4th in a year following our surviving Dr Cayla's retirement) trying to persuade me that too much painkiller is poisonous.  I don't really need convincing, and it's quite interesting to find out how little gradual reductions in doses changes things.

Twin dogs Edmond and Elvire have just celebrated their 12th birthdays.  They are in good spirits and health, now that we have sorted out Elvire's bladder problem - I need to take her for a quick pee in the middle of the night, which is really no problem since I wake often anyway and get back to sleep easily enough after the brief foray.  I'm gradually returning to normal after I recovered from my broken arm at the beginning of the year.

We had a nice moment today. I was anxious over the past week because our 🍷 cooling system had broken down and over 200 bottles were (still are) at risk in this hot weather. I could not for the life of me remember who had repaired it last time - it ran faultlessly for over 9 years then, after repair, another 5+. Anyway, Mary phoned Languedoc Depannage, who mended our dishwasher a few months since, and lo, it was them! The very nice lady instantly knew about the last repair and understanding (as people down here do) the dangers of cooling failure for wine stores, is sending one of her nice young men to look this afternoon, estimate tomorrow, repairs on the horizon. Service is not dead!

Something lighthearted to end with. We are off to celebrate our own birthdays in Burgundy for a few days!


New discoveries and old friends

By Jon North ([email protected])

At the Mas de Bellevue above Lunel to the north

I've nearly begun this post several times over the summer.  I do so now in memory of my recently deceased friend Alan Byars, married to Mary's cousin Barbara.  Although he made his money from another liquid, oil, this larger than life Texan shared my interest in wine and encouraged me to revive this blog when we met over good glasses whether in New Mexico or the Rhône valley.  He was an atypical American, (many I know don't even have passports) having lived and worked in Europe as well as in the US, and he and Barbara shared many holidays with us in England and in France as well as America.

Last time I wrote of our winter excursions into Spanish wines, and we have continued to enjoy the fruits of  our discovery of the Barcelona wine merchant Decántalo whose deliveries and service are very good.  Now I want to write a little about more local wines, which of course have been at the heart of our enjoyment of wine since our first excursions to France in the 1990s.   Our most recent discovery has been a wine truck, a motorised market stall that turns up at markets and evening events in Lunel and other local towns.  It's based near the Pic Saint Loup, one of our best-known local appellations, which can be seen (as here from the Mas de Bellevue) on the horizon from many places around here, and it's called Dégustez Sud, run by a nice couple who spend a lot of time picking out good wines from small producers across the area from Spanish border to the Rhône.  The wines are not necessarily cheap, but this is largely because smaller producers have higher overheads than larger-scale winemakers.

So far we have tried two whites, Folio, a grenache gris from Collioure near the Spanish border and a Mas d'Amile terret blanc, neither cheap but both out of the ordinary and enjoyable.  White wines can be more expensive than run-of-the-mill reds despite the generally shorter making time, because the process has to be cleaner and more temperature controlled.

Pleasant evening outings into Lunel to try wines from Dégustez Sud, the second with oysters for Mary!

Terret used to be a grape only used for fortified apéritif wines like Noilly Prat, but recently some delicious dry white wines have been made from this grape, and one from the Domaine de la Fadèze near Mèze has long been one of our favourites.  Interestingly, in a comparative tasting of that and the Amile wine the other day, we both preferred the cleaner, lemony Fadèze to the more recent discovery, and it has the benefit of being less than a third of the price, but that may be partly because we go to the producers for the Fadèze.  They make a range of red, white and rosé single-variety wines, all at very good prices.  

I'm ending with a few of the labels of recently enjoyed wines - 2 from the Rhône valley, a 10-year-old Beaumes de Venise from the left bank of the Rhône, in perfect condition from Durban, one of the first producers we visited there and the other from the right bank, the newere additions to the Rhône area in the Gard, in fact near the Pont du Gard and so named Domaine de l'Aqueduc.   And 2 from the Rive droite of the Garonne, one of the good sweet wines opposite the great Sauternes châteaux, and a very good Entre Deux Mers white from our good friend Jérôme whom we met recently in the Drôme, another proof that good white wines can keep for several years.



Les vacances continuent

By [email protected] (Jon North)


in the Drôme near Crest

Last week we went on holiday.  Since we can only now start planning trips to England, our current breaks are in France, and this trip was to the area we know well on the other side of the Rhône.  In fact it was the twinning link with Die that pulled us towards France from 1992 onwards, and over more than 10 years we visited the area 2 or 3 times a year.  We made friends there, and gradually got to know the neighbouring areas of Provence to the south and then the Languedoc further west, where we eventually decided to live.

Die is mountainous, and we prefer the flatter lands to live in, but we love revisiting our old haunts and discovering new bits - this was our second visit to the Crest area, between Die and Valence.  We found a simple comfortable gîte and drove around to Die, Châtillon-en-Diois and Saint Andéol-en-Quint (also an early holiday place for us, the first place we took Sam to, and where other ex-Wirksworth friends have now settled), and combined some gentle tourism and a bit of wine buying with visits to several good friends.

The countryside south of Crest and towards Saillans is dominated by an extraordinary mountainous area, a kind of long oval with forest in the centre, the forêt de Saou.  The mountains culminate at their eastern end by the Trois Becs, peaks visible from the A7 motorway as you approach from the south.  Jérôme, whom we welcomed to stay with us in Wirksworth in the 1990s and who now lives and works in Germany, invited us to eat with him in the little village of Saou, only 10 minutes from our gîte, which has a slightly alternative air and was humming with post-covid enjoyment the evening we ate their with him and his son Oscar.  It's a centre for walking and climbing, and Jérôme has known the area well since his youth growing up in Châtillon.

We were delighted to be able to visit Jérôme's parents Pierre and Michelle during our holiday.  Pierre was the percepteur (tax official) in Châtillon while Michelle was a teacher - over the years we stayed several times in their flat over the trésorerie and, when they retired, they built a house in the village righ on the little market square, the Champ de Foire.  they had both had covid but luckily were not too seriously ill.

We spent a morning wandering round Crest and had lunch in a pleasant restaurant there.  The tower, a former prison, is a landmark in the area, and we also visited Die itself, and spent some time with Krys, one of our oldest twinning friends.  On our final evening we also visited old Wirksworth friends Clare and Alan who moved to the area permanently after retirement - a very good evening meal in their garden in St Andéol, but the storm that accompanied our drive back to the gîte was not so much fun!  The links forged by twinning have stood the test of time.

the 7 deadly sins carved on a building in Crest - sloth, pride, envy, wrath, avarice, gluttony and lust

The Tour ends and the blog returns

By [email protected] (Jon North)

Photos mostly of skies and garden to accompany this blog post

I'm glad to sit down and write again after some weeks taken up with following a fascinating Tour de France.  The news is full of Covid still of course , but now mingled with every louder cries of freedom, of liberté and of the irrepressible French need to protest, so that although France is much more controlled than the UK Macron, is seen as a dictator denying people their rights.  The latest manifestation of the gilet jaune mentality - I prefer the cycling version.

Our view of 'getting back to normal' is coloured by ever-closer knowledge of the dangers of the pandemic, most recently when Mary met our friends  Daniel & Josette in the street last week.  They were among the first French friends we made through casual meeting at a musical event soon after we arrived, and both have had their share of health problems, but recently Daniel came close to death through Covid, and it is a great blessing that he recovered.

Vaccination was a concern for us in the late spring, but thanks to help from our doctors' practice we both had appointments and double doses fairly promptly and now have all the QR coded documents to confirm it.  We are now also legitimate residents of la belle France.  My permit arrived by post soon after our February interviews at the Préfecture, but we are grateful to another French friend (again since the early days of our arrival here): he works for a mairie, and Mary was convinced that council officers did not have to flounder in the labyrinth of internet contacts and phone queues to be able to phone up and chase her application.  He told us afterwards that it had taken even him several attempts to get through to the right person, but within a week or of his calls Mary had not one but two appointments at the Préfecture in Montpellier, and now has her card.

On the home front I've sold my bike, which gave me over 10 years of enjoyment.  I still enjoy riding in
theory, but feel a little uncertain of my balance since my accident so have decided to get my exercise by walking or daily sessions on the static bike I have.  A pity though that I'll not get to ride the two new cycle routes from Lunel, to Marsillargues and to La Grande Motte - maybe I'll hire a bike sometime and ride them.  That and the cross trainer I also use most days have confirmed their excellent value compared with gym subs, especially since they are on site and I can choose my own music or podcasts.  Podcasts are a never-ending source of interest and variety - I'll do a round-up of our favourites during the summer.

The man who bought my bike is our gardener and handyman, M. Beaumann, introduced to us by friend Dawn who lives the other side of Lunel, who has just built our new shed to replace the ramshackle one I put up soon after we arrived.  He cleared the bottom of the garden and put up a new fence too, and although we wondered if we'd lose privacy, in practice it has been a real improvement to the garden, and an old vine and bamboo in pots have rapidly made the boundary green again.  I enjoy the garden at night as well as during the day because I need to take Elvire out for a pee in the early hours, and on one occasion she took a time to perform.  One of the neighbours must have seen me and called the police in case I and was an intruder - when I got back inside I saw blue flashing lights cruising in front of the house, but they must have had a good look and decided I belonged here - they just drove off and we heard no more.

Our Tuesday language groups are starting again - we are hosting tomorrow - and it's quite strange getting back into a rhythm of meeting and learning, but we really enjoy seeing our friends French, English and American plus some other Europeans!

In a week or so we are looking forward to a holiday in the Drôme, near our old twin area of the Diois - a gîte where dogs are allowed, and our first time away since we visited Nigel & Elizabeth.  Of course we still have no idea when we'll be able to travel to see our family and friends in the UK.  We're just beginning to plan other trips around France, not unconnected with wine!

By [email protected] (Jon North)

After a beautifully sunny start to June, his week in Lunel has turned muggy and grey.  Little rain though, despite rain and storms all round us.

The blog is back. Not really a break but a lazy delay in putting together this next post.  That means there are plenty of pictures to share, and the news here is that we have a new garden shed - our friendly workman M. Beaumann is just finishing the concrete floor as I write.

The first pic shows the old and very ramshackle shed, which lasted nearly 15 years.  You can see the tortoise in front of her little shelter in the second photo

Last week we paid a welcome visit to our friends Nigel & Elizabeth near Narbonne.  Four sets of photos, one of the river Aude near their house, seen during our dog walks, and three others at Narbo Via, the new and impressive Norman Foster museum on the outskirts of Narbonne.  This town was the commercial centre of the Roman empire in France, but without the monumental buildings of Nîmes or Arles.  So the remains had to be reassembled from the later buildings into which they'd been incorporated, and the main display is a kind of giant library of stone carvings.  Foster, we think, has done France proud!

This summer the town has come to life a bit more with brightly coloured animal sculptures

Finally the garden continues to provide colour and interest - this time from lilies and (ornamental) pomegranates as well as ever-changing light on our own sculptures.

A month of holidays

By [email protected] (Jon North)

I begin this blog with a boast about our wonderful daughter-in-law Fi, who has just been awarded an honorary doctorate by Keele University.  Here's the announcement, excellent news for the theatre too because her colleague Theresa also received an award as you can see.  The New Vic has just reopened after a long layoff - in France too, culture and arts are tentatively coming back to life, and choral singing is not lagging behind - we hear that in England it has still been singled out as especially risky

May in France is, it seems, stuffed with holidays.  It is not the first time I've commented that many of these are Catholica, Christian, religious festivals - as I write this Monday afternoon we have the Pentecôte holiday, what in England would be called Whit Monday.  Years ago when our new library, the médiatheèque, opened to fanfares (rightly) and soon afterwards the town announced that it would be open on the first Sunday of each month.  That year, the first one, the first Sunday of April was April, was Easter Sunday and - guess what - the Library was closed!  France will continue to honour its Catholic heritage but inconsistently refuses to acknowledge equally other religions such as Islam.

I was intrigued this week by this piece by Duncan Campbell about Bow Street on its final day as a functioning court.  On that day in 2006 he was a member of the press bench  "I still have my pass). A young woman, arrested for posting advertisements for sex workers in telephone boxes, was given a conditional discharge and ordered to surrender her Blu Tack. A businessman facing extradition to Germany for a £14 million fraud case was remanded in custody. Two Kosovans were accused of paying £4000 to buy a Moldovan woman from an Albanian gang in a deal agreed in a pod on the London Eye. They denied forcing her into the sex trade but were rejected for bail because false documents had been found at their home. A young Londoner who had stuffed £200 worth of Marks & Spencer lingerie down his trousers was remanded for reports.  At last, the list-caller, Angela Georgiou, told the magistrate, Timothy Workman: ‘With sadness, I call your last case ever at Bow Street, sir.’ The honour fell to a 32-year-old Scot from Kirkcaldy, who had breached an Asbo (Anti-Social Behaviour Order) – he was found in possession of a bottle of red wine and some lighter fluid – and little knew that the hand of history had landed on his collar the previous night in the Covent Garden piazza. It was his fifth visit to the court and he pleaded guilty. ‘The closure of the court, with its great legal heritage and its history,’ Workman said, ‘is of great sadness to me and to all who are associated with this court.’ He was the 33rd chief magistrate, a role once held by Henry Fielding, who presided over the first detective force, the Bow Street Runners."  All that was happening the same year, 2006, as we moved to France.

I read a lot, and am frequently caught up in discussions about tablet (Kindle or iPad - I have both) vs the traditional book.  Lots of things jostle for importance in my mind.  Librarians like me were constantly surrounded by books, arranging them on shelves and keeping them by the bed or armchair.  I love our shelves of books, and know most of them pretty well.  So although the electronic formats are less evocative, but more practical for two reasons.  One is often the sheer size and weight: reading in bed holding a large heavy hardback is a struggle, but my Kindle has one other advantage I've come to appreciate reading in French - I can click on a word I don't know and find its translation instantly.  And since we are now of an age when we have to start thinking of downsizing, getting rid of many metres of shelves may in future be a necessity though not yet!  The seemingly limitless capacity of a little Kindle to hold a library of books, and its ability to search for characters whose identity has been forgotten, are great assets.  And, living in France, our regular periodicals like The Week and The London Review of Books arrive right on time.  Mary nevertheless prefers to wait for the paper versions a few weeks later!

We are constantly reminded of litter and waste.  As a dog-walker I  see the endless trail of muck and litter (and of course picking up our own) on the daily trips round the neighbourhood; and of course we have to keep track of regular council rubbish collections, feeling pleased that our own local refuse service has widened out its plastics recycling service, but at the same time wary that we don't really know what happens to the sorted plastics, tin cans and card we throw away.  There is a relatively new, large incinerator in the next village, not at all liked by people living there but clearly it has to be kept busy so one always wonders if some of our waste is not recycled but burnt.  All the same our local authority makes big efforts to encourage us to recycle and has special collections for metal and large electronic items etc - our old computer printer has to be disposed of soon.  And also, the local paper is regularly full of stories and pictures of fly tipping in town centres.  Not a simple process to manage either for us or for the authorities.

My next blog will include a tour of the garden, much changed since our arrival 15 years ago.  The photos each time often chart its simple pleasures, and in the glorious weather we've been having it is a constant joy to watch things growing and glowing.

By [email protected] (Jon North)

May brings looser travel restrictions in France.  The 10 km radius we’ve been confined in was lifted this week, although night time curfews still remain, gradually starting later as we head towards midsummer.  This was the second time we’d had to stay within the circle, and after last time I lost the map, so I am keeping it to hand this time in case it pops up again!  As you can see it would not quite take us to Aigues Mortes or Mauguio, but St Christol was within range, and a corner of the Étang d’Or for flamingo-spotting, but no seaside – our nearest at La Grande Motte is at least 12 km away.

bye bye to one restriction
My life has been disturbed recently by Elvire the dog’s problem of peeing during the night.  It’s easy enough to deal with since we have tiled floors, but it has meant getting up early.  But she seems in good spirits all the same, and our vet has now diagnosed a hyperparathyroid problem which will need surgery – a delicate operation but one which will have to be done, so we are in touch with a surgeon.  Here’s the explanation if you’re interested.  We spend quite' a lot on vets' fees and treatments, but we feel very pleased to have two happy lively dogs, good companions who give us both cause to take a little more exercise than we otherwise might.  The tortoise at least (sadly only one who appears twice below - they are I keep reminding myself they are wild animals and the other escaped more than  a year ago)

As France approaches regional elections, and Presdiential elections are on the horizon, the perennial question 'will the far right make significant gains?' resurfaces.  President Macron is not popular everywhere and tries sometimes to face both ways.  Since France is celebrating the centenary of another controversial leader, Napoleon, this cartoon caught my eye.

Consensual commemoration of Napoleon - the rift between left and right is so out of fashion

Finally a couple of quotes from The Week:  'America innovates, China duplicates, and Europe regulates' (quoted in The Daily Telegraph); and 'At every party there are two kinds of people – those who want to go home and those who don’t. The trouble is, they are usually married to each other (Ann Landers, quoted in the San Francisco Chronicle).  

Despite gradual easing and more vaccinations, there's not much chance of parties to escape from just now...

Animals, an Amelanchier and the wider world

By [email protected] (Jon North)

This weekend the French Covid restrictions will start, cautiously, to be eased - from Monday the 10 km radius for our journeys within France will be lifted though the evening curfew will only be lifted bit by bit.  That affects me taking the dogs for their late evening walk (for which I must carry an attestation until mid May - our shopping lists are written on old attestations for the moment!)  

Our lives have not varied much, but this week we bought a new garden tree/shrub/bush from a newly-discovered nursery not far from here.  We wondered if Amelanchiers, which we had in English gardens, would survive our hotter, drier climate, but were reassured by the man in charge of our excellent local arboretum and by the nurseryman., so our new little bush is proudly in the middle of the lawn near the tortoise enclosure and, lo, just as Mary was planting it the tortoise emerged muddily from her hibernation!  A week or so later than last year, but it is really good to have her back in view.

article about children reading more in lockdown in the Guardian offered me a moment to take notice of the everyday, and to be thankful that my mum encouraged me to read and use the public library. Reading is invaluable, and makes little noise in a time when many media are incredibly noisy. But laughing out loud was, I recall, still risky in my childhood: reading and enjoying Just William books under the bedclothes caused me occasional parental censure, especially when I disturbed the Quaker study groups downstairs! I try to ignore extraneous noise, but it drives me bonkers when someone's Facebook post unexpectedly bursts into speech or music - better to invite sounds in rather than have them blast out without warning (occasionally even waking a sleeping partner at night).

As we continue to mourn the lost opportunity to travel to Armenia again (it would have been a year ago) we take an interest in the terrible difficulties of the people in that tiny country for the sake of our friends there, and one of many good things coming out of the new USA last week was the announcement that President Biden formally recognises the  Armenian genocide.  It is incredible that (kowtowing to Turkey) they have been so slow to acknowledge such a blatant historic human rights abuse.

And among the fairly petty concerns people in the UK and Europe worry about, the appalling situation in countries further away, hooked into hard-line political agendas and too poor to afford the vaccines and treatments, even adequate health services, to cope with a flood of infections.  The people of India are in a profound crisis, somehow in scale with the terrible disasters and episodes of violence in the country’s history. European countries, and the US, have dithered and made false steps - I think we have to remember how fortunate we are. But political dogma and rigidity will always cap ineptitude.

Not my photo, but a beautiful shot of a vine near Pic Saint Loup which survived the recent frosts
Back to plants.  My normal shots of plants are pretty, but these have a whole different focus, and great importance for the future if you’re a wine lover. Looks rather more demanding than your average day in the garden!

At the St Christol Domaine de Coste Moynier

I have good memories of Glendurgan in Cornwall so am delighted to see it at the head of this article, as I am to celebrate spring flowers and blossom everywhere. But this campaign seems to have created a new kind of tree, a ‘blossom tree’. Not sure what that is - most blossom is a transient pleasure on the way to some fruit or other, or in cases like our beautiful grenadier, not due to flower for a month or more yet, categorised as flowering or ornamental trees or shrubs. Ah well, living language...

Podcasts are now a frequent source of information and entertainment for us, and one from the Guardian caught my attention last week - a real-life clown.  Have a listen.  Police spies seem to have been on the radar for ever. I read the book Undercover at least 10 years ago, and it seems to be trickling throughthe judicial process just now.

It turns out a lot of my preoccupations are UK-related - somehow they are more spicy than the French ones I can disentangle!  May day, the fête du travail, is tomorrow, and it has just been announced that the traditional lilies of the valley will be able to be sold, though there are Covid restrictions on roadside sales and it turns out that some of the flowers on sale beside the road are stolen in the first place!

More on words and language

By [email protected] (Jon North)

Our house with its tall conifer - a landmark for those lost around the neighbourhood!

I love maps, but not always on the internet - atlases and other printed maps often seem more satisfactory although less searchable.   You can see from these two maps from the Petit Larousse (too heavy to hold for long, so useful transferred to a screen) that Lunel is right at the eastern edge of the Hérault département.  So many places in the Hérault are actually a long way from us, and many of our contacts and meeting places when we can travel are in the Gard which wraps itself round the right hand side of the Hérault.  Most départements in France are named for rivers - the Gard is unusual in modifying the river name (Gardon), but in any case many rivers spend a lot of their lengths in other départements.  The river closest to us is the Vidourle which is notorious for its floods, every 25 years or so, which forms the eastern border of the Hérault with the Gard.

A scene in our garden some years ago for a lunch after our Tuesday French conversation group. The garden has not changed much but even before the pandemic the personnel has, several of these people have departed from our group in various ways, and there's little chance of gatherings like this again in the near future.

Our life here revolves round the non-stop process of learning French.  After nearly 15 years we've made a lot of progress, but it is still a minefield and equally a source of constant fascination.  There are two dimensions - one, the many-faceted business of written French (easier because you can usually go away and look it up) and spoken French which can vary both in speed (you discover that English people too seem to rattle away too fast) and regional accent, to say nothing of the difference between slang, jargon, technical vocabulary and formal statements.  We have found the Government press conferences models of clarity (even when the news is unwelcome) as are magazine tv shows like the excellent travel magazine programme  Des racines et des ailes, but catching chatter among friends is often difficult, as if speaking and hearing on the phone, especially when you don't know in advance the topic of the call.  Sadly we have all too little friendly chatter at the moment.

The first poppies a week or two ago

The issue of sexist language is very topical here now.  France is some way behind the English-speaking world in this, partly because of the additional complexity that all nouns have gender, and historically because of the Académie française which has for centuries laid down the law about what is correct and incorrect.  Now inclusive names of the 'man includes woman' kind are much less common - names of professions (professeuse as well as professeur, for instance) have increasingly been feminised since the 1980s and mor recently there have been official circulars defining how inclusive pronouns like 'he or she' should be written - I have always tended to use / , but one hotly debated method here is the use of the point médian, a kind of decimal point when for instance masculine and feminine endings are indicated, for example professeu·r·se.  As with much to do with language in French, this gets rather complicated (just typing the thing is complicated enough!)

Such cultural debates are often long and heated - a supplement in Midi Libre was headed to "cette écriture qui divise tant" and referred to a veritable (ardente) battle of Hernani - what on earth is that?  Well, it's a reference to a play Hernani by Victor Hugo (the name is from a Spanish town).  It became notorious for the demonstrations at its first performance between the romantics (Hugo had Berlioz and Théophile Gautier, poet of Les nuits d'été' among his champions) and classicists who saw the play as a direct attack on their values.  Verdi also wrote an opera, Ernani, apparently.  So passions were roused then, and people today recognise the reference nowadays well enough for it to be used in a local newspaper.

Clearly understanding culture, popular or not, is a complicated process.  Meanwhile, we listen to frequen official press conferences on Covid as much to hear the very clear language ministers and officials use as to keep up with the latest information.  Restrictions in movement are to be eased, and in any case we have now both been vaccinated, but our lives are quiet and the chance of travelling to England is very small just now, so sadly our family and friends there remain at the end of phones and video calls.  This week the physiotherapist, Emma, who has helped me through over 3 months' healing of broken arm is leaving for her next placement, working with children in the hills somewhere.  I'll miss her, but of course the team practice she works in will provide me with a replacement.  And April continues to bring mostly beautiful weather.

Roses starting to show in the front yard

Solemn news, and, What's in a name?

By [email protected] (Jon North)

National figureheads aged all but 100 do not die often, so the passing of Prince Philip deserves more than a mention.  ‘Figurehead’ is an apt description for this naval man whose function was mainly ornamental. 

These days my day starts early, since Elvire the dog needs letting out.  This Saturday the usual selection on Radio 3 (and I’m guessing all over the BBC) was replaced with nearly continuous music which is not disagreeable.  It leaves space for reflection - I’m not a royalist but I think the mood was right at a time of national mourning following the death of Prince Philip at a venerable age.  For my friends who already think there is too much fuss about posh people in the media, I find the response of wall-to-wall music ideal.  And despite the increasing rarity of chimney sweeps, I recall Shakespeare’s verse

Thou thy worldly task hast done,
Home art gone, and ta’en thy wages:
Golden lads and girls all must,
As chimney-sweepers, come to dust.



Here are the 20 top names (boys and girls, 40 in all) registered in Montpellier over the last 20 years.

Local expats (people like me, but I don't share their views!)) commented that the names were ‘not very French’.  But two things strike me – the people commenting are probably much older than the people (many being parents of the new babies) who chose the names, even if not as old as me.  One comment expressed surprise  that Catholic names do not figure more prominently – but France is a secular state and prides itself on its republican values, even though saints’ days still figure on all published diaries and calendars, and many public holidays are still church hangovers. 

 So yes, we live in a very contradictory country!  Second, saying things are not very French is a bit odd, since they are by definition French choices. I find the absence of more north African names a little surprising given the significant proportion of families of north African  origin in the area.

Among the podcasts we’ve listened to recently is Tim Harford's Cautionary Tales.  These are really good at adding a dose of reality and realism to the mad hype of modern life.  As well as reality checks on the pandemic, his subjects range from the Charge of the Light Brigade to Harold Shipman, and art forgery, and much, much more.

Our weekend has also been enlivened by watching two Rugby League Challenge Cup matches - the only French representatives, Catalan Dragons, gave a very spirited performance to win their tie against Wakefield Trinity.  Rugby here is almost all Union rather than the rugby à treize we were watching, but the Catalan team is more or less local to us, and we've always enjoyed watching this form of the game.

Meanwhile the news here has also been full of  grim news of frozen vines and fruit trees - lots of growers have lost their crop this year thanks to at least one night of temperatures as low as -8°C.  Not uncommon further north but pretty unusual here, and thus less likely to be insured.

Vines bursting into leaf near Luc's garden in Aigues Mortes, befiore the very cold weather  

More hopeful signs of spring with our latest dwarf irises

Spanish winter

By Jon North ([email protected])


My encounters with Spanish wines go back to my teens, when my father returned from holiday in Spain (with my mum of course, but I’m not sure if Pam and/or Tom went too) lugging on the train 12 bottles of Rioja.  We have carried many bottles in our car over the years, but on the train with all the suitcases too…  Only my Dad!

More recently it all started in the autumn when Mary sighed that she missed Fino sherry, and we both recalled our love of PX (short for Pedro Ximenes, a grape variety used for sweet fortified wines in southern Spain, and so used in blends with drier wines to make the ubiquitous 'cream sherries' well-known in the UK).  We first encountered 100% PX 20 years ago at Rick Stein’s Padstow restaurant when the dessert was simply vanilla ice cream with a schooner of PX poured over.  

So I hunted idly to try and satisfy Mary’s craving and came across the Barcelona wine merchant Decántalo.  They specialise in Spanish wines but a quick scan shows they have plenty from other countries too – it seems to me to be as reliable and well-organised as the UK Wine Society with the advantage for us that it is just down the road, not in what we have now sadly to think of as a foreign country!

On top of this, this wine merchant packs things in super-safe cartons – we've had one or two disasters with breakages in the past, but bottles really have a hard time getting broken in these deliveries.  We began before Christmas with Tio Pepe Palomino Fino and Gonzalez Byass Nectar PX, plus a couple of  unfortified wines.  One of the first of these we tried was Protos Clarete, a light red or dark pink from Ribera de Duero, an area now quite well-known, top centre/north Spain a bit SW of Rioja.  This reminds me of the light red clairet which is produced in Bordeaux and whose name of course links to the red clarets from there we all know and love.  But the dark pink, or light red, style is distinct there as it turns out to be in Spain.

We also tried 3 Muga Riojas (red, white and rosé), all of them very good – a friend who knows this whole field well says white Rioja is hard to find, and remembering Dad’s samples I was really interested in this – Oz Clarke says white Rioja is a bit of an afterthought, but we have really liked this Muga, so still have some bottles to enjoy!   We then spotted a Christmas offer of 18 different wines, all red,

·         6 from Ribera del Duero (see above – we have already enjoyed these, wines and makers included Juegabolos, Malleolus, Corimbo I, Pago de los Capellanes Reserva, Pícaro del Águila and Astrales);

·         6  from Priorat(wines and makers include Ferrer Bobet Vinyes Velles, Salanques, Laurel, Mas d'en Compte Negre, Planetes de Nin, and Coma Vella) – we are halfway through these and have been so impressed by the  Ferrer Bobet that we have spent a small fortune on some of these bottles to lay down for the next few years;

·         and 6 other reds, 3 from Montsant: (Fredi Torres Lectores Vini Montsant; Sindicat La Figuera; and Orto - we shared the  Figuera wine with friends yesterday and were very impressed), another Rioja: (Diez-Caballero Crianza 2018) and two from further south (Jumilla - SE Spain N of Murcia: Casa Castillo; and from Valencia: Parotet Vermell)

In the huge country of Spain and its many contrasting wine areas, I was surprised to find that two of these 3 appellations are tucked into a tiny hilly area SW of Barcelona: 

Priorat,  which according to Hugh Johnson's pocket guide produces some of Spains finest wines. It's named after a former monastery tucked under craggy cliffs. The key is the slate soil – known as llicorella. 

Montsant, tucked in around Priorat 

The thing to look forward to is a trip to these areas of Spain, relatively close to us although the travel complexities of travel with Covid, national restrictions and of course Brexit remain to be discovered! 


hello i have written about the metaverse and that cursed walmart video that’s been going around

Suburban Chicago McMansions Follow a Dark Logic Even I Do Not Understand

For reasons architecturally unbeknownst to me, the McMansions of Chicago’s suburbs are actually insane. Perhaps it makes sense that Chicago, America’s mecca of great and distinguished architecture would also give birth to what can be appropriately called the netherworld version of that.

For six years, I have run this blog, and for six years I have been absolutely amazed by the formal leaps and bounds exhibited by the McMansions of Chicago’s suburbs. This area is undisputedly the fertile crescent of unhinged custom homebuilding and while I’ve heard other claims made for the gaudy, compact McMansions of Long Island, the paunchy shingled stylings of Greenwich, Connecticut, the Disney-Mediterranean hodgepodges of Florida, the oil-drenched nub mountains of North Texas, you name it – nothing comes remotely close to that which has been built in the suburbs of Cook, Lake, and DuPage Counties. (In the case of the houses featured in this post, nine of ten are located in Barrington, IL, which just might be the census designated place known as McMansion Hell.)

Usually vernacular architecture has some kind of origin point, a builder or a style or a developer one can point to and say, aha, that’s where that comes from. One could argue that the postmodern classicism of a Robert AM Stern or the tory Colonial Revival selections found in the Toll Brothers catalog provided this service for much of the McMansion canon.

However, the McMansions in the Chicago Suburbs are so wildly customized and unique, it is as though each of the ten listed here were in competition with one another to build the most outrageous collage of wealth signifiers imaginable, to the point where their architecture becomes almost un-house-like. The responsibility for their form, owing to the absence of architects, lies solely with the owners and the custom builders who did their unquestioned bidding, who plucked each turret and mismatched window from the catalog after being told, give me that. These homes are the end logic of the “custom home” of the pre-2008 era where nouveau riche (and sometimes old money) fantasies were dropped on whatever massive virgin lot one could afford to hook up plumbing to.

There are two Barrington subtypes I’ve been able to identify that, while not unique to the area, seem to be the only kinds of formal logic uniting many examples. The first I’ll call the Long House, which is just what it sounds like: a once rational house that’s been stretched to comical length-wise proportions:

Theoretically the above house makes sense to the eye. The turrets divide it into a kind of five part vertical rhythm. But the more you stare, the less sense it makes. Why is there a window between the third and fourth turret but no other? Why are there two whole other wings jutting out from the house in two other directions? Were the house not one color, the eye would get lost immediately, and the scale is such that the realtor had to zoom all the way out with a drone just to capture the whole thing in one frame. Besides, what style even is this imitating? French Country? Great Recession-core? (The same could be asked of all of these houses which, owing to their bloated-ness defy and elude even the most half-assed stylistic or historical cosplay.)

In case you were wondering, the turret exists so as to roof a curved secondary mass. A horrible question to ask ourselves is: when a turret is not used, how does one attach the curved mass to the roof? The answer is whatever is going on in the above example. I’m sorry you all have to see this.

The Long House is perhaps best demonstrated in the above particular model, which appears as though it’s not actually real but rather a mid-range SketchUp render. This house actually reminds me of many examples I’ve seen in Bergen County, New Jersey. The first three masses form a logical tripartite facade. The two that are tacked on after that undermine the rest and render it almost comical. Also they’re slightly different from one another. Of course.

The other of the two subtypes is what I call the Tank House. (One also finds turrets on a tank.) The Tank House is, well, shaped kind of like a tank: hulking, with a central protruding mass around which everything else is oriented, often at a strange oblique angle:

Building a house at an oblique angle is kind of an interesting architectural decision especially on a corner lot, but none of these are corner lots - they are large swaths of what was probably farmland unhindered by size constraints. A carport is rather like the firing arm of our tank house, protruding outward and demonstrating a kind of military might:

Often in the Tank House, additional masses are just kind of piled on to the sides because it’s actually kind of inconvenient to design a really big house on a 45 degree angle:

This results in these houses taking on a kind of kaleidoscope effect where they tesselate, spread and converge as the eye tries to assimilate them into something with symmetry, even though the design consistency falls apart at the edges.

And then there’s whatever this is:

Yeah. Sometimes postmodernism wasn’t all fun colors and ironic greek order references. Unfortunately.

However, the Tank House doesn’t always have to involve an oblique angle. What’s unique - other than the oversized central portico - is actually the piling on of the massing into mismatched wings:

Like I said above, architecture, especially “traditional” architecture longs for symmetry, and these houses simply do not have it. They always manage to screw up, shoving some house over there, some roof to that side, as though they’ve started with a central idea and were unable to commit, rather like this post in which I’m wandering around really, really trying to understand why these houses are so damn bizarre.

In the last two examples, you’ll see a central hall punctuated by grand entrance of some kind. But in both cases the symmetry is broken by adding another mass to the right simply because the garage calls for it. It shows a remarkable lack of architectural faculty and imagination to let a garage derail the entire formal logic of the house. It’s lazy. However, the garage is a status symbol in and of itself – perhaps the disruption, the madness, is the point. (In architecture, as in all things, one must remember not to ascribe to malice that which can be easily explained by incompetence.)

This brings us to the last of our examples, which I consider to be among the greatest McMansions to ever exist:

This house took sprawl as its very inspiration, its DNA, its parti. It exists simply to say how much of it there is. It lays on a barren sea of turf grass, is constructed entirely from fossil-fuel based materials, is illuminated by a spurious sky added in post. Everything about it is the pinnacle of artifice, the absence of substance. Even color eludes it - it has traded color for “tone,” for a monochromatic neutrality that even better conveys just how huge and stupid it is. I hate this house, but I also love it, because it pushes the boundary of the medium like all memorable works of architecture do. That’s the thing – despite six years of running this website, every time I think I’ve seen it all, I come back to Barrington, Illinois and find something even my headiest subprime fever dreams couldn’t possibly cook up.

If you liked this post, consider signing up for my Patreon where you can get merch, livestreams, bonus houses, discord server access and more.

Not into subscriptions? Tip me a cup of coffee for my trouble at Ko-Fi.

The McMansion Hell Yearbook: 1981

Hello everyone! We return to the great state of Illinois (where I live) to bring you this wonderful time capsule from DuPage County (where I don’t live but have ridden my bike.) There is actually much more house to get through than in the usual McMansion Hell post so Iet’s not waste time with informalities.


This incredible 70s hangover is served (with a fine line on a silver tray) at a neat $5 million. It has seven bedrooms for maximum party discretion and 4.5 bathrooms also for maximum party discretion but of a different sort. Shall we?

Lawyer Foyer

Definitely thought that the staircase emptied out into a pool of brown water. (I’m sober, though.)

Auditorium-Sized Living Room

Pretty sure this is the most epic hearth in McMansion Hell history, if not world history. a bit of overkill, imo. Anyway, let’s see what’s behind it.

In the late 1970s, society once inquired, collectively: What if “Dudes Rock” was a bar?


This is the most normal room in the house. (This is a threat.)

Main Bedroom

How can something clearly from the 80s have such powerful 2006 energy?

Main Bathroom

This was likely a reno job but master bathrooms did start being roughly the size of my living/dining room a few years later.


Okay. Okay. We’ve completed our tour of the main, relatively normal McMansion part of this house. We are now entering the Sicko Zone, wherein everything gets progressively a little more, well, sick.

(Note: There are more images from the sicko zone but Tumblr only lets me put 10 images in per post so please head over to the McMansion Hell Patreon to see more.)

The Den

Remember late-era Frank Lloyd Wright? These architects dared to ask: What if he sucked?

the horrible room

yeah sorry i need some air.

Rear Exterior

Well, that was eventful. I hope you all enjoyed our little foray into hell. Stay tuned for more Yearbook! It’s only going to get pinker and tealer from here.

If you like this post, consider supporting me on Patreon for as little as $1 a month!

Not into monthly subscriptions? Try the tip jar!

Hello! I finally wrote about the Farmhouse Style!

Note: this piece includes the phrase “the Yeti cooler of houses.”


The McMansion Hell Yearbook: 1980

(back of a quirky literary novel voice): Sometimes, things are not what they seem. An architecture critic disappears for three months to follow bike racing around Europe, rife with questions of becoming and desire. A real estate agent uploads a listing to an aggregator, knowing that it will be a difficult sell but thinking not much of it, for, like Tolstoy’s unhappy families, all houses are difficult to sell in their own way. A house is built in 1980 in Staten Island and would have thrived as an anonymous bastion of tastelessness had the internet not been invented. But the internet had been invented. All of these things are brought together here, through truly unlikely circumstances.

Let’s not bother with the formalities this time.

None of you will buy this house.

Sitting Room

Does anything here make sense? The periwinkle sofa, the twinkling of bronze glass, a truly transitional material, a mall exiting stagflation and entering the sultry trap of Reaganite libertarianism that would leave it empty twenty-five years later. The sense that one is always changing levels, trapped in a landing of some sort, never quite arrived on stable footing. But that’s just the style, one assumes. One foot in the seventies, with all their strife, one foot in the beginning of what felt like the end of history. One’s ass on the iridescent pleather sofa, waiting for the centuries to change.

Sitting Room II

My suspicion is that there are no pictures of the mirrored mystery foyer because the photographer’s identity would be henceforth revealed, and the point of all real estate photography is for the viewer to imagine themselves as the only person in a given space.

Dining Room

The shinier things are, the richer one is, obviously.


This serious sociological research also happens to coincide with the Giro d'Italia, one hopes.


(crediting @cocainedecor on twitter for their term. but also, where can i get some chevron mirrors, asking for a friend.)

Master Bedroom

just asking questions

Bedroom 2

Ostensibly bad opinion that I will nevertheless defend: the corner bed slaps, let’s bring it back.


(Staten Island accent): Hey, I’m workshoppin’ some metaphors here!

Alright, we’ve entertained this monstrosity enough - time to wrap things up.

Rear Exterior

You know, McMansion Hell has been around for five years now, and has coined many terms - an art, ahoy matey, lawyer foyer, brass n’ glass, pringles can of shame - but I have to say, I hope fireplace nipples also sticks.

Anyway, that’s all for 1980 - join us next month for 1981.

If you like McMansion Hell, support it on Patreon!

short lease in a slick machine: a personal essay about apartments

Hi Everyone, you may have wondered where I’ve been for the last few months. The truth is, I, like most people must at some point in their lives, needed to take a little break and figure some things out, needed to go on some long personal journeys, needed to meet some heroes, needed to just not do this website for a short amount of time, but don’t worry, I’m back now, and I’m bringing the feels on the way in.

Before I present this essay, I would like to offer my deepest thanks to the people who kept supporting me on Patreon during this soul searching. I owe you everything.

I’m moving again. I’ve moved every single year since I’d left my parents’ house at the age of eighteen, with the exception of the apartment I had on the second story of a Queen Anne on S. Mendenhall Street in Greensboro, in which I stayed in for two years. The rest of my dwellings have been painfully temporary, with life inevitably coming around to its annual migratory upheaval. There have been many reasons why, of course, quotidian reasons that always feel devastating at the time – jobs, school, pestilence, crazy roommates, despicable slumlords, partners to be moved closer to, relocating just to get away from where one has been before. I could rank every apartment on a scale of worst to best, from most to least livable, but none of them were permanent.

above: the only apartment I ever lived in for more than a year, a sacred place.

I wanted to write about the apartment I’m moving away from in Chicago even though perhaps it’s not prudent to do so – it’s never prudent to be personal on the internet. Don’t worry, though, I won’t include anything incriminating that could be construed as defamation or whatever. You can just feel angry on my behalf, which is really, truly in the spirit of McMansion Hell. And this is, well, apartment hell. The apartment I’ve lived in this past year quite frankly and very succinctly encompasses everything I kind of hate about architecture, about design, about the ways people in the profession are expected to live their lives for the benefit and the consumption of others.

first impressions

When I first saw the apartment, it was the nicest apartment I’d ever been in, the finest I’d hitherto walked the halls of in my rubber Birkenstocks. It was big and full of light, with lovely maple floors, the kind where, at the right time of day, you could sometimes see the tiger pattern emerge in flecks and ribs like those on the backs of violins. When the landlord, an architect, showed it to us, he had his stuff in there still. A Bertoia chair that was probably real. Very carefully selected items from Design Within Reach alongside enough pieces from other places to make the whole getup seem more authentic. Sparse hangings on the walls, each big and well-framed. Single potted plants. A well-oiled cutting board.

There were European bath and kitchen fixtures and recessed lights that dimmed at the press of a button, which meant we could get rid of all of our floor lamps. In the kitchen, tall, elegant white cabinets above a slab of marble, dubbed, reverently at the time, a living material. Blinds on rollers meant no need for hanging curtains. A soaking tub and a Duravit toilet, you know, the floating kind cultured people had. Europeans. The rent was at the top of our budget but still doable. I signed the lease fast, with unbelievable giddy excitement. Finally, a nice place to live after years and years and years in what could only be deemed as shitholes. Shitholes and the nice midcentury apartment building I lived in in DC, but that was a studio and DC was a place I wanted to get so immensely far from that we ended up in Chicago, the only city in America I ever really wanted to live in.

cracks in the facade, so to speak

As soon as we moved in, an unsettled feeling crept in. I can place it now as the sense that this apartment was too nice for people like us – people with particle board furniture and student loan debt. That it wasn’t really ours, we were just borrowing it before someone worthier came. Subconsciously, we knew this. We never hung anything on the walls save for the Mondaine clock my husband bought at the MoMA Design Store and the Giro d’Italia jersey signed by Tom Dumoulin, which I’d had framed. The walls were a blinding white. Putting tacks in them felt like an unlawful penetration. Our landlord fussed over the stuff we had on the back porch. One time he criticized where my husband had situated the soap on the kitchen counter, the living material which, in reality, is just a fancy term for “stains easily.”

All of a sudden, we were living under a microscope.

We weren’t using the apartment the right way; namely, we didn’t decorate or live like an architecture critic and a mathematician theoretically should. Our apartment wasn’t photogenic. There were too many bikes in the living room. We still had a garbage $300 Wayfair sofa that felt like sitting on cardboard. There was clutter. This beautiful apartment wasn’t meant for our kind of ordinary and this was made known several times in subtle and rather degrading ways, after which our lease was not renewed, to the relief of all parties involved. Even if it meant moving again.

The longer I lived in the apartment, the more I hated it, the more I realized that I had been fooled by nice finishes and proximity to transit into thinking it was a good apartment. As soon as we’d got in there, things started to, well, not work. European fixtures aren’t well-liked by American plumbers. The dimmable lights would sputter and spit little blinking LEDs for reasons totally unknown and we’d have to pull a tab to reset them. Everything was finicky and delicate. The shower head, the kitchen sink that fell in two times somehow (which we had been accused of being rough with, an absurd thought – it’s a kitchen sink!), the bedroom doors that didn’t close right, the bathroom door that would trap you inside if it shut during a hot shower. All of the niceness, the glitzy brand names, the living materials were not meant for everyday use, even by gentle individuals like ourselves. They were made solely for looking at, as though that were the point of all habitation.

Suddenly, we were in a prison of design. This was a place for performing living, and we, as normal people, simply wanted to live – wanted to leave clothes in front of the washer as we pleased, wanted to bake cakes that got flour everywhere, wanted to just collapse somewhere and go to sleep, wanted to have a private life not dominated by the curation and fussiness and pressures of taste that govern careers like mine. Our house was always just for our consumption, not that of others. I spend most of my life in the worlds of design and architecture, and to be honest, you wouldn’t know it aside from all the heavy books and the tapered legged coffee table. I never had it in me to turn my house into a museum of my own clever delectations, a proof of concept of my skills as a critic. I just wanted to dwell naively. Off Instagram.

But the worst part of the apartment was that it was designed by someone who didn’t know how to live, couldn’t think of anyone’s world other than the sparse one of the architect who owned nothing save for color-coordinated books and limited edition lithographs. It had all the functions of living, technically speaking, but the way in which they were allocated and arranged made no sense. There were no closets in any of the rooms, just open storage, which only works for people who don’t actually have things. The tub wasn’t caulked to the wall so that it would appear to float, a nice aesthetic effect which made taking showers annoying and perhaps bad for the walls.

Above all, I hated the kitchen the most. The kitchen was basically ten feet of counter space, with giant cabinets extending to the ceiling, far beyond what any normal person could reach without a stepladder, the upper shelves of which being where things went to be forgotten. A sink punctuated the center of the marble countertop – and marble is a terrible material for a countertop. It stains and wears with water. It shows all mess mercilessly. There was a stove and a fridge just, like, in the kitchen attached to nothing. The gas stove had no overhead ventilation and every time we used it we had to open the door so the smoke alarm wouldn’t go off. It was a kitchen designed by people who never cooked: too small, inefficient, laid out in the way it was, like so many apartment kitchens, so that it shared services with the same wall as the bathroom. We couldn’t put anything in the finicky sink to soak so the counter was always crowded with dishes. We had no dishwasher because that would mean ceding the only bottom cabinet that was truly usable.

It angered me, really, as an architecture critic, that this apartment, which had so very much been made to be ogled and looked at and oohed and ahhed over by people of taste was absolutely, for a lack of a better word, bullshit. That it was beautiful but unlivable, like some kind of joke made only for people like me to laugh at. I love design, obviously, but I hate the pressure to have to perform taste in the most intimate of one’s settings and this was the epitome of that, the untouchableness of it, the smug superiority of its flavorless emptiness. I’m not a curator of other people’s gazes when I’m in my pajamas or sweating it out on the trainer. I’m simply Kate Wagner, living with a husband and a dog, like a lot of twenty-seven year old white girls in cities. By the end of the lease, I just wanted to move somewhere where I’d feel at home, whatever that meant. I never had the type A personality needed for pristine white walls. I hated how the recessed lights made all our stuff look cheap, like a museum of stunted adulthood.

Our new apartment has a two-year lease, which is about as much stability people like us could ever hope for or afford. It’s the first floor of a worker’s cottage dominated by a palladian window on the second story that would be pretentious were it not so earnest. The house itself is a hodgepodge of the vernacular, which is what I deserve, as its chronicler. The interior walls are painted lively colors – a soft blue, a slate purple, a taupe, a mint green. It’s gritty enough to be cool and old enough to be livable. There are closets. The bathroom is covered in chiclet glass tile that’s different shades of blue, which I find endearing. But what I love most of all is the kitchen.

All my life, I’d been in search of an apartment with a decent kitchen, and I’ve always wondered why apartment kitchens suck so bad save for the obvious answer (landlords are cheap.) Like I said earlier, the desire to route services (plumbing, electricity) in the most efficient way possible governs most things, though this is more true of renovations or new builds than the adaptation of single family homes into multi-family dwellings. In the case of the latter, the second floor apartments are always the worst off, in fact, almost all apartments are worse off than the one that houses the actual original full-sized kitchen to begin with.

Adapting a space that was meant for sleeping into one where food could be cooked often required some inventiveness with regards to fire safety and ventilation and this usually took the path of least resistance, hence why most kitchens are positioned to the rear of the house, especially if there is outdoor access. (Plumbing in older houses also tends to be positioned on interior walls to avoid pipes freezing in the winter.) In Chicago, most layouts of familiar single-family vernacular housing styles are similar to one another on the ground floor, but the apartments on the second floor are always quite varied, especially with regard to where the kitchen is placed. Often it’s done, again, in a way that allows existing services to be used or for new ones to be built that are on the same wall as another unit. Adding new plumbing where it wasn’t before is expensive and a pain.

However, service routing aside, most apartment kitchens are only ever satisfactory – kitchens for people who ate nothing but takeout or miniature versions of the real thing as though apartment living were just an audition for owning a house, something that’s just no longer true in this economy. This one – with its vintage 50s aluminum cabinetry and its enameled countertops with glitter infused in them like some kind of demure bowling ball and its full-sized appliances and dishwasher, and mint green penny tile, its wonderful quirkiness and its ample cabinet space beneath the counters – is functional. It works like a kitchen should, towards a domestic life engineered by modernism and scientific management with a dash of feminism to be less arduous. This is nothing short of a miracle to me. When I think about it, I get emotional. I have been searching for so long for any kind of semblance of a place tailored in any way towards my needs, towards my desires, which is to have enough space to help rather than hinder in the preparation of meals. Meals we now enjoy as a very small family. The kitchen was never really important to me until I had someone to share it with, as insipid and mawkish and introduction-to-a-gluten-free-recipe as that sounds. I’m no longer living for one, but for two, and I didn’t realize how much that changed living.

I didn’t realize how much autonomy meant until I lived in a place where I felt I had none.

Our new landlords, a school-teacher and private investigator (what a combo) are there right now cleaning the house, fixing the little nicks left by the previous tenants, pulling out their picture hanging apparatuses, which, they assure us, we can leave too. We can put stuff up on the walls, the very thought! They’ve already stickered our names on the mailboxes, have installed a doorbell, which strikes me as a very post-COVID gesture. They hope we will stay there a long time, and so do we. There’s a yard for the dog to play in with garden beds that house burgeoning bell peppers. Our friends are allowed to come over, which they weren’t before — well, not officially, but it felt like it. There are sounds in the house, of those who dwell above and below, the sounds of life. There’s a window I wish I was sitting by writing, and soon, I will be.

So many of us ask the simple question, what is home? What should it be? And the only real, genuine answer I have to give after ten-odd moves is that home is the only place in the world where one can be truly unselfconscious. Even if that means having particleboard furniture and a bunch of bicycles.

That’s my business, not yours.

If you liked this post, check out the McMansion Hell Patreon, or, if so inclined, drop a tip in the tip jar.

r/McMansionHell - Hello r/McMansionHell, I'm Kate Wagner, creator of McMansion Hell and architecture critic at The New Republic. AMA!

r/McMansionHell - Hello r/McMansionHell, I'm Kate Wagner, creator of McMansion Hell and architecture critic at The New Republic. AMA!:

Howdy, Folks! If you’re not busy right now, I’m doing an AMA on the McMansion Hell Subreddit! Stop by and ask me some questions!

The McMansion Hell Yearbook: 1979

Howdy, folks! I hope all of my fellow Midwesterners are enjoying this year’s false spring. Seventy-degree days notwithstanding, the snow will indeed be back, and, as such, I have prepared for you a house to enjoy (?) alongside a miserably late-in-the-year hot cocoa. 

Now, this house isn’t as oppressively horrible as the last one, however, the point of the Yearbook is to show off how houses evolved overtime, and also to celebrate some of the kookier time capsules left out there. Our current house falls into the latter category, and to be honest, I find it weirdly endearing. 

Located just outside of Detroit, this 5 bed, 4.5 bath house tops out at over 10,000 square feet. Yes, you read that right. 10,000. You’ll see why later. Anyways, if you want to purchase said house, it can be all yours for just under $1,000,000. A steal!

??? Foyer

In America we don’t have barons, only robber barons, so I’m going to assume whoever built this house did so on the backs of thousands of exploited 19th century child laborers or whatever. Bad stuff. 

??? Room

Unsure of the purpose of this room, genuinely, because all other rooms are accounted for. This one’s just empty. It’s just existing. Vibing, as one might say.

TV (???) Room

Don’t mind me, I’m just getting out my birding binoculars in order to watch Seinfeld reruns.


Considering the history of the Midwest and the fact that Sears and co. cut down all our old growth forests in order to do cheap furniture and balloon framing, this whole wood paneling bit is really part of a much larger historical milieu.  

Dining Room

The American Bicentennial lurks in the background of all of these houses, its legacy permanently ingrained in too-dark rooms across the nation. 

Main Bedroom

Shivering at the thought of my feet touching cold tile floor every morning. That’ll wake you up. 

Other Bedroom

You know, the grandness of the chandelier has diminishing returns if you put one in every single room. Then it becomes just another light fixture. 

Random Bathroom

BROWN TUB BROWN TUB BROWN TUB (the rarest of all mid-century tubs)

Pleasure Grotto

Ok now this is why I chose this house. It also explains why this house is 10,000 square feet - at least half of that is just this pool alone. The funniest bit is, I can’t for the life of me tell WHERE this pool is by looking at the exterior of the house. In fact, I’m not sure how they managed to fit so much house in that small of an envelope, but at this point, it’s so weird I’m inclined not to ask further questions. Some things in the universe are not meant to be known to us. 

Rear Exterior


Anyways, I’ll let that haunt you for a little while. 

In the mean time, I’d like to take this space at the end of the post to announce that I’ve started a little side project devoted to my other love in life, professional cycling. It’s a newsletter called derailleur that aims to tell the stories of contemporary professional cycling in an unconventional, narrative-driven way. If you’re into such things, feel free to check it out: 


If you like this post, and want to see more like it, consider supporting me on Patreon!

There is a whole new slate of Patreon rewards, including: good house of the month, an exclusive Discord server, monthly livestreams, free merch at certain tiers and more!

Not into recurring donations but still want to show support? Consider the tip jar!

Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

i draw cyclists

i draw cyclists:

hey so in my spare time, when i am not an architecture critic, i like to draw. this has merged with my other love in life (professional cycling) and as such i have dedicated the last six months of my evening hours to drawing cyclists. 

tl;dr i made a tumblr where i’m posting my art if you’re into that kind of thing. this isn’t monetized in any way and i don’t take commissions - it’s just a nice (if strange) hobby i enjoy.

see you all monday with a new house post <3

The McMansion Hell Yearbook: 1978

Howdy Folks! Today’s house comes to us from Iredell County, North Carolina, and trust me, it is quite a doozy - just in time for Valentines Day, too! If you don’t fall in love with it, I don’t know what to tell you. 

This 5300 square foot, 4 bedroom, 4.5 bath house, comes in at $625,000, making it more of a bargain than most McMansions usually are, and while the Tudors never came to America, a place that had not yet been “discovered” by the time the Tudors were in power in England, fear not - for all the repression and stuffiness of 15th century Britain can still be found within these darkened doors. 

Lawyer Foyer

If your house doesn’t constantly give off I AM MARRIED vibes, your spouse might start having indecent thoughts. One must stay vigilant at all times. 

Dining Room

Look, hutches are good storage, okay. Sturdy. We as a generation (millennials) need to get back into knickknacks. Minimalism is dead. Long live kitsch. 

Living Room

Honestly, this house is so dark and repressed it makes high school me look like a libertine. 


“What do you mean ‘dopeness’ isn’t a qualifier for granting a property historical landmark status?” 

Main Bedroom

Love is in the air. Also the air is really, really stale in here right now. 


If your bathroom doesn’t emulate a luxuriant grotto, wyd???

Bedroom 2

please, my floor ducks, they are so cold,,,,


I have got to stop using epic ironically. I already lived through 2008 once. 

That’s it for the interior! Let’s just step outside for a quick breather…

Rear Exterior

Well, I hope you had a good time traipsing through what can only be described as a treasure trove of different matching fabrics. Be sure to stick around for the next part of “Underground” which is coming your way shortly!

If you like this post, and want to see more like it, consider supporting me on Patreon!

There is a whole new slate of Patreon rewards, including: good house of the month, an exclusive Discord server, weekly drawings, monthly livestreams, a reading group, free merch at certain tiers and more!

Not into recurring donations but still want to show support? Consider the tip jar! 

Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

Underground, Part 1

[Author’s Note: A year ago, when waiting for the DC Metro, I came up with an idea for a short story involving two realtors and the infamous Las Vegas Underground House, typed up an outline, and shoved it away in my documents where it sat neglected until this month. The house recently resurfaced on Twitter, and combined with almost a year of quarantine, the story quickly materialized. Though I rarely write fiction, I decided I’d give it a shot as a kind of novelty McMansion Hell post. I’ve peppered the story with photos from the house to break up the walls of text. Hopefully you find it entertaining. I look forward to returning next month with the second installment of this as well as our regularly scheduled McMansion content. Happy New Year!

Warning: there’s lots of swearing in this.]



Back in 1997, Mathieu Rino, the son of two Finnish mechanical engineers who may or may not have worked intimately with the US State Department, changed his name to Jay Renault in order to sell more houses. It worked wonders.

He gets out of the car, shuts the door harder than he should. Renault wrinkles his nose. It’s a miserable Las Vegas afternoon - a sizzling, dry heat pools in ripples above the asphalt. The desert is a place that is full of interesting and diverse forms of life, but Jay’s the kind of American who sees it all as empty square-footage. He frowns at the dirt dusting up his alligator-skin loafers but then remembers that every lot, after all, has potential. Renault wipes the sweat from his leathery face, slicks back his stringy blond hair and adjusts the aviators on the bridge of his nose. The Breitling diving watch crowding his wrist looks especially big in the afternoon glare. He glances at it.

“Shit,” he says. The door on the other side of the car closes, as though in response. 

If Jay Renault is the consummate rich, out-of-touch Gen-Xer trying to sell houses to other rich, out-of-touch Gen-Xers, then Robert Little is his millennial counterpart. Both are very good at their jobs. Robert adjusts his tie in the reflection of the Porsche window, purses his lips. He’s Vegas-showman attractive, with dark hair, a decent tan, and a too-bright smile - the kind of attractive that ruins marriages but makes for an excellent divorcee. Mildly sleazy.

“Help me with these platters, will you?” Renault gestures, popping the trunk. Robert does not want to sweat too much before an open house, but he obliges anyway. They’re both wearing suits. The heat is unbearable. A spread of charcuterie in one hand, Jay double-checks his pockets for the house keys, presses the button that locks his car. 

Both men sigh, and their eyes slowly trail up to the little stucco house sitting smack dab in the center of an enormous lot, a sea of gravel punctuated by a few sickly palms. The house has the distinct appearance of being made of cardboard, ticky-tacky, a show prop. Burnt orange awnings don its narrow windows, which somehow makes it look even more fake. 

“Here we go again,” Jay mutters, fishing the keys out of his pocket. He jiggles them until the splintered plywood door opens with a croak, revealing a dark and drab interior – dusty, even though the cleaners were here yesterday. Robert kicks the door shut with his foot behind him.

 “Christ,” he swears, eyes trailing over the terrible ecru sponge paint adorning the walls. “This shit is so bleak.”

The surface-level house is mostly empty. There’s nothing for them to see or attend to there, and so the men step through a narrow hallway at the end of which is an elevator. They could take the stairs, but don’t want to risk it with the platters. After all, they were quite expensive. Renault elbows the button and the doors part. 

“Let’s just get this over with,” he says as they step inside. The fluorescent lights above them buzz something awful. A cheery metal sign welcomes them to “Tex’s Hideaway.” Beneath it is an eldritch image of a cave, foreboding. Robert’s stomach’s in knots. Ever since the company assigned him to this property, he’s been terrified of it. He tells himself that the house is, in fact, creepy, that it is completely normal for him to be ill at ease. The elevator’s ding is harsh and mechanical. They step out. Jay flips a switch and the basement is flooded with eerie light. 

It’s famous, this house - The Las Vegas Underground House. The two realtors refer to it simply as “the bunker.” Built by an eccentric millionaire at the height of Cold War hysteria, it’s six-thousand square feet of paranoid, aspirational fantasy. The first thing anyone notices is the carpet – too-green, meant to resemble grass, sprawling out lawn-like, bookmarked by fake trees, each a front for a steel beam. Nothing can grow here. It imitates life, unable to sustain it. The leaves of the ficuses seem particularly plastic.

Bistro sets scatter the ‘yard’ (if one can call it that), and there’s plenty of outdoor activities – a parquet dance floor complete with pole and disco ball, a putt putt course, an outdoor grill made to look like it’s nestled in a rock, but in reality better resembles a baked potato. The pool and hot tub, both sculpted in concrete and fiberglass mimicking a natural rock formation, are less Playboy grotto and more Fred Flintstone. It’s a very seventies idea of fun.

Then, of course, there’s the house. That fucking house. 

A house built underground in 1978 was always meant to be a mansard – the mansard roof was a historical inevitability. The only other option was International Style modernism, but the millionaire and his wife were red-blooded anti-Communists. Hence, the mansard. Robert thinks the house looks like a fast-food restaurant. Jay thinks it looks like a lawn and tennis club he once attended as a child where he took badminton lessons from a swarthy Czech man named Jan. It’s drab and squat, made more open by big floor-to-ceiling windows nestled under fresh-looking cedar shingles. There’s no weather down here to shrivel them up.


“Shall we?” Jay drawls. The two make their way into the kitchen and set the platters down on the white tile countertop. Robert leans up against the island, careful of the oversized hood looming over the electric stovetop. He eyes the white cabinets, accented with Barbie pink trim. The matching linoleum floor squeaks under his Italian loafers. 

“I don’t understand why we bother doing this,” Robert complains. “Nobody’s seriously going to buy this shit, and the company’s out a hundred bucks for party platters.”

“It’s the same every time,” Renault agrees. “The only people who show up are Instagram kids and the crazies - you know, the same kind of freaks who’d pay money to see Chernobyl.” 

“Dark tourism, they call it.”

Jay checks his watch again. Being in here makes him nervous.

“Still an hour until open house,” he mutters. “I wish we could get drunk.”

Robert exhales deeply. He also wishes he could get drunk, but still, a job’s a job.

“I guess we should check to see if everything’s good to go.”

The men head into the living room. The beamed, slanted ceiling gives it a mid-century vibe, but the staging muddles the aura. Jay remembers making the call to the staging company. “Give us your spares,” he told them, “Whatever it is you’re not gonna miss. Nobody’ll ever buy this house anyway.” 

The result is eclectic – a mix of office furniture, neo-Tuscan McMansion garb, and stuffy waiting-room lamps, all scattered atop popcorn-butter shag carpeting. Hideous, Robert thinks. Then there’s the ‘entertaining’ room, which is a particular pain in the ass to them, because the carpet was so disgusting, they had to replace it with that fake wood floor just to be able to stand being in there for more than five minutes. There’s a heady stone fireplace on one wall, the kind they don’t make anymore, a hearth. Next to it, equally hedonistic, a full bar. Through some doors, a red-painted room with a pool table and paintings of girls in fedoras on the wall. It’s all so cheap, really. Jay pulls out a folded piece of paper out of his jacket pocket along with a pen. He ticks some boxes and moves on.

The dining room’s the worst to Robert. Somehow the ugly floral pattern on the curtains stretches up in bloomer-like into a frilly cornice, carried through to the wallpaper and the ceiling, inescapable, suffocating. It smells like mothballs and old fabric. The whole house smells like that. 

The master bedroom’s the most normal – if anything in this house could be called normal. Mismatched art and staging furniture crowd blank walls. When someone comes into a house, Jay told Robert all those years ago, they should be able to picture themselves living in it. That’s the goal of staging. 

There’s two more bedrooms. The men go through them quickly. The first isn’t so bad – claustrophobic, but acceptable – but the saccharine pink tuille wallpaper of the second gives Renault a sympathetic toothache. The pair return to the kitchen to wait.


Both men are itching to check their phones, but there’s no point – there’s no signal in here, none whatsoever. Renault, cynical to the core, thinks about marketing the house to the anti-5G people. It’s unsettlingly quiet. The two men have no choice but to entertain themselves the old-fashioned way, through small talk.

“It’s really fucked up, when you think about it,” Renault muses.

“What is?”

“The house, Bob.”

Robert hates being called Bob. He’s told Jay that hundreds of times, and yet…

“Yeah,” Robert mutters, annoyed.

“No, really. Like, imagine. You’re rich, you founded a major multinational company marketing hairbrushes to stay-at-home moms, and what do you decide to do with your money? Move to Vegas and build a fucking bunker. Like, imagine thinking the end of the world is just around the corner, forcing your poor wife to live there for ten, fifteen years, and then dying, a paranoid old man.” Renault finds the whole thing rather poetic. 

“The Russkies really got to poor ol’ Henderson, didn’t they?” Robert snickers.

“The wife’s more tragic if you ask me,” Renault drawls. “The second that batshit old coot died, she called a guy to build a front house on top of this one, since she already owned the lot. Poor woman probably hadn’t seen sunlight in God knows how long.”

“Surely they had to get groceries.”

Jay frowns. Robert has no sense of drama, he thinks. Bad trait for a realtor.

“Still,” he murmurs. “It’s sad.”

“I would have gotten a divorce, if I were her,” the younger man says, as though it were obvious. It’s Jay’s turn to laugh.

“I’ve had three of those, and trust me, it’s not as easy as you think.”

“You’re seeing some new girl now, aren’t you?” Robert doesn’t really care, he just knows Jay likes to talk about himself, and talking fills the time.  

“Yeah. Casino girl. Twenty-six.”

“And how old are you again?”

“None of your business.”

“Did you see the renderings I emailed to you?” Robert asks briskly, not wanting to discuss Jay’s sex life any further.

“What renderings?”

“Of this house, what it could look like.”

“Oh. Yeah.” Jay has not seen the renderings.

“If it were rezoned,” Robert continues, feeling very smart, “It could be a tourist attraction - put a nice visitor’s center on the lot, make it sleek and modern. Sell trinkets. It’s a nice parcel, close to the Strip - some clever investor could make it into a Museum of Ice Cream-type thing, you know?”

“Museum of Ice Cream?”

“In New York. It’s, not, like, educational or anything. Really, it’s just a bunch of colorful rooms where kids come to take pictures of themselves.”

“Instagram,” Jay mutters. “You know, I just sold a penthouse the other week to an Instagram influencer. Takes pictures of herself on the beach to sell face cream or some shit. Eight-point-two million dollars.”

“Jesus,” Robert whistles. “Fat commission.”

“You’re telling me. My oldest daughter turns sixteen this year. She’s getting a Mazda for Christmas.”

“You ever see that show, My Super Sweet Sixteen? On MTV? Where rich kids got, like, rappers to perform at their birthday parties? Every time at the end, some guy would pull up in, like, an Escalade with a big pink bow on it and all the kids would scream.”

“Sounds stupid,” Jay says.

“It was stupid.”

It’s Robert’s turn to check his watch, a dainty gold Rolex.

“Fuck, still thirty minutes.”

“Time really does stand still in here, doesn’t it?” Jay remarks.

“We should have left the office a little later,” Robert complains. “The charcuterie is going to get –“

A deafening sound roars through the house and a violent, explosive tremor throws both men on the ground, shakes the walls and everything between them. The power’s out for a few seconds before there’s a flicker, and light fills the room again. Two backup generators, reads Jay’s description in the listing - an appeal to the prepper demographic, which trends higher in income than non-preppers. For a moment, the only things either are conscious of are the harsh flourescent lighting and the ringing in their ears. Time slows, everything seems muted and too bright. Robert rubs the side of his face, pulls back his hand and sees blood.

“Christ,” he chokes out. “What the hell was that?”

“I don’t know,” Jay breathes, looking at his hands, trying to determine if he’s got a concussion. The results are inconclusive – everything’s slow and fuzzy, but after a moment, he thinks it might just be shock.

“It sounded like a fucking 747 just nosedived on top of us.” 

“Yeah, Jesus.” Jay’s still staring at his fingers in a daze. “You okay?”

“I think so,” Robert grumbles. Jay gives him a cursory examination.

“Nothing that needs stitches,” he reports bluntly. Robert’s relieved. His face sells a lot of houses to a lot of lonely women and a few lonely men. There’s a muffled whine, which the two men soon recognize as a throng of sirens. Both of them try to calm the panic rising in their chests, to no avail.

“Whatever the fuck happened,” Jay says, trying to make light of the situation, “At least we’re in here. The bunker.”

Fear forms in the whites of Robert’s eyes.

“What if we’re stuck in here,” he whispers, afraid to speak such a thing into the world. The fear spreads to his companion.

“Try the elevator,” Jay urges, and Robert gets up, wobbles a little as his head sorts itself out, and leaves. A moment later, Jay hears him swear a blue streak, and from the kitchen window, sees him standing before the closed metal doors, staring at his feet. His pulse racing, Renault jogs out to see for himself.

“It’s dead,” Robert murmurs. 

“Whatever happened,” Jay says cautiously, rubbing the back of his still-sore neck, “It must have been pretty bad. Like, I don’t think we should go up yet. Besides, surely the office knows we’re still down here.”

“Right, right,” the younger man breathes, trying to reassure himself.

“Let’s just wait it out. I’m sure everything’s fine.” The way Jay says it does not make Robert feel any better. 

“Okay,” the younger man grumbles. “I’m getting a fucking drink, though.”

“Yeah, Jesus. That’s the best idea you’ve had all day.” Renault shoves his hands in his suit pocket to keep them from trembling.  


If you like this post, and want to see more like it, consider supporting me on Patreon!

There is a whole new slate of Patreon rewards, including: good house of the month, an exclusive Discord server, weekly drawings, monthly livestreams, a reading group, free merch at certain tiers and more!

Not into recurring donations but still want to show support? Consider the tip jar! 

Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

We Interrupt This Broadcast to Bring You an Especially Cursed House

Hello everyone. Originally, this post was supposed to be devoted to the year 1978, however something came up, and by something, I mean this 2.2 million-dollar, 5,420 sq ft 4 bed/4.5 bath house in Colt’s Neck, NJ. 

You see, usually, when a listing goes viral, I’m content to simply retweet it with a pithy comment, but this house genuinely shook something in me, genuinely made me say “what the (expletive)” out loud. It is only fair to inflict this same suffering onto all of you, hence, without further ado: 

Looks normal, right? Looks like the same low-brow New Jersey McMansion we’re all expecting, right? Oh, oh dear, you couldn’t be more wrong

Guess who’s making a list and checking it twice? 

Guess who’s gonna find out who’s naughty or nice?

Guess who’s coming to town? 

Guess who’s coming to town to drag your ass into hell?

A gentle reminder that it is not yet Thanksgiving. 

But oh. Oh. It continues:

If you’re wondering what’s happening here, you’re not alone, and sadly there is no convenient way to find out via a kind of haunted house hotline or something. 

I can’t even label these rooms because frankly I’m not even sure what they are. All I am sure of is that I want out of them as soon as humanly possible. 

r̸̘̆e̴̝̻̽m̵̡̼̚ȩ̵͑̎ͅm̷͍̮̉b̸̥̈e̶̯̺̽͗r̸̝͊͠ ̸̡͎̅̀t̴̯̲̓ȯ̷̮̫ ̷̜̅̀ŵ̶̟̱ā̴̭̘s̸̥͋h̴͉̿ ̵̡̑y̸̩͈͑o̷̹̭͛͝ů̷̩̮̔r̶̜̃ ̴̠̗͋ẖ̴̈́͛a̸̢̟̐͒n̶̩̟̆ḍ̵̍̀s̴̨̈́

How is it that a room can simultaneously threaten, frighten, and haunt me? Me, of all people!

My eyes do not know where to go here. They go to the window, they go to the fireplace, they go to the massive mound of fake plant and statuary currently gorging on the leftmost corner of the room, they go to my hands, which are shaking. 

“Hello, I would like to get in touch with the Ministry of Vibes? Yes, I’ll hold.” 

I haven’t been this afraid of a shower since I went to Girl Scout camp in the fifth grade and there was a brown recluse spider in the camp shower and I screamed until the counselor came in and told me it was only a wolf spider but it turns out those still bite you and it hurts

I love watching Still Images on my Television Set :)

Nobody make a sound. He’s watching you. 

i spy with my evil eye:


Their souls are trapped in these photographs forever :)

Okay, phew, we made it out alive. Here’s the back of the house I guess. 

Well, I hope you’re as thoroughly disturbed as I am. Seriously, I’m going to have trouble sleeping. I mean, I already have trouble sleeping, but this is just making that existing problem so much worse. 

If you like this post, and want to see more like it, consider supporting me on Patreon!

There is a whole new slate of Patreon rewards, including: good house of the month, an exclusive Discord server, weekly drawings, monthly livestreams, a reading group, free merch at certain tiers and more!

Not into recurring donations but still want to show support? Consider the tip jar! (Tips are much appreciated since I am making a cross country move in two weeks!!!)

Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

The McMansion Hell Yearbook: 1977

Howdy, folks, and happy October! (It’s snowing here in Chicago lol) 

Before I get down to business on today’s post, I want to let you know of two big events coming up this week: 

First, I’ll be in conversation with Susan Chin and Vinson Cunningham tomorrow evening (10/28) to talk about urbanism during the pandemic (virtually) at the Museum of the City of New York. More info and tickets here

 I am giving this year’s Brendan Gill Lecture in Architectural Criticism at Yale via Zoom on Thursday the 29th of October at 6:30 Eastern Time. Admission is free. Here’s a link to the talk which includes info on how to register. 

Alright, now back to the main event. We’re back in Cook County, Illinois because of course we are, and this house falls into the rare McMansion Hell category of “this house is terrible but also kind of cute somehow????” 

It’s a shame you can’t really see the turret because it adds so much. Anyways, this house is peak 70s McMansion: longer than it is tall, involves a mansard, big picture windows, not too adventurous roof-wise. Still, it’s 6900 square feet boasting 5 bedrooms and 6.5 baths all at a whopping $1.5 million dollars. Just some pocket change, you know…

Let’s see inside, shall we?

Lawyer Foyer

All I want is some Looney Tunes action where some’s coming up from the basement and someone’s coming in the front door and WHAM!!!! 

Sitting Room

I kind of stan the dog pots though… 

Dining Room

I think the wallpaper might be crabs???? (????)


Pros of tile countertops: v twee and cute
Cons of tile countertops: grout 

Also we NEED to bring back the kitschy farmhouse aesthetic from 40 years ago. No more quartz countertops. It’s time for tiles with chickens on them!!!


Is this room supposed to be like weirdly tropical?? or Parisian??? or Martha Stewart??? or???

Vibe check: [please calibrate vibe checker and try again]


After all, inside every middle manager is a languishing Hemingway…

Main Bedroom

“Struggled hard for these views (six arm flexing emojis)”

Also, disclosure: McMansion Hell will no longer use the term “master bedroom” because it’s antiquated and never made much sense after the (American) Civil War if you really think about it for more than three seconds. 

Main Bathroom

where to purchase malachite wallpaper asking for a friend (the friend is my office)

Spare Bedroom

Nothing says “I am a fun-loving carefree and slightly cRaZy girl” like this font:

Alright, that’s it for the inside. Instead of the rear exterior though, I’m going to end this post with a fun aerial shot instead just to show that my suspicions about this house have been confirmed. 

Secret Aerial Footage (helicopter sounds)

See, this house is actually very weird!!!! It is not as cute when all of its wily tricks have been revealed!!!!

Okay, that’s it for 1977. Stay tuned for 1978! 

If you like this post, and want to see more like it, consider supporting me on Patreon!

There is a whole new slate of Patreon rewards, including: good house of the month, an exclusive Discord server, weekly drawings, monthly livestreams, a reading group, free merch at certain tiers and more!

Not into recurring donations but still want to show support? Consider the tip jar! (Tips are much appreciated since I am making a cross country move in two weeks!!!)

Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

Public opinion has softened its views on Brutalism. That isn’t enough to stay the wrecking ball.

Public opinion has softened its views on Brutalism. That isn’t enough to stay the wrecking ball.:

I’m back in The Architect’s Newspaper, where I’m talking about my favorite subject (Brutalism) and my least favorite subject (capitalism).

The McMansion Hell Yearbook: 1976

Howdy, folks! Today’s house comes to us from my newly adopted county of Cook County, Illinois, and boy can this baby fit so many 70s house stereotypes in it. 

It’s got everything: weird spanish colonial revivalism, an external layout that can only be described as post-split-level, a 3 car garage, and it’s brown! This lovely 5 bedroom, 5 bath 5200 square foot estate is relatively affordable by McMansion Hell standards, coming in at around $600,000. There’s a lot of house to cover, so let’s get the ball rolling! 

Lawyer Foyer

This foyer has all the elements of a contemporary lawyer foyer (large chandelier, grand staircase, two stories) except for the oversized transom window over the front door. The fact that the house looks like a split-level on the outside is interesting because it’s a regular two-story house on the inside, furthering the hypothesis that the Lawyer Foyer itself is an offshoot of the 1.5 and two-story entrances present in split levels. In many ways this house is a transitional example nestled between two eras: the split-level/ranch of the 70s and the two-story neo-eclectic houses that would become popular in the 1980s. 

Sitting Room

Fun fact: a look at recent IKEA catalogs demonstrates that the grandma couch is slowly wedging its way back into America’s living rooms. 

Dining Room

I am weeping with envy at those chairs. (Instagram story vagueposting voice) Some people just don’t know what they have. 

Living Room

The overstuffed leather sofas might not be pretty but they are authentic.


Why I hate the kitchen island/peninsula stovetop recapped:
- can’t use the island for seating bc cooking stuff is hot and steamy
- one casual lean and you’re burned
- no backsplash to catch like overboiling pasta sauce
- wastes valuable counter space

I can go on.

Master Bedroom

Personally if I had all that extra space in my bedroom I’d put something cool like a pool table or a hot tub in there bc why not???

Speaking of tubs…

Master Bath

One must wonder why brown bathroom fixtures exist in the first place because frankly it’s not a very flattering color considering the functions. Let’s just say it was a different time. 

Bedroom 2

As someone who grew up in the era of Toyota Corolla hegemony, 70s cars are extremely funny to me - like they take up half a block and get 4 miles to the gallon??? No wonder there was an oil crisis!!! 

Bedroom 3

The virgin midcentury modern collector vs the chad grandma using a 1967 teak Dunbar sideboard as a display case for their doily collection 


This whole post is a ploy to get the zoomers to watch Cheers

Alright folks, our little house tour has come to a close - it’s time for our favorite part:

Rear Exterior

(looking enviously at other countries with functioning governments beginning to open back up): yeah ok you do you, i’m just gonna watch the tour de france in a bathrobe and rank the teams based on how cancelled their sponsors are.

Well that does it for 1976! Join us soon for another installment of the Brutalism Post and keep your eyes peeled for whatever wretched house the year 1977 has bestowed upon this cursed land. 

I know that these are economically uncertain times, but many creators including myself depend on Patreon for most of their income, so if you have a minimum of $12/year to spare and are into bonus content, then do I have some good news for you:

If you like this post, and want to see more like it, consider supporting me on Patreon!

There is a whole new slate of Patreon rewards, including: good house of the month, an exclusive Discord server, weekly drawings, monthly livestreams, a reading group, free merch at certain tiers and more!

Not into recurring donations but still want to show support? Consider the tip jar! (Tips are much appreciated since I am making a cross country move in two weeks!!!)

Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.