Which equilibrium will prevail?

By Simwood

By Peter Farmer Simwood’s views on the recent BT Openreach FTTP pricing (called the Equinox Offer) will be known to regular readers. Our response to Ofcom’s consultation on it is here and Simon mentioned it to Parliamentarians today. Today, the Competition Appeal Tribunal, one of the judicial bodies with the ability to overturn a decision […]

Where are we with the air-con?

By [email protected] (RevK)

I had aircon in my old house - standard split system with indoor units on the wall. It worked well. Summer or winter, extreme hot or cold, I was able to ensure bedroom and office stayed well controlled and comfortable. Not once could it not cope.

For the new house I put some money aside to invest in an even more serious aircon, ducted, with a lossnay and for fresh air as well. We are directly on the A40 with no vents in windows, so needed. It is far from cheap (A lot of houses in wales are probably cheaper than this installation!). I was keen, and happy, to pay "top dollar" for a "proper" system. This is my retirement, my comfort, I deserve this!

As I have said on twitter, that it is Major Cooling & Heating that are doing this. They were recommended, and have been in business some time.

They are nice, and friendly, and do seem reasonably competent on the face of it. So we ordered the system and it is installed. It took some time. It involved a lot of work we had to do with help from my son-in-law/sparky.

But it is not right, sorry. I do feel a tad sorry for them - as it looks like they took all the room sizes, and so on, and contacted their suppliers that recommended a Mitsubishi system with Lossnay and GUG. It was installed, then the issues started.

There are two big issues.

1. It cannot read the room temperature from the controller. This is the controller that comes with it, which they says is not even a "standard spare part" as it is specially for the GUG, yet it has a thermistor in it, and has a setting to use the controller temperature, which it accepts. This fooled us as clearly it was not using the controller, freezer spray made that really easy to demonstrate!

2. It does not seem to be powerful enough.

The first point is pretty much a show stopper. We have two rooms on each of two systems, and may want to run one or the other or both. The fact we want to cool the "secondary" room was important as my wife and her sister when using the guest room, have very different ideas on a "comfortable temperature"! We do accept that if we are running both rooms at once, then they are not separately controllable - we know that.  That was not actually a problem for us. For the "one or the other" we actually put motorised vents to each room and switched the controllers in each room so only one was connected. Simple, or so we thought. But apparently, even though it has at thermistor and a setting, it can only read the "return air flow", which only comes from one room! Not impossible to fix with more vents and more motorised vents in the pipes for the return air flow, but for one room this meant removing wardrobes, and plaster board and trunking a vent in the wall and lots of work (which we paid for separately) and may now need doing for the "return air" if we do that. Not good. Not impossible to fix.

Even so, we now know that this also means much more careful placement of the vents in the rooms else the feed air just runs along the ceiling to the return vent and thinks all is well and the room is warm. This meant changes to vents, and lots of testing. Getting the airflow matters way more if the temperature sensor is not the controller, put where we want it.

The second point is, frankly, a bigger concern. It got to over 28℃ in my office last summer. So a system that can cool even that one room to 21℃ is needed. I was clear I wanted an "over spec'd" system if necessary to do that. But as it is not the height of summer I have no way to test that. All I can test is heating. Well the system says it can do 28℃ heating. So let's try!

The answer is a solid "nope". One system managed one room (not the two rooms and en-suites it should do, just the one) up to 25℃ after some hours. The other much the same 24℃. Yes, it works for 20℃ and so is actually fine for now, but if it cannot cope with heating many degrees now, how will it cope with cooling many degrees, as many as 7℃, in summer?

At the end of the day this gives me zero confidence the system has enough "oomph" to cool my office in the summer at all.

Can I help? Well, I am. I have invested in more test equipment, calibrated sensors, etc. I have tried everything even moving and changing vents. We had the vents all changed to larger size at the start when it was apparent it would not cope. I am doing everything I can to make this work if at all possible. But no luck.

I am now putting in several sensors in one room at 0.5m height intervals to see if the air circulation and heat distribution is somehow a factor. But even so, the basics of "not enough oomph" is pretty clear.

So next step is down to Major Cooling & Heating to see if they have an answer, changes to the system, an alternative system, or a refund. We will see how good they are.

Speaking at Westminster Forum

By Simwood

By Simon Woodhead I had the pleasure of speaking to Parliamentarians at the Westminster Forum today, on all things Wholesale IP Voice, but specifically on IP migration. I was also asked to Chair a few sessions which was a great opportunity to raise some pertinent issues close to my heart with key industry decision makers. […]

A Password Manager Isn't Just for Christmas, It's for Life (So Here's 50% Off!)

By Troy Hunt

Presently sponsored by: 1Password is a secure password manager and digital wallet that keeps you safe online

I was having a coffee with a good mate the other day. He's not a techie (he runs a pizza restaurant), but somehow, we ended up talking about passwords. Because he's a normal person, he has the same 1 or 2 or 3 he uses everywhere

Phone screens are broken

By kevin

I fail phone screens pretty often, which limits my job prospects and is embarrassing for someone with ten years of industry experience, a pretty extensive Github account and a publicly available list of difference-making projects. 1 In theory a phone screen is supposed to evaluate whether a) this person would be good at the job […]

Tech, and mince pies

By [email protected] (RevK)

We have environmental sensors in the house. They are linked to HomeKit (via a firebrick, and raspberry pi, don't ask).

My phone went mad, telling me several of the rooms had High CO₂. This happens occasionally in the kitchen (aka living room) when we have a few people around, but it is only the two of us, and it is lots of the rooms in the house.

I checked, not the loft, not the outhouse, so not coming from outside it seems. But several rooms throughout the house!

Seems I have found the answer...

It seems that "Vinegar ( ethanoic or acetic acid ) is used in pickles and mincemeat and ... The acid reacts with sodium hydrogen carbonate to produce carbon dioxide ."

So yes, mince pies are picked up by the technology! wow.

They do look yummy though :-)


Mark Zuckerberg has only neutral feelings toward Peppa Pig, who he understands is a fictional character, and he blames the coronavirus pandemic on other factors.

Weekly Update 272

By Troy Hunt

Presently sponsored by: 1Password is a secure password manager and digital wallet that keeps you safe online

Check out that lighting! The Elgato Key Lights have made a massive difference and they're easily controlled via their Stream Deck or the Home Assistant integration. I'm just super, super happy with these and after posting this video, I've fixed them directly to the

A smarter alternative to password recognition could be right in front of us: Unique, invisible, maybe even deadly

By Alistair Dabbs

Take your breath awayyyyyyyy

Something for the Weekend, Sir?  "Breathe into the tube, sir." Oh yes, dear reader, I am being breathalysed.…

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.

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.


Each one contains a chocolate shaped like a famous spacecraft and, for the later numbers, a pamphlet on managing anxiety.

One way a builder culture can fail

I've told some stories about what happens when you end up at a company that builds nothing and instead rents everything from some vendor. Given that, it's only fair that I describe something bad that can happen at a company which is known for building stuff.

Let's say you're at one of these companies which has a reputation for building infrastructure stuff instead of renting it. This can be good if you like that kind of environment and like digging into problems by using the source code, by talking to the people involved, and generally having access to things.

The trouble is that sometimes these companies will hire someone who's known for doing X... and *only* X. They're a builder, all right, as long as you want them to build X. Perhaps they have been building X at some other company, and now your company has hired them to come and do that same job over here instead.

Unsurprisingly, having invested in getting that person on board, the company is going to try to make that project happen. Then, they are going to try to make X go to production. That is, it has to "ship" and actually go out to real machines which are dealing with actual user traffic. If X never ships, then they look bad, the people who vouched for them look bad, their management looks bad, and so on up the line.

There's also the possibility that the prestige of having this person working at the company is what they're actually cultivating, and management wants to make this person happy by letting them work on their pet project, even if the pet project itself is not doing anything positive.

I will now point out that whether X makes it to production can become disconnected from the notion of whether X actually belongs in production. In one outcome, it's brilliantly executed and things grow. But, this is about the downsides, and in that scenario, it's a stinking pile of garbage and needs to be thrown out, but it gets forced in, anyway.

The way you find out what might happen is to challenge it on technical grounds. If the challenge is met with non-technical rebuttals, it might just be one of those bad situations. If they attack the person who brought it up, it probably is. They're pushing it for the wrong reasons: political, not technical.

If this project is being pushed for political reasons, then it should not come as a surprise that when it finally does ship to production, it causes outages and generally fails to deliver on its promises. It's actually worse than just leaving things the way they had been before any of this stuff showed up.

This is just one of the ways an unprincipled "builder culture" can backfire, particularly if you have people running the show who have no problem putting their own gains ahead of the company. They'll push all kinds of garbage if it makes them hit their goals and get a bigger bonus, a promotion, or some kind of shiny new position.

Just imagine what companies would look like if their hiring processes filtered out this kind of charlatan instead of looking for whether they could do some dumb coding card trick in a 45 minute interview block. I think they'd look very different, and a whole bunch of people would have to find another industry to prey upon.

Edge Cake

Every time IERS adds or removes a leap second, they send me a birthday cake out of superstition.

Frequency analysis on hundreds of billions of reports at Report URI: Top-K

By Scott Helme

After looking at how a Bloom Filter works and moving on to understand a Count-Min Sketch, we were left with the final problem of identifying the most frequent reports we see at Report URI. Looking at our stream of hundreds of millions of reports per day, we're going

Awful People

Hm, this burger place has a couple of good reviews, but LakeSlayer7 says he got food poisoning there and everyone should try this other place down by the lake instead.

20 year study of global wealth demolishes the myth of ‘trickle-down’


Telegram Introduces DRM


The Serverless Shell


Ask HN: Anyone else getting a 500 on their Google Calendars?


MicroStudio now supports microScript, Python, JavaScript and Lua


Beginner's Guide to the Flow Notes Method


DeepMind's Player of Games, a general-purpose game algorithm


Portable and Interoperable Async Rust


My First 5 Minutes on a Server; Or, Essential Security for Linux Servers (2013)


The RNA World Hypothesis


Amazon packages pile up after AWS outage spawns delivery havoc


Controlled indoor cultivation of black morel


Show HN: P2P remote desktop – an alternative to TeamViewer / AnyDesk


Show HN: git-history, for analyzing scraped data collected using Git and SQLite


Open Dynamic Robot Initiative (2020)


Germany's Olaf Scholz takes over from Merkel as chancellor

Olaf Scholz is sworn in as chancellor, leading a three-party coalition after 16 years of Merkel rule.

Open hardware smartphone PinePhone Pro starts to ship – to developers only, for now

By Liam Proven

New e-ink tablet, too. Open mobiles, tablets and laptops are coming... slowly

Open-source-hardware vendor Pine64 has started shipping versions of its upgraded smartphone and new e-ink tablet – but so far, only to developers.…

Omicron: What are England's mask rules now?

Face coverings are a legal requirement again in England in shops and on public transport.

Reading and Leeds: Dave, Arctic Monkeys and Megan Thee Stallion to headline 2022 event

Megan Thee Stallion and Dave are among the other artists in the line-up for next year's festival.

Covid booster jab booking system opens to over-40s in England

Another seven million people will be able to book their top up jab, including those in at-risk groups.

We can unify HPC and AI software environments, just not at the source code level

By Rob Farber

Compute graphs are the way forward

Register Debate  Welcome to the latest Register Debate in which writers discuss technology topics, and you the reader choose the winning argument. The format is simple: we propose a motion, the arguments for the motion will run this Monday and Wednesday, and the arguments against on Tuesday and Thursday. During the week you can cast your vote on which side you support using the poll embedded below, choosing whether you're in favour or against the motion. The final score will be announced on Friday, revealing whether the for or against argument was most popular.

Downing Street party: No 10 staff joked about party amid lockdown restrictions

The video obtained by ITV comes after days of questions about the event that took place last year.

Halo Infinite: Time to 'mix-up' the series

How some of the brains behind Halo: Infinite developed it in a fast-changing gaming landscape.

Hamilton v Verstappen - the key moments of a thrilling season

BBC Sport looks back on the key moments of a memorable F1 season as Lewis Hamilton and Max Verstappen prepare for a thrilling finale.

Australia 'surprised' by Broad omission for first Ashes Test

Australia were "surprised" that England left bowler Stuart Broad out for the first Ashes Test at The Gabba in Brisbane, says captain Pat Cummins.

Bipin Rawat: India's top general in helicopter crash

Chief of Defence Staff General Bipin Rawat was in the helicopter which crashed in southern India.

Storm Barra: Power cuts hit north and north east Scotland

About 1,000 homes in north and north east Scotland are left without electricity as extreme weather again disrupts the network.

Covid: Who can have a booster jab and how can you get one?

All UK adults will be offered a Covid booster, and 12-15-year-olds will be offered a second jab.

But why that VPN? How WireGuard made it into Linux

By Steven J. Vaughan-Nichols

Even the best of ideas can take their own sweet time making it into the kernel

Maybe someday – maybe – Zero Trust will solve many of our network security problems. But for now, if you want to make sure you don't have an eavesdropper on your network, you need a Virtual Private Network (VPN).…

Olaf Scholz: Who is Germany's new chancellor?

The centre-left leader was vice-chancellor and succeeds Angela Merkel after securing a coalition deal.

Hey Reddit! It’s Pierre Gasly, F1 driver for Scuderia AlphaTauri. It’s that time of year I answer your questions… AMA! [tomorrow 9/12/2021]

By /u/AlphaTauriF1

Hey Reddit! It’s Pierre Gasly, F1 driver for Scuderia AlphaTauri. It’s that time of year I answer your questions… AMA! [tomorrow 9/12/2021] submitted by /u/AlphaTauriF1 to r/formula1
[link] [comments]

What are some old British TV shows (pre-2000) that still hold up really well?

By /u/FuckingPope

Just browsing /r/oldbritishtelly and surprised at how many shows, when I try and watch then, don't really hold up very well.

On the other hand, I do think:

  • Gamesmaster

  • Crystal Maze

  • Gladiators

Could all be aired today and work just as well.

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

What is the scariest Pub you’ve ever been to?

By /u/Weary-Surprise-2150

I’m looking for the kind of pub which filled you with fear as soon as you walk in, the kind with hairdryers hanging off the wall, blinking overhead lights, dirty pint glasses and terrifying patrons who are all like Begbie from Trainspotting.

submitted by /u/Weary-Surprise-2150 to r/AskUK
[link] [comments]

Pay £15 for an advent calendar, only to find today's chocolate is missing and replaced with a 15% off code

By /u/TentativeGosling

I really like Tony's Chocoloney and my daughter and wife have had one of their calendars as an upgrade from their usual chocolate advent calendar due to the rubbish past few years. Today's window was opened to find absolutely nothing apart from a voucher code for 15% off their website. It's supposed to be a metaphor for unequal profits in the chocolate industry, but try explaining that to a child who's upset they haven't got their chocolate treat as they prepare to walk through a storm to school.

submitted by /u/TentativeGosling to r/britishproblems
[link] [comments]

Do you have a 'nice' receptionist at your GP's?

By /u/HappyNoinin

Then for the love of all that is holy, let their manager know!

I'm sick of being told that I'm the only nice receptionist. It's great to hear but does 'eff all in changing the way the other staff act. Instead of telling me about all the annoying people I work with (I know... I have to work with them), use that time to drop a quick email to the practice. Not only does it help the nice employee get recognised it highlights that the others don't get this feedback and may need further training/observation.

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

Woman 21, lost a tooth after being punched by man for rejecting him.

By /u/PROcrastinataa

Woman 21, lost a tooth after being punched by man for rejecting him. submitted by /u/PROcrastinataa to r/unitedkingdom
[link] [comments]

My cs professor demands syntax highlighting on paper in order for us to score full marks.

By /u/therealsavalon

My cs professor demands syntax highlighting on paper in order for us to score full marks. submitted by /u/therealsavalon to r/ProgrammerHumor
[link] [comments]

5:01. That's my new nickname.

By /u/Timmy0240


My boss and co-worker have decided to give me a nickname! As the title suggests, they call me "5:01", because I leave almost bang on at the end of my day, which starts at 8:00am and ends on 5:00pm.

For context, at this particular establishment, overtime is unpaid. So, for every minute I'm there after 5:00pm, my time is unpaid. Well, as my boss would put it, paid in benefits, which I have not used nor do I plan to, as they're of no use to me. And he absolutely will not change his stance on that.

So, as a result of that particular policy, I make a point of doing almost no overtime. In dire straits to get a job done? Unfortunately, we're not a non-for-profit organisation, and I'm not donating my time, so it falls under the 'not my problem' policy I've established.

And as a result of my stoic approach, they've given me a rather demoralising, and frankly, humiliating awesome new nickname, which I'll be taking in my stride.

And after the last shenanigan of them not being able to pay my wage one week, I'm now looking for alternative employment. Or, maybe nothing at all. I'm not going to take being treated as sub-human just because I refuse to give my time away to make someone else money.

You can call people lazy all you want, but that's just because you've spent your life working, trying to prove to yourself, that you're not, and now you regret it.

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

Daily Discussion Thread - 08 Dec 2021

By /u/AutoModerator

submitted by /u/AutoModerator to r/ScottishFootball
[link] [comments]

Christian Horner interview: ‘Max Verstappen will not resort to crash tactics – he’s a better driver than Lewis Hamilton’

By /u/Drac2022

Christian Horner interview: ‘Max Verstappen will not resort to crash tactics – he’s a better driver than Lewis Hamilton’ submitted by /u/Drac2022 to r/formula1
[link] [comments]

I have tested positive to covid but my landlord has asked me not to report it

By /u/OtherwiseFun167

I live in a building where all rooms are shared and nobody can self isolate properly. I have tested postive to covid and the landlord has made a room available for me only, by moving occupants into other rooms. The landlord rents some of the rooms on Airbnb, booking.com, etc.

He has begged me not to report my lateral flow test and not to request a PCR, because, in his words: "Than I'd have to shutdown the whole place".

Is it true that, if the PCR is postive, then the whole place needs to be quarantined? I think he's just making it up but I'd like your opinion. Thanks.

submitted by /u/OtherwiseFun167 to r/LegalAdviceUK
[link] [comments]

Tony's advent calendar missing a chocolate!

By /u/Tomarse

Both my kids opened the 8th door today on their Tony's advent calendar and neither of them had a chocolate. Completely gutted.

submitted by /u/Tomarse to r/britishproblems
[link] [comments]

Humans helping humans..

By /u/FoundationUseful270

Humans helping humans.. submitted by /u/FoundationUseful270 to r/HumansBeingBros
[link] [comments]

What would you add?

By /u/suptonyt

What would you add? submitted by /u/suptonyt to r/teenagers
[link] [comments]

Hawkeye S01E04 - Discussion Thread

By /u/steve32767

Its that time again! This thread is for discussion about the episode, bro.

Insight will be on for at least the next 24 hours!

(When Project Insight is active, all user-submitted posts have to be manually approved by the mod team before they are visible to the sub. It is our main line of defense we have for keeping spoilers off the subreddit during new release periods.)

We will also be removing any threads about the episode within these 24 hours to prevent unmarked spoilers making it onto the sub.

Discussion about the previous episodes is permitted in the thread below, discussion about episodes after this is NOT.

Proceed at your own risk: Spoilers for this episode do not need to be tagged inside this thread.

S01E04: Partners, Am I Right? Bert & Bertie Erin Cancino & Heather Quinn December 8th, 2021 on Disney+ 41 min None

For additional discussion about Marvel Studios shows on Disney+, visit /r/MarvelStudiosPlus bro

Previous Episode Threads:

submitted by /u/steve32767 to r/marvelstudios
[link] [comments]

git-history: a tool for analyzing scraped data collected using Git and SQLite

I described Git scraping last year: a technique for writing scrapers where you periodically snapshot a source of data to a Git repository in order to record changes to that source over time.

The open challenge was how to analyze that data once it was collected. git-history is my new tool designed to tackle that problem.

Git scraping, a refresher

A neat thing about scraping to a Git repository is that the scrapers themselves can be really simple. I demonstrated how to run scrapers for free using GitHub Actions in this five minute lightning talk back in March.

Here's a concrete example: California's state fire department, Cal Fire, maintain an incident map at fire.ca.gov/incidents showing the status of current large fires in the state.

I found the underlying data here:

curl https://www.fire.ca.gov/umbraco/Api/IncidentApi/GetIncidents

Then I built a simple scraper that grabs a copy of that every 20 minutes and commits it to Git. I've been running that for 14 months now, and it's collected 1,559 commits!

The thing that excites me most about Git scraping is that it can create truly unique datasets. It's common for organizations not to keep detailed archives of what changed and where, so by scraping their data into a Git repository you can often end up with a more detailed history than they maintain themselves.

There's one big challenge though; having collected that data, how can you best analyze it? Reading through thousands of commit differences and eyeballing changes to JSON or CSV files isn't a great way of finding the interesting stories that have been captured.


git-history is the new CLI tool I've built to answer that question. It reads through the entire history of a file and generates a SQLite database reflecting changes to that file over time. You can then use Datasette to explore the resulting data.

Here's an example database created by running the tool against my ca-fires-history repository. I created the SQLite database by running this in the repository directory:

git-history file ca-fires.db incidents.json \
  --namespace incident \
  --id UniqueId \
  --convert 'json.loads(content)["Incidents"]'

Animated gif showing the progress bar

In this example we are processing the history of a single file called incidents.json.

We use the UniqueId column to identify which records are changed over time as opposed to newly created.

Specifying --namespace incident causes the created database tables to be called incident and incident_version rather than the default of item and item_version.

And we have a fragment of Python code that knows how to turn each version stored in that commit history into a list of objects compatible with the tool, see --convert in the documentation for details.

Let's use the database to answer some questions about fires in California over the past 14 months.

The incident table contains a copy of the latest record for every incident. We can use that to see a map of every fire:

A map showing 250 fires in California

This uses the datasette-cluster-map plugin, which draws a map of every row with a valid latitude and longitude column.

Where things get interesting is the incident_version table. This is where changes between different scraped versions of each item are recorded.

Those 250 fires have 2,060 recorded versions. If we facet by _item we can see which fires had the most versions recorded. Here are the top ten:

This looks about right - the larger the number of versions the longer the fire must have been burning. The Dixie Fire has its own Wikipedia page!

Clicking through to the Dixie Fire lands us on a page showing every "version" that we captured, ordered by version number.

git-history only writes values to this table that have changed since the previous version. This means you can glance at the table grid and get a feel for which pieces of information were updated over time:

The table showing changes to that fire over time

The ConditionStatement is a text description that changes frequently, but the other two interesting columns look to be AcresBurned and PercentContained.

That _commit table is a foreign key to commits, which records commits that have been processed by the tool - mainly so that when you run it a second time it can pick up where it finished last time.

We can join against commits to see the date that each version was created. Or we can use the incident_version_detail view which performs that join for us.

Using that view, we can filter for just rows where _item is 174 and AcresBurned is not blank, then use the datasette-vega plugin to visualize the _commit_at date column against the AcresBurned numeric column... and we get a graph of the growth of the Dixie Fire over time!

The chart plugin showing a line chart

To review: we started out with a GitHub Actions scheduled workflow grabbing a copy of a JSON API endpoint every 20 minutes. Thanks to git-history, Datasette and datasette-vega we now have a chart showing the growth of the longest-lived California wildfire of the last 14 months over time.

A note on schema design

One of the hardest problems in designing git-history was deciding on an appropriate schema for storing version changes over time.

I ended up with the following (edited for clarity):

CREATE TABLE [commits] (
   [hash] TEXT,
   [commit_at] TEXT
   [_item_id] TEXT,
   [IncidentID] TEXT,
   [Location] TEXT,
   [Type] TEXT,
   [_commit] INTEGER
CREATE TABLE [item_version] (
   [_item] INTEGER REFERENCES [item]([_id]),
   [_version] INTEGER,
   [_commit] INTEGER REFERENCES [commits]([id]),
   [IncidentID] TEXT,
   [Location] TEXT,
   [Type] TEXT
CREATE TABLE [columns] (
   [namespace] INTEGER REFERENCES [namespaces]([id]),
   [name] TEXT
CREATE TABLE [item_changed] (
   [item_version] INTEGER REFERENCES [item_version]([_id]),
   [column] INTEGER REFERENCES [columns]([id]),
   PRIMARY KEY ([item_version], [column])

As shown earlier, records in the item_version table represent snapshots over time - but to save on database space and provide a neater interface for browsing versions, they only record columns that had changed since their previous version. Any unchanged columns are stored as null.

There's one catch with this schema: what do we do if a new version of an item sets one of the columns to null? How can we tell the difference between that and a column that didn't change?

I ended up solving that with an item_changed many-to-many table, which uses pairs of integers (hopefully taking up as little space as possible) to record exactly which columns were modified in which item_version records.

The item_version_detail view displays columns from that many-to-many table as JSON - here's a filtered example showing which columns were changed in which versions of which items:

This table shows a JSON list of column names against items and versions

Here's a SQL query that shows, for ca-fires, which columns were updated most often:

select columns.name, count(*)
from incident_changed
  join incident_version on incident_changed.item_version = incident_version._id
  join columns on incident_changed.column = columns.id
where incident_version._version > 1
group by columns.name
order by count(*) desc

Helicopters are exciting! Let's find all of the fires which had at least one record where the number of helicopters changed (after the first version). We'll use a nested SQL query:

select * from incident
where _id in (
  select _item from incident_version
  where _id in (
    select item_version from incident_changed where column = 15
  and _version > 1

That returned 19 fires that were significant enough to involve helicopters - here they are on a map:

A map of 19 fires that involved helicopters

Advanced usage of --convert

Drew Breunig has been running a Git scraper for the past 8 months in dbreunig/511-events-history against 511.org, a site showing traffic incidents in the San Francisco Bay Area. I loaded his data into this example sf-bay-511 database.

The sf-bay-511 example is useful for digging more into the --convert option to git-history.

git-history requires recorded data to be in a specific shape: it needs a JSON list of JSON objects, where each object has a column that can be treated as a unique ID for purposes of tracking changes to that specific record over time.

The ideal tracked JSON file would look something like this:

    "IncidentID": "abc123",
    "Location": "Corner of 4th and Vermont",
    "Type": "fire"
    "IncidentID": "cde448",
    "Location": "555 West Example Drive",
    "Type": "medical"

It's common for data that has been scraped to not fit this ideal shape.

The 511.org JSON feed can be found here - it's a pretty complicated nested set of objects, and there's a bunch of data in there that's quite noisy without adding much to the overall analysis - things like a updated timestamp field that changes in every version even if there are no changes, or a deeply nested "extension" object full of duplicate data.

I wrote a snippet of Python to transform each of those recorded snapshots into a simpler structure, and then passed that Python code to the --convert option to the script:

git-history file sf-bay-511.db 511-events-history/events.json \
  --repo 511-events-history \
  --id id \
  --convert '
data = json.loads(content)
if data.get("error"):
    # {"code": 500, "error": "Error accessing remote data..."}
for event in data["Events"]:
    event["id"] = event["extension"]["event-reference"]["event-identifier"]
    # Remove noisy updated timestamp
    del event["updated"]
    # Drop extension block entirely
    del event["extension"]
    # "schedule" block is noisy but not interesting
    del event["schedule"]
    # Flatten nested subtypes
    event["event_subtypes"] = event["event_subtypes"]["event_subtype"]
    if not isinstance(event["event_subtypes"], list):
        event["event_subtypes"] = [event["event_subtypes"]]
    yield event

The single-quoted string passed to --convert is compiled into a Python function and run against each Git version in turn. My code loops through the nested Events list, modifying each record and then outputting them as an iterable sequence using yield.

A few of the records in the history were server 500 errors, so the code block knows how to identify and skip those as well.

When working with git-history I find myself spending most of my time iterating on these conversion scripts. Passing strings of Python code to tools like this is a pretty fun pattern - I also used it for sqlite-utils convert earlier this year.

Trying this out yourself

If you want to try this out for yourself the git-history tool has an extensive README describing the other options, and the scripts used to create these demos can be found in the demos folder.

The git-scraping topic on GitHub now has over 200 repos now built by dozens of different people - that's a lot of interesting scraped data sat there waiting to be explored!

Quoting Martin O'Leary

One popular way of making money through cryptocurrency is to start a new currency, while retaining a large chunk of it for yourself. As a result, there are now thousands of competing cryptocurrencies in operation, with relatively little technical difference between them. In order to succeed, currency founders must convince people that their currency is new and different, and crucially, that the buyer understands this while other less savvy investors do not. Wild claims, fanciful economic ideas and rampant technobabble are the order of the day. This is a field that thrives on mystique, and particularly preys on participants’ fear of missing out on the next big thing.

Martin O'Leary

s3-credentials 0.8

s3-credentials 0.8

The latest release of my s3-credentials CLI tool for creating S3 buckets with credentials to access them (with read-write, read-only or write-only policies) adds a new --public option for creating buckets that allow public access, such that anyone who knows a filename can download a file. The s3-credentials put-object command also now sets the appropriate Content-Type heading on the uploaded object.

Google Public DNS Flush Cache

Google Public DNS Flush Cache

Google Public DNS ( have a flush cache page too.

Via isclever on Hacker News

Cloudflare's DNS service has a tool that anyone can use to flush a specific DNS entry from their cache - could be useful for assisting rollouts of new DNS configurations.

Via isclever on Hacker News

Centrifuge: a reliable system for delivering billions of events per day

Centrifuge: a reliable system for delivering billions of events per day

From 2018, a write-up from Segment explaining how they solved the problem of delivering webhooks from thousands of different producers to hundreds of potentially unreliable endpoints. They started with Kafka and ended up on a custom system written in Go against RDS MySQL that was specifically tuned to their write-heavy requirements.

Via @jkakar



This is such a great idea: jc is a CLI tool which knows how to convert the output of dozens of different classic Unix utilities to JSON, so you can more easily process it programmatically, pipe it through jq and suchlike. "pipx install jc" to install, then "dig example.com | jc --dig" to try it out.

Via Tips on Adding JSON Output to Your CLI App

100 years of whatever this will be

100 years of whatever this will be

This piece by apenwarr defies summarization but I enjoyed reading it a lot.

Weeknotes: Shaving some beautiful yaks

I've been mostly shaving yaks this week - two in particular: the Datasette table refactor and the next release of git-history. I also built and released my first Web Component!

A Web Component for embedding Datasette tables

A longer term goal that I have for Datasette is to figure out a good way of using it to build dashboards, tying together summaries and visualizations of the latest data from a bunch of different sources.

I'm excited about the potential of Web Components to help solve this problem.

My datasette-notebook project is a very early experiment in this direction: it's a Datasette notebook that provides a Markdown wiki (persisted to SQLite) to which I plan to add the ability to embed tables and visualizations in wiki pages - forming a hybrid of a wiki, dashboarding system and Notion/Airtable-style database.

It does almost none of those things right now, which is why I've not really talked about it here.

Web Components offer a standards-based mechanism for creating custom HTML tags. Imagine being able to embed a Datasette table on a page by adding the following to your HTML:


That's exactly what datasette-table lets you do! Here's a demo of it in action.

This is version 0.1.0 - it works, but I've not even started to flesh it out.

I did learn a bunch of things building it though: it's my first Web Component, my first time using Lit, my first time using Vite and the first JavaScript library I've ever packaged and published to npm.

Here's a detailed TIL on Publishing a Web Component to npm encapsulating everything I've learned from this project so far.

This is also my first piece of yak shaving this week: I built this partly to make progress on datasette-notebook, but also because my big Datasette refactor involves finalizing the design of the JSON API for version 1.0. I realized that I don't actually have a project that makes full use of that API, which has been hindering my attempts to redesign it. Having one or more Web Components that consume the API will be a fantastic way for me to eat my own dog food.

Link: rel="alternate" for Datasette tables

Here's an interesting problem that came up while I was working on the datasette-table component.

As designed right now, you need to figure out the JSON URL for a table and pass that to the component.

This is usually a case of adding .json to the path, while preserving any query string parameters - but there's a nasty edge-case: if your SQLite table itself ends with the string .json (which could happen! Especially since Datasette promises to work with any existing SQLite database) the URL becomes this instead:


Telling users of my component that they need to first construct the JSON URL for their page isn't the best experience: I'd much rather let people paste in the URL to the HTML version and derive the JSON from that.

This is made more complex by the fact that, thanks to --cors, the Web Component can be embedded on any page. And for datasette-notebook I'd like to provide a feature where any URLs to Datasette instances - no matter where they are hosted - are turned into embedded tables automatically.

To do this, I need an efficient way to tell that an arbitrary URL corresponds to a Datasette table.

My latest idea here is to use a combination of HTTP HEAD requests and a Link: rel="alternate" header - something like this:

~ % curl -I 'https://latest.datasette.io/fixtures/compound_three_primary_keys'
HTTP/1.1 200 OK
date: Sat, 27 Nov 2021 20:09:36 GMT
server: uvicorn
Link: https://latest.datasette.io/fixtures/compound_three_primary_keys.json; rel="alternate"; type="application/datasette+json"

This would allow a (hopefully fast) fetch() call from JavaScript to confirm that a URL is a Datasette table, and get back the JSON that should be fetched by the component in order to render it on the page.

I have a prototype of this in Datasette issue #1533. I think it's a promising approach!

It's also now part of the ever-growing table refactor. Adding custom headers to page responses is currently far harder than it should be.

sqlite-utils STRICT tables

SQLite 3.37.0 came out at the weekend with a long-awaited feature: STRICT tables, which enforce column types such that you get an error if you try to insert a string into an integer column.

(This has been a long-standing complaint about SQLite by people who love strong typing, and D. Richard Hipp finally shipped the change for them with some salty release notes saying it's "for developers who prefer that kind of thing.")

I started researching how to add support for this to my sqlite-utils Python library. You can follow my thinking in sqlite-utils issue #344 - I'm planning to add a strict=True option to methods that create tables, but for the moment I've shipped new introspection properties for seeing if a table uses strict mode or not.

git-history update

My other big yak this week has been work on git-history. I'm determined to get it into a stable state such that I can write it up, produce a tutorial and maybe produce a video demonstration as well - but I keep on finding things I want to change about how it works.

The big challenge is how to most effectively represent the history of a bunch of different items over time in a relational database schema.

I started with a item table that presents just the most recent version of each item, and an item_version table with a row for every subsequent version.

That table got pretty big, with vast amounts of duplicated data in it.

So I've been working on an optimization where columns are only included in an item_version row if they have changed since the previous version.

The problem there is what to do about null - does null mean "this column didn't change" or does it mean "this column was set from some other value back to null"?

After a few different attempts I've decided to solve this with a many-to-many table, so for any row in the item_version table you can see which columns were explicitly changed by that version.

This is all working pretty nicely now, but still needs documentation, and tests, and then a solid write-up and tutorial and demos and a video... hopefully tomorrow!

One of my design decisions for this tool has been to use an underscore prefix for "reserved columns", such that non-reserved columns can be safely used by the arbitrary data that is being tracked by the tool.

Having columns with names like _id and _item has highlighted several bugs with Datasette's handling of these column names, since Datasette itself tries to use things like ?_search= for special query string parameters. I released Datasette 0.59.4 with some relevant fixes.

A beautiful yak

A very beautiful yak

As a consumate yak shaver this beautiful yak that showed up on Reddit a few weeks ago has me absolutely delighted. I've not been able to determine the photography credit.

Releases this week

TIL this week

Free software activities in November 2021

Here is my monthly update covering what I have been doing in the free software world during November 2021 (previous month):


Reproducible Builds

The motivation behind the Reproducible Builds effort is to ensure no flaws have been introduced during this compilation process by promising identical results are always generated from a given source, thus allowing multiple third-parties to come to a consensus on whether a build was compromised.

This month, I:


Elsewhere in our tooling, I made the following changes to diffoscope, including preparing and uploading versions 190, 191, 192, 193 and 194 to Debian:

I also made an update to the command-line client to trydiffoscope , a web-based version of the diffoscope in-depth and content-aware diff utility, specifically only waiting for 2 minutes for try.diffoscope.org to respond in tests. (#998360)



I also filed a single non-reproducible bug this month against meson to note that it has an outdated Source field in the debian/copyright file. (#1000328)


Debian LTS

This month I have worked 18 hours on Debian Long Term Support (LTS) and 12 hours on its sister Extended LTS project.

You can find out more about the project via the following video:

PHP 8.1 release notes

PHP 8.1 release notes

PHP is gaining "Fibers" for lightweight cooperative concurrency - very similar to Python asyncio. Interestingly you don't need to use separate syntax like "await fn()" to call them - calls to non-blocking functions are visually indistinguishable from calls to blocking functions. Considering how much additional library complexity has emerged in Python world from having these two different colours of functions it's noteworthy that PHP has chosen to go in a different direction here.

Via Hacker News

Quoting Rasmus Lerdorf

htmlspecialchars was a very early function. Back when PHP had less than 100 functions and the function hashing mechanism was strlen(). In order to get a nice hash distribution of function names across the various function name lengths names were picked specifically to make them fit into a specific length bucket. This was circa late 1994 when PHP was a tool just for my own personal use and I wasn't too worried about not being able to remember the few function names.

Rasmus Lerdorf

Introduction to heredocs in Dockerfiles

Introduction to heredocs in Dockerfiles

This is a fantastic upgrade to Dockerfile syntax, enabled by BuildKit and a new frontend for executing the Dockerfile that can be specified with a #syntax= directive. I often like to create a standalone Dockerfile that works without needing other files from a directory, so being able to use <<EOF syntax to populate configure files from inline blocks of code is really handy.

Via @mwarkentin

Weeknotes: Apache proxies in Docker containers, refactoring Datasette

Updates to six major projects this week, plus finally some concrete progress towards Datasette 1.0.

Fixing Datasette's proxy bugs

Now that Datasette has had its fourth birthday I've decided to really push towards hitting the 1.0 milestone. The key property of that release will be a stable JSON API, stable plugin hooks and a stable, documented context for custom templates. There's quite a lot of mostly unexciting work needed to get there.

As I work through the issues in that milestone I'm encountering some that I filed more than two years ago!

Two of those made it into the Datasette 0.59.3 bug fix release earlier this week.

The majority of the work in that release though related to Datasette's base_url feature, designed to help people who run Datasette behind a proxy.

base_url lets you run Datasette like this:

datasette --setting base_url=/prefix/ fixtures.db

When you do this, Datasette will change its URLs to start with that prefix - so the hompage will live at /prefix/, the database index page at /prefix/fixtures/, tables at /prefix/fixtures/facetable etc.

The reason you would want this is if you are running a larger website, and you intend to proxy traffic to /prefix/ to a separate Datasette instance.

The Datasette documentation includes suggested nginx and Apache configurations for doing exactly that.

This feature has been a magnet for bugs over the years! People keep finding new parts of the Datasette interface that fail to link to the correct pages when run in this mode.

The principle cause of these bugs is that I don't use Datasette in this way myself, so I wasn't testing it nearly as thoroughly as it needed.

So the first step in finally solving these issues once and for all was to get my own instance of Datasette up and running behind an Apache proxy.

Since I like to deploy live demos to Cloud Run, I decided to try and run Apache and Datasette in the same container. This took a lot of figuring out. You can follow my progress on this in these two issue threads:

The short version: I got it working! My Docker implementation now lives in the demos/apache-proxy directory and the live demo itself is deployed to datasette-apache-proxy-demo.fly.dev/prefix/.

(I ended up deploying it to Fly after running into a bug when deployed to Cloud Run that I couldn't replicate on my own laptop.)

My final implementation uses a Debian base container with Supervisord to manage the two processes.

With a working live environment, I was finally able to track down the root cause of the bugs. My notes on #1519: base_url is omitted in JSON and CSV views document how I found and solved them, and updated the associated test to hopefully avoid them ever coming back in the future.

The big Datasette table refactor

The single most complicated part of the Datasette codebase is the code behind the table view - the page that lets you browse, facet, search, filter and paginate through the contents of a table (this page here).

It's got very thorough tests, but the actual implementation is mostly a 600 line class method.

It was already difficult to work with, but the changes I want to make for Datasette 1.0 have proven too much for it. I need to refactor.

Apart from making that view easier to change and maintain, a major goal I have is for it to support a much more flexible JSON syntax. I want the JSON version to default to just returning minimal information about the table, then allow ?_extra=x parameters to opt into additional information - like facets, suggested facets, full counts, SQL schema information and so on.

This means I want to break up that 600 line method into a bunch of separate methods, each of which can be opted-in-to by the calling code.

The HTML interface should then build on top of the JSON, requesting the extras that it knows it will need and passing the resulting data through to the template. This helps solve the challenge of having a stable template context that I can document in advance of Datasette 1.0

I've been putting this off for over a year now, because it's a lot of work. But no longer! This week I finally started to get stuck in.

I don't know if I'll stick with it, but my initial attempt at this is a little unconventional. Inspired by how pytest fixtures work I'm experimenting with a form of dependency injection, in a new (very alpha) library I've released called asyncinject.

The key idea behind asyncinject is to provide a way for class methods to indicate their dependencies as named parameters, in the same way as pytest fixtures do.

When you call a method, the code can spot which dependencies have not yet been resolved and execute them before executing the method.

Crucially, since they are all async def methods they can be executed in parallel. I'm cautiously excited about this - Datasette has a bunch of opportunities for parallel queries - fetching a single page of table rows, calculating a count(*) for the entire table, executing requested facets and calculating suggested facets are all queries that could potentially run in parallel rather than in serial.

What about the GIL, you might ask? Datasette's database queries are handled by the sqlite3 module, and that module releases the GIL once it gets into SQLite C code. So theoretically I should be able to use more than one core for this all.

The asyncinject README has more details, including code examples. This may turn out to be a terrible idea! But it's really fun to explore, and I'll be able to tell for sure if this is a useful, maintainable and performant approach once I have Datasette's table view running on top of it.

git-history and sqlite-utils

I made some big improvements to my git-history tool, which automates the process of turning a JSON (or other) file that has been version-tracked in a GitHub repository (see Git scraping) into a SQLite database that can be used to explore changes to it over time.

The biggest was a major change to the database schema. Previously, the tool used full Git SHA hashes as foreign keys in the largest table.

The problem here is that a SHA hash string is 40 characters long, and if they are being used as a foreign key that's a LOT of extra weight added to the largest table.

sqlite-utils has a table.lookup() method which is designed to make creating "lookup" tables - where a string is stored in a unique column but an integer ID can be used for things like foreign keys - as easy as possible.

That method was previously quite limited, but in sqlite-utils 3.18 and 3.19 - both released this week - I expanded it to cover the more advanced needs of my git-history tool.

The great thing about building stuff on top of your own libraries is that you can discover new features that you need along the way - and then ship them promptly without them blocking your progress!

Some other highlights

TIL this week

Releases this week



Hurl is "a command line tool that runs HTTP requests defined in a simple plain text format" - written in Rust on top of curl, it lets you run HTTP requests and then execute assertions against the response, defined using JSONPath or XPath for HTML. It can even assert that responses were returned within a specified duration.

Via @humphd

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!

Channels 2.0

Finally, the promised land is here and Channels 2.0 is released. But how much has changed? And why?

CodeSOD: Dummy Round

By Remy Porter

Different languages will frequently have similar syntax. Many a pointy-haired-boss has seen this similarity and thus assumed that, if their programmer knows C, then C++ should be easy, and if they know C++ then going into C# must be trivial. I mean, the languages look the same, so they must be the same, right? Boats and cars are steered by wheels, so clearly if you can drive a car you can pilot a boat, and nothing will go wrong.

Andreas S inherited some code that started at C/C++ and was then ported to C#. The original developers were the sort to reinvent wheels wherever possible, so it's no surprise that they kept that going when they moved into C#.

There are, for example, a few methods not supplied in today's code sample. They wrote their own RoundTo, which Andreas describes thus: "RoundTo() is basically equal to Math.Round(), but implemented in a WTF way." There is also a homebrew Sprintf implemented as an "extension method" on Strings.

These all get combined in the method GetStringToRound which doesn't get anything, but seems to just format a string into a rounded off value.

public static string GetStringToRound(double dValue, int iDecimals) { double dDummy = dValue; string sFormat = $"%.{iDecimals}lf"; double dDummyRound = 0.0; string sReturn = ""; for (int i = 0; i <= iDecimals; i++) { dDummyRound = RoundTo(dDummy, i); double dDifferenz = RoundTo(dDummy - dDummyRound, i + 1); if (dDifferenz == 0.0) { sFormat = sFormat.Sprintf("%ld", i); sFormat = "%." + sFormat + "lf"; break; } } if (dValue != dDummyRound) { dValue = dDummyRound; } sReturn = sReturn.Sprintf(sFormat, dValue); return sReturn; }

I think the dummy here is me, because I do not understand any of the logic going on inside that for loop. Why is it even a for loop? I see that we're checking if rounding to i and i+1 decimal places are the same, we know that we don't really need to round farther. Which, sure… but… why?

I'm sure this code works, and I'm sure it's doing what it was intended to do. I also know that there are built-in methods which already do all of this, that are cleaner and easier to read and understand, and don't leave be scratching my head feeling like a dDummy.

[Advertisement] Utilize BuildMaster to release your software with confidence, at the pace your business demands. Download today!

Unseen Effort

By Ellis Morning

Hermann Safe Co. Safe

Anita, a senior developer, had recently been hired at a company with around 60 employees. Her first assignment was to assist with migrating the company’s flagship on-premises application to the cloud. After a year of effort, the approach was deemed unworkable and the entire project was scrapped. Seem a little hasty? Well, to be fair, the company made more money selling the servers and licenses for running their application on-premise than they made on the application itself. Multiple future migration attempts would meet the same fate, but that's a whole other WTF.

With the project's failure, Anita became redundant and feared being let go. Fortunately, the powers-that-be transferred her to another department instead. This was when Anita first met Henry, her new manager.

Henry was a database guy. It wasn't clear how much project management experience he had, but he definitely knew a great deal about business intelligence and analytics. Henry explained to Anita that she’d be working on implementing features that customers had been requesting for years. Anita had never worked with analytics before, but did have a background in SQL databases. She figured multi-dimensional databases shouldn't be too hard to learn. So learn she did, working as a one-person army. Henry never put any time pressure on her, and was always happy to answer her questions. The only downside to working for him was his disdain toward open source solutions. Anita couldn't use any NuGet packages whatsoever; everything had to be built from scratch. She learned a ton while making her own JSON parsing library and working out OAuth 2.0 authentication.

Upon completing a project, Anita would go to Henry's office to demo it. Once satisfied, Henry would say "Great!" and hand her a new project. Whenever Anita asked if there were a feature request logged somewhere that she could close out, she was told she didn't have to worry about it. She would also ask about her previous efforts, whether they'd been tested and released. Henry usually replied along the lines of, "I haven't had time yet, but soon!"

Over time, Anita noticed an uncomfortable trend: every 12 months or so, the higher-ups fired 20-30% of the entire staff, normally from Sales or Marketing. The company wasn't making as much money as the shareholders thought it should, so they would fire people, wait a few months, then hire new people. For the most part, though, they spared the developers working on the core application. They were smart enough to understand that no one coming in cold would be capable of figuring out this beast.

She figured she was safe—and yet, after 6 years, Anita found herself being fired. Henry brought her into his office, insisted it wasn't his choice, and emphasized that he was very sorry to lose her.

Anita shook her head in resignation. After the shock had worn off, she'd looked into a few things. "Over the years, you gave me 8 projects to work on," she said.

Henry nodded.

"Are you aware that you never tested any of them?" Anita asked. "You never released them to production. They're still sitting in SourceSafe, waiting for someone to use them. Are you aware that the company has never seen a penny from the work I've done for you?"

From the look on his face, it was clear that Henry had never realized this.

"This has been a good learning experience, at least," Anita said. "Thanks for everything."

Anita was able to take the knowledge she'd gained and double her salary at her next job, which only took 3 weeks to find. She's no longer reinventing the wheel or going unappreciated, and that's a win-win for sure.

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

Leading From Affronts

By Remy Porter

Scientists frequently need software to support their research, but rarely are strong developers. And why should they be, that software is written to accomplish a goal, and it's the goal which matters to them more than anything about the software itself.

That's where Jared comes in. He worked in a university IT department and his job was simply to write the software the researchers needed. They frequently had a very clear picture of what they needed, along with big piles of math to explain it, plus piles of example input and expected output data.

The team was small- just Jared and two other developers, Larry and Barry. There was no team lead, they could simply coordinate and divide the work. Their manager was nearly invisible, and mostly focused on keeping external office politics from disrupting the work. The work wasn't precisely simple, but it was clear and well defined, the pay was good.

While the code quality wasn't perfect, it was good enough. Since throughput was one of the main drivers of the design, a lot of code segments got hyperoptimized in ways that made the code harder to understand and maintain, but boosted its performance. The software was mostly stateless, the unit test coverage was nearly 100%, and while the UI was the ugliest of ducklings, the software worked and gave the researches what they wanted.

In short, it was the best job Jared had ever had up to that point.

Six months into the job, Jared came into work as he normally did. Larry was an early starter, so he was already at his desk, but instead of typing away, he simply sat at his desk. His hands were in his lap, and Larry simply stared forlornly at his keyboard. Barry had a similar thousand-yard stare aimed at his monitor.

"What's wrong?" Jared asked.

The answer was just a long sigh followed by, "Just… go pull the latest code."

So Jared did. The latest commit eradicated everything. Most of the files in the codebase had been deleted and replaced with a single 7,000 line God Object. And the git blame told him the culprit, someone named "Scott".

"Who the heck is Scott?"

Larry just shook his head and sighed again. Barry chimed in. "He's our technical lead."

"Wait, we got a new technical lead?" Jared asked.

"No, he's always been the tech-lead. Apparently. I had to check the org-chart because I didn't even know- none of us did. But Larry's worked with Scott before."

That revelation caused Larry to sigh again, and shake his head.

"It apparently didn't go well," Barry explained.

A little later that morning, Scott wandered into their team room. "Hey, Josh, you must be the new developer."

"Jared, and I've been here for six months-"

"So, I noticed we'd gotten a little off track," Scott said, ignoring Jared. "I've been bouncing around a lot of different projects, because well, you know, when you're good people want you to do everything, and work miracles, amirite? Anyway, we're going to make some changes to improve code quality and overall design."

So Scott walked them through his new architectural pattern. That 7,000 line God Object was, in part, an event bus. No object was allowed to talk directly to any other object. Instead, it needed to raise an event and let the bus pass the information to the next object. For "performance" each event would spawn a new thread. And since the God Object contained most of the application logic, most events on the bus were sent from, and received by, the God Object.

As a bonus, Scott hadn't written any unit tests. There were more compiler warnings than lines of code- Scott's code averaged 1.3 warnings per line of code. And no, Scott would not allow anyone to revert back to the old code. He was the tech-lead, by god, and he was going to lead them.

Also, 18-person months of work had just been deleted, all the new features that Jared, Larry and Barry had added over the past six months. Their end users were furious that they'd just lost huge pieces of functionality. Also, the multi-threaded "performant" version took hours to do things that used to take seconds. And within a few weeks of Scott's "revisions" the number of bugs tracked in Jira rose by a factor of six.

The researchers did not like this, and simply refused to update to the new application. Scott did not like that, and started trying to force them to change. Their manager didn't like any of this, and pressured the team to fix the new version of the application. And quickly, which meant a lot of unpaid overtime. Once overtime started, Scott "surprisingly" got pulled into another project which needed his attention.

With Scott gone, they were almost able to revert to the old version of the code, but there had been so much work put into the new version that their manager only saw the sunk costs and not the bigger picture. They were committed to sinking the ship, whether they liked it or not.

Bug counts kept rising, it got harder and harder to implement new features, there was a scramble to hire new people and the team of three suddenly became a team of twelve, but nothing could be done for it. The system had become an unmaintainable Codethulhu.

The best job Jared had ever had turned into the worst, all with one commit from Scott. Jared quit and found a new job. Scott kept plugging away, vandalizing codebases in the university for another five years before finally screwing up big enough to get fired. The last Jared saw on LinkedIn, Scott had moved on to another, larger, and more prestigious university, doing the same development work he had been doing.

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

Error'd: The Other Washington

By Lyle Seaman

This week, anonymous Franz starts us off with a catch-22. "I opened MS Word (first time after reboot) and a dialog box opens that tells me to close a dialog box. This was the only open dialog box... I guess even software makes excuses to be lazy on Fridays."



Sarcastic Laks exclaims "Too much speed!" but declines further wit. "I'll leave that snarky comment up to you this time," he says. Sorry Laks, I'm fresh out.



Google One member Daniel D. flexes "When you happen to be a Google One member, you will see this new top secret MIME type." Only for Google One members.



And speed demon Andreas C. flexes back, humble-bragging that 10Gb/s internet connectivity: "Gee, these powershell modules just gets larger and larger.."

1.3 Terabytes! Not too shabby.



Finally, remote worker Todd R. has uncovered the real root cause of WeWork's fall: poorly targeted direct mail campaigns. "There's a new Washington location, only 2,500 miles away. I'll stay here for now, thanks."



As this one might require a bit of orientation for our far-flung friends, here's a handy map from the US Library of Congress to explain US geography.



That's all for this week, but don't despair. The supply of Error'ds on the web is reliably non-decreasing.

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

CodeSOD: A Split in the Database

By Remy Porter

Oracle is… special. While their core product is their database software, what they actually sell is layers and layers of ERPs and HR systems that run on top of that database. And what they really make money on is the consulting required to keep those monsters from eating your company's IT team alive.

Because these ERPs are meant to be all things to all customers, you also will find that there are a lot of columns named things like attribute3. Your company's custom logic can stuff anything you want in there. "Do as thou wilt," as they say. And suffer the consequences.

For Steven H, his company had a requirement. The order lines needed to join to the manufactured batch that was used to fill that order. This makes sense, and is easy to implement- you add a join table that links BatchId and OrderLineId And, if the folks who build this feature did that, we wouldn't have an article.

To "solve" this problem, they simply mashed together all the order line IDs fulfilled by a batch into a text field called attribute7. The data looked like:


That fulfilled the requirement, in someone's mind, and the ticket was closed and folks moved on to other work. And then a few years later, someone asked if they could actually display that data on a report. It seemed like a simple request, so it got kicked off to an offshore team.

This was their solution:

CREATE VIEW batch_order_lines_vw AS SELECT bh.batch_id, ol.header_id, <other fields go here> FROM order_lines ol, batch_header bh WHERE 1=1 AND ol.line_id IN ( SELECT TRIM( REGEXP_SUBSTR( bh.attribute7, '[^|]+', 1, LEVEL)) FROM DUAL CONNECT BY REGEXP_SUBSTR( bh.attribute7, '[^|]+', 1, LEVEL) IS NOT NULL) ORDER BY line_id ASC

This query joins the batches to the order lines by using a REGEXP_SUBSTR to split those pipe-separated order lines. In fact, it needs to run the same regex twice to actually handle the split. In a subquery that is going to be executed for every combination of rows in order_lines and batch_header. Each table has millions of rows, so you already know exactly what this query does: it times out.

Speaking of things timing out, Steven has this to say about where this went:

We reported this to the database development team and marked the request as blocked. It's been maybe 2 years since then and it's still in that same state. I have since transferred to another team.

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

CodeSOD: Two Comparisons, Hold the Case

By Remy Porter

There are a lot of times when we want string comparisons to be case insensitive. It's quite a lot of cases, so every language is going to give us a way to easily specify that's what we want.

Take, for example, this C# code, written by one of Robin's team-mates.

override public void VerifyConnectionDetails(bool queryRequired) { if (this.Name.EndsWith("2", StringComparison.OrdinalIgnoreCase) || this.Name.EndsWith("2", StringComparison.OrdinalIgnoreCase)) { // Let some time pass to simulate PIDS behavior System.Threading.Thread.Sleep(100); IsConnected = false; } else { IsConnected = true; } IsConnected = true; }

Here, we want to have two different code paths if the Name ends in "2". But we don't want one of those sneaky lower-case 2s to throw things off, so we make this a case insensitive comparison.

Which, honestly, it's a perfectly reasonable thing to do. It may not have always been a "2" that they were looking for, so a case insensitive check may have made more sense in the past. But then… why do the check twice?

And this is where the flow of code drifts from "silly" to just weird. If we're on the "2" code path, we pause for 100ms and then set IsConnected to false. Otherwise, we set it to true. Then no matter what, we set it to true.

I suspect the "2" code path meant to have the false set before the sleep, to simulate checking a connection. Then it sets it to true, simulating that the connection has been established. But I don't know that from this code, instead what I see is a really weird way to force an IsConnected property to be true.

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

CodeSOD: Filtering Out Mistakes

By Remy Porter

We all make simple mistakes. It's inevitable. "Pobody's nerfect," as they say, and we all have brain-farts, off days, and get caught up in a rush and make mistakes.

So we use tools to catch these mistakes. Whether it's automated testing or just checking what warnings the compiler spits out, we can have processes that catch our worst mistakes before they have any consequences.

Unless you're Jose's co-worker. This developer wasn't getting any warnings, they were getting compile errors. That didn't stop them from committing the code and pushing to a shared working branch. Fortunately, this didn't get much further down the pipeline, but said co-worker didn't really understand what the big deal was, and definitely didn't understand why there were errors in the first place.

In any case, here were the errors tossed out by the C# compiler:

Error: CS0165 - line 237 (593) - Use of unassigned local variable 'filter' Error: CS0165 - line 246 (602) - Use of unassigned local variable 'filter' Error: CS0165 - line 250 (606) - Use of unassigned local variable 'filter' Error: CS0165 - line 241 (597) - Use of unassigned local variable 'filter'

Now, let's see if you can spot the cause:

if (partnumber !="") { string filter="(PartPlant.MinimumQty<>0 OR PartPlant.MaximumQty<>0 OR PartPlant.SafetyQty<>0)"; } else { string filter="PartPlant.PartNum = '" + partnumber + "'"; } if (plantvalue !="") { string filter= filter + ""; } else { string filter= filter + " AND PartPlant.Plant = '" + plantvalue + "'"; } if (TPlantcmb.Text !="") { string filter= filter + ""; } else { string filter= filter + " AND PartPlant.TransferPlant = '" + TPlantcmb.Text + "'"; }

C#, like a lot of C-flavored languages, scopes variable declarations to blocks. So each string filter… creates a new variable called filter.

Of course, the co-worker's bad understanding of variable scope in C# isn't the real WTF. The real WTF is that this is clearly constructing SQL code via string concatenation, so say hello to injection attacks.

I suppose mastering the art of writing code that compiles needs to come before writing code that doesn't have gaping security vulnerabilities. After all, code that can't run can't be exploited either.

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

CodeSOD: Are You Doing a Bit?

By Remy Porter

"Don't use magic numbers," is a good rule for programming. But like any rule, you shouldn't blindly apply it. We know what happens when people do, however: we get constants that might as well be magic numbers.

Still, there are sometimes novel versions of this old song. Shmuel F sends us this one in C:

unsigned int ReadMemory(unsigned int address, char size) { switch (size) { case BIT3: // read byte-size case BIT5: // read int-size } }

The cases of the switch statement are a clear threat- we have constants used that are just magic numbers. But the developer responsible went a little above and beyond in defining this:

#define ZERO 0 #define ONE 1 #define TWO 2 #define THREE 3 #define FOUR 4 #define FIVE 5 #define BIT0 (1 << ZERO) #define BIT1 (1 << ONE) #define BIT2 (1 << TWO) #define BIT3 (1 << THREE) #define BIT4 (1 << FOUR) #define BIT5 (1 << FIVE)

Shmuel writes:

Seeing in the code ZERO and ONE is annoying. but this? this is just picking a fight.

All of this leaves us with one more question: why on Earth is size a bitmask?

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

Error'd: The Scent of a Woman

By Lyle Seaman

While Error'd and TDWTF do have an international following, and this week's offerings are truly global, we are unavoidably mired in American traditions. Tomorrow, we begin the celebration of that most-revered of all such traditions: consumerist excess. In its honor, here are a half-dozen exemplary excesses or errors, curated from around the globe. They're not necessarily bugs, per se. Some are simply samples of that other great tradition: garbage in.

Opening from Poland, Michal reported recently of a small purchase that "The estimated arrival was October 27th. But, for a not-so-small additional fee, AliExpress offered to make an extra effort and deliver it as soon as... November 3rd."



Svelte Tim R. declines a purchase, reporting "ao.com had a good price on this LG laptop - the only thing that put me off was the weight"



Correct Kim accurately notes that "Getting the width of the annoying popup box is important if you want it to convey the proper message."



"As a leftie, I approve", applauds David H. "I certainly don't want any blots, scratches or muscle fatigue using this product!"

I'm particularly pleased that there is "space for a name on the pen."



Ironically inflexible (says I, stretching hard for a gag) Melissa B. expresses dismay over an unexpected animal in her local library. "All I wanted was a yoga DVD. I wasn't expecting a surprise O'Reilly book on Programming Internet Email..." According to the reviews at Amazon, however, it apparently "contains interviews and stories of some of the biggest acts to ever get on stage such as KISS, Bon Jovi,Guns 'N Roses, Iron Maiden, Alice Cooper and many others." Who's to say there's not a yoga DVD tucked inside as well?



For the winning point, sportsman Philipp H. shares a gift search for his girlfriend, thinking "the smell of the beach might suit her more than the odor of football". I'm not sure of even that, Philipp. The beach isn't all coconuts, you know.



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

Classic WTF: When Comments go Wild

By Remy Porter

It's a holiday in the US, so while we're gathering with friends and family, reminiscing about old times, let's look back on the far off year of 2004, with this classic WTF. Original -- Remy

Bil Simser comments on comments ...

I'm always pleased when I see developers commenting code. It means there's something there that should be commented so the next guy will know WTF whoever wrote it was thinking. However much like any FOX special, there are times when "Comments Gone Wild". I present some production code that contains some more, err, useful comments that I've found.

// Returns: Position of the divider
// Summary: Call this method to get the position of the divider.
int GetDividerPos();

Hmmm. Glad that was cleared up.

// Summary: Call this method to refresh items in the list.
void Refresh();

Again. Good to know.

// Summary: Call this method to remove all items in the list.
void RemoveAllItems();

Whew. For a minute there I thought we would have to spend some serious debugging
time hunting down this method.

And my personal favorite...

/* this next part does something cool; don't even try to understand it*/

i_love_lucy_is_on_tv turned out to be a boolean variable set to false. Go figure.

Heh. And on an unrelated note, I've just given the good o'le two-week notice to my employer. I'll miss 'em ... they were the inspiration for starting this blog, and provided a good many of posts. I trust Jakeypoo will update us on some of their new developments, and pray I'll have nothing to share with you from my new employer.

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

CodeSOD: Counting Arguments

By Remy Porter

Lucio C inherited a large WordPress install, complete with the requisite pile of custom plugins to handle all the unique problems that the company had. Problems, of course, that weren't unique at all, and probably didn't need huge custom plugins, but clearly someone liked writing custom plugins.

One of those plugins found a need to broadcast the same method invocation across a whole pile of objects. Since this is PHP, there's no guarantee of any sort of type safety, so they engineered this solution:

function call($name, $args) { if (!is_array($this->objects)) return; foreach ($this->objects as $object) { if (method_exists($object, $name)) { $count = count($args); if ($count == 0) return $object->$name(); elseif ($count == 1) return $object->$name($args[0]); elseif ($count == 2) return $object->$name($args[0], $args[1]); elseif ($count == 3) return $object->$name($args[0], $args[1], $args[2]); elseif ($count == 4) return $object->$name($args[0], $args[1], $args[2], $args[3]); elseif ($count == 5) return $object->$name($args[0], $args[1], $args[2], $args[3], $args[4]); elseif ($count == 6) return $object->$name($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); } } }

I'll admit, this code itself may not be a WTF, but it points at a giant code smell of over-engineering a solution. It's also fragile code. If two underlying objects have the same name, they must take the same number of arguments, and whoever invokes this must supply than number of arguments. Oh, and nobody can accept more than 6 arguments, which should be all you ever need.

Actually, that last one probably is a good rule. Gigantic parameter lists make your code harder to read and write.

Then again, this method also makes it harder to read and write your code. It's the sort of thing that, if you ever find yourself writing it, you need to go back and re-evaluate some choices, because you probably shouldn't have. But maybe Lucio's predecessor needed to.

"Don't ever do this, until you do, but you still shouldn't have," seems to be a good description of this code.

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

CodeSOD: Templated Comments

By Remy Porter

Mike's company likes to make sure their code is well documented. Every important field, enumeration, method, or class has a comment explaining what it is. You can see how much easier it makes understanding this code:

/// <summary> /// Provides clear values for Templates /// </summary> public enum TemplateType { /// <summary> /// 1 /// </summary> TEMPLATE_1 = 1, /// <summary> /// 2 /// </summary> TEMPLATE_2 = 2, /// <summary> /// 3 /// </summary> TEMPLATE_3 = 3, /// <summary> /// 6 /// </summary> TEMPLATE_6 = 6, /// <summary> /// 8 /// </summary> TEMPLATE_8 = 8, /// <summary> /// 10 /// </summary> TEMPLATE_10 = 10, /// <summary> /// 12 /// </summary> TEMPLATE_12 = 12, /// <summary> /// 17 /// </summary> TEMPLATE_17 = 17, /// <summary> /// 18 /// </summary> TEMPLATE_18 = 18, /// <summary> /// 20 /// </summary> TEMPLATE_20 = 20, /// <summary> /// 32 /// </summary> TEMPLATE_32 = 32, /// <summary> /// 42 /// </summary> TEMPLATE_42 = 42, /// <summary> /// 54 /// </summary> TEMPLATE_54 = 54, /// <summary> /// 55 /// </summary> TEMPLATE_55 = 55, /// <summary> /// 57 /// </summary> TEMPLATE_57 = 57, /// <summary> /// 73 /// </summary> TEMPLATE_73 = 73, /// <summary> /// 74 /// </summary> TEMPLATE_74 = 74, /// <summary> /// 177 /// </summary> TEMPLATE_177 = 177, /// <summary> /// 189 /// </summary> TEMPLATE_189 = 189 }

There. Clear, consice, and well documented. Everything you need to know. I'm sure you have no further questions.

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

CodeSOD: A Sort of Random

By Remy Porter

Linda found some C# code that generates random numbers. She actually found a lot of code which does that, because the same method was copy/pasted into a half dozen places. Each of those places was a View Model object, and each of those View Models contained thousands of lines of code.

There's a lot going on here, so we'll start with some highlights. First, the method signature:

// Draws a number of items randomly from a list of available items // numToDraw: the number of items required // availableList: the list of all possible items, including those previously drawn // excludeList: items previously drawn, that we don't want drawn again public List<MyObject> GetRandomNumbers(int numToDraw, List<MyObject> availableList, List<MyObject> excludeList)

We want to pull numToDraw items out of availableList, selected at random, but without including the excludeList. Seems reasonable.

Let's skip ahead, to the loop where we draw our numbers:

while (result.Count != numToDraw) { // Add a delay, to ensure we get new random numbers - see GetRand(min, max) below Task.Delay(1).Wait(1); // Get a random object from the available list int index = GetRand(nextMinValue, nextMaxValue);

Wait, why is there a Wait? I mean, yes, the random number generator is seeded by the clock, but once seeded, you can pull numbers out of it as fast as you want. Perhaps we should look at GetRand, like the comment suggests.

// Returns a random value between min (inclusive) and max (exclusive) private int GetRand(int min, int max) { // Get a new Random instance, seeded by default with the tick count (milliseconds since system start) // Note that if this method is called in quick succession, the seed could easily be the same both times, // returning the same value Random random = new Random(); return random.Next(min, max); }

Ah, of course, they create a new Random object every time. They could just create one in the GetRandomNumbers method, and call random.Next, but no, they needed a wrapper function and needed to make it the most awkward and difficult thing to use. So now they have to add a millisecond delay to every loop, just to make sure that the random number generator pulls a new seed.

There are some other highlights, like this comment:

// Copy-paste the logic above, but for the max value // This condition will never be true though, because nextRand(min, max) returns a number between min (inclusive) // and max (exclusive), so will never return max value. Which is just as well, because otherwise nextMaxValue // will be set to the largest value not picked so far, which would in turn never get picked.

But one really must see the whole thing to appreciate everything that the developer did here, which they helpfully thoroughly documented:

// Draws a number of items randomly from a list of available items // numToDraw: the number of items required // availableList: the list of all possible items, including those previously drawn // excludeList: items previously drawn, that we don't want drawn again public List<MyObject> GetRandomNumbers(int numToDraw, List<MyObject> availableList, List<MyObject> excludeList) { if (availableList == null || numToDraw > availableList.Count) { // Can't draw the required number of objects return new List<MyObject>(); } List<MyObject> result = new List<MyObject>(); // Get limits for drawing random numbers int nextMinValue = 0; int nextMaxValue = availableList.Count; // Keep track of which items have already been drawn List<int> addedIndex = new List<int>(); while (result.Count != numToDraw) { // Add a delay, to ensure we get new random numbers - see GetRand(min, max) below Task.Delay(1).Wait(1); // Get a random object from the available list int index = GetRand(nextMinValue, nextMaxValue); // Check if we have drawn this item before if (!addedIndex.Contains(index)) { // We haven't drawn this item before, so mark it as used // Otherwise... we'll continue anyway addedIndex.Add(index); // Using a sorted list would make checking for the presence of "index" quicker // Too bad we aren't using a sorted list, or a HashSet addedIndex.Sort(); } // In order to avoid redrawing random numbers previously drawn as much as possible, reduce the range if (nextMinValue == index) { // We have just drawn the minimum possible value, so find the next minimum value that hasn't been drawn int tempValue = nextMinValue + 1; while (true) { // Look through the list to find "tempValue". O(N), since it is a list, and I don't think the compiler // will know it's been sorted if (addedIndex.FindIndex(i => { return i == tempValue; }) < 0) { nextMinValue = tempValue; break; } if (tempValue == nextMaxValue) { // Check that we haven't drawn all possible numbers break; } tempValue++; } } // Copy-paste the logic above, but for the max value // This condition will never be true though, because nextRand(min, max) returns a number between min (inclusive) // and max (exclusive), so will never return max value. Which is just as well, because otherwise nextMaxValue // will be set to the largest value not picked so far, which would in turn never get picked. if (nextMaxValue == index) { int tempValue = nextMaxValue - 1; while (true) { if (addedIndex.FindIndex(i => { return i == tempValue; }) < 0) { nextMaxValue = tempValue; break; } if (tempValue == nextMinValue) break; tempValue--; } } // Check that the picked item hasn't been picked before (I thought this was the point of added index?) // and that it doesn't exist in the excluded list MyObject tempObj1 = result.Find(i => { return i.ID == availableList[index].ID; }); MyObject tempObj2 = null; if (excludeList != null) { // this could have been a one-liner with the null conditional excludeList?.Find..., but that's fine tempObj2 = excludeList.Find(i => { return i.ID == availableList[index].ID; }); } if (tempObj1 == null && tempObj2 == null) { // Hasn't been picked, and is allowed because it isn't in the exclude list availableList[index].IsSelected = true; result.Add(availableList[index]); } } return result; } // Returns a random value between min (inclusive) and max (exclusive) private int GetRand(int min, int max) { // Get a new Random instance, seeded by default with the tick count (milliseconds since system start) // Note that if this method is called in quick succession, the seed could easily be the same both times, // returning the same value Random random = new Random(); return random.Next(min, max); }

I love all the extra Sort calls, and I love this comment about them:

// Too bad we aren't using a sorted list, or a HashSet

If only, if only we could have made a different choice there.

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

Error'd: Largely middling

By Lyle Seaman

Jani P. relates "I ran into this appropriate CAPTCHA when filling out a lengthy, bureaucratic visa application form." (For our readers unfamiliar with the Anglo argot, "fricking" is what we call a minced oath: a substitute for a more offensive phrase. You can imagine which one - or google it.)



Cees de G. "So glad that Grafana Cloud is informing me of this apparently exceptional situation."



Wayne W. figures "there must be a difference in calculating between an iPad, where this screen capture was done, and later finalizing a somewhat lower-priced transaction on an iMac."



Jim intones

"Perhaps I need a medium to get the replies on Medium."



And finally, an anonymous technology consumer shares a suspiciously un-Lenovian* stock photo, writing "I hope Lenovo's software and hardware are better than their proofreading." (*correction: after some more research prompted by a commenter, I have concluded that the laptop pictured is in fact a Lenovo device, possibly an IdeaPad. It only looks like a MacBook.)



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

CodeSOD: Efficiently Waiting

By Remy Porter

Alan was recently reviewing some of the scriptlets his company writes to publish their RPM installers. Some of the script quality has been… questionable in the past, so Alan wanted to do some code review.

In the uninstallation code, in the branch for AIX systems specifically, Alan found a block that needs to check that a service has successfully shut down. Since properly shutting down may take time, the check includes a pause- implemented in an unusual way.

until lssrc -s the-service-name-here | egrep 'inoperative|not'; do perl -e 'select(undef,undef,undef,.25)' done

This code calls into the Perl interpreter and executes the select command, which in this context wraps the select syscall, which is intended to allow a program to wait until a filehandle is available for I/O operations. In this case, the filehandle we're looking for is undef, so the only relevant parameter here is the last one- the timeout.

So this line waits for no file handle to be available, but no more than 0.25 seconds. It's a 250ms sleep. Which, notably, the AIX sleep utility doesn't support fractional seconds- so this is potentially 750ms more efficient than taking the obvious solution.

As Alan writes:

This code is obviously worried that re-testing for service shutdown once a second with a simple "sleep 1" might risk a serious waste of the user's time. It's just so much better not to be vulnerable to a 750ms window during which the user might be distracted by browsing a cat video. Naturally this is worth the creation of a dependency on a Perl interpreter which gets invoked in order to fake a millisecond sleep timer via (ab)use of a general I/O multiplexing facility!

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

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 nore[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 https://amzn.eu/anWjLlM 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! 


Springing forward

By [email protected] (Jon North)

This week's blog is mostly about health.  The good news this week is that my doctor has fixed Covid vaccinations for both of us today, which is a relief.  Of course, the rapidity with which vaccines has been developed and made safely available is pretty extraordinary.  It's interesting how many of the fears about vaccine denial have faded, though there is still negative babble at the fringes - I think most people see it as the only possible route back to 'normality', though there are hundreds of questions about what that should be or how things may change.

But the unholy tangle of new strains being discovered, problems about bulk manufacture and distribution of vaccines, political mud-slinging and bureaucratic delays, justifiable or unjustifiable caution about safety and side-effects, all of these created an unsettled atmosphere in ordinary people who worry about jobs as well as getting ill, with more time than usual to ponder things.  So other quite trivial things - for example the jamming of the automatic ignition on our gas hob, issuing a stream of crackling sparks for 24 hours - add yet more tension, and it took longer than it should have done to discover the off switch!

Hopeful buds on a drought-hit lemon tree, recovering this spring

I've written before about my physiotherapy, mostly a very positive experience this time (previous sessions of treatment for knee and sciatica were far less useful).  But I keep on realising how much better things will be as and when I can take responsibility for my own exercise and recovery.  When I was in a clinic after my knee operation I spent one hour out of 24 actually being treated; now I have a good half hour's intensive massage, and 20 minutes a session wrapped in a kind of cold blanket where icy water is pumped through.  And above all I have exercise machines at home which I can use when it suits me.  I've kept up the static bike throughout, and now I'm about to experiment gently with the cross-trainer whose arm movements seem to fit into what is allowed, applied gently!

Dogs meanwhile provide a structure and timetable to our days.  I've been able to resume early morning and late evening short walks, which takes pressure off Mary.  They have some digestive and bladder problems which need vet checkups.  But although these vet sessions are expensive, they are also reassuring, and the dogs are OK, and continue to provide us with enjoyment.

Marching on, and on

By [email protected] (Jon North)


Tom with me and sister Pam

13 March would have been my brother Tom's 70th birthday. He and his family are very much in our minds - departed far too soon. 

Meanwhile 12 March was another milestone in progressing our established status as French residents. That morning Mary and I surrendered our temporary EU cartes de séjour at the préfecture; our new cards as permanent foreign residents should arrive by post in a few weeks. Despite gripes elsewhere I have always respected French bureaucracy - if you follow the instructions you get the right results. The woman who dealt with our dossiers was very friendly and the whole rendez-vous more or less on time. We even had time, in a strangely quiet Montpellier, to buy some excellent kitchen gear before heading home to the dogs by midday. A good morning’s work.

There was some other welcome news for we Britons living abroad this week, or at least a promising development.  Buried in the details of the UK budget was news that the government plans to scrap the rule that bars those who have lived abroad for more than 15 years (as we shall soon have done) from voting in UK elections "the government is providing an additional £2.5m to remove the limit preventing British citizens who live overseas from voting after 15 years.”  So we shall be able to continue to vote in the West Derbyshire constituency where we lived before leaving the country.  

One story in the local paper caught my eye - of the revival of a traditional industry making fabric in Nîmes.  The blue denim, named ‘de Nîmes’ by the Americans who popularised it for jeans, is now going to be manufactured by a family firm in this area.  Among other local news, another story this month of wartime good deeds - A Jewish man has bequeathed a sizeable chunk of his fortune to the French village whose residents hid him and his family during the Second World War, despite the risk to their own lives. Eric Schwam, who died aged 90 on Christmas Day, is believed to have left s2m to the remote mountain village of Le Chambon-sur-Lignon, which gave shelter to 3,500 Jews during the war. Schwam and his family arrived in 1943 and stayed until 1950. In his will, he said the gift was an expression of his gratitude, and suggested it be spent on youth services.  We have friends whose family shared in the efforts to rescue Jewish people in this part of France during the war -  this strikes many chords with me.

This cartoon is for our daughter-in-law and many other friends involved in theatre and music. The Paris Odéon-Théâtre de l'Europe has been occupied by protestors, with Union support demanding reopening of theatres and extension of government support to the so-called intermittents who would normally be working there. The Minister Roselyne Bachelot has intervened but has not apparently been able to reassure all protestors. 

Sport has been a frequent interest for us as always.  I'm still reeling a little from the turbulent reversal of fortunes in the final stage of the Paris-Nice cycle race. Having led for most of the week, Primoz Roglič ended up 16th overall with ripped clothing and having dislocated a shoulder, and the winner in the end was Max Schachmann who also won last year. Riveting watching all the same.  Meanwhile the 6-nations rugby has caught fire despite the absence of spectators with a fizzing match between France and England and an absorbing on between Scotland and Ireland.  Meanwhile the woes of 'my' football team Liverpool continue, but it is after all only sport.  Another picture to end with.

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: derailleur.substack.com 


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.

The McMansion Hell Yearbook: 1975

Howdy, folks! We’re halfway through the 70s, and I thought I’d celebrate with a time capsule house stuck weirdly enough, in the 80s. Our house this time comes to us from Fairfield County, Connecticut, and while it may not be an obvious contender on the exterior, I promise you won’t be disappointed once we head through that door. 

This house, despite its modest exterior, boasts 4 bedrooms, 4.5 bathrooms, and just over 5300 square feet. It can be yours for just over $2.2 million USD.  I know you’re dying to see what’s inside, so I won’t keep you any longer.

Lawyer Foyer

As you can see, painting the walls white did not take the 70s out of this house. The disappointing part is that this is the room with the most vestiges of its 70s past - that wrought iron railing, pink linoleum, and pseudo-gothic chandelier definitely affirm that originally this house was much, much groovier before its 80s redux. 

Great Room

The realtor described this house as “transitional” which in some cases is a polite way of saying “trapped between stylistic movements and terrified to death of choosing one.” 

Sitting Room

Alright, alright, here’s one for the 80s aesthetic blogs. You’re welcome. 

Dining Room

As a form of economic stimulus, I am willing to accept giant cabinets and twee bird knickknacks. Speaking of giant cabinets, that one is, like, hearse-sized. How many candelabras and cloth napkins could one family possibly possess? 

Also, for some reason, the listing did not include any pictures of the kitchen, so we’ll have to go right into the master bedroom. 

Master Bedroom

Even in the 80s, was there ever a time where this aesthetic didn’t look, well, grandmotherly?

Bedroom 2

I’m moving in a few weeks and my back hurts just thinking about trying to lift that furniture!!!!

Bonus Room

I have to give credit where credit is due: this room is cool, and I would absolutely chill in it. Which goes to prove how deeply uncool these rich people are for not using it for chilling or any other activities. 

Rec Room

The drop-ceiling/can light combo is somewhat rare in terms of McMansion bonus rooms, as is that diagonal wood paneling which I unironically stan. Forget shiplap!!!

Alright, that’s it for our interior. Now to check out the rear exterior which proves once and for all that this house is, in fact, a McMansion. 

Rear Exterior

Honestly, I don’t know what kind of house this is - my guess is that it’s, like, a post-split-level, whatever that means. Either way, it’s super tacky and I’m glad I found it so I could share it with all of you. Check back here soon for another 70s house, as well as a much-needed update to the Brutalism Post. 

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.

#HousingLIVE Join The New Republic’s Kate Wagner for a special after-hours live action version of her satirical McMansion Hell blog. July 14, 2020 at 5.30pm EDT.

#HousingLIVE Join The New Republic’s Kate Wagner for a special after-hours live action version of her satirical McMansion Hell blog. July 14, 2020 at 5.30pm EDT.:

Howdy! Join me at the NewCities New Housing Solutions conference (along with much more important people like Ilhan Omar) where I’ll be roasting buildings and raising money for Moms4Housing! Link to submission and registration above.