The McMansion Hell Yearbook: 1971

Howdy Folks! 1971′s house comes to us from Morris County, New Jersey. Sitting at 5000 square feet, despite its age it’s still for sale for $1.2 million USD. As you can see, it is a surprisingly developed McMansion compared to the house from last month: 

This house showcases many different McMansion elements - clearly demonstrating an early iteration of the decorated split level emerging into a new architectural form. However, this house still has many split level elements, including a clear demarcation of first and second stories via attached masses - the garage in particular is reminiscent of many split level garages. This house also borrows elements from the 70s Mansard-style house, specifically in its use of embedded half-dormers, which recall many mansard-style houses but replacing the mansard roof with a low-pitched hipped roof. 

Paralegal Foyer (proto-Lawyer Foyer):

It was relatively common in early iterations of the McMansion to have a partial formation of the Lawyer Foyer, a two story entryway but lacking the transom window above the door that enables the entryway to be seen from the street. Sadly, this house was redecorated from its original 70s finishes, most likely in the late 1990s. 

Dining Room:

My personal opinion is that parquet floors Were Good Actually and we should bring them back. 


What’s enjoyable about looking at houses from the perspective of date is that there are some elements that are dated but also expensive to get rid of - the floating wetbar-island combo is very 70s, however I actually think these kinds of islands with cabinetry are useful and it would be nice to see them make a comeback. 


1) I remember going to some kid’s house in middle school and they had a huge kitchen like this and all the cabinets were literally filled with hamburger helper, easy mac, uncle ben’s rice, etc - the parents had this huge chef’s kitchen but apparently never cooked. 

2) that table would not last one encounter involving me, a beer, and a particularly animated political conversation. 

Master Bedroom:

It weirds me out when rich people don’t have headboards!!! I don’t know why!!! 

Bedroom 2:

I had a bedspread similar to this but it was in blue, brown, and green and I vote!

Bedroom 3:

The 3D furniture staging thing is fascinating to me because sometimes it’s virtually undistinguishable from real estate photos where the furniture is real but the photos themselves are photoshopped to the point of unreality. Personally I’d love to have a copy of the software that lets you 3D decorate random real estate listings - it’s like the Sims but for realtors. 

That’s the last of our interior rooms, which brings us to our concluding picture:

Rear Exterior

I have no idea how you mess up lining up six identical windows in a rational way and yet…and yet… 

Well folks, that does it for 1971! Stay tuned this week for another iteration of the Brutalism Post! 

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, a reading group, free merch at certain tiers and more!

Not into recurring donations or bonus content? Consider the tip jar! Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

The McMansion Hell Yearbook: 1970

(FYI - this is going to be a longer post than usual, so you might want to open it in a new tab if you’re reading it on Tumblr feed. There will be a read more break about halfway through.)

Howdy, folks! Welcome to the first edition of the McMansion Hell Yearbook - a year by year account of how the McMansion came to be. We begin our tour of time in the year 1970.

Why 1970: A Brief History Lesson

Whether or not the McMansion belongs to canonical or vernacular (everyday) architecture is a topic of some dispute - for example, Thomas Hubka, in his book Houses Without Names claims that the McMansion is simply the latest iteration of highly-customized architecture designed by and for rich people, which is why it doesn’t belong in studies of vernacular architecture. However, Hubka himself includes in his evolutionary study of floorplans, a type called “Large Suburban” which features a central foyer flanked by formal rooms leading into a vast living/entertaining space and kitchen. The question of where “Large Suburban” ends and “McMansion” begins is perhaps less of an architectural question than it is a cultural one, but that’s something we’ll discuss in more detail later on in this series.

A Styled Split-Level from a 1960 trade publication. Public Domain. 

Meanwhile, Virginia McAlester includes McMansions, called “Millennium Mansions” in the second edition of the Field Guide to American Houses, a phenomenon she places as starting around 1985. However, like most architectural phenomenons, the McMansion didn’t just appear out of nowhere. Its predecessor is what McAlester called the Styled Ranch (and Styled Split Level) - an elaboration of the ranches and split-levels of midcentury featuring the costuming of the simple ranch form in a variety of different architectural styles or themes including Colonial Revival, Neoclassical, Mediterranean, and Tudor. How these styled ranches and split levels escalated into the sprawling McMansions we know today is something this new series hopes to tackle.

Enough history (for now)! Here’s our 1970 house found in none other than Bergen County, New Jersey.

This 5,600 square-foot house features 6 bedrooms and 6 bathrooms and can be all yours for ~$1.8 million USD. You’ll notice a lot of things about this house that are not McMansion-like: its symmetry, its lack of a complex roofline, its unified exterior claddings and window styles. However, this is why the house is interesting - it is not as much a McMansion as it is a proto-McMansion. Many McMansion features are apparent in their nascent form, for example, the competing architectural styles of Tudor (windows) and Neoclassical (portico, front door, quoins), the tacked-on mass containing the three car garage, an ostentatious pediment with elaborate columns, and extruded double bay windows.

The most interesting of these proto-features is the front entryway, an early development of what will be known on this blog as the Lawyer Foyer. We see a large central window above the door (architectural historian Charles Jencks traces this to LA in his book Daydream Houses of Los Angeles, appropriately calling it the “LA Door”), with an outdoor decorative light dangling in front of it, a motif borrowed from certain, usually later iterations of the split level (seen in this example [top left] from a 1963 trade catalog). Let’s step inside:

Proto-Lawyer Foyer (Law School Foyer???)

What’s interesting about this example is that it is very McMansion like in its use of a large curved staircase and over-indulgent chandelier. However, the above-door window has yet to merge with the front door into a transom-window, and the chandelier, though large and ornate, has yet to replace the lantern outside as the lighting feature that can be seen from the street.

Sitting Room

Though this house tends to feature more Louis XV-style furniture (my suspicion is that this might be evidence of an 80s or 90s era redecorating), the emphasis on bulky, ornate 18th century reproduction furniture, moldings, and wallpaper is indicative of the fascination in the 1970s towards the (American) Colonial era in anticipation of the 1976 American Bicentennial. You can read more about this in this fantastic and captivating Collector’s Weekly article.

Dining Room

As we can see, the stuffy formal dining room has always existed in McMansions, simply because it has always existed in rich people houses in general since the dawn of time.

Living Room

While ugly and too big, this living room definitely is more reminiscent of a ranch-style living room than it is a McMansion great room. It even has doors (heresy!) Personally I stan those 70s brick veneer fireplaces because they are groovy and increasingly hard to find.

Oh. I should mention that you’re really, really not prepared for what you’re about to see in the next room.

Horse Shrine


For some reason having a racehorse shrine seems, like, peak New Jersey.

Ahoy, Chef!

If your nana or great aunt didn’t have these wyd

Master Bedroom

I should add that the listing for this house shows none of the six bathrooms, and, after viewing this room, I have to believe there’s a reason for that.

Spare Bedroom

Is there a tacky wallpaper museum?? If so, how do I get on the board of directors???

Anyways, this concludes our interior tour. Let’s go back outside.

Rear Exterior:

Well, on that (thankfully more subdued than usual) note, this concludes our 1970 entry in the McMansion Hell Yearbook. See you soon with an update on Brutalism, and stay tuned for next month’s 1971 McMansion.

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, a reading group, free merch at certain tiers and more!

Not into recurring donations or bonus content? Consider the tip jar! Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

Announcing the Winners of the 2019 McGingerbread Hell Competition

Wow! It was another great year for the McGingerbread Hell Gingerbread House Competition! The judges had their work cut out for them selecting between so many fine selections. Congratulations and great job to everyone who submitted an entry in this year’s contest. However, only six houses could make the cut.

Let’s start out with announcing the winners for Honorable Mention.

Honorable Mention: Priced to Sell! by Tina B.

The judges were wowed by the impressive nub, the tumorous turret, and the fantastically mismatched windows.

Quote from the Project Description: A true GEM of a house! 6,738 SF beautifully set on .23 parklike acres. Mediterranian villa in front, stately Federal in the back; it’s the mullet of houses!…Entertain in your beautiful backyard featuring a real StoneTek™ patio! The heavily pruned weeping cherry tree will be a real showstopper in 30-40 years! The largest roof in the neighborhood has Chex shingle roof in molasses brown. 4 BR / 5.5 BA / $899,000 / Days on market - 923

Honorable Mention: Festive Roofline Soup by Jessica C.

The judges LOVED the complexity of the roofline, the absurd gabling, and the 3 car garage.

Quote from the Project Description: Features include: • Flaked almond shingles covering a roofline so complex that it required trigonometrical expertise from my math teacher father to work out measurements…[and] A low maintenance yard as the house takes up almost the entire block! Now accepting offers; the sellers are motivated as the couple are in the middle of divorce proceedings.

Honorable Mention: Vinyl Vanity by Joseph & Kayla S.

The judges were impressed by the impressive garage to roof ratio, the roof detailings, the candy-cane columns, and excellent lawyer foyer.

Quote from the Project Description: This 2 square foot, two and a half story Craftsmen Tudor Post Classical Revival estate is the luxurious home that your friends and neighbors never wanted…The car is truly the heart of Tudor England, so we put the garage proudly up front, where the yawning chasm of the door greets the outside world with disdain…Be sure to schedule your private tour soon, this edifice is sure to not last long. On the market. If you’re curious about the price, you’re probably too economically responsible for this property.

And now, our top 3:

Third Place: A Jersey Thing by Nùria O.

Judges were impressed by the size, shape, and meticulous detailing of the project, which is reminiscent of a truly terrible McModern. Anjulie, seeing the size of the huge roof said “this is some sustainable sh*t.” This project captures the true McMansion ethos in truly making us say “what the hell is going on here?”

Project Description: Inspired by a beatiful RealLife™ McMansion™ in Beach Haven, NJ, this year’s featured McGingerbread mansion is a modern 5-bedroom, 16-bathroom home made entirely in construction-grade gingerbread and held together with royal icing made from free-range egg whites. The nonpareil- and sugar-crystal-covered walls provide both isolation from stormy weather and give a vintage air to counterbalance the futuristic lines of the design…On the back of the house, you can walk out to a large deck (perfect for entertainment) boasting a valuable one-piece handrail. From there you can access the beautiful mediterranean garden, set in candy charcoal and stones, environmentally friendly as it’s practically maintenance free. Don’t miss your chance to visit this unique home—feel the sugar rush!

Second Place: Victorian Opulence by Beth & Tina C.

Reigning McGingerbread champs Beth & Tina C. returned to the scene this year with yet another gorgeous gingerbread. Judges were wowed by the complexity and scale of the project. Sarah was impressed by the intricate piping and lots of frilly details, and the homage to the traditional Victorian gingerbread form. Anjulie described it as “unbearably neat” - she loved the uncantilevered bay window, the detached garage that makes entryway irrelevant, and the hilarious-front balcoiny with half-wall (not code compliant). Kate was impressed by the detailing and the extensive cantilevers which too serious structural engineering to pull off.

Project description: New from the creators that brought you a true monstrosity last year: The Victorian Opulence! Featuring a lovely wrap around porch, adorable detached garage, and a truly magnificent waterfall in the backyard, this monolith of a house features thee decks overlooking somewhat patchy but still rescueable landscaping. Other features include an outdoor patio, a tower for all your princess capturing needs, and a truly cursed facade featuring a curved roof of all things! With several nubbins featuring windows, there is no angle on this house you can’t see out of! Standing at nearly 2 feet tall and with an approximate total floor area of 550 square inches-excluding outdoor seating area-this Victorian style home will surely be the envy of all the gingerbread men in your country club. (Snow removal not included as part of HOA membership fees.)

And finally…

First Prize: Simply Having a Wonderful Building Crime by Erin E.

The judges all agreed: this house was outrageous - its execution was fantastic, and its design was full of so many delightful, humorous details. Sarah remarked: “This one is perfectly McMasion-scaled, with weirdly placed windows and gratuitous features to boot.” Anjulie couldn’t sing the praises enough: “I was particularly taken with the garage that is so far detached it makes the front door totally irrelevant…it’s a castle of grand sadness. The Pete Buttigieg sign is the literal icing on top.” Kate loved the details: the Pete sign, the ridiculously diverse selection of windows, the piped on invasive plants and basketball hoop, and the glass and siding effects. Part of the competition lies in its absurdity and humor, and in that particular category, this house took the cake.

Project description: This home Defies the Ordinary. Located on a 2.3 acre lot, you’ll be the envy of all your neighbors–and can watch from the top of the turret to be sure they’re suitably jealous! Enjoy sitting al fresco under the portico above the garage, or on the hand-laid M&M stone patio! The two-story entryway accounts for just a few of the more than 60 sugar glass windows! All of the walls join up exactly where the architect expected them to, and no windows were covered up on accident!!!

Constructed over two weeks, out of ten pounds of flour, four pounds of powdered sugar, and more than half a gallon of corn syrup, this modest four-story house will surely stand the test of time. It’s been meticulously decorated with royal icing vines, wreaths, and Christmas lights, and landscaped with gingerbread boulders, definitely-naturally-this-green icing grass, and coconut macaroon topiary. The roof stands at 17 inches high, and is crafted from waffle cookie shingles over gingerbread rafters. For sale for just $1,895,000, this house is just perfect for new families or young professionals just starting out!

Special thanks to everyone who entered this year and to our judges Sarah Archer and Anjulie Rao for their contributions in pulling off yet another successful entry our search for the Gingerbread McMansion Hall of Fame!

See you next week with this month’s 1970 McMansion.

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, a reading group, free merch at certain tiers and more!

Not into recurring donations or bonus content? Consider the tip jar! Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

Staring at Hell | Kate Wagner

Staring at Hell | Kate Wagner:

Howdy folks! My new long form piece for The Baffler is now available online. It features all kinds of goodies:

- Enlightenment slap fights

- Industrial Ruins

- The Sublime (not the band)

- Superfund sites

- How we as a culture react to the aesthetics of a modernity that have destroyed our environment (you know, lighthearted stuff)

New Blog Updates and Patreon Rewards for 2020!

Howdy folks!

Now is a great time to join McMansion Hell on Patreon, and I’ll tell you why!

Patreon has really evolved over the years and the landscape of how creators can interact with their patrons has changed dramatically - expanding to such areas as merch, exclusive servers, instagram-like story features, and newsletters. That’s why I’ve taken the opportunity to expand my Patreon to be more interactive with all of the patrons who make this project possible. More on that later!

First off, we’re going to start with what’s coming on the blog in the year 2020:

McMansion Hell enters bi-monthly status

As many of you are aware, this blog has been, well, flaky, as I try to balance my career as a freelancer, speaker, and educator with my career as a blogger. Instead of random updates, this blog will be set to publish twice a month, the first post being a house roast and the second post being a series post, such as the series on Brutalism. This allows time for freelancing, devoting more time to Patreon, and creates a more consistent expectation of what bang you’ll get for your buck.

New House Roasts, Year By Year

Do you ever wonder how McMansions got the way they did? We’ll we’re about to find out. Now that we’ve completed the 50 States of McMansion Hell, I’m going to be selecting one house for every year from 1970 to 2018 that is emblematic of the design trends of its time - in house-roast form, of course.

New and Continuing Series

The Brutalism Post will see three more installments this year. It will be followed by The Postmodern Project a new, five-post series on Postmodernism and its trials, tribulations, and legacy.

Results from the 2019 Gingerbread Contest will be announced next week!

New Patreon Rewards and Tiers

In order to take advantage of all the different goodies Patreon now has to offer, the tiers have been totally revamped:

$1 - League of Architectural Wokeness

$3 - League of Architectural Sassiness

$5 - League of Architectural Savviness

$10 - League of Architectural Solidarity

$20 - Guardians of Architecture

$30 - NEW TIER: League of Discourse Warriors

$50 - League of Suburban Warriors

I hope that you enjoy this year of house roasts, articles, and fun new patron goodies. See you next week with the Gingerbread Contest results!



McMansion Hell Cross Stitch Patterns

Howdy folks! Someone alerted me that the file link for the McMansion Hell Cross Stitch patterns was no longer working, so I wanted to upload them in full here in time for the holiday season. They’re free for everyone to use, so please don’t go selling them on Etsy that would be very not cool!!!! 

EDIT: if you like these, and want to help your freelancer friend out over the holidays, I’ve made an Etsy store for my other cross stitch patterns:


Happy Holidays!


McGingerbread Hell Competition 2019

It’s that time of year again, folks! Fire up the range, get the frosting out, and pour some hot cocoa, because the McGingerbread Hell 2019 Competition has now been officially launched!


Your task is to create the most nubtastic, gawdawful gingerbread McMansion in all of McMansion Hell!! If you succeed, you will be rewarded with cool merch and even some money (as much cash as I’m able to put up post-wedding):


All winners will be featured on the blog and will be mailed an award certificate.

Rules and Regulations:

• Gingerbread structures must be constructed mainly of gingerbread and icing.

• Styrofoam and other support materials are not permitted.

• Entries must be original, don’t just assemble a pre-made kit. (to clarify: you can use materials from kits but don’t just put a kit together and call it a McMansion)

• All components of the display, except for the base, must be made of edible materials.

• Edible materials include candy, nuts, cereal, cookies, crackers, pasta, and other food items that do not include wrappers or sticks. Wrappers should be removed from candy and other decorations.

• Entries must be created this year

Entries will be judged on:

• overall appearance (30 points)

• originality/creativity (30 points)

• workmanship/technique (30 points)

• difficulty (10 points)

!!!! ABOUT OUR 2019 JUDGES !!!!

Kate Wagner

Kate Wagner is an architecture and cultural critic based in Washington, DC. She is the creator of the blog McMansion Hell, which examines the phenomenon that is the McMansion and uses it as a tool for architectural education and humorous cultural remarks. Kate has written about architecture, design, and culture for numerous publications including The Atlantic, CityLab, Metropolis, and The Nation. She is a columnist at The New Republic, The Baffler, and Curbed.

Anjulie Rao 

Anjulie Rao is a Chicago-based journalist and Editor of Chicago Architect magazine. As a writer, she focuses on livable built environments, equitable design, architecture criticism, and radical urbanism. With an academic background in art history, she enjoys intersections between art, infrastructure, and political narratives. She completed her Masters in New Arts Journalism from the School of the Art Institute of Chicago in 2014 and her bylines can be found in Chicago Architect, Metropolis, American Craft Magazine, Chicago Magazine, Artsy, Curbed Chicago, and LUXE Magazine, among others.

Sarah Archer

 Sarah Archer is a design and art writer based in Philadelphia, and the author of the “The Midcentury Kitchen: America’s Favorite Room, from Workspace to Dreamscape, 1940s-1970s” which was published this year by Countryman Press. Her first book, “Midcentury Christmas” explores the material culture of Christmas during the Cold War in the United States. She is a contributing editor at American Craft Magazine, and writes regularly for Hyperallergic, The Atlantic, Architectural Digest, and The New Yorker online. Her articles and reviews have appeared in Curbed, Metropolis, CityLab, Slate, The Washington Post, The Magazine Antiques, Modern Magazine, The Journal of Modern Craft, and Studio Potter

Registration starts December 8th, 2019 and ends January 8th, 2019. Winners will be announced January 10th, 2019.

Submissions (including photo upload) will be handled via this Google Form:

If you have any questions, please direct them to: [email protected] with the subject: Gingerbread

Looking forward to seeing your entries!

I now pronounce you nub & roofline

I now pronounce you nub & roofline

50 States of McMansion Hell: Fairfax and Loudoun County, Virginia

Howdy folks! This post has been months in the making. Scouring the hell that is the McMansion Trenches of Virginia for only the best (worst) houses for your viewing pleasure generated some truly awful contenders. Of all the counties in Virginia, it was the wealthiest DC suburban counties of Fairfax and Loudoun that delivered. I won’t leave you hanging longer than I already have, so without further ado, the countdown:

#10: The Trellis Terror (Loudoun County)

The scrunched up piles of roof and narrow windows are a casualty of trying to squeeze the biggest possible house complete with not one but two garages into the smallest imaginable lot. The second story over-the-garage trellis aims to invoke the Tuscan countryside, but ends up looking like a bad strip mall Olive Garden instead. 

#9: Tricorn Turret (Loudoun County)

The consistency of cladding materials and window shapes make this house more well put-together than most McMansions. However it made the list for obvious reasons: a substantial and precipitous roofline, a rare triple turret dormer assembly, and that bizarre skeletal stone porch thing transform this house from country estate to ridiculous Hummer house. 

#8: Fort Void (Loudoun County)

Usually the problem of McMansions is too many large windows, in this case it’s too many small windows, all of them different from one another as if this house was just a front for the Pella Window showroom. The monotonous brick swallows the windows giving the house a fortress-y aura. The juxtaposition of pastoral rolling farmland with an equally ugly house right next door is particularly choice. 

#7: Mt. Nub’s Revenge (Loudoun County)

This house is a perfect example of how, even when they try really really hard, McMansions are incapable of symmetry. The more you look at this house the more “spot the difference” elements you find: the weird short colonnade vs the five-bay picture window; the length of the two wings, the roofline of the right wing is for some reason broken up because God is dead. And then there’s that nub. 

#6: Sticker Shock (Loudoun County)

This robust residence is absolutely chaotic. No two gables are the same. Stone is applied liberally and without logical consistency. Gutters trail down columns and crevices. Every window antagonizes its neighbor. The only thing over which any control has been exerted is nature itself, repressed and dominated by a monocultural expanse of grass. Normally I am not so blunt, but I will be today: I hate this house. 

#5: Chonky Corinthian

There is a certain type of house that is very popular in Fairfax County. It consists of a hulking range of hipped roofs punctured by a central (?) portico supported by columns that can only be described as thicc. This is one of these houses. The people who built this house could not decide when they were done building it. One can only assume that the myriad plans for this house were saved with file names like “House″ “House 2″ “House 2 final” “House 2 final final” “House 2 FINAL FINAL FOR REAL THIS TIME” 

#4: Mad Hatter (Fairfax County)

First of all, this home is way too long. It just keeps going. It’s like six different houses stitched together. Roofs begin and end. Porches come and go. Two stories somehow transform into one. By the time the eye reaches the front entrance, one is already exhausted. Finally, whoever decided to take the phrase “nesting gables” and apply it in this way deserves a trial at the Hague. 

#3: Tragic “Tudor” (Fairfax County)

This is the house equivalent of an identity crisis. Elements of French, English, and Donald Trump commingle to produce a truly formidable facade. All of the landscaping choices in this post are sad, but this house takes the cake for most depressing scenery, and not just because it was photographed in winter. Stubby shrubs appear to be gasping for breath, what trees exist are mere, unstable sticks; beside the pergola, a fallen cypress. 

#2: Foaming at the Mouth (Fairfax County)

This is a classic McMansion: it does its best to look dignified and imposing and instead appears cartoonish and cheap. Every element of this house except perhaps the wooden door is derived from petroleum products. The massive transom screams “climate denialism.” The grand entrance is overdone and top-heavy to the point of parody. In short: I hope this house melts. 

#1: Brick Behemoth 

If you combine all of the insipid elements of the other houses: mismatched windows; massive, chaotic rooflines; weird asphalt donut landscaping; pompous entrances, and tacked on masses; you’d get this house. The more one looks at this house the more upsetting it becomes. The turrets don’t match. The roofline is truly mountainous. The windows are either too small or too big for the walls they are housed in. The carhole is especially car hole-y. What sends this one over the top is its surroundings: lush trees and clear skies that have been desecrated in order to build absolute garbage. At least it doesn’t have shutters. 

Well, that’s it for Virginia! Stay tuned for another installment of “The Brutalism Post” - this time about what Brutalism actually is. 

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 Week, Crowdcast streaming, and bonus essays!

Not into recurring donations or bonus content? Consider the tip jar! Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball.

Copyright Disclaimer: All photographs are used in this post under fair use for the purposes of education, satire, and parody, consistent with 17 USC §107. Manipulated photos are considered derivative work and are Copyright © 2019 McMansion Hell. Please email [email protected] before using these images on another site. (am v chill about this)

Class of 2020: How Kate Wagner Is Making Everyone Question Everything About DesignHowdy!! I’m...

Howdy!! I’m very pleased to announce that Apartment Therapy has included me in their Class of 2020 Design Change Makers!

The Brutalism Post, Part 2: What Brutalism is Not

Why open a series about Brutalism by discussing what is not Brutalism? The answer is simple: of all of the terms in the history of architecture, Brutalism is perhaps the most misused and misunderstood by the general public. 

Pictured: Citizens Bank Tower, 1958-66. Not Brutalism (it’s just plain ol’ International Style modernism). Source

The main issue here, as we will discuss later, is not that people are ignorant for using the wrong definition of the word Brutalism, but that the word Brutalism has come to mean or refer to a variety of architectural phenomena that are linked to one another via overarching similarities, the most important being an expanded set of buildings that elicit a specific emotional response in the viewer.  

“Brutalism”, a specific architectural movement with its own ideology and history, has come to encompass a wide range of colloquial meanings. Some of these meanings are common misconceptions that reflect a need for broader architectural education (the purpose of this series), and some of these meanings reflect a deeper, more philosophical, interrogation into how we perceive and discuss architecture and the complex emotions it arouses within us, exposing a need for new means of communicating a common architectural sentiment

Let’s start with the most common misuse of the term. 

Brutalism is not: every single building made primarily of reinforced concrete. 

Blame this one on the dictionary. The term Brutalism, while being derived from the French term beton brut, meaning raw concrete, does not apply to all buildings made from reinforced concrete. Developed in the 1870s, reinforced concrete is one of the most commonly used building materials in the world. Because of its inexpensive price, its structural integrity, and its ability to be cast into a variety of shapes and forms, many buildings were - and continue to be - made from it. 

Let’s look at three examples of buildings I have found labeled “brutalist” in various places. 

Not Brutalism: (from left to right): Tadao Ando, Vitra Conference Center (1993) Photo by Wojtek Gurak (CC BY NC 2.0); Le Corbusier, Villa Savoye (1929) Photo by Scarlet Green (CC BY 2.0); Albert Kahn, Highland Park Ford Factory (1910) Photo by Thomas Hawk (CC BY NC 2.0)

All of these buildings are constructed primarily from reinforced concrete. As you can see, they are all very, very different from one another. In these three cases, the key piece of information discrediting these buildings as being Brutalist is when they were built. Brutalism was a specific architectural movement from spanning a defined period of time (1940s-late 1970s). Buildings constructed outside of this time window are rather unlikely to be Brutalist

Let’s look at why these buildings might be mislabeled brutalist. 

Our first example is the Vitra Conference Center by Tadao Ando, which was built in 1993. Even though 1993 is far outside the time frame that brutalism spanned, this building has many characteristics that are “brutalistic,” specifically its extensive use of unpainted reinforced concrete, its heavy, geometric massing, and its intense visual weight. Ando’s architecture falls under the term “critical regionalism” - which is best understood as being modern in form (but not in dogma), with a heightened focus on the surrounding ecology and landscape as well as other geographical, cultural, and social contexts.  

The Villa Savoye by Le Corbusier, finished in 1929, is one of the most iconic 20th century houses and works of modernist architecture in the world. This house, though made of reinforced concrete, belongs to the movement known as the International Style, which was developed in Western Europe after World War I, is known for its rejection of ornament, flat surfaces (especially roofs), extensive use of glass, and visually lightweight and repetitive forms. While the International Style makes use of concrete, it differs from Brutalism in its visual lightness - the Villa Savoye seems to float effortlessly above the landscape - very unlike Brutalist architecture, which is characterized by its massive scale, hulking forms and visual heaviness. 

The Highland Park Ford Plant, built in 1910 by noted factory architect Albert Kahn, was once the premiere factory building in America, helping to advance not only the Fordist system, but the city of Detroit, Michigan as being the automobile capital of the world. It is a touchstone of factory design, notable for its pioneering use of the assembly line to facilitate mass production, a concept that remains central to factory design today. Although made of reinforced concrete, the Highland Park plant is not a brutalist building. It frequently is mischaracterized as being brutalist because of its massive side, imposing features, and the close association that has developed between brutalist architecture and urban exploration photography (More on this later). 

TL;DR: All brutalist buildings are made of reinforced concrete (or heavy masonry), but not all reinforced concrete buildings are brutalist. Moving on.

Brutalism is not a catch-all term for Late Modernist architecture

Architecture got so weird and complicated in the period from the 1960s through the early 1980s that it inspired the architectural theorist Charles Jencks to create the first of several delightful and mind-bending charts to try and categorize it: 


What is Late Modernism? The concise definition is that it is an umbrella term encompassing the various architectural movements that transpired after International Style/Mid-Century Modernism but before Postmodernism. (For more on what Late Modernism is and why you should care, see my post from 2016.) Brutalism elides with Late Modernism, but not all Late Modern buildings are Brutalist. Because Brutalism is contemporaneous with Late Modernism, the distinction can be confusing. Often the case is that Late Modern buildings that are described as ‘Brutalist’ should be recategorized or reassigned to a different, equally obscure and hyper-specific architectural sub-movement happening around the same time. This might seem nitpicky, but look on the bright side: now you get to correct your friends. 

Late Modernism encompassed a lot of smaller architectural movements, most, but not all of them ending in -ism. Some, like Brutalism and High Tech, are more well known; others, like Metabolism, Structuralism, Critical Realism, and Neo-expressionism, not so much. Some buildings don’t fit into any of these categories and must (frustratingly) be referred to as simply “Late Modern” or “Transitional” (referring to the transition from Modernism to Postmodernism.) 

Here are three Late Modern buildings that are not Brutalist:

Left: Richard Rogers, Lloyd’s Building (1986) Photo by Lloyd’s Insurance (CC BY 2.5); Top Right: Kisho Kurakawa Nakagin Capsule Tower (1972) Photo by scarletgreen (CC BY 2.0); Bottom Right: Herman Hertzberger, Centraal Baheer (1972) Photo by Apdency (CC BY-SA 3.0) 

Lloyd’s Building, the headquarters of Lloyd’s of London, located in, unsurprisingly, London, was designed by Richard Rogers and completed in 1986. Despite the relative lack of reinforced concrete, the building is frequently categorized as being Brutalist. The fact that it lacks reinforced concrete as a defining architectural feature is all one needs to eliminate Lloyd’s from the Brutalism category - why it is put there in the first place we will discuss more in depth in the next section of this post. Lloyd’s - along with most of Rogers’ work - is part of the architectural movement known as “High Tech” because it is, well, High Tech. 

High Tech buildings are the apogee of the modernist mindset in terms of glorifying the functions of a building and the technological elements of structural engineering. They take what are usually internal systems such as structural frames, circulation systems (such as stairs and elevators) and services (electrical, plumbing, etc) and integrate them into their external architectural form. (Lloyd’s is colloquially known by Londoners as the “inside out building”). High Tech was relatively short lived because it turns out that when you decorate the outside of your building with its internal services, when winter comes, your water pipes, exposed to the elements, tend to freeze. 

The Nakagin Capsule Tower, built in 1972 by Japanese architect Kisho Kurakawa (one of my favorite architects ever who more people should know about), is one of the buildings most commonly labeled as Brutalist. This building illustrates the gray area that arises when one uses vague aesthetic attributes (concrete, visually heavy, geometric massing) to designate a building as Brutalist instead of the actual history and context of the building in question. The Nakagin Capsule Tower belongs to a different (if coexistent) architectural movement that, frankly is a lot weirder than Brutalism: Metabolism. Take the formal concept of organic biological growth and systems and combine it with the urbanistic concept of megastructures (an entire city contained in a single continuous structure or via several interconnecting structures) and you get Metabolism. Because of the practical issues with building an entire city within a single building, Metabolism lived mostly on paper, however a few built examples were executed, the most famous being the Nakagin Capsule Tower. 

The Centraal Baheer office building was built by Dutch architect Herman Hertzberger in 1972. Like the Nakagin Capsule Tower, it satisfies many of the aesthetic signifiers commonly attributed to Brutalism: it’s made of reinforced concrete, composed of large geometric massing, and it’s visually heavy. Also like the Nakagin Capsule Tower, it belongs to a different, coexisting architectural movement, primarily developed by the Dutch, called Structuralism. Structuralism is a complex set of architectural ideologies developed in the 1960s and 70s, centered around a few key concepts: the rationalist idea that people’s behavior can be directly changed (or manipulated) via design; designing built structures that correspond in form to social structures; an emphasis on cultural and geographical context; an urbanism and design approach based, like Metabolism, on a biological growth analogy (called Aesthetics of Number); the integration of a variety of uses and programs within the same overall structure; and, finally, the aim to architecturally reconcile the needs of both “high” and “low” culture. 

Brutalism, Metabolism, and Structuralism arose from a similar origin, and are ideologically more alike than different, something we will talk about in the next installment of this series. 

Brutalism is not a feeling. 

But also, it kind of is. It is, as the folks say, “a big mood.” A large reason why buildings are incorrectly labeled Brutalist is because they bring forth a very specific emotional response to architecture shared by many people across the world. Some of the buildings that cause people to feel this complex and nuanced set of emotional and aesthetic reactions are, in fact, Brutalist, but many are not. To me, what this demonstrates, is a broader need for architectural education and discourse that goes beyond the most common system for classifying architecture: stylistic labels. 

To talk about this, we’ll bring back Lloyd’s Building, Kahn’s factory and present it alongside a few other examples. 

Left to Right: John M Johanson, Stage Center Oklahoma City (1979) Photographer unknown; Yuri Platonov, Russian Academy of Sciences (1968) Photo by Raita (CC BY 2.0); Boris Magasto, Haludovo Hotel, Krk, Croatia (1972) Photographer unknown; Kevin Roche, The Pyramids (1972) Photo by jikatu (CC BY SA 2.0)

All of these buildings (and all of the photographs of these buildings) are very different from one another, and yet, they have all been classified mistakenly as being “Brutalism.” The only real link between them is emotion. 

Like many folks in the late aughts/early 2010s, I nurtured my then-juvenile love of architecture through spending hours lurking in the Skyscraper City forums looking at thread after thread of pictures of 20th century architecture. Why? Because those images made me feel powerful emotions that I still find difficult to put into words. 

When talking about Brutalism as a feeling, perhaps the closest idea comes from the English philosopher Edmund Burke in his 1756 treatise “A Philosophical Enquiry into the Origin of our Ideas of the Sublime and Beautiful”. I am, of course, talking about the sublime. The Burkean sublime is emotionally complex. To quote Burke directly: 

“Whatever is fitted in any sort to excite the ideas of pain, and danger, that is to say, whatever is in any sort terrible, or is conversant about terrible objects, or operates in a manner analogous to terror, is a source of the sublime; that is, it is productive of the strongest emotion which the mind is capable of feeling.”

But the sublime isn’t just negative. It overwhelms us with its awesome power and in this moment, “the mind is so entirely filled with its object, that it cannot entertain another.” Burke’s concept of the sublime was initially applied to such things as the ocean or the Alps - natural features that are so large, massive, and inherently dangerous that they put us in a state of awe-inspiring disbelief - and yet, and despite their mass and their danger, they give us feelings of deep pleasure and joy

To the people (including myself) who love Brutalism - it does engender feelings of unknowing, of mystery, and sometimes, especially when said Brutalist building is in disrepair or photographed at a particularly menacing angle, of fear or grief. It shares this, rather than a stylistic label, with the buildings featured in this post. 

Because of Brutalism’s association with the State, such as in the case of the former Soviet Bloc, East Germany, the welfare state in England, or its use in governmental buildings around the world, lingering political sentiments can also contribute to this complex mix of emotions - whether one longs for the halcyon days of eras past or fears them as being domineering or totalitarian. It can also cause people to associate buildings that are not Brutalist with buildings that are because they share a same political history. Similar to how the post-industrial society left behind a trail of industrial ruins along the American Rust Belt, so too has neoliberalism gutted and left for dead the monuments of these modernist utopias. 

An actual Brutalist building: Paul Rudolph, Endo Laboratories Headquarters (1964). Photo via Library of Congress

Brutalist or not, these are enigmatic buildings - their forms are strange and unusual, alien even; their contents and even their purposes remain mysterious. Their siting makes them seem either imposing relative to their surroundings or isolated and alone. There is something dark and lonely, sad and longing about them. They are beautiful, partially because of their striking, form-bending architecture, and partially because they once lived different lives in times so unlike ours. 

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 Week, Crowdcast streaming, and bonus essays!

Not into recurring donations or bonus content? Consider the tip jar! Or, Check out the McMansion Hell Store! Proceeds from the store help protect great buildings from the wrecking ball. 

Copyright Disclaimer: All photographs are used in this post under fair use for the purposes of education, satire, and parody, consistent with 17 USC §107. Manipulated photos are considered derivative work and are Copyright © 2019 McMansion Hell. Please email [email protected] before using these images on another site. (am v chill about this)

important announcement

i met the lawyer to my foyer
the nub to my roofline
the car to my carhole…
what i’m trying to say is i’m engaged now

edit: we will not be buying a mcmansion for obvious reasons but if you’re feeling the love tonight, you can donate a coffee to the kate wagner & partner tiny and modest wedding fund: ! 

(i’m a writer and he’s a high school math teacher so we could use all the help we can get.)

50 States of McMansion Hell: Campbell County, Wyoming

Howdy, folks! It’s time for us to go home, (big, ugly) home on the range. That’s right: It’s time for Wyoming. Now, when I think Wyoming, I think of rolling hills, ranches, incredible landscapes, and also that book about cowgirls that Dick Cheney’s wife wrote.

On that note:

This beautiful 5 bed/4.5 bath 6,000 square foot house was built in 2002. It can be all yours for around $700,000 USD.

Let’s mosey on down through this here estate.

Divorce Lawyer Foyer/Living Room

Now, I’ve been an architecture enthusiast for about a decade of my short, two and a half decade life and never have I seen something as both absurd and patently useless as whatever the hell that thing separating the foyer and the living room is. Does it have a structural purpose? No. Does it have an aesthetic purpose? Also no.


(Running for president voice) “Folks, when I become president, I assure you that the injustice - the absolute tyranny -  that is the island stovetop/wall oven combo will finally–” (crowd cheering) “– and I mean finally, be put deep into the ground where it belongs.”

Dining Room

The aged bronze chandeliers must have been on ultra clearance. Personally, as someone who loves a good deal, I cannot shame them for this.

Master Bedroom

What I can’t determine is what they were going for with the sponge paint on the walls. My closest approximation is tree bark, in which case what we see before us in fact is deeply offensive to the trees, who are innocent and don’t deserved to be involved in any of this.

Master Bathroom

I don’t care how nostalgic we as a culture get for the late nineties/early aughts, sponge paint should never come back. One, it’s sponge paint. Two, it is ridiculously labor intensive and frankly we could all be spending our last few years on this still-habitable earth doing something more worthwhile with our time, such as going outside or falling in love or destroying our brains on the internet.

You are seriously not ready for this

When making this picture I realized I desperately need to log off.

Bathroom 2

Computer, enhance.

Ok but you can’t even read that in the shower. If you’re that desperate for prophetic, non-digital bathroom reading material, buy a bottle of Dr. Bronners or, like, a copy of War and Peace.


Poor Little Julie. :(

Well, that wraps up our interior. Now, for the final frontier, on the frontier:

Rear Exterior

Somehow this house looks more like it’s made out of cardboard than the many, many houses on this blog that also look like they’re made out of cardboard.

Anyways, that does it for Wyoming! Stay tuned for next week’s Brutalism Post, Part II: What Brutalism is Not. Have a great weekend, folks.

If you like this post, and want to see more like it, consider supporting me on Patreon, ESPECIALLY if you also like donoteat01′s content on YouTube, because we will be doing a livestream collab on Patreon on August 25th, 2019 from 8-10PM EST!!!

There is a whole new slate of Patreon rewards, including Good House of the Week, Crowdcast streaming, and bonus essays!

Not into recurring donations or bonus content? Consider the tip jar! Or,Check out the McMansion Hell Store ! 100% of the proceeds from the McMansion Hell store go to charity!

Copyright Disclaimer: All photographs are used in this post under fair use for the purposes of education, satire, and parody, consistent with 17 USC §107. Manipulated photos are considered derivative work and are Copyright © 2019 McMansion Hell. Please email [email protected] before using these images on another site. (am v chill about this)

Kate Wagner - McMansion Hell Live at Motorco!

Kate Wagner - McMansion Hell Live at Motorco!:

Howdy folks! If you’re in the NC area next Tuesday, come and see me talk about McMansions as well as do a live house roast at Motorco in Durham. The ticket sales go to fund NC Modernist Houses, a nonprofit that works to preserve the heritage of architectural modernism in North Carolina. 

When: Tuesday, July 23, 6pm

Where: Motorco, 723 Rigsbee Avenue, Durham

Tickets: Advance - $29
At the door - $39
VIP - $99
(you get to throw axes at pictures of McMansions with me afterward lol)

See y’all there! 

The Brutalism Post, Part One: Introduction

This is part one of a five-part post about Brutalism. 

University of Massachusetts at Dartmouth campus by Paul Rudolph. Photo via Library of Congress

No style of architecture so passionately divides even the most good-natured and level-headed people as Brutalism. The discourse surrounding Brutalism being “good” or “bad” is fierce and polemical. The “for” crowd lobbies on both aesthetic grounds – posting pictures of incredible and obscure structures and saying “I mean LOOK at this” – as well as political ones, citing in particular, how Brutalism was used to house thousands of people during the postwar period. 

On the other hand, the “against” crowd brings up the failed urbanism of Le Corbusier that gave us the freeways and slum clearance that split and displaced entire swaths of city fabric, proclaiming that only architects or architecture enthusiasts like Brutalism, and that this is a testament to how out of touch they are with everyday people. “If you had to live or work in these buildings,” they say, “you’d feel differently.” 

Unité d'Habitation by Le Corbusier. Photo by Thomas Nemeskeri, via Flickr (CC BY-NC-ND 2.0) 

I’ve been a spectator to this debate since I first lurked in the Skyscraper City forums as a high school freshman, ten years ago, when Brutalism itself sparked the interest in architecture that brings me here today. I have, as they say, heard both sides, and when asked to pick one, my response is unsatisfying. Though my personal aesthetic tastes fall on the side of “Brutalism is good,” I think the actual answer is  it’s deeply, deeply complicated. 

Still, what is it about Brutalism that makes it so divisive? Why does a short-lived substyle of modern architecture elicit such vehement passion in so many people? What does it even mean for a style of architecture to be “good” or “bad”? You can see why I’m drawn to finally sitting down and penning this series, which has been simmering at the back of my mind since I started McMansion Hell three years ago. (By the way, Happy Birthday to this blog!!!) 

Brutalism has a special way of inspiring us to ask big and difficult questions about architecture. “Is Brutalism good?” is really a question of “is any kind of architecture good?” - is architecture itself good? And what do we mean by good? Are we talking about mere aesthetic merits? Or is it more whether or not a given work of architecture satisfies the purpose for which it was built? Can architecture be morally good? Is there a right or wrong way to make, or interpret, a building? 

Ferrier Estate, a now-demolished social housing complex in South London. Photo by Tim Slessor via Flickr (CC BY-NC 2.0)  

I have bad news for you: the answers to all of these questions are complicated, nuanced, and unsatisfying. In today’s polemical and deeply divided world of woke and cancelled, nuance has gotten a bad rap, having been frequently misused by those acting in bad faith to create blurred lines in situations where answers to questions of morality are, in reality, crystal clear. This is not my intention here. 

For centuries, the philosophical discipline of aesthetics has tried in vain to articulate some kind of clearly defined standard by which we can delineate whether or not a work of art is good, bad, moral or amoral. Architecture makes this even more complicated because unlike literature, painting, music, or art, we have to live, work, and exist in architecture. Not only does the question of whether or not we can separate the art from the artist exist in architecture, so to do questions of whether or not we can separate the building from the politics, from the culture, from the time period, from the urbanism, from the socioeconomic system, from the entire contents of everyday life in which it exists. 

Orange County Government Center, Perspective Drawing, by Paul Rudolph. Photo via the Library of Congress.

Existential questions aside, there are other reasons to write about Brutalism. First, while we’ve been hemming and hawing about it online, we’ve lost priceless examples of the style to either demolition or cannibalistic renovation, including Paul Rudolph’s elegant Orange County Government Center, Bertrand Goldberg’s dynamic Prentice Women’s Hospital in Chicago, and the iconic Trinity Square, Gateshead complex, famous for the role it played in the movie Get Carter. My hope is that by bringing up the nuances of Brutalism before a broad and diverse audience, other buildings on the chopping block might be spared. 

On an even broader note, I think Brutalism is worth writing about simply because a lot of people are rightly confused as to what it even is.  The common practice of identifying Brutalism by the presence of a material - reinforced concrete - too broadly defines a style that belongs to a specific era and architectural praxis. There are so many buildings and styles called Brutalist that are not Brutalist that I’ve devoted the first two installments of this series to the subject “What Brutalism Is Not,” followed, of course, by “What is Brutalism?” The goal is that these two essays will be educational and interesting (with the added bonus of providing the reader with an arsenal of information that will make them as insufferable at dinner parties as I am.)

The third part in this series is devoted to the people of Brutalism - the architects, politicians, planners, writers, and philosophers, who signed their names to an architectural movement that spanned the globe. Finally, the last installment gathers all this information together and answers the question we’ve all been waiting for: is Brutalism good? 

The Kyoto International Conference Center, designed by Sachio Otani. Photo by Chris Guy, via Flickr. (CC BY-NC-ND 2.0) 

This is a series on Brutalism, but Brutalism itself demands a level of inquiry that goes beyond defining a style. Really, this is a series about architecture, and its relationship to the world in which it exists. Architects, as workers, artists, and ideologues, may dream up a building on paper and, with the help of laborers, erect it in the material world, but this is only the first part of the story. The rest is written by us, the people who interact with architecture as shelter; as monetary, cultural, and political capital; as labor; as an art; and, most broadly, as that which makes up the backdrop of our beautiful, complicated human lives. 

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 Week, Crowdcast streaming, and bonus essays!

Not into recurring donations or bonus content? Consider the tip jar! Or,Check out the McMansion Hell Store ! 100% of the proceeds from the McMansion Hell store go to charity!

Copyright Disclaimer: All photographs are used in this post under fair use for the purposes of education, satire, and parody, consistent with 17 USC §107. Manipulated photos are considered derivative work and are Copyright © 2019 McMansion Hell. Please email [email protected] before using these images on another site. (am v chill about this)

To make a closing prison bad news

By /u/lol62056

To make a closing prison bad news submitted by /u/lol62056 to r/therewasanattempt
[link] [comments]

Team of amateurs vs 1 NBA player

By /u/PutridCloister

Team of amateurs vs 1 NBA player submitted by /u/PutridCloister to r/gifs
[link] [comments]

This statue in Poland looks like Darth Vader on a snowy day

By /u/KaleBrecht

This statue in Poland looks like Darth Vader on a snowy day submitted by /u/KaleBrecht to r/StarWars
[link] [comments]

At our school cafetaria, no-one ever wants the receipt. So the cafetaria lady put the paper in a loop to limit paper waste.

By /u/Laurensmatthijs

At our school cafetaria, no-one ever wants the receipt. So the cafetaria lady put the paper in a loop to limit paper waste. submitted by /u/Laurensmatthijs to r/mildlyinteresting
[link] [comments]

Pennsylvania man captures all walks of life crossing log bridge

By /u/Wuz314159

Pennsylvania man captures all walks of life crossing log bridge submitted by /u/Wuz314159 to r/videos
[link] [comments]

tHis CaVE iS NoT A NAtuRaL ForMaTiOn...

By /u/fegkay15

tHis CaVE iS NoT A NAtuRaL ForMaTiOn... submitted by /u/fegkay15 to r/halo
[link] [comments]

The Trump administration has barred the top US disease expert from speaking freely to the public after he warned the coronavirus may be impossible to contain

By /u/DaFunkJunkie

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

100% legitimate quote

By /u/CastleYunYun

100% legitimate quote submitted by /u/CastleYunYun to r/HistoryMemes
[link] [comments]

Whistleblower Accuses Trump of 'Corrupt' Effort to 'Cover Up' Possible Exposure of Federal Workers to Coronavirus; "The utter ineptitude of this administration is infuriating. They are going to get people killed."

By /u/Thinkingonsleeping

Whistleblower Accuses Trump of 'Corrupt' Effort to 'Cover Up' Possible Exposure of Federal Workers to Coronavirus; "The utter ineptitude of this administration is infuriating. They are going to get people killed." submitted by /u/Thinkingonsleeping to r/politics
[link] [comments]

Execute order covid-19

By /u/uros4658

Execute order covid-19 submitted by /u/uros4658 to r/PrequelMemes
[link] [comments]

What was sexy 10 years ago but isn't now?

By /u/Jasonjones2002

submitted by /u/Jasonjones2002 to r/AskReddit
[link] [comments]

🔥 Mount Fuji from above

By /u/Dodecahedron7

🔥 Mount Fuji from above submitted by /u/Dodecahedron7 to r/NatureIsFuckingLit
[link] [comments]

where to start...

By /u/ballan12345

where to start... submitted by /u/ballan12345 to r/SelfAwarewolves
[link] [comments]

Poor guy just wanted a high five

By /u/AlrRaMon

Poor guy just wanted a high five submitted by /u/AlrRaMon to r/Wellthatsucks
[link] [comments]

Customers hate tipping before they’re served – and asking makes them less likely to return

By /u/LaromTheDestroyer

Customers hate tipping before they’re served – and asking makes them less likely to return submitted by /u/LaromTheDestroyer to r/science
[link] [comments]

Error'd: Just Following Out of Order Orders

By Mark Bowytz

"Instructables alphabetic sorting by each country's name in its own language (i.e. Spain == Espana) is a great idea, but it kind of makes for a hard to navigate list," writes Peter L.


"It's very thoughtful of my company to *try* to autofill my network username," Joe writes.


Noah wrote, "Some newsbot is really worried about bumblebees...not to say it isn't entirely unfounded concern though."


"While alt-tabbing my apps, I found what one might think of as an attempt at a hidden form,"


"I imagine that somewhere behind the scenes at H&R Block, some design said that x must be set to a randomvalue, and, well, here we are," writes Darrel H.


Brett wrote, "Seems that AxleHire does their deliveries using their fleet of DeLoreans."


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

CodeSOD: A Blacklisted Senior

By Remy Porter

Damien has the “pleasure” of supporting JavaScript code which runs, not in a browser or Node, but inside of a proprietary runtime specialized in handling high-performance collection datatypes. You can write extremely fast code, so long as you’re using the collection types correctly. This is good, because a lot of those JavaScript blocks have to be executed for every single request. Milliseconds of execution time add up faster than you think.

One of Damien’s senior peers needed to add some code that would filter fields out of a response. Data fetched from the database would be compared against a blacklist of fields to exclude- those fields should be removed from the collection.

This is a relatively simple task, and one that has, in other variations, already been implemented in the codebase. Some of those proprietary enhancements are faster implementations of types like Set, so the basic approach would be:

  1. Load the blacklist into a Set
  2. Iterate over the items in reverse order
  3. Check if each item is in the set, and if so, remove it from the list using removeAt

The Set is fast. By iterating in reverse order, you can change the length of the list without disrupting the for loop. removeAt is a direct access, which is also fast. Since performance is a concern, this is a pretty good solution.

The senior developer came up with this:

function getFilteredItems() {
    var items = getItems();
    var blacklist = config.getBlacklist();
    Object.keys(blacklist).forEach(function (blacklistElement) {
        if (blacklist[blacklistElement]) {
            items.toArray().forEach(function (item) {
                if (item.tag === blacklistElement) {
    return items;

getBlacklist was implemented by this developer, and thus they could have done anything they wanted. What they chose to do was return an object where keys were the field names, and values were booleans. The blacklist could contain hundreds of items.

So we iterate across each key, keeping in mind that some of these keys may potentially be false, and thus should be skipped anyway. Then, for each key in the blacklist, we iterate across each item in our items array, turning something that should have been a linear operation into a quadratic operation. The items array could have hundreds or hundreds of thousands of items, depending on the operation.

But we don’t just iterate across the items array. We iterate across items.toArray(), a copy of the items array. So that bloats the runtime and the memory footprint, especially since we need to do that for each blacklist item. But then that’s necessary, since we use items.remove to remove the item in place- something that we couldn’t do from inside of a forEach because changing the size of a collection while iterating across the collection can be tricky (if you don’t use the solution we mentioned above).

But items.remove is what makes this even worse. Because items.remove does a linear search through the array to find the target reference. So, we iterate across the blacklist. For each item in the blacklist, we iterate across the entire list of items, then for each item we need to remove, we iterate across the items again. And all this assumes that the toArray cast is cleverly implemented using a memcopy approach and doesn’t have to actually iterate the array, which is probably true.

Even if performance doesn’t matter, that’s a pretty WTF way to implement that, even if you’re a “senior developer”.

[Advertisement] ProGet can centralize your organization's software applications and components to provide uniform access to developers and servers. Check it out!

CodeSOD: Producing Self Joins

By Remy Porter

Wesley considers himself an “intermediate SQL-er”. The previous “database expert”, though, has moved on to greener pastures, and now Wesley is “the database person”. This means that they need to pick through a bunch of stored procedures and triggers and try and understand the undocumented, unversion-controlled database code.

The upshot, is that Wesley is starting to feel like his intermediate skills might be more “expert” than the previous expert.

For example, Wesley found this query. The goal of this query is, for a single point-of-sale terminal, in a date range, how many of each product did they sell, as a raw count. It should be able to say, there were 5 apples, 10 oranges, etc.

Now, you or I or Wesley are probably already reaching for the GROUP BY and maybe a CASE. It’s the right choice, obviously. But the “expert” has a different solution:

COUNT(c.ProduceId) AS Apples,
COUNT(d.ProduceId) AS Oranges,
-- ... 
COUNT(ac.ProduceId) AS Zucchini,
COUNT(ad.ProduceId) AS Other,
COUNT(ae.ProduceId) AS GrandTotal
FROM Cashier a
INNER JOIN Sale b ON a.RegisterId = b.RegisterId
                     AND (CONVERT(DATE,b.SaleDate) BETWEEN @startDate AND @endDate
LEFT OUTER JOIN ProduceType c ON b.ProduceId = c.ProduceId AND c.ProduceName = 'Apples'
LEFT OUTER JOIN ProduceType d ON b.ProduceId = d.ProduceId AND d.ProduceName = 'Oranges'
-- ...
LEFT OUTER JOIN ProduceType ac ON b.ProduceId = x.ProduceId AND x.ProduceName = 'Zucchini'
LEFT OUTER JOIN ProduceType ad ON b.ProduceId = y.ProduceId AND y.ProduceName = 'Other'
LEFT OUTER JOIN ProduceType ae ON b.ProduceId = z.ProduceId AND z.ProduceName IS NOT NULL
GROUP BY a.Name, b.RegisterId
ORDER BY a.Name, b.RegisterId

This… is a massive self-join. Each join trips back to ProduceType, but filters it for one specific type of produce. For every kind of produce they track. Well, presumably every kind- at some point the list of produce in the ProduceType table might change, in which case this query breaks.

This isn’t the simplest query to write in SQL, given that SQL really doesn’t like it when you dynamically project an arbitrary number of columns, so pretty much any solution is going to be at least a little bit ugly. Still, with a smart use of CASE statements or possibly sub-queries, you can certainly get there. Given all the possible ways to write a query like this, it’s impressive to see that the original developer hit upon what may be the worst possible one.

Wesley adds:

I can’t stop asking myself: how does someone end up writing a join into a N-way self-join instead of counting cases over a single join? HOW?! Were they challenged to write a loop-switch sequence in SQL? Was CASE broken somehow?
Since there’s no revision control for these scripts, I may never know.

[Advertisement] Ensure your software is built only once and then deployed consistently across environments, by packaging your applications and components. Learn how today!

CodeSOD: Break your Labels

By Remy Porter

Nedra writes “I discovered this code while cleaning up and refactoring some label printing methods in a home-grown ERP that I maintain.”

The code in question “works most of the time”, which means it’s crossed a line of code quality. Speaking of crossing lines, this particular block of code needs to take information about how a product is formulated and print it on a label. These sorts of ERP functions are “mission critical”, in that correct and accurate formulations- whether the ingredients list on a foodstuff or the ingredients in a can of paint, or an industrial solvent- are required for regulatory compliance.

Labels are also physical objects, and have a defined physical size. This means that you can only fit so much information on them, and you’ll need to make sure the layout of what you’re printing is readable on the label.

Nedra’s co-worker had… a solution for this.

  Dim result As String = ""
  Dim f As String() = Formula.Split(New String() {Environment.NewLine}, StringSplitOptions.None)
  If f.Count > 8 Then
      For Each line In f
          If line.Length > 80 Then
              Dim break As Integer = line.Substring(0, 80).LastIndexOf(" ") + 1
              line = line.Insert(break, Environment.NewLine)
              If line.Length > 161 Then
                  break = line.Substring(0, 161).LastIndexOf(" ") + 1
                  line = line.Insert(break, Environment.NewLine)
                  If line.Length > 242 Then
                      break = line.Substring(0, 242).LastIndexOf(" ") + 1
                      line = line.Insert(break, Environment.NewLine)
                      If line.Length > 323 Then
                          break = line.Substring(0, 343).LastIndexOf(" ") + 1
                          line = line.Insert(break, Environment.NewLine)
                      End If
                  End If
              End If
          End If
          If String.IsNullOrEmpty(result) Then
              result = line
              result += Environment.NewLine + line
          End If
      For Each line In f
          If line.Length > 65 Then
              Dim break As Integer = line.Substring(0, 65).LastIndexOf(" ") + 1
              line = line.Insert(break, Environment.NewLine)
              If line.Length > 131 Then
                  break = line.Substring(0, 131).LastIndexOf(" ") + 1
                  line = line.Insert(break, Environment.NewLine)
                  If line.Length > 197 Then
                      break = line.Substring(0, 197).LastIndexOf(" ") + 1
                      line = line.Insert(break, Environment.NewLine)
                      If line.Length > 263 Then
                          break = line.Substring(0, 263).LastIndexOf(" ") + 1
                          line = line.Insert(break, Environment.NewLine)
                      End If
                  End If
              End If
          End If
          If String.IsNullOrEmpty(result) Then
              result = line
              result += Environment.NewLine + line
          End If
  End If

After writing a block like this, you definitely need to take a break. At its core, this code injects linebreaks at specific positions in a string depending on how many total original lines there were. For a long moment, I was trying to figure out the off-by-one errors that it looked like it had- 80 characters, then 161?- but that’s specifically because it’s inserting characters.

It’s not efficient, it’s not easy to read, it’s not easy to skim, but it does work. Mostly. Some formulas have a lot of content, which means this break pattern doesn’t always actually fit the content correctly.

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

CodeSOD: The Label Printer

By Remy Porter

If you create a UI object in code, you have to go through all that pesky, annoying work of initalizing that object so it displays correctly. I mean, who wants to write VB.NET code which looks like this:

Label = New Label Label.Size = New Size(710, 300) Label.TextLB = "Operation:" someForm.Controls.Add(Label)

Here, we've created a label object which overrides a handful of default properties, and then gets added to the screen. You'll have to do that for every control! Obviously, you need a method.

No, not a method called something like OperationLabel() which creates and adds the Operation: label to the form. You have to think more generic than that. We want a method which allows us to add any label, with any configuration, to the form.

Benjamin's co-worker has an idea exactly about how to accomplish that. Instead of that ugly block of code above, you can write this gorgeous code:

CreateRectLabel(Label, "Label", String.Empty, New Point(290, 5), someForm, Color.Red, Color.White, Color.White, 710, 300, Color.White, "SomeText", String.Empty, New Font(MainFontName, 48, FontStyle.Bold), New Font(MainFontName, 16, FontStyle.Bold), New Font(MainFontName, 28, FontStyle.Bold), TextEffects.Floating, TextEffects.Floating, TextEffects.Floating, Lang.InstructionErrors.PushInRedButton, TextEffects.Floating, New Font(MainFontName, 34, FontStyle.Bold), Color.White, Color.White, TextEffects.None, "", Nothing, Color.White, TextEffects.None, "", New Font(MainFontName, 12, FontStyle.Regular), Color.White, TextEffects.None, "", New Font(MainFontName, 12, FontStyle.Regular))

Now you have to directly set every one of those parameters, no exceptions! You'll always have to be perfectly explicit about what settings you're using.

Here is the implementation of that CreateRectLabel method:

Public Sub CreateRectLabel(ByRef LabelObj As Label, ByVal LabelName As String, ByVal TextLT As String, ByVal LabelLocation As Point, ByRef PanelContainer As Object, ByVal LabelColor As Color, ByVal TextColorLT As Color, ByVal TextColorCaption As Color, ByVal LabelWidth As Integer, ByVal LabelHeight As Integer, ByVal TextColorLB As Color, ByVal TextLB As String, ByVal TextCaption As String, ByVal FontLT As Font, ByVal FontCaption As Font, ByVal FontLB As Font, ByVal TextEffectLT As TextEffects, ByVal TextEffectCaption As TextEffects, ByVal TextEffectLB As TextEffects, ByVal TextLM As String, ByVal TextEffectLM As TextEffects, ByVal FontLM As Font, ByVal TextColorLM As Color, ByVal TextColorRM As Color, ByVal TextEffectRM As TextEffects, ByVal TextRM As String, ByVal FontRM As Font, ByVal TextColorCB As Color, ByVal TextEffectCB As TextEffects, ByVal TextCB As String, ByVal FontCB As Font, ByVal TextColorCT As Color, ByVal TextEffectCT As TextEffects, ByVal TextCT As String, ByVal FontCT As Font, Optional ByVal LabelSpecialEffects As SpecialEffects = SpecialEffects.None) LabelObj = New Label LabelObj.Name = LabelName LabelObj.Size = New Size(LabelWidth, LabelHeight) LabelObj.Location = LabelLocation LabelObj.Shape = Shapes.Rectangle LabelObj.ShadowMode = ShadowModes.Blurred LabelObj.ColorSurfaceNormal.Render3DType = ColorRenderType.Best3D LabelObj.ColorSurfaceNormal.BackColor = LabelColor LabelObj.ColorSurfaceNormal.BackColor2 = LabelColor LabelObj.ColorSurfaceNormal.GradientType = ColorGradientType.Classic LabelObj.ColorSurfaceNormal.GradientFactor = 4 LabelObj.Surface = Surfaces.HardPillow LabelObj.SmoothEdges = Smooths.High LabelObj.SpecialEffect = LabelSpecialEffects ' Left Top Text LabelObj.TextDescrLT.ColorNormal = TextColorLT LabelObj.TextDescrLT.SpecialEffect = TextEffectLT LabelObj.TextDescrLT.Text = TextLT LabelObj.FontLeftTop = FontLT ' Center Top Text LabelObj.TextDescrCT.ColorNormal = TextColorCT LabelObj.TextDescrCT.SpecialEffect = TextEffectCT LabelObj.TextDescrCT.Text = TextCT LabelObj.FontCenterTop = FontCT ' Caption Text LabelObj.ForeColor = TextColorCaption LabelObj.FontCaption = FontCaption LabelObj.TextDescrCaption.SpecialEffect = TextEffectCaption LabelObj.Text = TextCaption ' Left Middle Text LabelObj.TextDescrLM.ColorNormal = TextColorLM LabelObj.TextDescrLM.SpecialEffect = TextEffectLM LabelObj.TextDescrLM.Text = TextLM LabelObj.FontLeftMiddle = FontLM ' Left Bottom Text LabelObj.TextDescrLB.ColorNormal = TextColorLB LabelObj.TextDescrLB.SpecialEffect = TextEffectLB LabelObj.TextDescrLB.Text = TextLB LabelObj.FontLeftBottom = FontLB ' Center Bottom Text LabelObj.TextDescrCB.ColorNormal = TextColorCB LabelObj.TextDescrCB.SpecialEffect = TextEffectCB LabelObj.TextDescrCB.Text = TextCB LabelObj.FontCenterBottom = FontCB ' Right Middle Text LabelObj.TextDescrRM.ColorNormal = TextColorRM LabelObj.TextDescrRM.SpecialEffect = TextEffectRM LabelObj.TextDescrRM.Text = TextRM LabelObj.FontRightMiddle = FontRM LabelObj.Visible = True PanelContainer.Controls.Add(LabelObj) End Sub

No, there are no overloads. Yes, they quite clearly understood what optional paremeters are. No, they didn't want to use them for anything else but the LabelSpecialEffects parameter.

In any case, when you want to change a setting on a label, enjoy counting parameters to figure out where exactly you should make the change.

[Advertisement] ProGet can centralize your organization's software applications and components to provide uniform access to developers and servers. Check it out!

Error'd: Identification Without Authentication

By Mark Bowytz

Mark M. wrote, "While I was reading the Feb 6th DailyWTF, Feedly chimed in with this helpful comment that really put it in context."


"I was looking for a wireless keyboard on Amazon but I forgot to mention that I wanted one that was hairless too," Jean-Pierre writes.


"Oh, yes, please! I'd love to let my phone make phone calls!" writes Jura K.


Oliver X. writes, "Technically, it's equivalent to UTC+1, right?"


"Shopping on Wayfair in preparation for our upcoming move when I discovered this untold treasure! ...or, should I say, undefined treasure?" Sarah S. writes.


"Thanks so much for the 'timely' alert, Ebay. I'll be sure to keep a close eye on this one," David wrote.


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

CodeSOD: It's For DIVision

By Remy Porter

We’ve discussed the evil of the for-case pattern in the past, but Russell F offers up a finding which is an entirely new riff on this terrible, terrible idea.

We’re going to do this is chunks, because it’s a lot of code.

protected void setDivColor()
    List<HtmlControl> Divs = new List<HtmlControl>();
    HtmlControl divTire1Det = divShopCart.FindControl("divTire1Det") as HtmlControl;
    if (divTire1Det.Visible)

    HtmlControl divTire2Det = divShopCart.FindControl("divTire2Det") as HtmlControl;
    if (divTire2Det.Visible)

So, this method starts with a block of C# code which tries to find different elements in the HTML DOM, and if they’re currently visible, adds them to a list. How many elements is it finding? If I counted correctly (I didn’t count correctly), I see 13 total. Many of them are guarded by additional if statements:

    if (!bMAlignAdded)
        HtmlControl divManufAlign_Add = divShopCart.FindControl("divManufAlign_Add") as HtmlControl;
        if (divManufAlign_Add.Visible)
    if (!bRoadHazardAdded)
        HtmlControl divRoadHazard_Add = divShopCart.FindControl("divRoadHazard_Add") as HtmlControl;
        if (divRoadHazard_Add.Visible)

That’s the first 80 lines of this method- variations on this pattern. And at the end of it, we have this shiny list of divs. The method is called setDivColor, so you know what we’ve got to do: change the UI presentation by flipping some CSS classes around in a for loop, but also, in a terrible way.

    int j = 0;
    foreach (HtmlControl dDiv in Divs)
        if (dDiv.ClientID.Contains("divTire1Det"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divTire2Det"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");

        else if (dDiv.ClientID.Contains("divDownloadRebate"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divTire1WheelBal"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divTire2WheelBal"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divStudding"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divFWheelAlign"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divTireDisp"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divTireFee"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divSalesTax"))
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divManufAlign_Remove") && bMAlignAdded)
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divRoadHazard_Remove") && bRoadHazardAdded)
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divManufAlign_Add") && !bMAlignAdded)
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divRoadHazard_Add") && !bRoadHazardAdded)
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
        else if (dDiv.ClientID.Contains("divDiscount") && !bRoadHazardAdded)
            Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");

We iterate across every element in the list, which we just selected those elements, mind you, and then on alternating rows, swap between GreyBackground and WhiteBackground, giving us a nice contrast between rows of divs. It’s not enough, however, to just do that, we need to have this bizarre addition of a chain of if/else ifs that have it behave like a for-switch, but none of those cases are actually necessary, since we’ve already built the list in the previous block.

Maybe I’ve been writing too much of my own bad code lately, but I think I understand what happened here. At one point, instead of using FindControl, this code just tried to get a list of all the children and iterated across it, and thus the for-switch section was born. But the DOM changed, or maybe that never worked, and thus the developer went back and added the top block where they FindControl each element they need, but never updated the for loop to simplify the logic.

As a bonus WTF, and I recognize that I risk starting a flamewar with this: but CSS classnames should never explicitly reference the UI effect they have (GreyBackground and WhiteBackground) and instead the logical classification of the element (form-row, form-row-alt, for example). There are CSS frameworks which disagree with me on this, but they are wrong.

Full code:

protected void setDivColor()
        List<HtmlControl> Divs = new List<HtmlControl>();
        HtmlControl divTire1Det = divShopCart.FindControl("divTire1Det") as HtmlControl;
        if (divTire1Det.Visible)
        HtmlControl divTire2Det = divShopCart.FindControl("divTire2Det") as HtmlControl;
        if (divTire2Det.Visible)
        HtmlControl divTire1WheelBal = divShopCart.FindControl("divTire1WheelBal") as HtmlControl;
        if (divTire1WheelBal.Visible)
        HtmlControl divTire2WheelBal = divShopCart.FindControl("divTire2WheelBal") as HtmlControl;
        if (divTire2WheelBal.Visible)
        HtmlControl divStudding = divShopCart.FindControl("divStudding") as HtmlControl;
        if (divStudding.Visible)
        HtmlControl divFWheelAlign = divShopCart.FindControl("divFWheelAlign") as HtmlControl;
        if (divFWheelAlign.Visible)
        if (bMAlignAdded)
            HtmlControl divManufAlign_Remove = divShopCart.FindControl("divManufAlign_Remove") as HtmlControl;
            if (divManufAlign_Remove.Visible)
        if (bRoadHazardAdded)
            HtmlControl divRoadHazard_Remove = divShopCart.FindControl("divRoadHazard_Remove") as HtmlControl;
            if (divRoadHazard_Remove.Visible)
        HtmlControl divTireDisp = divShopCart.FindControl("divTireDisp") as HtmlControl;
        if (divTireDisp.Visible)
        HtmlControl divTireFee = divShopCart.FindControl("divTireFee") as HtmlControl;
        if (divTireFee.Visible)
        HtmlControl divSalesTax = divShopCart.FindControl("divSalesTax") as HtmlControl;
        if (divSalesTax.Visible)
        if (!bMAlignAdded)
            HtmlControl divManufAlign_Add = divShopCart.FindControl("divManufAlign_Add") as HtmlControl;
            if (divManufAlign_Add.Visible)
        if (!bRoadHazardAdded)
            HtmlControl divRoadHazard_Add = divShopCart.FindControl("divRoadHazard_Add") as HtmlControl;
            if (divRoadHazard_Add.Visible)
        HtmlControl divDiscount = divShopCart.FindControl("divDiscount") as HtmlControl;
        if (divDiscount.Visible)
        int j = 0;
        foreach (HtmlControl dDiv in Divs)
            if (dDiv.ClientID.Contains("divTire1Det"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divTire2Det"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divDownloadRebate"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divTire1WheelBal"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divTire2WheelBal"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divStudding"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divFWheelAlign"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divTireDisp"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divTireFee"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divSalesTax"))
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divManufAlign_Remove") && bMAlignAdded)
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divRoadHazard_Remove") && bRoadHazardAdded)
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divManufAlign_Add") && !bMAlignAdded)
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divRoadHazard_Add") && !bRoadHazardAdded)
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
            else if (dDiv.ClientID.Contains("divDiscount") && !bRoadHazardAdded)
                Divs[j].Attributes["class"] = (j % 2 == 0 ? "GreyBackground" : "WhiteBackground");
[Advertisement] Ensure your software is built only once and then deployed consistently across environments, by packaging your applications and components. Learn how today!

Copy/Paste Culture

By Alex Papadimoulis

Mark F had just gone to production on the first project at his new job: create a billables reconciliation report that an end-user had requested a few years ago. It was clearly not a high priority, which was exactly why it was the perfect items to assign a new programmer.

"Unfortunately," the end user reported, "it just doesn't seem to be working. It's running fine on test, but when I run it on the live site I'm getting a SELECT permission denied on the object fn_CalculateBusinessDays message. Any idea what that means?"

The problem was fairly obvious, and Mark knew exactly what the error meant. But the solution wasn't so obvious. Why did the GRANT script work fine in test, but not in production? How can he check to see what the GRANTS are in production? Is there someone specific he should ask to get permission to look himself? Does the DBA team use a sort of ticketing system maybe? Is this even the right approach? Who on his team could he even ask?

Fortunately, Mark had the perfect venue to ask these sorts of questions: the weekly one-on-one with his team lead, Jennifer. Although he had a few years of coding experience under his belt, he was brand new to The Enterprise and specifically, how large organizations worked. Jennifer definitely wasn't the most technical person he'd met, but she was super helpful in "getting unblocked" as he was learning to say.

"Huh", Jennifer answered in their meeting, "first off, why do you even need a function to calculate the business days between two dates?"

"This seems like something pretty common in our reports," Mark responded, "and this, if the logic ever changes, we only need to change it in one place."

Jennifer gave a mystified look and smiled, "Changes? I don't think the 7-day week is going to change anytime soon, nor is the fact that Saturday and Sunday are weekends."

"Well, umm," Mark definitely didn't expect that response. He was surprised to have to explain the basic principles of code reuse to his supposed mentor, "you see, this way we don't have to constantly rewrite the logic in all the places, so the code is a bit simpler."

"Why don't you just copy/paste the calculation code in your queries?" she rhetorically asked. "That seems like it'd be a lot simpler to me. And that's what I always do…. But if you really want to get the DBAs involved, your best contact is that dba-share email address. They are super-slow to project tickets, but everyone sees that box and they will quickly triage from there."

Needless to say, he didn't follow Jennifer's programming advice. She was spot on about how to work with the DBA team. That tip alone saved Mark weeks of frustration and escalation, and helped him network with a lot more people inside The Enterprise over the years.


Mark's inside connections helped, and he eventually found himself leading a team of his own. That meant a lot more responsibilities, but he found it was pretty gratifying to help others "get unblocked" in The Enterprise.

One day, while enjoying a short vacation on a beach far, far away from the office, Mark got a frantic call from one of his team members. An end-user was panicked about a billables reconciliation report that had been inaccurate for months. The auditors had discovered the discrepancies and needed answers right away.

"So far as I can tell," his mentee said, "this report is using a fn_ CalculateBusinessDays function, which does all sorts of calculations for holidays, but they already prorate those on the report."

The problem was fairly obvious, and Mark knew exactly what happened. Some must have changed the logic on that function to work for their needs. But changing it back would mean breaking someone else's report. And the whole idea of a function seemed strange, because that would mean taking a dependen--

The junior programmer interrupted his stream of thought.

"I think I should just add an argument to the function to not include holidays," he said. "That's really simple to do, and we can just edit our report to use that argument."

"Ehhh," Mark hesitated, "the logic is so simple. Why don't you just copy/paste the business day calculation? That's the simplest solution… that's what I do all the time."

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

Logs in the Cloud

By Remy Porter

Carrol C just joined IniTech. They were hiring for someone who could help them tame their cloud costs. There’s a lot of money being spent on AWS. Management had bought in on the “it’s cheaper than on-prem”, and were starting to wonder why that promise wasn’t being fulfilled.

After a little settling in period, Carrol had his credentials for their AWS environment, and started digging around just to familiarize himself with the infrastructure. This environment had started as an on-prem system that got migrated to the cloud, so the infrastructure was mostly a collection of virtual-machines using attached virtual disks- EBS- for storing data.

And that was the first red flag. Each VM was using between 160–200GB of EBS. CPU usage was hovering at around 15%, and RAM was barely a blip, but the quantity of disk was getting a more than a little out of hand. Carrol scribbled a few notes on a post-it, and went down the hall to visit Merna’s cube. Merna was one of the engineers responsible for developing the application. “Hey, Merna, question for you: how big is our application code and deployable artifacts?”

“Oh, depends on which instance you’re talking about, but the biggest weighs in at about a gig,” Merna said. “But we have some additional stuff installed on our VM image, so the VM image itself is about 4GB.”

“And what does-” Carrol paused to check his note- “the WRPT–073 instance do?”

“Oh, that’s just a simple webserver. Just generates some reports. Barely operates at capacity on even a Micro instance.”

“So… why is the disk sized for 200GB?”

Merna looked at Carrol like he had just asked the dumbest possible question. “Logs, obviously,” she said.

“… you have 196ish gigs of logs?”

Merna nodded. “We might need them.”

“AWS has a log aggregator that doesn’t store the logs on EBS. You could just ship them there and use logrotate to trim your logs, and that would be way cheaper.”

Merna shook her head. “You say that, but- oh, hold on.” Merna’s email bleeped at her: instance WRPT–073 was getting close to its disk capacity threshold. She quickly pulled up the AWS console and added another 10GB to the disk, before turning back to Carrol. “A lot of those accessory services have highly variable costs, and it makes it hard to predict your spend. Using cloud VMs is a much more consistent option. But if you feel so strongly about it, you could submit a request and we’ll evaluate it for a future release.”

Carrol submitted a request, and also pinged his new boss. “I think I know a way we can manage costs.” For now, Merna and the other engineers just expand disks when they fill up. It remains to be seen if anything actually changes, but regardless, Carrol is prepared for an “interesting” time at IniTech.

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

CodeSOD: Legacy Documentation

By Remy Porter

Vernice inherited a legacy web app. By "legacy" in this case, we mean "lots of jQuery." jQuery everywhere. Nested callbacks of HTTP requests, no separation of concerns at all, just an entire blob of spaghetti code that was left out on the counter and is now stuck together as a big blob of sauceless starch. And as for documentation? There isn't any. No technical documentation. No comments. The code didn't even pretend to be self-documenting.

For the past few months, Vernice has been tasked with adding features. This generally meant that she'd find the code she thought was responsible for that section of the app, change something, see nothing happen, realize she was looking at the wrong module, try that three more times, finally find the actual code that governed that behavior, but as it turns out it had downstream dependents which broke.

Adding a single textbox to a form was a week long process.

So imagine Vernice's joy, when she opened a file and saw neat, cleanly formatted code, a compact function, and her text editor showed her the telltale color of comments. There were comments! Had she finally found the "good" part of the application?

Then she read the code.

<script> $(function() { $('.notification-exp').bind('click', function() { var confirmation = confirm( 'Confirm expiration?' ); // confirm if(confirmation) return true; // don't confirm else return false; }); }); </script>

Finding this, after all of her struggles, Vernice writes: "I found this small snippet of self-documenting yet excessively documented code, I had strong feelings about this oasis and had to submit it."

[Advertisement] Ensure your software is built only once and then deployed consistently across environments, by packaging your applications and components. Learn how today!

Error'd: A Taste of Nil

By Mark Bowytz

"This nil looks pretty tasty, but I think I’m allergic to it since I always feel sick when I see it in my debugger," Kevin T. writes.


"Well, better to see this on the display than the airplane, I suppose," writes Mark M.


Bartosz wrote, "I knew Bill Gates is a visionary, but I'd have never imagined that he came up with Single Sign-On to his products so many years before I was born!"


"Allstate's got some attractive rates on Undefined insurance," Ted C. wrote.


Philipp L. writes, "If Bangkok's MRT is planning an upgrade, I wonder whether they consider skipping Windows XP and going straight to Vista."


Michael R. wrote, "In a world where two digit identifiers aren't always a fit, McDonalds is stepping up its game."


[Advertisement] Ensure your software is built only once and then deployed consistently across environments, by packaging your applications and components. Learn how today!

CodeSOD: The Powerful Parent

By Remy Porter

As we’ve explored recently, developers will often latch onto something they pick up in one language and carry it forward with them into others. Kerry still is working with the co-worker who has… odd ideas about how things should work. At is turns out, this developer is also a Highly Paid Consultant, which we just discussed yesterday.

The latest problem Kerry found was in a display grid. It lists off a bunch of information linked to the user’s account, and each entry on the grid has a little plus sign on it to display further details. What, exactly, appears on that grid is tied to your account. It’s also worth noting that this service has a concept of corporate accounts- a “parent” account can administer entries for all their child accounts.

When someone clicks that little plus sign, we need to fetch additional details, regardless of whether or not they’re a corporate parent account or not. So how exactly does the C# controller do this?

           long? acctId = null
            // if the user is a corporate dealer fetch claims without using an account Id
            if (User.IsInRole("Parent_User") ||
                acctId= null;
                acctId= fetchAcctId();
            Model model = _service.fetchDetails(itemId, acctId);

The first thing that’s worth noting is that we already have the account ID value- we needed it to display the grid. So now we’re fetching it again… unless you’re one of the parent user roles, which we make null. It was already null on the first line, but we make it null again, just for “clarity”. The comment tells us that this is intentional, though it doesn’t give us any sense as to why. Well, why do we do that? What does that fetchDetails method actually do?

        public DetailViewModel fetchDetails(long itemId, int? acctID)

            DetailViewModel results = new DetailViewModel();

                using (var ctx = new DBContext())
                    DetailViewInternal detailData = ctx.DetailViewInternals.SingleOrDefault(
                      x => x.itemID == itemId && (x.FacilityID == acctID || acctID == null)
                    results.CustomerFirstName = detailData.FirstName;
                    results.CustomerLastName = detailData.LastName;
                    ...snip out a lot of copying of info...
            catch (Exception ex)
                _log.Debug($"Error getting detail.. exception {ex.Message}");
            return results;

The key logic is the lambda that we use to filter: x => x.itemID == itemId && (x.FacilityID == acctID || acctID == null)

For “normal” users, their acctID must match the FacilityID of the data they’re trying to see. For “parent” users, it doesn’t, so we pass a null to represent that. We could, of course, pass a flag, which would make sense, but that’s clearly not what we’re doing here. Worse, this code is actually wrong.

Specifically, a “parent” account has a specific list of children- they actually have a set of acctIDs that are valid for them. With this approach, a maliciously crafted request could actually pass an itemID for a different company’s data (by guessing ID values, perhaps?) and fetch that data. The “parent” privileges give them permission to see anything if they’re clever.

What makes this worse is that the grid code already does this. Instead of reusing code, we reimplement the authorization logic incorrectly.

With that in mind, it’s barely worth pointing out that there’s no null check on the query result, so the results.CustomerFirstName = detailData.FirstName line can throw an exception, and our exception just gets logged in debug mode, without any of the stack trace information. I’m pointing it out anyway, because there’s not many things more annoying than a useless log message. This also means that the exception is swallowed, which means there’s no way for the UI to present any sort of error- it just displays an empty details box if there are any errors. Enjoy puzzling over that one, end users!

[Advertisement] ProGet can centralize your organization's software applications and components to provide uniform access to developers and servers. Check it out!

Hop Scotch

By Remy Porter

IniTech’s fashion division, IniGarment, launched their new accounting solution by hiring “best in class” highly-paid-consultants (HPCs). The system launched, collapsed under the weight of the first week of use, hardware was thrown at the problem in an absolute crisis panic, and the end result was that they had a perfectly serviceable accounting package that was overbudget and supported by expensive HPCs.

It wasn’t sustainable. So out the HPCs went, and in came a pile of salaried employees. Jeff was one of those. His first six weeks at IniGarment were spent trying to understand the nest of stored procedures, quick hacks, and ugly choices. One of the first puzzles Jeff decided to look into was an invoice uploading step.

They used a turn-key eCommerce package to handle sales, and the accounting system needed to generate invoices and upload them to the eCommerce package. This relatively simple task took 30 minutes to generate and upload a single invoice, and that was on a good day. On bad days, it could take nearly an hour. So Jeff set out to figure out why.

In the middle of a 700+ line stored procedure, Jeff found the query which generated the report. The whole process required big piles of temporary tables (which, instead of being true temp tables, were created/dropped with each execution), and ugly group-bys and subqueries. Still, even with all that, it was just a SQL query, right?

INSERT INTO ApiInvoiceItemReports
	NULL AS BrandCode,
	dbo.TRIM(T.invno) AS InvoiceNumber,
	MIN(T.[lineno]) AS InvoiceLineNumber,
	dbo.TRIM(I.OrderNumber) AS OrderNumber,
	dbo.TRIM(LEFT(T.ItemNo, 12)) AS ProductNumber,
	MAX(dbo.TRIM(S.Title)) AS ProductName,
	MAX(dbo.TRIM(T.season)) AS SeasonCode,
	MAX(dbo.TRIM(T.season)) AS SeasonDescription,
	MAX(compno) AS DivisionCode,
	MAX(compno) AS DivisionDescription,
		CASE WHEN charindex('-',dbo.trim(T.ItemNo)) > 0 THEN charindex('-',dbo.trim(T.ItemNo))-13 ELSE 3 END
	) AS ColorCode,
	MAX(ISNULL(dbo.TRIM(C.descrip), '')) AS ColorDescription,
	MAX(dbo.TRIM(Gender.GenderCode)) AS GenderCode,
	MAX(dbo.TRIM(Gender.GenderCode)) AS GenderDescription,
	NULL AS DimensionCode,
	MAX(sizrange) AS SizeScaleCode,
	MAX(dbo.TRIM(Category.CategoryCode)) AS ProductCategoryCode,
	MAX(dbo.TRIM(Category.CategoryCode)) AS ProductCategoryDescription,
	SUM(qtyord) AS InvoicedQuantity,
	MAX(unitpr) AS ProductInvoicedPrice,
	'S' AS StatusCode,
	1 AS ObjectState
FROM Arytrans T
INNER JOIN #InvoiceReportsData I ON I.InvoiceNumber = T.invno
INNER JOIN aastock S ON S.ItemNo = T.ItemNo
LEFT JOIN aacolor C ON C.code = substring(dbo.trim(T.ItemNo), 13, 5)
	(SELECT ItemNo, Code AS GenderCode, NULL AS CategoryCode FROM rsoption WHERE [Key] = 'GENDER') AS Gender
	(SELECT ItemNo, NULL AS GenderCode, Code AS CategoryCode FROM rsoption WHERE [Key] = 'PRODUCTCATEGORY') AS Category
	ON Gender.ItemNo = Category.ItemNo
	Gender.ItemNo = T.ITEMNO OR Category.ItemNo = T.ITEMNO
WHERE T.compno = 9
	AND T.ItemNo IS NOT NULL AND T.ItemNo <> ''
	AND T.Custstyle IS NOT NULL AND T.custstyle <> ''
	AND T.WebOrderid IS NOT NULL AND T.WebOrderid <> ''
	AND T.WebStyle IS NOT NULL AND T.WebStyle <> ''
	T.invno, I.OrderNumber, T.itemno

Now, it’s not terribly surprising that this query didn’t perform well, but Jeff was surprised where the performance bottleneck was. Specifically, it was this inner join: INNER JOIN aastock S ON S.ItemNo = T.ItemNo, and the related field access: MAX(dbo.TRIM(S.Title)) AS ProductName.

Looking at the execution plan, Jeff discovered that the combination of the group-bys, and the MAX access meant that this was triggering a full tablescan of aastock for each result row. That was certainly going to hurt performance, but aastock wasn’t that large a table- 165,000 rows- so that didn’t quite explain what was going on.

But aastock wasn’t actually a table. It was a view. Defined as:

    CREATE view [LOCALSQL].VENDOR.[dbo].[aastock] as
    select *
    from [REMOTESQL].ERP.[dbo].aastock

This was getting close to explaining the massive performance hit. aastock was a view to a table in a remote database. So each one of those full table scans needed a network hop. But wait, how was the remote table defined? Turns out, it’s a view as well:

    create view [REMOTESQL].ERP.[dbo].[AASTOCK] as 
    select * from [REMOTESQL].ERP.[dbo].[syn_AASTOCK];

But wait, what’s syn_AASTOCK? That sounds like a synonym. What does it point at?

    FOR [ERP_stage1].[dbo].[AASTOCK]

… it’s a reference to yet another remote server, their ERP system. As it turns out, the HPCs couldn’t figure out how to avoid deadlocks with their mirrored replication, so their “fix” was to create synonyms which point to an ERP replica, and then swap which replica the synonym pointed at depending on the hour, cycling through ERP_stage1, ERP_stage2, ERP_replA, etc.

The result is that this query did a full tablescan for each row which included two network hops. No one knew that it was doing this, and it certainly wasn’t documented anywhere. Once Jeff understood the path, he could refactor the entire stored procedure to clean up the access path using common table expressions and a cross apply to restrict the way functions got applied. With that, the query went from many minutes of execution to a handful of seconds.

Jeff briefly contemplated looking into the issues with deadlocks in replication, but decided that wasn’t the next problem to solve when there were other queries that could be tweaked to increase performance without opening that box of horrors.

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

CodeSOD: Install Your Package

By Remy Porter

I use Python a lot at work, and if you're doing anything vaguely data oriented, you want to use NumPy. I gave a talk about how much I love NumPy. It's one of the things that I automatically include in every requriements.txt because it's so goddamn useful.

Lanny supports a product which uses NumPy, which is why he was surprised to find this block:

#################### Import Section of the code ############################# try: import numpy as np except Exception as e: print(e,"\nPlease Install the package") #################### Import Section ends here ################################

Now, Python is perfectly happy to let you put code inline in modules. This allows for useful idioms- like, for example, I often do import blocks like this in the entry point script of a product:

if mode == "debugging": from debugging_main import main elif mode == "server": from server_main import main elif mode == "client": from client_main import main main()

It's a powerful tool that lets me deploy the same core product in different modes depending on how I'm using it. It's also useful when you don't know exactly which version of a dependency should be used- some Python packages have binary versions, but those are platform specific, so you may have some pure Python wrapper that implements a matching API.

So, for example, you might do:

try: import some_binary_dependency as my_lib except: import some_python_wrapper as my_lib

This practice lets us fail gracefully: when the exceptional situation happens, we fail into a state where the program can continue, perhaps with some limitations. Which is not what happens in the example Lanny found. Here, the program warns you that you should have NumPy installed- well, no, it tells you to "Please Install the package", and isn't terribly specific about which one- and then crashes out when it tries to use the package. This is one of the odder cases of "just swallow the exception and keep going". As Lanny points out, "NumPy is used in nearly every line of the following code, so it's not like this is getting partial functionality."

Frankly, though, that's not even TRWTF to me. By convention, all Python imports go at the top of the script. At a glance, it lets you see what is imported. You don't need those comments to mark out the section. Those comments are just visual noise, they're not making the code any clearer.

And also, if you're the sort that cares about such things, they're not the same length. It's like a painting hung not quite straight on the wall. Everything just feels lopsided and wrong.

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

Representative Line: Without Directions

By Remy Porter

Adam S sends us a representative line which represents a mystery. It's a simple enough Java statement:

private static final Integer[] DIRECTIONS = { 0, 1, 2, 3, 5, 6, 7, 8 };

There is no documentation, no commentary, no explanation of what, exactly, this is supposed to represent. Why did the developer choose to use Integer and not the int primitive type? Why is this just a sequence of numbers in order? Why is 4 missing from the sequence?

The only clue we have is to look at how this particular constant is used, but that is, sadly, no extra help: ``DIRECTIONS.length```. It leaves us with another question: why not just have a constant integer value?

The fact that there are eight entries is tantalizingly reasonable: North, North-East, East, etc. Except we include 0 and 8, but exclude 4, which doesn't make sense. Did the original developer want to suggest that there should be 8 possible directions, and didn't understand how counting works? Then they just deleted one number to make the numbers add up? Why 4 though? Was their fourth birthday a profound disappointment? Do they just consider 4 unlucky? It is the only number in the list which is the square of a prime, so maybe there's a deep numerological significance to their choice?

In the end, we must simply admit: we have no idea what this developer was doing. We are in good company, though, for it seems likely that this developer also had no idea what they were doing.

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

Return to the Vaucluse, 2019

By Jon North ([email protected])

One of our first ports of call when we began regular visits to France over 25 years ago was to the southern Rhône valley, the south of the Drôme département (south that is, of our old twin town, Die).  This September we were back in the Vaucluse for a short overnight stay on my birthday.  The photo above is from the road approaching the Domaine de Coyeux, high above Beaumes de Venise, with Mont Ventoux in the distance.  Try as I might I could not convey the height and scale of this well-known obstacle in many Tours de France, but it is often there in views of the area.

When we first visited in the mid-1990s the only way to approach Coyeux was via an unmade road, snaking across the top of the Dentelles de Montmirail, itself already a worrying distance from civilisation.  We've visited the Domaine de Durban, on the road towards Coyeux, quite often over the years, but now that track is closed and the road to Coyeux snakes up the hillside like a Tour de France special, until you arrive on the high plateau with the lace-like rocks that give the Dentelles their name, at closer quarters.

On the way to the Domaine de Coyeux
When we first came in the 90s, Beaumes de Venise was well-known for its sweet muscat wines, as it still is, but in the past 20 years sweet wines have become less popular and the reds from this village have become increasingly good and, compared with the neighbouring Gigondas or Vacqueyras, let along Châteauneuf du Pape, very good value.  Coyeux is noted this year in the Guide Hachette for an excellent red, Praestans, which fulfilled our expectations when we tasted it.  We also fell for dry white and rosé wines from Muscat grapes - a very worthwhile visit with views to match.


All the white and rosé wines we tried at Coyeux were made from muscat petit grains grapes, the same as are used to make the fortified Muscat de Beaumes de Venise.  When we firt came, dry wines were only made when the harvest was plentiful enough.  Now, dry white wines are increasingly normal, and I was surprised to discover rosé made from the same grape (this is not really surprising - the skins are reddish though the juice is 'white', so leaving ths skins in contact with the juice for a short time makes a nice pale rosé).  Mary is always pleased to find dry muscat, and the Coyeux rosé and white were both excellent.  We also have more and more dry muscat around us in Lunel, and one of our best winemakers tells us he decreases the sugar content of even his sweet wines year by year as people's tastes change.

As we often do when travelling in France, we chose to stay in a Logis de France hotel - almost always with good restaurants attached.  This one in Sablet, the Domaine de Cabasse, lived up to the usual good standards and is as its name suggests also attached to a wine domaine.  However, with so many good wines around we didn't buy here this time - just drank some of their good red with our meal.  The pool was also a welcome attraction in the afternoon heat.

The hotel is among the vines midway between the small sleepy villages of Sablet and Séguret.  
As you emerge onto the little road, across the fields you can see two huge buildings typical of the caves coopératives you come across right across the south of France, but if possible even bigger.  This I guessed, rightly, was the Gravillas Coop which we were aiming for after our night in the hotel.  It has a good reputation, and a Rosé in particular which got outstanding marks in the latest Guide Hachette.  The previous afternoon we'd stopped in another small sleepy village, Violès, on the plain between the Rhône and the Dentelles.  There we visited a charming family-run domaine, the Bastide Saint Vincent, another Hachette recommendation, whose red Florentin is a splendid example of the newish 'Plan de Dieu' (plain of God, I guess) Côtes du Rhône Villages appellation.

 The story of our link to Violès also goes right back to our twinning visits 25 years ago.  At that time our local organic shop in Derbyshire had branched out into wines, and had a nice red Côtes du Rhône and we decided to see if we could find the producer.  At that time Violès was even more of a backwater than it is now - small, dusty and not really used to tourists, but we found the winemaker, bought some wine and had a meal in the little restaurant at the village crossroads.  The raising of quality and acquisition of the plan de Dieu tag has brought new fortune to Violès, which now has more commerce, several well-set-up winemakers and a beautiful new public library among other things.  All very enouraging

To finish here are a few photos of the area, taken on the top of the Dentelles but a little further south and west around the Domaine de Durban, with some better views of Mont Ventoux too

Our dog Camel

By [email protected] (Jon North)

Over 250 years the English poet Christopher Smart wrote the poem For I will consider my cat Jeffrey.  Now we think constantly 'for we will consider our dog Camel', the new friend at 74 rue de la Brechette following Evie's sad death last autumn.  Her replacement is several times her size!!

Last week we went to Figeac, 3-4 hours' drive west of Lunel, to collect our new companion, a 10-year-old male dog called Camel.  He had lived for 4 years in the refuge in the remote hilltop locality Nayrac a couple of km outside Figeac on the river Lot.  The refuge is operated (since the late 80s) by  MASAQ, the Mouvement Associatif pour la Sauvegarde des Animaux du Quercy, a very caring and committed group which seems to be struggling to cope with demand - the 100+ dogs have to be housed, fed and walked by volunteers and they are completely full up on the cat side, and the refuge has shelter and some limited facilities, but little warmth or protection for the many animals in the woodland setting surrounded by rubbish processing plants at the end of a long winding dead end road.

Camel is a placid, friendly animal, underweight and in need of more walks and more food, carefully controlled to allow for his rather shrunken stomach, and now just starting to get used to our warm dry house!  He was chipped and checked by their vet before we could collect him and sign the adoption papers, and given a thorough check by our own vet the day after he arrived.  But if he seems bemused to find himself in our home it isn't surprising - he'll still be getting used to being warm.

Figeac itself is a really nice little town with a really lovely medieval centre which we explored despite the annoying closure of the Tourist Office for staff training!  But going to the Mairie instead to get a town plan was a bonus, because the young woman at the desk turned out to be a volunteer at the refuge and of course knew one of their longest-staying residents!  She and we were very glad to say hello before we went to find him.

Here is an album of photos of Camel in his first few days with us.

Road trip

By [email protected] (Jon North)

Interrupting my enjoyable accounts of meetings with family and friends in England, a trawl around out 3500 km plus round trip to England from the S of France.

We decided to drive because we thought of taking French wine to our family.  In the process we kept some Burgundy for ourselves from our favourite Jacob vineyards - crémant, Chambolle Musigny and some white Hautes Côtes de Beaune matured in Acacia barrels which is less easily available so we were lucky to find it!  Sadly, on our return through France we could not find a chance to revisit Echevronne but we'll be back, no doubt.

Perhaps the highlights of the route and the roads we travelled were or will be the Millau viaduct which will more or less welcome us back into the Languedoc when we return home down the A75 tomorrow, and the quiet journey from north of London up the A5 towards Staffordshire as we started our visit in December.  the Narrow Boat pub on the Grand Union Canal has been an enjoyable stopping place over the years.  We returned south on the A5 but sadly the pub was not yet open for coffee as we passed.

But the most surprising pleasure is the moment on the M25 near Rickmansworth when it passes neatly under the Chalfont Viaduct - as the Atlasobscura website relates "Those impressive Edwardians thoughtfully left enough room between the arches of this grand 1906 railway viaduct for an eight-lane motorway to pass through".  I can't help thinking the motorway designers had to back off a considerable distance to line up the M25 through those excellent brick arches.

Our almost daily journeys from near Burton to Wirksworth, between the houses of our sons, gave us time to refine our route - the picturesque but windy one via Ashbourne was rapidly replaced by the smoother but still enjoyable route via the A38 and A50, quicker and less demanding!

We have learnt to pace ourselves, shorter stages with hotel stops, but still on these short winter days the end of each day is a challenge as streams of headlights approach us in the gathering darkenss as we attempt to decipher the directions to the next hotel.  And even welcome sunshine in France today presented problems as we negotiated ring roads and roundabouts.  But we enjoyed the sights we could spare time to see - Chartres cathedral against the skyline, and a sliver of crescent moon as we drove towards Orléans.

The car ferry is a gentle respite on the route, and the Channel Tunnel is so quickly over in a car that you scarcely remember it before you are on the road again.  But on short winter days perhaps the tunnel is a better bet, leaving more daylight hours to drive safely in.  Changing sides of the road no longer presents too many challenges - I always feel that the signage and road markings are clues enought to which side of the Channel and of the road you are currently on.  And we saw no gilets jaunes at all on the way up,though several stood by their roadside fires and did not bother us as we passed Dieppe, Evreux and Dreux on the way down.

An anniversary and other Christmas moments

By [email protected] (Jon North)

Our 40th wedding anniversary was in October, but since we could not meet the family then we arranged a meal together just after Christmas.  It was lovely to have all our sons and their families with us for an evening of Italian treats in Oakerthorpe, where the Peacock pub has been rebranded Pesto at the Peacock!

We shared our time over the festive period between the homes of Jeff & Fi and Sam and family, enjoying several exchanges of presents, walking around the Staffordshire countryside and taking occasional trips to shops in Burton and Ashbourne, as well as catching up on tv and sleep!

Jeff & Fi's cottage across the fields

Some Christmas moments at Marebrook

By [email protected] (Jon North)

More photos from our stay at Jeff & Fi's

Waiting for Christmas in Staffs and Derbys

By [email protected] (Jon North)

Our days leading up to Christmas this year have been spent with the usual mix of shopping, wrapping, watching telly and spending time with our family.  This is a little photo diary of our first few days in rural Staffordshire.



Christmas trip part 2 - to the Midlands

By [email protected] (Jon North)

NB photos of Staffs taken on an earlier winter visit
 I'm writing in the early morning of Saturday 22 Dec in a cosy cottage near Burton-on-Trent, home our son and daughter-in-law Jeff & Fi, and our temporary resting place in England.  We've driven nearly 1500 km to get here with amazingly little difficulty - not only avoiding hold-ups in France but making the journey from Kent to London and then on to Staffs smoothly on quiet roads.  All the more amazing on the brink of a holiday weekend when all reports are of heavy traffic and jams.  They all seem to have happened after we passed!

Our short stay in London with old friends Ruth & Claus was comfortable and warm in every sense.  We had a chance to wander in Highgate village and introduced two sets of friends from different parts of our lives over lunch - if there was a common thread beyond a general enjoyment of culture it was the appreciation of good wine: we'd brought with us wine Gaynor & Ed had bought in Bordeaux during our summer visit there together, and we enjoyed both good Bordeaux red and delicious Chablis with lunch.  I keep straying in this blog into the territory of the wine one!

Highgate scenes

So we set our yesterday from London, aiming for the A5.  This lust be one of the least diverted of the old Roman Roads in the country, once you get onto it north of St Albans.  Of course it has new bits like the Milton Keynes bypass that Romans would have found it hard to imagine (even without the concrete cows) but mostly it passes through delightful undulating rural landscapes all the way to Leicestershire where we turned off towards Burton.  On the way up we stopped for some lunch at a really good raodside pub, the Narrow Boat at Weedon (now we discovered with Motel-like rooms fringing the car park).  We visited this quite often on our trips to and from Derbyshire some years ago.  The grounds are right next to the Grand Union Canal and it's altogether a good place to visit.  We arrived at Jeff & Fi's at 3 pm and enjoyed a cosy evening with a blazing stove, good wine(!) including some excellent Aldi organic prosecco we'd discovered on our last visit and some beautiful pinot noir we'd brought from the Limoux vineyard of Jean-Louis Denois.  A good start to our holiday.

Christmas in England - arrival

By [email protected] (Jon North)

With the uncertainties of Brexit on the horizon, this seems like a more than usually important time to visit our family in England, and we are really looking forward to being with Jeff & Fi, Sam, Sas, Heather and Ben and also seeing Ed, Isla and Karen for a while.  Lots to look forward as I sit in our Folkestone hotel which was a nightmare to find in the wet and dark, but it all felt better after a drink in the bar!

The past two days started early, very early, as we drove up a dark and almost deserted A9 from Lunel to our overnight stop in Burgundy, not quite knowing if the gilets jaunes would add to the uncertainty of Brexit.  Weekend reports were not encouraging - we read of fires on and by motorways and toll booths, a whole section of the A7 from Avignon to Valence closed, numerous entrances and exits closed as our own local ones had been on and off for the past few weeks.  We started out full of anxiety, just hoping that after the weekend the demonstrators would all heed to colder damper weather and go home.  

All sorts of thoughts have crowded in on us as we've driven 1,000+ km up France.  We drove without seeing a single gilet jaune. Tant mieux, and of course there are fewer in the north than in the south, fewer in midweek than at weekends, fewer now than there were 2 months ago. But we were reminded that until recently a frequent electronic message on motorways here used to be 'respect the men in yellow’, and today it says something like ‘agents anticipés’. Does not trip off the tongue as the other used to, but no danger of mistaking workmen for protestors, at least in the wording of messages!  

One final thought about these demonstrations - we read in a local paper in Burgundy that local groups of gilets jaunes are hoping to form associations so that they can be eligible for grants from public authorities!!  So people who began by demonstrating against too high taxes are now hoping some taxation will be spent on their groups.  In fact, merssages are mixed - some want lower taxes; others want to preserve services which are being cut.  On top of that, some have destroyed lots of things, motorway toll booths and sometimes the roads themselves with fire.  Vinci (one of the motorway companies) reckons they will need to spend millions repairing things.  Not easy to square with keeping up tax-funded services.  But enough, we don't understand everything and no doubt there are important causes to be fought.  The rest of this will be, more pleasantly, concerned with our doings.

Our first port of call in Burgundy was our friends Jean-Michel and Christine Jacob, whose wine will accompany us to England and (some of it) back home.  It's always a pleasure to see them again, but their story really belongs in my wine blog where I've often written of them (here for example), so suffice it to say that we were warmly received and delighted with the wines we found and could take away, as we hope our family and friends will be!  We had a good simple lunch in Beaune, a pleasure to revisit this lovely town, and then sought our our hotel.

lunch in Beaune - Mary appears twice thanks to the mirror next to our table!
The hill of Corton from our hotel terrace
We'd chosen a Logis hotel in Ladoix Serrigny, on the south-eastern flank of the famed Hill of Corton (origin of grand crû wines which we did not seek out this time, both red and, unusually north of Beaune, white (Corton Charemagne).  It was a simple but comfy overnight stop and we set out at leisure for the north today.  The roads were quiet, the weather mostly dry and often bright, and the middle stretch in particular as we approached Troyes across the Fôret d'Orient was full of the amazing variations of colour and texture of winter scenery, branches, fields and hedgerows.  The last stretch past Reims and on up to the coast is long and less interesting to look at, but we made the Tunnel hours ahead of the time we'd planned and so crossed into wet Kent and our first night on English soil, looking forward to seeing people as we travel north tomorrow and after.

September wine fairs

By Jon North ([email protected])

The French 'rentrée' is also the start of an interesting period for wine enthusiasts - the season of wine fairs in supermarkets.  In all, these span nearly 6 weeks, and these days the wines are not only good value but also carefully selected.  As with medal competitions, you always have to bear in mind that makers who already have a good market for their wines need not participate, but with the aid of review articles you can usually buy good wines at good prices.  Since the best bargains are usually snapped up early, the secret is to arrive at the supermarket at opening time on day 1. 

I did this several times in September, partly for our wine tasting circle here in Lunel and partly to find wines as presents.  The wines I bought are listed below, but first a few notes on the different places I visited and on some of my choices.  I was aided by the comprehensive article in the Revue in August, which highlighted a dozen or so top picks from each chain.

The earliest wine fairs are in the cut-price supermarkets - Lidl, Aldi, Netto and Leader Price.  One could add BioCoop but their wine fair sas so chaotic that they could not even agree on a start date, so lost out as I arrived early on the first day of each.  That’s what you have to do to snap up the best bargains.  Lidl is the most impressive, with three aisles dedicated to a huge range of French and a few foreign wines.  As you can see, I found plenty of choice even without the usual array of Bordeaux reds.  Rhône reds and a nice Touraine white were my picks here.

For the rest, the budget stores ranged from the chaotic Netto (lucky to find any of the wines listed beforehand) to the interesting but slightly disorganised Leader Price and the very nicely organised Aldi, whose range I’ll explore more next year.  Although the major supermarkets’ fairs start later in September, or into October, I managed to find one of my star buys in Intermarché and (as I have done often in previous years) some good buys in Leclerc.

Two personal stories link to my wine fair visits this year.  The first is a red from the flat lands between Orange and the Dentelles de Montmirail in the southern Rhône, from the village of Violès.  When we first discovered this it followed a purchase from the organic shop Beanos in Matlock Bath, which we used a lot during our time in Derbyshire.  At that time Violès was on the bottome rung of the Côtes du Rhône, a sleepy village en route to more celebrated places like Vacqueyras, Gigondas and Beaumes de Venise.  Since then the village has acquired Côtes du Rhône Villages status itself, and the Tour des Abbesses we found in Inter was one of the best reds we’ve come across recently for  everyday drinking.  I seek it out when I visit Intermarché stores in the Cevennes, but I doubt it will be sin stock for much longer.

Second, one of the highlights of my visit to Aldi was the Bonnezeaux from a well-known producer, Château de Fesles.  The sweet chenin blanc wines from this area (the Layon valley south of Angers) are exceptional and long-lasting, one of the few white appellations outside exalted Burgundies to keep more than a few years.  But is is for this very reason that makers divest themselves of wines 15 years old or more.  We first discovered this in the 1990s when we bought 1979 Bonnezeaux from the very same producer from 3D wines, who introduced us to some of our favourite makers elsewhere.  Because these wines last so long, makers hold onto stocks but in the end have to sell them to make room in their cellars, and we profit.  This Bonnezeaux was not a great wine, but a delicious wine to drink now all the same, and it will keep a few years yet.

By the way, a late purchase not on my list below is a Savennières, another Anjou wine but this time dry but equally longlasting.  Sadly the bottle we bought from Leclerc will not be tested for longevity because we finished it between us at lunchtime today, but there is another lurking and I’ll be getting back to Leclerc in the vain hope that there may still be some left - utterly delicious.

Here is my list of purchases, 7 whites first, the rest red.

Saint Véran Louis Dailly 2017 Leader Price 8.04 €
Macon Villages Cave d'Azé 2017 Netto 4.99 €
Touraine Sauvignon Caves Gilles Gobin 2017 Lidl 3.99 €
Menetou Salon Patient Cottat 2017 Intermarché 9.95 €
Sancerre Les Fossiles, dom Roblin 2017 Intermarché 13.75 €
Alsace Riesling Rittimann Celliers de Romarin 2016 Aldi 5.99 €
Bonnezeaux Château de Fesles (50 cl) 2001 Aldi 13.99 €
CdR Villages Dom de Tavans 2017 Leader Price 5.87 €
Cahors Malbec du Clos 2015 Leader Price 5.33 €
J L Baldès
Saint Joseph Dom de Blacieux 2017 Lidl 9.99 €
Vacqueyras Terroir des Dentelles 2016 Lidl 6.99 €
SCA Rhonéa, Beaumes de Venise
Juliénas Collin-Bourisset 2017 Lidl 5.99 €
Vinsobres Dom Croze-Brunet 2016 Lidl 5.49 €
Côtes du Rhône Vill. Dom la Tour des Abbesses, Plan de Dieu 2017 Intermarché 4.49 €
Gaillac Gd réserve de Labastide de Lévis 2016 Aldi 3.99 €

Visiting the Val du Séran

By Jon North ([email protected])

We come to the Ain almost every year to play and sing music at Val du Séran, a huge converted farm building in the lovely countryside between the Bugey area and the upper Rhône.  It's quite isolated, surrounded by green hills with some of the cows that produce milk for Comté cheese, and with more distant views of the pre-Alpine mountains.  But apart from the stimulating guidance of our host Stéphane and the marvellous cooking of his wife Chantal, we always enjoy the wines they choose to accompany our evening meals, usually showing a sure touch  in matching food and wine.

This year, for example we've had a Bordeaux Clairet accompanying tarragon chicken.  We came across this on our trip to Bordeaux earlier this year - a light-coloured red wine (like a dark rosé) usually made from merlot grapes.  Then, a Californian cabernet sauvignon full of sweet vanilla fruit in a style which is definitely not French, a really good match with a scented but mild beef curry; a smooth Fitou (from the area south of Narbonne, not far from us) with a veal and ginger dish; a beautiful red Côte du Rhône  with barbecued rissoles made from a Croatian recipe; and a Fleurie (one of the Beaujolais crûs, usually regarded as relatively light and floral) with a pork mignon served with a haricot purée.  A couple more nights of this before we return to our own less diverse choices at home.

When we come to this area, we also enjoy the local wines, particularly the white Roussette de Savoie and Seyssel, made from local grape varieties Altesse and Molette.  These are lively flavourful wines which work well as apéritifs, as Mary proves most evenings after a full day of cello playing.  AT Stéphane's recommendation we visit the maker Bernard Aimé in the village of Corbonod near the town of Seyssel itelf and close to the river Rhône which is very picturesque in this area.

We have good lunches here of salads, cheese and fruit, but (unlike our home habit) no alcohol at lunchtime so that the music is not marred by sleepiness or lack of attention!  But the evenings are a time to relax and feast, as you can see!

Living with pain

By [email protected] (Jon North)

The past year for me has seen a slow ratcheting up of pain from sciatica.  Before that I would not have believed its all-consuming force.  Even so, I am well aware that I am lucky not to have worse, and the exercise of trying to stay positive is both constructive and interesting.  When we arrived in France Mary spent months with severe tendinitis in a shoulder which she would otherwise have used to bow her cello - upsetting and frustrating but ultimately thank goodness cured.  Since then we have both had joint pain, and sod's law says that at our age this is usually in a place linked to your most creative and important activity.

Treating pain is a complex obstacle course full of blind alleys and treatments which have worked for other people, enthusiastically advocated, but they seem to have no effect when you try them yourself.  Ultimately painkillers are OK, but they kill more than the pain you are trying to treat, and if they do not upset the digestive system or attack the stomach lining they are more or less addictive.  I take them anyway, and they work at least for periods of time.  'Alternative' treatments work if you believe in them, and I tend not to which makes me a poor patient!

With the sciatica I have also been through the gamut of steroid treatments which are very good for a day or three, then just stop working, back to agonising mornings.  Surgery is something I've had with one knee replacement, with mixed results though I can walk - it is like having a posh new hinge on a door, but someone forgot to oil it properly.  Since sciatica involves eroded discs in the spine it is another level of complexity and risk altogether, and I'll go some distance to avoid it despite our appreciation of the talents of Supervet Noel Fitzpatrick.  The animals he treats are after all much less heavy than I am!

But exercise and physical treatment are another matter.  I enjoy cycling, and riding my bike around our lovely flat town or using my exercise bike at home are both constant parts of my life.  The pain goes down, and either I can read and listen to music, or enjoy passing scenery, whhile I finish a session or ride with less.

I've just got back from my latest session with a physiotherapist.  I have had several of these over the past 5 years or so, before and after knee surgery, and my expectations were low.  I'm not the only person, patient or doctor, who recognises the description of being left hitched to a machine (pulley, electrodes, whatever) for 20 minutes while your therapist attends to 2 or 3 other clients.  An hour in a treatment room with only 10 minutes' direct treatment is not uncommon.

I'm not writing to moan about bad examples of physiotherapists because this time I think I have finally found a good one.  A young man who spent 29 mins of the allotted half hour with me, pushed and pulled me both to check my limits and push them a bit, and most importantly left me with exercises I should be doing several times a day at home.  To be fair to the last man he proposed something similar, but not very well explained.  I know now what stretching I need to do and how often, and I'll do it even though my rubber mat on the floor is less convenient and comfortable than his therapy couch.

I'll see him regularly over the next 6 weeks or so.  But in the end the answer is going to be in my own hands, or legs maybe - profiting from my enjoyment of cycling outdoors and in, putting together the advice of my GP, the rheumatologist, an osteopath who tweaked my vertebrae once, and my new physiotherapist that the best treatment is going to be more exercise.  And overcoming my innate laziness to get down on the floor and do the spinal stretches every day.

Incidentally, I was puzzled about the link between the term rheumatology, all things connected with rheumatism, arthritish and pains generally in joints and muscles, and the original French/Latin root rhume meaning cold or sniffles.  Apparently ancient medicine regarded these painful conditions as linked to watery humours - who knew?  The Oxford Dictionary certainly did and does!

At the same time I remember all the time that other people (family, friends and those I meet around the place) have more serious difficulties.  I was reminded of this again this morning seeing others arriving at the physio centre as I left to ride my bike home in the sunshine.


By [email protected] (Jon North)

Well here I am again, the inconstant blogger.  I have more time to write just now, and more time to read, so this will be about reading, and specifically in praise of the Kindle.  I've nothing against other brands but I'm not the BBC so need not display impartiality and I have little experience of other electronic readers.

I am a librarian and booklover, so of course I understand and share many people's feelings that Real Books are still of value.  Some would say they are far better - Mary usually reads them, and I often do, but often I turn to my Kindle and here's why.

First of all, I read in bed.  A heavy book can be difficult to manage, and if like me you often read when your partner is asleep, a Kindle is light enough to hold in one hand and its inbuilt light is a boon.

Secondly, and I appreciate this as a librarian, you can search text.  As I get older I often lose track of the names of people and places, and find it helpful to check back to the first or a previous reference.  Who was that?  When did the place crop up or what did the person do?  On a Kindle I can check quickly back and resume reading.

Thirdly, in my frequent need to read in a foreign language (my French is improving, but slowly) if I come across a word I don't remember or have never seen before I can quickly check its meaning through the built-in dictionary.  This is a real boon, and there is a way of noting newly discovered words in a vocabulary builder which, after a while, is a good read on its own!

Fourthly I get my daily paper first thing in the morning.  Paper copies are among the most famously cluttering things in many households I have known, often piled high in garages and spare rooms when their owners cannot bear to throw them out 'in case', but they are scarcely ever re-read after a day or two.  The online papers are not there for ever but for a couple of weeks you can search, then clip and store things that interest you.

People who cling fiercely to books and never read electronic text talk of the feel and form of a real book.  I share some of this feeling, especially having worked with older out of print books, but I realise that these become fragile and should finally be conserved and consulted via scanned copies or they will be damaged beyond repair.

I don't think I shall ever stop liking having books around, but they take space and collect dust - logically a Kindle is more environmentally friendly option, and it's amazing to think that there can be scores, hundreds, of books available in one small device, more easily stored and downloaded at will.  And as travelling with heavy books is ever harder, a single device with months of good reading in it is a welcome asset.

Thinking back to our holiday in the Caucasus

By [email protected] (Jon North)

I have been wondering, thinking more or less non-stop, and dreaming as well, how to round up our extraordinary fortnight beyond the Black Sea and on the boundary between Europe and Asia.  We went knowing so little, and we have found out so much about these extraordinary small countries in the mountainous triangle between the Russian, Turkish and Iranian great powers.

We visited Armenia and Georgia, for only a week each, and could hardly have contemplated visiting Azerbaijan which is the third of the trio because its relations with Armenia are so poor.  Indeed, on a trip north and wesst around Armenia we were advised to avoid the road near the western border in case of snipers.  Since our return we have reflected as much on the shared history of the countries we visited as on the differences which struck us most forcibly during our visit.

It was only as we started to read good guidebooks (we'd especially recommend the Bradt Guide to Armenia by Deirdre Holding, and the Georgia companion by Tim Burford (Bradt also) is not bad either), and then discovered a wonderful history and contemporary survey The Caucasus: an introduction by Thomas de Waal, that we began to understand the interwoven complexities of this fascinating area.

The Genocide Memorial in Yerevan
Armenia, our first port of call and now a landlocked country of only 3+ million people, was perhaps historically the most significant, having for centuries stretched from the eastern Mediterranean through Turkey across almost the whole of the area now divided between Armenia, Georgia and Azerbaijan.  Its current identity is marked by loss - loss of territory to the Turks (who now claim the sacred Mount Ararat once the centre of the Armenian highlands from which the ethnic group originates), loss of people to the awful genocide of the early 20th century, and loss of stability in the face of war (still smouldering with Azerbaijan over the disputed territory of Nagorny Karabach) and of natural disaster in the shape of earthquakes, since the area is on a geological fault line.   One town, Spitak, the size of Lunel was almost destroyed in 1988 and most of its inhabitants killed.  The damage was still all too evident, with temporary homes in containers and railway carriages, as we travelled through the area.

Our second week in Georgia was primarily to meet again our friends Leo and Marika, whom we'd hosted in Wirksworth in the early 2000s.  We added organised tours to fill our time during the week when they had to work.  We had a quaint but comfortable hotel in the old town of Tblisi, whence we could walk around the centre and visit museums and churches, and even attend a marionette show in the charming puppet theatre (in Georgian but with English surtitles, a very entertaining folk tale that ended up with the principal characters in Paris!).
Pirosmani's Doctor on a donkey

Karen Hakobyan's instruments
Highlights of our visit included artistic visits to the beautiful small museum in Yerevan dedicated to the well-known film director Sergei Parjanov - we loved it and went back to take in more detail before leaving Armenia - and the beautiful small gallery of the artist Niko Pirosmani in Signagi.  We also met Karen Hakobyan, a maker of traditional musical instruments including the duduk, in Yerevan - a real inspiration, and I have an alto shvi, a traditional fipple flute, as a lasting memento.  The instruments are made of stained apricot wood, the traditional material.

The separate identities of the two countries were really only crystallised under Tsarist and particularly Soviet influence, one effect of which was to precipitate huge population shifts to create 3 ethnically distinct countries (it would have been diffficult if not impossible to visit Azerbaijan even if we had had time).  I read that at one time in the 19th century almost no ethnic Armenians lived in present-day Armenia, huge numbers residing in what is now Iran and many also living in Georgia (our Armenian driver Ashot, for example, was brought up in Tblisi).

But communist rule (and particularly the longs shadows of Stalin and Beria) served to sow distrust between ethnic groups which separated like oil and water.  Armenia now has a population 98% ethnically Armenian, and although Tblisi has a more cosmopolitan feel (with a mosque where Shia and Sunni worship together and Christian churches of all the various traditions), there is a feeling of bravado and of Georgian national pride as strong in its way as the Armenian one.

The distrust, and the story of the south Caucasus, revolves round ethnic and cultural minorities, not only in Nagorny Kharabakh where de facto Armenian control has left a seemingly permanent impasse between the opposed positions of Azerbaijan and Armenia that have resisted repeated international conferences all over the world and which makes any reconciliation between Armenia and Turkey even more difficult than the genocide left it, but in the north of Georgia where two autonomous regions, Abkhazia and South Ossetia,, have been set up with Russian support.  The history of these two areas is long and complicated, but it has left most Georgians with a deep distrust of Russia and a strong preference for territorial integrity.  This in turn means they support Azerbaijan in claiming back Nagorny Kharabakh which sets Georgia at odds with Armenia, although luckily the antipathy is not extgreme so you can still travel as we did from one to the other, and Armenian commerce has access to the Black sea through the southern province of Georgia where there is still a high Armenian population that has resisted ethnic cleansing.

Traditional bread-making in Garni, Armenia
Two final things for now.  First food and drink.  We had excellent food throughout, with lots of fresh fruits, vegetables and salads particularly in Armenia and some lovely soups in Georgia as well as the ubiquitous and stomach-lining khachapuri, variations on warm flat bread filled with cheese, one delicious variant of which has an egg lightly poached on top.  The Armenian wine industry is less developed than the Georgian but both use indigenous grape varieities to good effect, particulalry the red Areni (centred round a village of that name in the south) in Armenia and some good dry whites in Georgia.  But Georgia also prides itself on good sweet red and white wines made from late-picked grapes.  And then there is Armenian brandy, reputedly Churchill's favourite tipple, and the ubiquitous vodka which testifies to the strength of the Soviet influence.

Drink at the Botanic Gardens, Tblisi
Roadside food stall in Tblisi old town
Wine tasting at Château Mukhrani west of Tblisi
Second, Stalin.  An odd note to finish on, maybe, and our Georgian friends doubted if we really needed to visit the museum in Gori which he himself established.  The little town still retains his statue in hte centre, and his childhoold house is preserved under a kind of huge bus shelter.  He adopted the last Tsar's railway carriage to get around, more or less without modification.  But we were helped by a suitably irreverent English-speaking guide, himself a native of Gori.  Above all this was a reminder (in a world where Brexit and Trump remind us how near the surface divisive extremism can be) that the fragile free countries we visited are there partly as a result of Stalin who, for better or worse, permitted the development of separate states with separate identities, and partly despite the cruel bloodshed that has surrounded them throughout their history and virtually until the present.

View over Tblisi to the mountains north-west of the city
Perhaps the most powerful influences that have shaped them and allowed them to survive and develop, though, are the mountains - the High Caucasus to the north which so hampered easy Russian access to the southern countries, the mountains between Turkey and Armenia which while sacred to the latter are also a brake on easy passage, and the mountains within the countries which have allowed separatist enclaves to survive.  It also makes for lovely scenery for us tourists, even if there is a risk of the early snow we ran into twice in our fortnight.

The larger Mount Ararat with Khor Virap monastery in the foreground
Mount Ararat from the 7th century circular cathedral of Zvartnots south of Yerevan

A week in Georgia

By [email protected] (Jon North)

 I had hoped to write this sooner, but getting back home I had to catch up on life in France, so this has been the first chance I've had to publish this post about our second week away.

It was of course the original reason for our Caucasus trip - to visit the couple of Georgian friends Leo and Marika whom we had hosted while Leo was a postgraduate architecture student in Nottingham.  But they both have to work, so having spent a weekend with them we joined up with the guide Eva (also seen here) and driver Ilya for a few days' tours to places outside the capital.  The weather turned wet and cold until our last day, which spoiled a lot of views, but we still saw a lot.

Our hotel in the Old Town was comfortable and convenient for walking around the tourist centre of Tblisi, which we did often during our week's stay.  The travel agent had arranged daytime trips during the week, but over the weekend Leo drove us east to an area, Khakheti, which produces most of the country's wine.  We visited monasteries and a town wine festival, and also a gallery including works by Pirosmani, one of the country's most popular modern artists who liked his wine as you can see).



We spent the week, while Marika and Leo were at work, exploring the area west of Tblisi, including the old capital of Georgia and its cathedral, a monatery overlooking a lake and a snowy mountain pass, then later the château Mukhari, a winery of some quality.

Probably the outstanding visit of the week was to Mtskheta, the old capital of Georgia, which is just west of Tblisi at the confluence of 2 rivers.  The 6th century Jvari monastery is on a promontory overlooking the rivers, and the 11th century cathedral of Mtskheta just below.  Both were impressive - photos to finish this brief post, and more to come as I reflect on the complex, intertwined history and culture of the two countries we visited over this memorable fortnight.


A week in Armenia 14-20 October 2016

By [email protected] (Jon North)

We'd thought of visiting our friends in Georgia for a few years, and Mary finally made the arrangements this summer as we celebrate 40 years together.  She found a travel agent in Montpellier which does Asian tours including an Armenian trip with an extension into Georgia, and since the season is nearly over they offered us an individual fortnight's holiday for 2.  This week we were in Armenia, and next we'll be in Georgia whence we fly home to France.

So this is a bit about our first week.  The best story is told through photos, but although I can easily put these on Facebook from this tablet, getting them into a blog will be much easier once I'm home with my laptop.  For now, some verbal impressions.  We travelled to Yerevan via Vienna, arriving in the early hours of Friday last.  Our guide Marietta and driver Ashot met us at the airport and have accompanied daily with friendly and professional care - they usually leave us evenings to recover, but this evening they've invited us for a farewell meal before they both accompany us to the airport at 5 tomorrow morning.

We have spent most of the time based in Yerevan, a sprawling mixture of Soviet blocks, shacks, building sites and splendid modern plazas and developments, home to around a million people, with very busy roads, and few bikes or motor bikes.  Roads outside the capital, and even back roads in Yerevan, are mostly in a poor state, and Ashot has needed all his skill to keep us out of most of the potholes in his Mercedes minibus.

Marietta, who is proud of her French, is even prouder of her country and people.  In fact, many people we met were anxious to get our opinion and approval of Armenia.  We had little real knowledge of it before we came, and only found a really good guidebook (in the Bradt guides series - after our arrival, but we rapidly realised that this small nation with its quirky and unique alphabet derives its intense national pride from its history, up to the present day, of defining itself in the melting pot of the Caucasus, between the powerful political jaws of Russia and Turkey and as a Christian country under pressure from Muslim neighbours.

We have visited Christian heritage in many monasteries and saw incredible and ancient remains including countless lovely carvings, and we witnessed briefly the Sunday mass and beautiful singing at the cathedral.  We discovered local traditions - musical instruments like the doudouk, bread making - and extraordinary artists like Sergei Paradjanov.  We have been to wine and brandy tastings and learnt about local grape varieties.  And we have eaten good food, based hugely around fresh fruit and veg and salads and cooked vegetables prepared in countless ways, interesting local cheeses, creams and yoghurts, plus nice meat especially in stuffings for vine leaves.  And drunk a lot of good coffee.

We have ventured out of Yerevan to do all this on day excursions, mostly on day excursions but once on a 2-day trip via the huge lake Sevan north near the Azeri and Georgian borders, a journey plagued by rain then snow which forced us to alter our route, all of which Ashot handled well despite dropping temperatures.  On that trip we were reminded of the latest catastrophic earthquake in the north-west - Armenia lies on a tectonic fault-line.  Tragedies near the epicentre were heightened by poor Soviet-era building standards so that whole buildings collapsed killing thousands.

Such tragedies, and wars, pale into insignificance beside the 1915 genocide which has occupied our minds increasingly towards the end of our visit.  Wikipedia and the official genocide memorial website give much valuable information but nothing quite prepares you for the terrible graphic reality of the museum exhibition witnessing to the enforced death of over a million Armenians expelled from their homes and neighbourhoods.

I could go on but it will suffice to finish with our own testimony to a friendly and hospitable people despite, perhaps partly because of the tragedies and economic hardship they have suffered and despite the difficulties many still face.  We are happy to do our small part to make this place and these people better-known.

On my radar: Victoria Coren Mitchell’s cultural highlights

By Victoria Coren Mitchell

The writer and broadcaster on a brilliant children’s museum, Downton and a poem about a skunk

Victoria Coren Mitchell is an author, broadcaster and former professional poker player and is married to the comedian David Mitchell. She started writing a weekly column for the Daily Telegraph aged 14, and has since published a number of books including For Richer, for Poorer: Confessions of a Poker Player (2009). Seasonal specials of the quiz show Only Connect, which she has presented since 2008, will be running on 30 Dec and 1-3 Jan at 8pm on BBC Two. Only Connect: The Difficult Second Quiz Book is out now.

Continue reading...

Why is the NHS listening to the siren voices of the vape manufacturers? | Victoria Coren Mitchell

By Victoria Coren Mitchell

The calls to make e-cigarettes free on prescription are outrageous when an actual cure for smoking is available

Public Health England has called for e-cigarettes to be made available on the NHS. This makes me so angry that I want to have a fag, although the last one I had was on 27 September 2014.

Ah well. I’ll settle for eating another packet of Minstrels and typing furiously.

Continue reading...

The checkout free shop is a wonderful idea, a machine will never judge you | Victoria Coren Mitchell

By Victoria Coren Mitchell

When we no longer have to impress the cashier – or fellow shoppers – we can buy what we like

Are you frightened of the rising machines? I try not to be. Machines are the future and being horrified by the future is so terribly ageing. Banging on about the misery of automated switchboards, the insecurity of online banking or the impersonality of email puts 20 years on you immediately, like racism or natural light. I try to avoid such things.

So, for me, it’s all “Good news, my local post office has shut down!”, “Ooh, you need a ‘registered account’ to buy cinema tickets, I couldn’t be happier!” and “Hurray! A leaked NHS England report says 111 calls will soon be diverted to a ‘diagnosis app’ instead of a person!”

Continue reading...

I did lose a pair of trousers once but they weren’t worth £1m, Boris | Victoria Coren Mitchell

By Victoria Coren Mitchell

The bankrupt tennis star’s admission that he has mislaid his trophies resonates with all of us who know we put that thing somewhere…

A s I sat with Boris Becker in the Riviera sunshine, each of us clutching a cigarette in one hand and a doughnut in the other, I thought: “This is my kind of sportsman.”

I didn’t know Boris Becker very well but I liked him enormously. Clearly, we both enjoyed the taste of a sugary butt on a spring afternoon. Also, we both loved a hand of cards; we were in Monte Carlo for a €10,000 poker tournament. I always found him approachable, friendly, unpretentious and nice to be around.

Continue reading...

Comparing unlike with unlike – it’s Whitehall’s secret new parlour game | Victoria Coren Mitchell

By Victoria Coren Mitchell

If the culture minister says that ambassadors should be paid more than BBC editors, we should next ask him how to choose between Victoria Beckham and a leopard

Well done Peston On Sunday, last week, for having three interview guests and triggering major news stories with each of them. That’s an amazing hit rate.

First guest Jeremy Corbyn hit the headlines for suggesting that the UK doesn’t really have a special relationship with America. Third guest Miriam Margolyes said “fuck” live on air. And the middle guest, shiny new culture secretary Matt Hancock, said that editors at the BBC should not be paid more than ambassadors.

Continue reading...

Molly tries to shuffle the pack | Victoria Coren Mitchell

By Victoria Coren Mitchell

The more things change the more they stay the same – even in a film about a strong woman

Can Hollywood fix itself? Is that already happening? Let’s go to the cinema together and find out.

It’ll have to be my local Everyman – a genteel chain where they transmit a lot of productions live from the National Theatre and sell yoghurt-coated nuts instead of Minstrels. Might not be your cup of tea. On the plus side, you can also get a cup of tea. It has to be that venue, because the trip has already happened.

Continue reading...

My Christmas present to you

By Victoria Coren Mitchell

Hate gift guides? Here’s an alternative to all those that insult you with dull ideas

The gift guides are out again! Regular readers will know how infuriated I am by those Christmas gift guides. Pages and pages of newsprint, all given over to the advice that we should consider buying our relatives a pair of socks or a bottle of wine.

Adding insult to insult, they invariably divide these “ideas” into relatives (“A lipstick for your wife! A book for your mum! A bottle of wine for Grandpa!”) just to make sure that nobody shops beyond the boundaries of age and gender stereotype. Not only must we buy the same old stuff every year, we must make the same old assumptions. Women love clothes. Kids love sweets. Men love golf calendars.

Continue reading...

Ed Sheeran versus the super-idiots | Victoria Coren Mitchell

By Victoria Coren Mitchell

Attacking the singer’s charity efforts takes a rare type of stupidity. But guess what...

According to a Dropbox survey published last week, most people believe that “only 68% of their work colleagues” are capable of the job.

This is a staggering figure. Why so high? Nobody’s capable of the job. Nobody’s capable of anything.

Related: Ed Sheeran Comic Relief film branded 'poverty porn' by aid watchdog

Continue reading...

Michael Gove, where did our love go? | Victoria Coren Mitchell

By Victoria Coren Mitchell

The environment secretary has shown a flash of his old character but I can’t forgive his betrayal

Did you wake up on Thursday morning expecting to feel a wave of affection for Michael Gove? I didn’t. I’m not sure anyone did. Possibly not even Mrs Gove, who wrote a very interesting joke in her Daily Mail column the day before.

“Kevin Spacey and Harvey Weinstein are reportedly languishing in rehab at an upmarket sex addiction clinic in Arizona,” it began. “No sex for eight weeks, apparently – although quite why they needed to fly to the desert for that is beyond me. Most of us find getting married does the trick.”

Continue reading...

Why are the police copping flak? | Victoria Coren Mitchell

By Victoria Coren Mitchell

Don’t damn officers for a Halloween prank – law and order should show it has bit of heart

It is possible that I have many things in common with Fenland police. You can’t do Only Connect for as long as I have without knowing that one thing can always be linked to another. Four things can be a challenge, but a simple pair, such as Fenland police and me… off the top of my head: we both like to wear blue, we’ve both dealt with a lot of drunks and neither of us has managed to stamp out hare-coursing in the county of Cambridgeshire.

And here’s another: we both tweeted pictures of ourselves dressed up for Halloween.

Continue reading...

Casinos gamble on their credibility | Victoria Coren Mitchell

By Victoria Coren Mitchell

If you’re too smart for gaming houses they’ll find a way to stop you - but more fool them

It is rare to see Phil Ivey, the greatest poker player of our time, losing seriously. This man is a genius. He can get inside other people’s heads.

The first time I played poker against him, I think he found me a little unsettling. People do, the first time. In Phil’s case, I don’t think it’s just that I was female – which is what throws most people – but that I was female and making jokes.

Continue reading...

Faster, higher, twerkier? | Victoria Coren Mitchell

By Victoria Coren Mitchell

Why stop at pole dancing at the Olympics? Let’s have groping and mud wrestling as well

The news that pole dancing has been formally recognised as a sport – and will now be considered for possible inclusion in the Olympics – fills me with delight.

Regular readers may be surprised. You might imagine I would feel weary and suspicious at this development. You might imagine I’d roll my eyes and ask: “What next? A simultaneous men’s event – how many bills can you shove in her bra as she writhes?”

Continue reading...

I’m really not a petrolhead... | Victoria Coren Mitchell

By Victoria Coren Mitchell

... but the thought of driverless cars and the surrender of freedom fill me with gloom

God bless the women of Saudi Arabia and their excitement about a royal decree allowing them to hold driving licences at last.

As we sit in traffic jams, fuming about inexplicable delays and unending roadworks, terrible radio playlists, the utter monotony and hell of it all, we should think of our sisters in the desert who see only the freedom, power and joy.

Continue reading...

Putting Granny online? No thanks| Victoria Coren Mitchell

By Victoria Coren Mitchell

I’m all for doing something for old people. But don’t ask me to put family snaps on the web

Today is National Grandparents’ Day. AgeUK is asking people to tweet, Instagram, hashtag (and other words your granny would not have understood) a photograph of their beloved ancestors, marked #grandpics, with a suggested donation of £5 with every photograph.

They asked me directly to do this. I said no. F*** em, I said.

Continue reading...

Oh, do let’s be beastly to the Nazis | Victoria Coren Mitchell

By Victoria Coren Mitchell

Nobody thinks Paul Hollywood is an actual Nazi; we should let him dress how he likes

A Nazi goes into a pub.

Hang on… that’s not a Nazi! It’s the well-known baker and TV personality Paul Hollywood!

Continue reading...

Grenfell Tower Inquiry to resume with architects’ evidence

By Peter Apps

The Grenfell Tower Inquiry will resume on Monday following a one-month break, with the architects who designed the refurbishment and cladding system due to give evidence.

Vistry Partnerships targets 6,000 new homes per year as group posts record profits

By Tim Clark

Vistry Partnerships, the partnerships arm of the house builder formerly known as Bovis Homes, has set targets to build more than 6,000 homes per year and achieve revenues of £1bn, the group’s latest accounts have revealed.

Scottish government agrees extra £25m for energy efficiency projects as Budget passes

By Lucie Heath

An extra £25m will be spent on local energy efficiency projects in Scotland, following a deal made between the Scottish National Party (SNP) and Scottish Greens to ensure the passage of the government’s Budget.

The Thinkhouse Review: the tension between housing targets and design standards

By Kerri Farnsworth

This month, Kerri Farnsworth looks at reports focusing on planning, design standards and building beautifully

Competition watchdog to launch enforcement action against developers over leasehold mis-selling

By Tim Clark

The Competition and Markets Authority (CMA) is set to launch enforcement action against developers after a probe into the leasehold industry found widespread evidence of misleading sales practices and unreasonable fees.

Housing bodies demand ‘levelling up’ of housing funding for the North in Budget

By Jack Simpson

Housing sector groups outline their wish lists for next month’s Budget

No solution to Universal Credit rent update issue in time for April increases

By Nathaniel Barker

Social landlords face a huge administrative burden from April due to a problem with Universal Credit bulk uploads

London association to team up with TfL to build 400 homes in Hounslow

By Tim Clark

A2Dominion has announced plans to partner with Transport for London (TfL) to build 400 new affordable homes in Hounslow. 

How councils play a crucial role in driving up private rented sector standards

By Simone Chinman Russell

With the private rented sector still growing, Simone Chinman Russell explores the best approach for councils to protect tenants

Short on time? Friday’s housing news in five minutes

By Jack Simpson

A round-up of the top stories this morning from Inside Housing and elsewhere

The spin has been good, but March’s Budget will let us know if ‘levelling up’ will be another let-down

By Martin Hilditch

Boris Johnson says he wants to “level up” society. March’s Budget will demonstrate whether he actually means it, writes Martin Hilditch

Budget 2020: what the housing sector wants from the chancellor

By James Wilmore

James Wilmore sifts through the submissions from the sector’s biggest players to find out what they want from the Budget on 11 March. Pictures by Alamy and Getty

East Anglian housing association to limit rent increase

By Tim Clark

An East Anglia-based housing association will limit rent rises in April to less than the amount permitted by government.

28 February digital edition of Inside Housing out now

By Inside Housing

The 28 February digital edition of Inside Housing is now available to subscribers

Bristol Council to sign up L&G for modular homes deal

By James Wilmore

Bristol Council has lined up Legal & General (L&G) to deliver 188 modular homes on a single site. 

Coronavirus: British man who was on Diamond Princess ship dies in Japan

The man, who was on the Diamond Princess cruise ship, is the first UK national to die from the virus.

Anglesey crossbow killer to serve at least 31 years

Terence Whall lay in wait for Gerald Corrigan and shot him as he tried to fix his satellite dish.

Greta Thunberg Bristol climate strike: 'The world is on fire'

The teenage activist was welcomed by some 15,000 people at the event in Bristol.

Post-Brexit talks: France warns UK against 'artificial deadlines'

France's Europe minister says the focus must be on substance, as details and timings of the talks emerge.

Maroon 5 criticised for 'reluctant' festival performance in Chile

Singer Adam Levine appeared uncomfortable and disinterested, despite being broadcast on live TV.

Facemasks on catwalk at Fashion Week

Marine Serre's show saw models wear outfits complete with matching facemasks.

Ironbridge flooding: Storm Jorge fears prompt defences repair plan

More heavy rain is expected in Ironbridge, Shropshire, as engineers replaced damaged defences.

Escape From Tarkov: Hardest of the hardcore looter-shooter is spellbinding despite the punishing learning curve

By Richard Currie

Fun not required

The RPG  Greetings, traveller, and welcome back to The Register Plays Games, our monthly gaming column. For the first time we feature a multiplayer title, and not a particularly forgiving one at that. I don't know why, I'm not even good at video games despite dedicating a chunk of my scant free time to playing them. Want to squad up? Someone send help, please, because I'm still trying to Escape From Tarkov.…

Syria war: Alarm after 33 Turkish soldiers killed in attack in Idlib

Turkey hits Syrian government targets in response and the EU warns of a major conflict developing.

Coronavirus: Nigeria confirms first case in sub-Saharan Africa

The Italian citizen had returned from Milan, in a region badly hit by the outbreak of the virus.

Three-time Olympic swimming champion Sun given eight-year ban

China's three-time Olympic champion swimmer Sun Yang is banned from competing for eight years for missing a doping test in September 2018.

Tamara Ecclestone: Cleaner denies jewel theft plot

Valuables worth £50m were taken during a raid in December at Tamara Ecclestone's home in Kensington.

Southern Water not such a phisherman's phriend, hauls itself offline to tackle email lure

By Richard Speed

UK utility biz suspends internet services

British utility biz Southern Water was the victim of a phishing attack on Wednesday, resulting in a hurried shutdown of some of the company's systems.…

Leasehold property buyers 'misled by developers'

Many homeowners find themselves in "serious traps" after being mis-sold properties, a watchdog says.

What's the risk to your baby, and other questions

Is it safe to share a communion cup in church, and other readers' questions answered.

Weeknotes: Datasette Writes

As discussed previously, the biggest hole in Datasette's feature set at the moment involves writing to the database.

Datasette was born as a hack to abuse serverless, stateless hosting by bundling a static, immutable database as part of the deployment. The key idea was that for some use-cases - such as data journalism - you don't need to be able to continually update your data. It's just the facts that support the story you are trying to tell.

I also believed the conventional wisdom that SQLite is fine for reads but shouldn't be trusted to handle web application writes. I no longer believe this to be the case: SQLite is great at handling writes, as millions of iPhone and Android apps will attest.

Meanwhile, the biggest blocker to people trying out Datasette is that they would need to convert their data to SQLite somehow in order to use it. I've been building a family of CLI tools for this, but that requires users to both be familiar with the command-line and to install software on their computers.

So: Datasette needs to grow web-based tools for loading data into the database.

Datasette's plugin system is the ideal space for experimenting with ways of doing this, without needing to try out crazy new features on Datasette's own core.

There's just one big problem: SQLite may be great at fast, reliable writes but it still doesn't like concurrent writes: it's important to only ever have one connection writing to a SQLite database at a time.

I've been mulling over the best way to handle this for the best part of a year... and then a couple of days ago I had a breakthrough: with a dedicated write thread for a database file, I could use a Python queue to ensure only one write could access the database at a time.

There's prior art for this: SQLite wizard Charles Leifer released code plus a beautiful explanation of how to queue writes to SQLite back in 2017. I'm not sure why I didn't settle on his approach sooner.

So... Datasette 0.37, released this evening, has a new capability exposed to plugins: they can now request that an operation (either a SQL statement or a full custom Python function) be queued up to execute inside a thread that posesses an exclusive write connection to a SQLite database.

I've documented how plugins can use this in the new plugin internals documentation: execute_write() and execute_write_fn().

So far there's only one public plugin that takes advantage of this: datasette-upload-csvs, which previously used a dirty hack but has now been upgraded to use the new execute_write_fn() method.

I'm really excited about the potential plugins this unlocks though. I experimented with a logging plugin and a plugin for deleting tables while I was building the hooks (full implementations of those are posted as comments in the pull request).

Other use-cases I'm interested to explore include:

Quoting Nelson Elhage

I’ve really come to appreciate that performance isn’t just some property of a tool independent from its functionality or its feature set. Performance — in particular, being notably fast — is a feature in and of its own right, which fundamentally alters how a tool is used and perceived.

Nelson Elhage

5 Best Practices for Synthetic Monitoring

By Megan Jones

Using synthetic monitoring to track your website’s performance is an effective way to ensure your site is up and running at optimal capacity. However, synthetic monitoring is much more than simply monitoring your site’s uptime and page speed.

The post 5 Best Practices for Synthetic Monitoring appeared first on Pingdom Royal.

Why Google invested in providing Google Fonts for free

Why Google invested in providing Google Fonts for free

Fascinating comment from former Google Fonts team member Raph Levien. In short: text rendered as PNGs hurt a Google Search, fonts were a delay in the transition from Flash, Google Docs needed them to better compete with Office and anything that helps create better ads is easy to find funding for.

Quoting Juliette Cezzar

So next time someone is giving you feedback about something you made, think to yourself that to win means getting two or three insights, ideas, or suggestions that you are excited about, and that you couldn’t think up on your own.

Juliette Cezzar

Android home screen widgets in HTML and JS

By sil

I like having the news headlines on my phone’s home screen. (Well, on the screen to the right.) It helps me keep up with what’s going on in the world. But it’s hard to find a simple headline home screen widget which isn’t full of ads or extra frippery or images or tracking; I just want headlines, plain text, not unpleasantly formatted, and high-density. I don’t want to see three headlines; I’d rather see ten. I tried a whole bunch of news headline home screen widgets and they’re all terrible; not information-dense enough, or they are but they’re ugly, or they insist on putting pictures in, or they display a ton of other information I don’t want.

It occurred to me that I don’t really need a news reader per se; just an RSS reader, which I then point at Google’s “all news” feed (which they move around from time to time but at time of writing in February 2020 is at However, RSS reader widgets are also all terrible.

Finally, I thought: fine, I’ll just do it myself. But I really don’t want to write Java and set up Android Studio. So I installed Web Widget which just renders a web page to a home screen widget, and then wrote a simple web page and stuck it at the root of my phone’s storage. I can then point Web Widget at file:///sdcard/noos.html and it all works, and I can customise it how I like. Every one’s a winner. Nice simple way to create widgets that do what I want. They can’t be animated or anything, but if you want something which displays some external data and is happy to be polled every now and again to update, it’s perfectly fine. Sadly, there’s no continuity of storage (indexedDB exists but doesn’t persist and localStorage doesn’t exist at all), but it’s good for what I needed.

Things I learned about shapefiles building shapefile-to-sqlite

The latest in my series of x-to-sqlite tools is shapefile-to-sqlite. I learned a whole bunch of things about the ESRI shapefile format while building it.

Governments really love ESRI shapefiles. There is a huge amount of interesting geospatial data made available in the format - 4,614 on!


shapefile-to-sqlite loads the data from these files into a SQLite database, turning geometry properties into database columns and the geometry itself into a blob of GeoJSON. Let's try it out on a shapefile containing the boundaries of US national parks.

$ wget
Saving to: ‘’                           100%[=====================================================================================>]  12.61M   705KB/s    in 22s     
2020-02-18 19:59:22 (597 KB/s) - ‘’ saved [13227561/13227561]

$ unzip 
inflating: temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.xml  
inflating: temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.dbf  
inflating: temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.prj  
inflating: temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.shp  
inflating: temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.shx

$ shapefile-to-sqlite nps.db temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.shp
[####################################]  100%

$ datasette nps.db
Serve! files=('nps.db',) (immutables=()) on port 8003
INFO:     Started server process [33534]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on (Press CTRL+C to quit)

I recommend installing the datasette-leaflet-geojson plugin, which will turn any column containing GeoJSON into a Leaflet map.

Screenshot of National Parks in Datasette

If you've installed SpatiaLite (installation instructions here) you can use the --spatialite option to instead store the geometry in a SpatiaLite column, unlocking a bewildering array of SQL geometry functions.

$ shapefile-to-sqlite nps.db temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.shp --spatialite --table=nps-spatialite
[##################################--]   94%  00:00:00

I deployed a copy of the resulting database using Cloud Run:

$ datasette publish cloudrun nps.db \
    --service national-parks \
    --title "National Parks" \
    --source_url="" \
    --source="" \
    --spatialite \
    --install=datasette-leaflet-geojson \
    --install=datasette-render-binary \
    --extra-options="--config max_returned_rows:5"

I used max_returned_rows:5 there because these geometrries are pretty big - without it a page with 100 rows on it can return over 90MB of HTML!

You can browse the GeoJSON version of the table here and the SpatiaLite version here.

The SpatiaLite version defaults to rendering each geometry as an ugly binary blob. You can convert them to GeoJSON for compatibility with datasette-leaflet-geojson using the SpatiaLite AsGeoJSON() function:

select id, UNIT_NAME, AsGeoJSON(geometry)
from [nps-spatialite]

Here's the result of that query running against the demo.

Understanding shapefiles

The most confusing thing about shapefiles is that they aren't a single file. A shapefile comes as a minimum of three files: foo.shp containing geometries, foo.shx containing an index into those geometries (really more of an implementation detail) and foo.dbf contains key/value properties for each geometry.

They often come bundled with other files too. foo.prj is a WKT projection for the data for example. Wikipedia lists a whole bunch of other possibilities.

As a result, shapefiles are usually distributed as a zip file. Some shapefile libraries can even read directly from a zip.

The GeoJSON format was designed as a modern alternative to shapefiles, so understanding GeoJSON really helps in understanding shapefiles. In particular the GeoJSON geometry types: Point, LineString, MultiLineString, Polygon and MultiPolygon match how shapefile geometries work.

An important detail in shapefiles is that data in the .shp and .dbf files is matched by array index - so the first geometry can be considered as having ID=0, the second ID=1 and so on.

You can read the properties from the .dbf file using the dbfread Python module like this:

$ ipython
In [1]: import dbfread
In [2]: db = dbfread.DBF("temp/Current_Shapes/Data_Store/06-06-12_Posting/nps_boundary.dbf")
In [3]: next(iter(db))
OrderedDict([('UNIT_TYPE', 'Park'),
            ('STATE', ''),
            ('REGION', 'NC'),
            ('UNIT_CODE', 'NACC'),
            ('UNIT_NAME', 'West Potomac Park'),
            ('DATE_EDIT', None),
            ('GIS_NOTES', ''),
            ('CREATED_BY', 'Legacy'),
            ('METADATA', ''),
            ('PARKNAME', '')])

Reading shapefiles in Python

I'm a big fan of the Shapely Python library, so I was delighted to see that Sean Gillies, creator of Shapely, also created a library for reading and writing shapefiles: Fiona.

GIS with Python, Shapely, and Fiona by Tom MacWright was particularly useful for figuring this out. I like how he wrote that post in 2012 but added a note in 2017 that it's still his recommended way of getting started with GIS in Python.


The trickiest part of working with any GIS data is always figuring out how to deal with projections.

GeoJSON attempts to standardize on WGS 84, otherwise known as the latitude/longitude model used by GPS. But... shapefiles frequently use something else. The Santa Clara county parks shapefiles for example use EPSG:2227, also known as California zone 3.

(Fun fact: ESPG stands for European Petroleum Survey Group, a now defunct oil industry group that today lives on only as a database of projected coordinate systems.)

I spent quite a while thinking about how to best handle projections. In the end I decided that I'd follow GeoJSON's lead and attempt to convert everything to WGS 84, but allow users to skip that behaviour using --crs=keep or to specify an alternative projection to convert to with --crs=epsg:2227 or similar.

SpatiaLite creates its geometry columns with a baked in SRID (a code which usually maps to the EPSG identifier). You can see which SRID was used for a specific geometry using the srid() function:

select srid(geometry) from "nps-spatialite" limit 1

SpatiaLite can also convert to another projection using the Transform() function:

select ':' || AsGeoJSON(Transform(geometry, 2227)) from "nps-spatialite" limit 1

(I'm using ':' || AsGeoJSON(...) here to disable the datasette-leaflet-geojson plugin, since it can't correctly render data that has been transformed to a non-WGS-84 proection.)

Pulling it all together

I now have two tools for imorting geospatial data into SQLite (or SpatiaLite) databases: shapefile-to-sqlite and geojson-to-sqlite.

I'm excited about Datasette's potential as a tool for GIS. I started exploring this back in 2017 when I used it to build a location to timezone API - but adding easy shapefile imports to the toolchain should unlock all kinds of interesting new geospatial projects.

On the Birmingham tech scene

By sil

A certain amount of kerfuffle over the last couple of days in the half of the Birmingham tech scene that I tend to inhabit, over an article in Business Live about Birmingham Tech Week, a new organisation in the city which ran a pretty successful set of events at the back end of last year.1

I think what got people’s backs up was the following from BTW organiser Yiannis Maos, quoted in the article:

I saw an opportunity borne out of the frustration that Birmingham didn’t really have a tech scene, or at least not one that collaborated very much.

You see, it doesn’t appear that the Tech Week team did much in the way of actually trying to find out whether there was a tech scene before declaring that there probably wasn’t one. If they had then they’d have probably discovered the calendar which contains all the stuff that’s going on, and can be subscribed to via Google. They’d probably have spoken to the existing language-specific meetups in the city before possibly doing their own instead of rather than in conjunction with. They’d have probably discovered the Brum tech Slack which has 800-odd people in it, or2 CovHack or HackTheMidlands or FusionMeetup or devopsdays or CodeYourFuture_ or yougotthisconf or Tech Wednesday or Django Girls or OWASP or Open Code or any one of a ton of other things that are going on every week.

Birmingham, as anyone who’s decided to be here knows, is a bit special. A person involved in tech in Birmingham is pretty likely to be able to get a similar job in London, and yet they haven’t done so. Why is that? Because Brum’s different. Things are less frantic, here, is why. We’re all in this together. London may have kings and queens: we’re the city of a thousand different trades, all on the same level, all working hand in hand. All collaborating. It’s a grass roots thing, you see. Nobody’s in charge. The calendar mentioned above is open source exactly so that there’s not one person in charge of it and anyone else can pick it up and run with it if we disappear, so the work that’s already gone into it isn’t wasted.

Yiannis goes on to say “I guess we weren’t really banging the drum about some of the successes Birmingham had seen in regards to tech.” And this is correct. Or, more accurately, I don’t personally know whether it’s correct, but I entirely believe it. I’m personally mostly interested in the tech scene in the city being good for people in the city, not about exhibiting it to others… but that doesn’t mean that that shouldn’t be done. Silicon Canal already do some of that, but having more of it can’t be bad. We all want more stuff to happen, there just doesn’t need to be one thing which attempts to subsume any of the others. Birmingham Tech Week’s a great idea. I’d love to see it happen again, and it’s great that Yiannis has taken a lead on this; five thousand people showing up can’t be wrong.

And, to be clear, this is not an attempt to rag on them. I don’t know Yiannis myself, but I’ve been told by people whose opinions I value and who do know him that he’s not intending to be a kingmaker; that what he’s looking to do is to elevate what’s already going on, and add more to it. That’s fantastic. They’ve contacted people I know and trust to ask for opinions and thoughts. I spoke to them when they set up their own events listing and asked people to contribute to theirs specifically and I said, hey, you know there already is one of those, right? If you use that (as Silicon Canal do) and ask people to contribute to that, then we all win, because everyone uses it as the single source and we don’t have fifteen incomplete calendars. And they said, hey, we didn’t know that, soz, but we’ll certainly do that from now on, and indeed they have done so, recommending to event organisers that they add their stuff to the existing calendar, and that’s brilliant. That’s collaboration.

I think of the tech scene in my city like a night out dancing. You go out for the evening to have a dance, to have a laugh. Show up on your own or with a partner or with a group, and then all get out there on the floor together and throw some shapes; be there for one minute or the whole night, nobody minds. And nobody’s directing it. Nobody wins a dance. If someone tries to tell everyone how to dance and when to dance and where to dance… then it stops being fun.

And so there’s a certain amount of resistance, on my side of the fence, to kingmakers. To people who look at the scene, all working together happily, and then say: you people need organising for your own good, because there needs to be someone in charge here. There needs to be hierarchy, otherwise how will journalists know who to ask for opinions? It’s difficult to understand an organisation which doesn’t have any organisation. W. L. Gore and Patagonia and Valve are companies that work a similar way, without direct hierarchy, in a way that the management theorist Frédéric Laloux calls a “teal organisation” and others call “open allocation”, and they baffle people the world over too; half the managers and consultants in the world look at them and say, but that can’t work, if you don’t have bosses, nobody will do anything. But it works for them. And it seems to me to be a peculiarly Brum approach to things. If we were in this for the fame and the glory we’d have gone down to London where everyone’s terribly serious and in a rush all the time. Everyone works with everyone else; BrumPHP talks about BrumJS, Fusion talks about School of Code; one meetup directs people to others that they’ll find interesting; if the devopsdays team want a speaker about JavaScript they’ll ping BrumJS to ask about who’d be good. That’s collaboration. Everyone does their bit, and tries to elevate everyone else at the same time.

So I really hope that the newspaper article was a misquote; that the journalist involved could have looked more into what’s going on in the city and then written something about all of that, too. It’s certainly easy to just report on one thing that’s going on, but exactly what makes the Birmingham tech scene different from others is that it’s rich and deep and there isn’t one convenient person who knows all of it. I’d love to see Birmingham journalism talking more about the Birmingham scene. Let’s hope there’s more of that.

  1. That link describes the 2019 Birmingham tech week at time of writing in February 2020. I do not know whether they’ll keep the 2019 schedule around (and I hope they do and don’t just overwrite it).
  2. to quote Jim

Getting a new phone

By sil

So, I’m getting a new phone. Here’s an insight into my decision-making processes.

I have, repeatedly and irritatedly, complained that phones now are too big. My beloved Sony Xperia Z5 Compact is the right size for a phone, in my opinion. I always, always use my phone one-handed; I never ever hold in one hand and touch the screen with the other. It is a loss to me why this, which was the normal way of using a phone for years, has been reclassified as a thing that nobody wants any more, but c’est la vie, I suppose. Anyway, said beloved Z5C finally threw a seven the other day and decided that it wouldn’t do wifi any more. Or, more accurately, that it was fine doing wifi when within about two feet of the router, and not otherwise.

That’s not ideal, I thought.

I mean, it’s five years old. So I probably did OK out of it. And the battery life is shocking now. So I’ve been vaguely thinking about getting something new for a while. I’m not sure that the wifi thing is sensibly repairable, and I read a forum post about a chap who took his Z5C apart to replace the (not-user-replaceable) battery (a process which involves heating it up to break the glue behind the glass, and a bunch of other stuff that there’s no way I’d be able to do without breaking the phone and possibly burning down the building) and while doing so managed to snap a tiny bit of metal which then broke the wifi antenna and made it exhibit the problems I’m seeing. So that’s probably what happened; it got jolted or something. No chance of me fixing that; if I have to solder anything, I’ll screw it up. This is the universe telling me to get a new phone, I thought.

Consequently, it’s off to GSM Arena’s phone finder. I don’t actually have much in the way of requirements for a phone. My original list of needs was:

This is not much of a strenuous list of requirements, to be honest. Or so I thought. I did some searches, and quickly established that I’d have to get something bigger than the Z5C; there isn’t anything at all that size, these days. So I wandered into town with the intention of picking up some actual phones to get a sense of what was too big.

This was harder than it looks, because basically every phone shop now bolts all their phones to the table so they can’t be picked up. All you can do is jab at the screen like a bloody caveman. This is pretty goddamn annoying when the point of the test is to see what a phone feels like in the hand. The O2 shop had a bunch of plastic models of phones and even those had a massive thing glued on the back with a retracting wire cable in it, as if I’m going to steal a non-functional plastic box, O2, for god’s sake, stop treating your customers like criminals, this is almost as bad as hotels giving you those crap two-part hangers like I’m going to spend £150 on a night in the Premier Inn and then nick the hangers, what’s wrong with you… but it did at least let me establish that the absolute outside maximum size for a phone that I’m able to tolerate is the Samsung Galaxy S10e. Anything bigger than that is just too big; I can’t reach the top of the screen without using my other hand.

A search on gsmarena for phones less than 143mm in height, with NFC and 3.5mm jack, from 2018 onwards lists three phones. The S10e as mentioned, the Sony Xperia XA2, and the Sharp Aquos R2 Compact. Now, I quite like the look of the Aquos (despite all the reviews saying “it’s got two notches! not even the Nazis did that!”) but as far as I can tell it just was flat never made available in the UK at all; getting hold of one is hard. And the S10e, while it seems OK, is a Samsung (which I’m not fond of) and more importantly is £450. This left me looking at the Xperia XA2, which was a possibility — it’s sort of a grand-nephew of my Z5C. Reviews weren’t very encouraging, but I figured… this might be OK.

Andrew Hutchings pointed out on Twitter (because of course I was bitching about this whole situation on Twitter) that there are USB-to-headphone-jack adaptors. Now, I knew this — my daughter uses one to plug her headphones into her iPhone — but for some reason I hadn’t properly considered that option; I’d just assumed that no headphone jack = stupid wireless headphones. An adaptor wouldn’t be that big a deal; my headphones just get thrown in my coat pocket (I have cheapish in-ear headphones, not posh cans that go ove the ear and need a bag to carry them around in) and so I’d just leave the adaptor attached to them at all times. That wouldn’t be so bad.

Taking the headphone jack requirement away from the search added two more options (and a bunch of smartwatches, unhelpfully): the Sony Xperia XZ2 Compact and the Nokia 8 Sirocco. I liked the sound of the Nokia, but… not for very good reasons. My favourite ever phone from an industrial design perspective was the Nokia N9, which I loved with a passion that was all-encompassing. I like the Nokia brand; it says classy and well-thought-out and well-integrated and thoughtful and elegant. And “Sirocco” is a cool name; I like things with names. I hate that phones are just called a code number, now. So “Sirocco” is much cooler than “S10e”. None of these are good reasons, particularly the ones that revolve around my nostalgia for the Nokia brand considering that it’s been bought by some other company now. And the Sirocco only got fairly average reviews.

Ah, but then I read the reviews. And all the things that reviewers didn’t like, I either didn’t care about or, more worryingly yet, I completely disagreed with. “As the phone has a 16:9 screen rather than the now more popular 18:9 (or even 19:9) style, it already seems dated” says techradar, for which you can just sod off. Why, why would I want a phone a foot long? That’s the opposite of what I want! So reviews that complain that it’s not tall enough (which was a lot of them) got discounted. Complaints that it’s using an older chipset than some of its contemporaries don’t bother me; it’s quite some newer than my current phone, after all. Apparently the camera isn’t perfect, about which I don’t care; it’s got a camera, so I’m good. And they all agreed on two things: it’s Android One, meaning that it’s stock Android and will get updates (which I like, since my Z5C is stuck on Android 7 (!)), and that it’s pretty. I like pretty.

The price tag was off-putting, though. £475 on Amazon. That’s rather too much; I’d have to save up for that, and as noted I have a phone with no wifi, so this problem needs solving sooner rather than later. I don’t mind second-hand, though, so I checked eBay and it was still £250 there, which is on the very utmost outer edge of what I can just drop on a purchase and I’d have to be really convinced of it. I don’t like buying things on the knock-knock, and I am in a 12-month can’t-leave SIM-only contract with Three, so the idea of getting an “upgrade” from my carrier was a no-no even if I wanted to, which I don’t (the SIM-only thing gives me unlimited texts and calls and 6GB of data per month for nine quid. Not forty nine. Nine. I don’t want to lose that).

And then I checked CeX. And CeX had it in stock, online, class A, for £175.

What? A hundred and seventy-five quid for a phone which elsewhere is nearly five hundred?

So I bought it. And now it’s not in stock online any more, so I assume I have the only one they had. This means you can’t do the same. Sorry about that.

It’s due to arrive early next week (which is the problem with buying on a Saturday). I’ll let you know how it goes. I’m rather looking forward to it.



This is a great idea: a command-line tool for parsing HTML on stdin using CSS selectors. It's like jq but for HTML. Supports a sensible collection of selectors and has a number of output options for the selected nodes, including plain text and JSON. It also works as a simple pretty-printer for HTML.

Quoting Eric Dobbs

A group of software engineers gathered around a whiteboard are a joint cognitive system. The scrawls on the board are spatial cues for building a shared model of a complex system.

Eric Dobbs

How to cheat at unit tests with pytest and Black

I’ve been making a lot of progress on Datasette Cloud this week. As an application that provides private hosted Datasette instances (initially targeted at data journalists and newsrooms) the majority of the code I’ve written deals with permissions: allowing people to form teams, invite team members, promote and demote team administrators and suchlike.

The one thing I’ve learned about permissions code over the years is that it absolutely warrants comprehensive unit tests. This is not code that can afford to have dumb bugs, or regressions caused by future development!

I’ve become a big proponent of pytest over the past two years, but this is the first Django project that I’ve built using pytest from day one as opposed to relying on the Django test runner. It’s been a great opportunity to try out pytest-django, and I’m really impressed with it. It maintains my favourite things about Django’s test framework - smart usage of database transactions to reset the database and a handy test client object for sending fake HTTP requests - and adds all of that pytest magic that I’ve grown to love.

It also means I get to use my favourite trick for productively writing unit tests: the combination of pytest and Black, the “uncompromising Python code formatter”.

Cheating at unit tests

In pure test-driven development you write the tests first, and don’t start on the implementation until you’ve watched them fail.

Most of the time I find that this is a net loss on productivity. I tend to prototype my way to solutions, so I often find myself with rough running code before I’ve developed enough of a concrete implementation plan to be able to write the tests.

So… I cheat. Once I’m happy with the implementation I write the tests to match it. Then once I have the tests in place and I know what needs to change I can switch to using changes to the tests to drive the implementation.

In particular, I like using a rough initial implementation to help generate the tests in the first place.

Here’s how I do that with pytest. I’ll write a test that looks something like this:

def test_some_api(client):
    response = client.get("/some/api/")
    assert False == response.json()

Note that I’m using the pytest-django client fixture here, which magically passes a fully configured Django test client object to my test function.

I run this test, and it fails:

pytest -k test_some_api

(pytest -k blah runs just tests that contain blah in their name)

Now… I run the test again, but with the --pdb option to cause pytest to drop me into a debugger at the failure point:

$ pytest -k test_some_api --pdb
== test session starts ===
platform darwin -- Python 3.7.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
django: settings: config.test_settings (from ini)
client = <django.test.client.Client object at 0x10cfdb510>

    def test_some_api(client):
        response = client.get("/some/api/")
>       assert False == response.json()
E       assert False == {'this': ['is', 'an', 'example', 'api']}
core/ AssertionError
>> entering PDB >>
>> PDB post_mortem (IO-capturing turned off) >>
> core/
-> assert False == response.json()
(Pdb) response.json()
{'this': ['is', 'an', 'example', 'api'], 'that_outputs': 'JSON'}

Running response.json() in the debugger dumps out the actual value to the console.

Then I copy that output - in this case {'this': ['is', 'an', 'example', 'api'], 'that_outputs': 'JSON'} - and paste it into the test:

def test_some_api(client):
    response = client.get("/some/api/")
    assert {'this': ['is', 'an', 'example', 'api'], 'that_outputs': 'JSON'} == response.json()

Finally, I run black . in my project root to reformat the test:

def test_some_api(client):
    response = client.get("/some/api/")
    assert {
        "this": ["is", "an", "example", "api"],
        "that_outputs": "JSON",
    } == response.json()

This last step means that no matter how giant and ugly the test comparison has become I’ll always get a neatly formatted test out of it.

I always eyeball the generated test to make sure that it’s what I would have written by hand if I wasn’t so lazy - then I commit it along with the implementation and move on to the next task.

I’ve used this technique to write many of the tests in both Datasette and sqlite-utils, and those are by far the best tested pieces of software I’ve ever released.

I started doing this around two years ago, and I’ve held off writing about it until I was confident I understood the downsides. I haven’t found any yet: I end up with a robust, comprehensive test suite and it takes me less than half the time to write the tests than if I’d been hand-crafting all of those comparisons from scratch.

Also this week

Working on Datasette Cloud has required a few minor releases to some of my open source projects:

Unrelated to Datasette Cloud, I also shipped twitter-to-sqlite 0.16 with a new command for importing your Twitter friends (previously it only had a command for importing your followers).

In bad personal motivation news… I missed my weekly update to Niche Museums and lost my streak!

Quoting David Heinemeier Hansson

We write a lot of JavaScript at Basecamp, but we don’t use it to create “JavaScript applications” in the contemporary sense. All our applications have server-side rendered HTML at their core, then add sprinkles of JavaScript to make them sparkle. [...] It allows us to party with productivity like days of yore. A throwback to when a single programmer could make rapacious progress without getting stuck in layers of indirection or distributed systems. A time before everyone thought the holy grail was to confine their server-side application to producing JSON for a JavaScript-based client application.

David Heinemeier Hansson

Deep learning isn’t hard anymore

Deep learning isn’t hard anymore

This article does a great job of explaining how transfer learning is unlocking a new wave of innovation around deep learning. Previously if you wanted to train a model you needed vast amounts if data and thousands of dollars of compute time. Thanks to transfer learning you can now take an existing model (such as GPT2) and train something useful on top of it that's specific to a new domain in just minutes it hours, with only a few hundred or a few thousand new labeled samples.

WordPress Plugin Makes it Easy to Add Pingdom Real User Monitoring to Your Site

By Jonas Strandell

wordpress plugin pingdomLike so many of you, we’re big WordPress fans here at Pingdom, and now we’ve made it super-simple for you to add Real User Monitoring (RUM) to your WordPress site.

By adding RUM to your WordPress site using our brand new plugin, you will get answers to questions like what browsers your visitors use, how many of them are using tablets or other devices, where are they located, and many more. With this information you can then take steps to improve the performance of your site.

Real User Monitoring is available on all our plans, including the free one, so there’s no reason why you shouldn’t add this plugin to your WordPress site today.

The post WordPress Plugin Makes it Easy to Add Pingdom Real User Monitoring to Your Site appeared first on Pingdom Royal.

I Want Off Mr. Golang's Wild Ride


Still using Google Authenticator? Here's why you should get rid of it today


Introducing Arkade - The Kubernetes app installer


Forget Chess – The Real Challenge Is Teaching AI to Play D&D


Reverie Labs (YC W18) Is Hiring Full-Stack Engineers to Help Cure Cancer


Google’s new treatment of nofollow links


Securing Memory at EPYC Scale


Advanced usage of Python requests: timeouts, retries, hooks


Ask HN: How to find work while homeless?


Linkalot: A web-based inbox for your links


Ken Allen


Monkey Patching in Golang (2015)


SeaMonkey 2.53.1 Released


Bootstrap Treeview


Show HN: Profit Hunt - Get inspired by profitable online projects


Montgomery Brewster's 'None of the Above' would walk this election.

By Jackart ([email protected])

It's actually quite liberating to follow politics without a team to shout for. I remain a Conservative by inclination. I like free markets, economic liberalism and so forth even if the Conservative manifesto doesn't seem to all that much, Tories, if not their leadership, are mainly for these things. I am also a social liberal, I remain committed to an open and tolerant society. However the Liberal Democrats risk becoming the Church of England does Politics, being stuffed with the kind of dry, shabby inadequate who can't quite get over his (self) loathing of homosexuality. I dislike May. I think she's a narrow-minded provincial bigot who's been promoted way, way above her level of competence. She is however the best of the two candidates for Prime Minister. 

Let's not pretend Corbyn was doing other than palling around with the IRA in the 1980s because the glamour of "anti-imperialist" terrorists excited him. He has always supported whoever was fighting the UK at the time, and doesn't deserve to be an MP, let alone to reverse those letters. Labour's clown-car economics is only marginally less risible than the Tories offer, this time round. The difference is Labour actually believe their silliness, and they're led by a traitor. 

If you live in Scotland, this election is about independence. If you live in NI, then this election is about the tribal headcount. If you live elsewhere this election is whether you want an incompetent nanny-state provincial Tory or an antediluvian Socialist to deliver Brexit. It's a shabby, and dispiriting affair. If you can't work out how to vote, you can always vote for Montgomery Brewster. None of the above is appealing. But if you feel you MUST vote, then I have prepared a handy flow-chart to help you.

If you despise politicians, you get despicable politicians.
This shabby parade of also-rans from which we have to choose on today (without any actual choice on the main, nay only, issue of the day) is the logic of calling decent, capable people like Blair, Cameron and Major "war criminals" and "Traitors", for decades. It pollutes the language for when you actually get some of these things on the offer.
No worthwhile people will put up with the scrutiny and abuse heaped daily on politicians. So you get the kind of bore for whom the scrutiny isn't an issue. They've never done anything interesting in the their lives. At least David Cameron dropped some E and went to a rave or two as a youth. What does Theresa May, who spent her twenties complaining about the promotion of lesbianism in schools, know of fun? As for Corbyn, he looks like the kind of man for whom a perfect saturday night is treatise on Marx (so long as it contains nothing he doesn't already know and agree with) with some lovely mineral water. He is the Labour man Orwell warned you about.

I'll be voting Tory. Why? My local headbanging Leadsomite hard-brexiter has stood down after his colossal act of vandalism, to be replaced by a man with whom I seem to agree.
My expectations are of a  Tory majority around 75, on a low turnout, and they will have half a dozen seats in Scotland.  The Liberal Democrats will take Vauxhall and Twickenham, losing in Sheffield Hallam (the "were you up for...?" moment as Clegg loses his seat), but holding Orkney and Shetland against the SNP, remaining about where they are now overall. Or that's where my betting is at the moment.
What do I want to see happen? I'd like to see May remain PM but in a hung parliament, reliant on Northern Irish politicians for her majority because let's face it, she deserves nothing better.
A rubbish show all round but at least I can enjoy it, whoever loses.

Whales are more Important to Climate change than Donald Trump.

By Jackart ([email protected])

Donald Trump has pulled the USA out of the Paris Climate accord. And I don't think this matters all that much. For a start, the USA's emissions are falling. Mostly this is because coal is being replaced by Natural Gas, but also because people are driving less, in smaller vehicles with ever more efficient engines. The motors driving the west's steady fall in carbon emissions are economic and technological, not political.

Next to the steady decline in carbon emissions from the west, is set the Vast increase in emissions in recent decades from Asia. But this represents billions of people using no net carbon energy, tending crops using animal muscle and burning biomass (and occasionally starving to death) Just a few decades ago, to my meeting an indian chap on Holiday in Stockholm with his family and chatting about cricket while we tried to decipher the train times. The rise of the middle class in India and China is a huge flowering of human potential, even if it comes with soluble environmental problems.

Anyway, the level of Co2 in the atmosphere is rising, and this is changing the climate. Reducing emissions is a noble aim, but it must not get in the way of developing economies' economic growth. Fortunately, the solution is already with us. Renewable technology is improving. Cars are getting more efficient, and perhaps moving away from fossil fuel (at least directly). And this process will happen in india and China more quickly than in the west beacaue adopting what will be soon proven and cheap technology will enable them to miss whole generations of poluting technologies.

Which brings us to the great cetaceans. The southern ocean is the world's biggest habitat, with the world's shortest food chain, at the top of which sits the largest animal that has ever existed on earth. Phytoplancton bloom, and are eaten by zooplankton, which are eaten by fish larvae and Krill, which are eaten buy just about everything else. The biggest eaters of Krill are the baleen whales which turn five tons of Krill into Iron-rich shit every day. Sperm whales meanwhile are diving to the abysal deep turning several tons of squid into Iron-rich scat, moving nutrients from the deep to the surface. The limiting nutrient at the bottom of the food-chain is iron, so whale faeces fertilise the ocean, and enable more phytoplanckton to grow which absorb Co2 from  the air, much of which falls to the bottom of the ocean as marine snow, and eventually become rock.

But we killed the whales, and when we stopped doing so, they didn't recover as quickly as we hoped. We didn't just kill the Apex predators, in doing so, humanity reduced the Southern ocean's ecosystem's capacity to create life, and absorb Carbon. The southerm ocean may have settled at a lower equilibrium of Iron circulation. The Atlantic on the other hand, which gets tons of Iron from the african deserts every time the wind blows, has seen whale stocks recover better.

Which is why I want to see more research into Iron seeding the ocean, which may give a leg up to Balaenoptera musculus, as well as possibly solving climate change. Climate change is a problem. But while Trump's petulent gesture doesn't help us solve it, nor does it make the problem any harder. Politicians simply matter less than a whale taking a dump.

Why the Blue Passport Matters.

By Jackart ([email protected])

People have spent the day on Twitter saying "why does the colour of a passport matter"? While the Daily Express is cheering the return of the Blue Passport to the rafters. For most people capable of abstract thought, this is a mystifying detail, the importance of which to their opponents is utterly baffling. Of course, I am a remain "ultra". But I did swim in the same intellectual Milieu as the Brexity-Trumpkins for decades and know many serious Brexiters personally. Having spend decades rationalising the EU-obsessed madness of the Tory right as a harmless eccentricity that they don't really mean, I do have, with hindsight, some understanding what these creatures think.

Why does the passport matter?

For the Tory Brexiter, the underlying issue is Sovereignty. They object violently, strenuously and on principle to ANYTHING that comes "above" the Crown in Parliament. The jurisdiction of the ECJ is for them, an insult to the courts and other institutions of the UK. The idea is offensive that any law-making organisation, especially one that Jacques Delors told the trades unions is basically for stopping the Tories Torying, could be "supreme" over parliament.

Of course the ECJ mainly deals in trade disputes and represents an international court to settle international issues and ensure consistent interpretation of EU law. It isn't "making the law of the land" and nor is it a "supreme" court in a meaningful way as far as the average citizen is concerned because it doesn't deal with those issues. If you're up in front of the Magistrate for punching a rotter, you're not going to be able to appeal all the way to the ECJ. Criminal law stops with the nation. Appeals of bad people going up to the European court of Human Rights on seemingly spurious grounds get funnelled into this narrative (shhh, I know), so the impression is obtained that "Crazy Euro-Judges" are "over-ruling parliament", and demanding prisoners can vote or should be allowed hacksaws to avoid trampling on "Human Rights" or whatever the tabloid outrage du jour may be. This then reinforces the narrative that the EU is "anti-democratic" and "makes all our laws". And once you have this narrative, flawed as it is, it's jolly easy to amass an awful lot of corroborating "evidence" because the Tabloids spent 30 years deliberately feeding it.

Sovereignty vs Influence; there is a trade-off. The UK, broadly, wrote the Financial services legislation for the entire continent. In return, the Continent got access to the only truly global city in Europe. The French did this for farming and got the CAP, while the Germans got the Eurozone's interest rates and got to destroy Southern Europe. The EU which contains (rather like the UK and trade negotiators) no-one who CAN write decent financial services legislation legislation, because most of those people are British. Thanks to Brexit, the quality of the legislation on financial services will go down, both in the UK which will be compelled to have regulatory equivalence to keep banks' access to the single market and the EU. The UK will have become a rule-taker rather than a rule maker. I fail to see how this reclaims "Sovereignty". The organisational source of the legislation will remain unchanged, but we loose any ability to influence, let alone write it. Multiply this catastrophe across an economy and you see why the "sovereignty" argument against EU law is, on any rational basis, stupid.

The parliament, the very existence of which takes on the aspect of a supranational government in waiting, rather than a simple means to have democratic oversight of an organisation which employs fewer people than Manchester city council, distributes about 1% of GDP and writes trade law. This unwarranted grandiosity once again suits both the Brussels apparatchiks, and the simian oiks of UKIP whom the British public sent to Brussels as a mark of the National contempt for the institution. The parliament is, to my mind is a risible little potempkin affair, barely worth considering,

So there's the error. Back to the passport.

The International Civil Aviation Organisation sets the dimensions, so the writing was on the wall for the old British hardback passport, fabulous though it was, it didn't really fit in the back pocket of your trousers.  However once you believe that the EU tentacles are slowly creeping into institutions to turn you into a province of the "EUSSR", then you start to see this everywhere. The EU is foolish to seek the trappings of a national Government before they had built a demos, and absent any desire for it from the people. Symbols matter. The UK doesn't have an ID card. So when Brits talk about nationality they might say "Australian passport-holder" rather than "Australian citizen". I am not sure if any other nationalities use this formulation. The passport is slightly more than a document. No? Try losing one abroad.

The EU resolution on Passports is here. For anyone who thinks the EU "made" the UK have a Maroon passport, here's EU Croatia's. .

The EU suggested the Colour be harmonised and the words "European Union" be put First. At the top. Above the crown, First. Symbolising, perhaps inadvertently that the EU was more important than the nations. And there you have it. And no-one working on it thought to object. Changing the colour of the passport was a key symbolic gesture that irritated many people, and reinforced an utterly false narrative, to no end or benefit to anyone. There is simply no need for European Union passports to be uniformly coloured. It merely satisfies the bureaucrats' desire for order. And it is my belief that it is this symbolic bureaucratic exercise in territory marking by the EU that revealed, and still reveals, a fundamental disconnect between the Brussels Panjandrums, the people of the EU and the British in particular. The Eurocrats want a Federal Europe with the EU as a Government. The Nations, broadly supported by their governments don't, and have resisted any attempt.

The EU hasn't made Britain less "sovereign". All EU law, necessary to trade with as little friction as possible, is of the type that by whom it is written doesn't matter. With trading standards does it really matter WHAT they are, just that they're as universal and consistently applied? I don't need to tell you that it was never illegal to display prices of potatoes in Lbs and Oz, just that you HAD to display the price in KG and g too, in case any Frenchmen walking through the market didn't know how many Lbs are in a KG. I don't care who writes the regulations for the import of Duck eggs, just that it's done.

But there it is. The Brexiters shooting with the accuracy of a semi-trained recruit who's just dropped LSD at every figment of their fevered imagination, egged on by equally deluded fantasists who still think they're creating a Federal United States of Europe. These two groups of lunatics needed each other. And so, the passport, with 'European Union' at the top was barely noticed on the continent, but seemed to some Brits as evidence the EU was after their democracy, their identity and their Freedom. However stupid this belief is, a Blue passport could've been delivered cheaply as a quick Tabloid-Friendly win for Cameron and such was the narrow margin, it would have probably been enough.

Rosencrantz and Guildenstern are Dead.

By Jackart ([email protected])

Wednesday saw my 40th Birthday, and to celebrate I went to see Tom Stoppard's brilliant Rosencrantz and Guildenstern are Dead at the Old Vic with a Chum. While Daniel Radcliffe & Joshua Maguire lead, the show is stolen by a magisterial performance by David Haig as The Player, a sort of luvvie-pimp-cum-impresario who holds the whole play, in its absurdity, together.

The play is Hamlet, seen from the point of view of two minor characters, Rosencrantz and Guildenstern, old friends of Hamlet's. The hapless pair spend the play wondering what they're doing and why, having been recalled to Elsinore by Claudius to find out why Hamlet's being such a dick, moping about and talking gibberish to himself ("to be, or not to be..." etc). They are eventually betrayed by their friend, who suspects them of working for his uncle which they are, sort of.

The play is therefore a meditation on the futility of existence, and the limitations of people's personal agency. Most people get on with their lives, as bit parts in a greater drama, not really sure as to the direction of events, or even of the past. After all, what have Rosencrantz and Guildenstern got to go on, but what can be gleaned from a few words of Shakespeare's, as metaphor for everyone's flawed and self-serving memory. Any interrogator or detective will tell you about the reliability of eye-witnesses and the difficulty of establishing the truth.

From everyone's point of view then, even when we're at the centre of events, most of the action is happening offstage. There will have been some point at which you could have said "no", but you missed it. Then you die.

If you can get tickets, do so.

Minimum Wages, Immigration, Culture and Education.

By Jackart ([email protected])

Net migration to the UK has run at hundreds of thousands a year for decades, of which about a quarter since 2004 has been "A8 countries", Poland, the Baltic states, Czech Republic, Slovakia, Slovenia and Hungary, another quarter from 'Core EU' and the rest from non-EU countries, mainly India, Pakistan and West Africa. 13% of the population of the UK was born overseas, of whom over 2/3rds are non-EU migrants. This is an unprecedented migration to the rich world from the poor, and It's not clear from this EU migration is the underlying problem. The Poles will integrate fast, and leave imprints on the culture like a higher incidence of catholicism, bigos (a stew of meat and Sauerkraut) and some hard-to-spell surnames. They're often better educated than the natives, and work harder.

In general the view I've taken over the years is that minimum wages are a bad thing, arguing that they are mainly paid for by the people who otherwise wouldn't get a job at all. Only a job can lead to a better job, and if people are unemployed for a long time, they often become unemployable. So by this logic, keeping unemployment down should in the long-run be better for the poorest.

But, there is a trade off. When I grew up, late '80s and '90s, I cannot recall seeing cars washed by hand. When my father wasn't exploiting child labour by getting me and my brother to do a rubbish, half-arsed job for which we expected to be paid handsomely, we went to see the "blue Dougals" at the petrol station. The UK as a wealthy country, had substituted Capital for Labour, and cars were washed by big machines at every petrol station. But a team of a dozen hard-working and cheerful eastern Europeans can set up a car-wash, do inside and out for very little capital outlay - a jet washer, and some sponges, so when the EU accession countries citizens moved to seek work, this is what many did. The car wash machines were gradually removed and replaced by people. This is the opposite of progress.

Let's take a step back and look at the big picture.

Europe's wealth, it's vitality, its progress didn't spring from European individual or cultural superiority. It started when half the population was wiped out by Yersinia pestis in the 14th Century. There was a certain amount of luck - the same event increased the power of the landowner in Rice states and in pre-feudal societies farther East, but in Northwestern Europe, this created a shortage of Labour, and the peasants rose up a generation afterwards to demand higher wages from their lords. When this happened in Italy, the energy was put into sculpture of the nude male form, and was called "the Renaissance". When wages rise, it makes sense to build machines rather than employ labour, which has a virtuous feedback loop: skilled people running the machines drive up production, and become richer, which creates an incentive for further innovation. More widespread desire for, and access to education is grease in the wheels of this, the motor of progress that led to the industrial revolution.

The opening up of America, a nation with a perpetual and long-lasting shortage of labour not only added another motor to that European culture of innovation which grew up after the Black Death, but also absorbed the excess labour of Europe. While there is a labour shortage, immigration can be managed, though immigrants in large numbers have nowhere, ever been welcomed by the people they move to. Even when the people are kith and kin, the 'Scots Irish' (in reality, families originally from Northern England and the Scottish Borders) were moved on by the Germans and English who'd already settled the East coast. They ended up in Appalachia.

It's clear, then in the short run and in aggregate, wages aren't "driven down" by migration in a market economy. Part of that, in modern times may be due to the minimum wage, which protects some of the people most vulnerable to substitution, but also the 'lump of Labour fallacy'. Immigrants, especially young workers with families bring demand as well as supply and these things more-or-less balance. They aren't "taking our jobs" but they are changing the nature of jobs available. And the vast supply of excess labour from the subcontinent, africa and the poorer bits of Europe is not exactly an incentive to invest in productivity-enhancing machines, as the car-wash example shows. The mass immigration from the poor world has the potential to stall the western motor of innovation and may contribute to wages not rising as far as they might, especially for the lowest skilled workers.

The UK has a problem with productivity. UK employers have got good at employing the excess Labour of a serious chunk of the world, UK wages have been flat for a decade, and these things are linked. So the Chancellor is hiking the minimum wage in the hope of good headlines, and to incentivise investment to drive productivity. So. What effect will this have on immigration. Will it draw more migrants to the UK hoping for higher wages, like European immigration to the USA, or will it price low-skilled immigration out of the Labour market and allow the motor of progress to continue?

Splits that used to be geographic - some countries were rich, and others poor and the movement between the two was rare, is moving to one where there are still two countries, it's just the divide is social, educational, and cultural. You have a global, liberal, free market culture, which values education and novelty. And you have national, 'c' conservatives who just want their own culture, don't care about education all that much, won't move to find a job, and expect to be looked after who stay put and resent incomers. And the latter are disproportionately annoyed about foreigners moving into "Their" neighbourhoods while it's the former who have more to fear in the short term from highly skilled competition, minimum wages see to that. And if minimum wages rise far enough, low skilled workers will not be able to get jobs and they will stop coming to the UK. The problem is, the lowest skilled people are often native. The cost of a raised minimum wage will be borne by those least able to cope.

If we are to avoid society fracturing permanently into Morlocks and Eloi we do need to manage migration, to keep that motor humming. We cannot let the world come at will. But there was no need to pull up the drawbridge against EU migrants who always looked like collateral damage to me.

It's not all about economic self-interest, nor is it wholly naked in-group preference (what educated, open minded people call "bigotry"). It is the interplay between the two. Ultimately the stagnation of UK wages over the last 10 years isn't due to migration, but the recovery from a balance-sheet recession of 2007-9. It's the feeling of ennui caused by a decade of stagnation which has caused the anti-immigration nonsense, the rather blameless Poles have just become a Piñata and for a population that was persuaded to lash out at the EU when they really wanted to lash out at "the Muslims". The tragedy is all this happened just as we were getting back to normal.

Nicola and Theresa. Phwooar.

By Jackart ([email protected])

The Daily Mail's headline "Legs-it" about Scottish First Minister and British Prime Minister Theresa May's shapely legs was pathetic. But remember, the Mail is written by women, for women, and women judge each other, all the time, harshly and vindictively. Judged especially harshly are women more accomplished or better looking than the average Daily Mail reader.

To call this "sexism" is to miss the point. This isn't about women being held down by sexist male tittle tattle. Clearly, two of the most powerful people in the country haven't been held down in any meaningful way. Any executive head of Government is fair game for any and all criticism. What these women have done is rise above the level at which society normally seeks to protect women from abuse.

Male politicians are made fun of for their appearance and clothing all the time. It's the sea men swim in. Whether it's Donald Trump's expensive, but ill-fitting suits and too-long ties like he's stepped out of a 1980s pop video caricature of a businessman, or Cameron's forehead, or the fact that middle-aged men are always assumed to be repulsive, this abuse is normal.  The ridicule a male politician faces when he's seen in public wearing anything other than a blue suit is extraordinary. From Tony Blair wearing a clean barbour, to William Hague's baseball cap or Cameron's beachwear, there's a reason male politicians dress identically. When women's clothing (far more interesting by the way, than the sober suits of most male politicians) is commented on, it enables a personal brand to be created that much easier. Theresa May's shoes are like Margaret Thatcher's handbag. True, women do have to think harder about their clothing - too much leg, cleavage etc... and you immediately invite scorn (of other women, mainly), but the fact the female wardrobe stands out against the endless blue/grey suits and red or blue ties of the male is as much an opportunity as it is a minefield.

Any comment about May's shoes, for example is part of her deliberately curated brand, and shoe-designers are falling over themselves to get their products onto her feet. This isn't sexist. Women like shoes, and there's no reason why Theresa May shouldn't have fun with them.

Lower down the pecking order there's a taboo against men commenting negatively on a woman's appearance, lest you hurt the poor dear's feelings. Yes male 'locker room' banter will discuss who's attractive, but it's rude to do so in front of women and by and large, gentlemen don't. Women don't typically have these conversations about men in earshot of men either, but describing men as "revolting" or "creepy" is so normal as to be unworthy of comment, and completely unnoticed. May and Sturgeon have risen above this social protection, and are subject to the same rules of engagement as men are. i.e that if we have feelings, tough.

These women are grown-ups doing important jobs. If you think the Mail's light-hearted front page is an insult to them, you're an idiot. Of course Sarah Vine who wrote the thing, knows exactly the response it would get, howls of idiot outrage from the usual suspects on Twitter, and from Sturgeon herself. This allows the paper to swat the complaints aside with contempt. This signals to their readership that the Mail is on their side against the bien-pensant left with their idiotic & totalitarian outrage about human trivialities. May by rising above it, does the same. The Mail is one of the Best-selling papers in the UK, and one of the world's most visited "news" (ish) websites. Who won that exchange?

The po-mo left, obsessed with identity politics, used to being able to bully dissenting opinion down STILL hasn't got the new rules of the game. Someone's pointed out the Emperor's naked, but he's still acting like he's in charge and hasn't noticed the mood's changed. Yet.

Completely unrelated, but thank you to the Anonymous commenter who wrote this. It cheered me up.

On Class, Culture and the New Politics

By Jackart ([email protected])

The two tribes of politics, broadly the Tory and Labour parties divided over the 20th Century principally on the matter of economics. Simplifying: Tories preferred market solutions to state planning, and preferred lower taxes and less generous state spending.
The Labour party, which when it abandoned clause IV, surrendered on the economic question, not coincidentally a few years after the Berlin wall came down.
As a result, the great battles since then have been essentially cultural. Gay rights, racial integration etc. The confusion stems from there being no consensus within the Tory or Labour tribes on these issues. Plenty of Tories are happily socially liberal, many of the Labour tribe are socially conservative, especially when you look at voters rather than representatives.
Which brings us to the tribal division of Britain: class. The middle class: liberal, internationalist, universalists; vs a working class: authoritarian, insular and particular world view. The former is comfortable with diversity and immigration. The latter isn't. The former's kids live a long way from home, and move for work, the latters kids live in the same town and expect the work to come to them. The former don't speak to their neighbours, the latter care what their neighbours do and think. These labels are correlated roughly with, but independent of, economic status. It's possible to be middle class, in a local-authority home living on benefits, and working class, earning seven figures and living in a manor house. (Though it's likely these people's kids will change tribes)
There are elements of these cultures in all major parties in the UK, but the rest of us rarely communicate with people from the other tribe. The people you have round for dinner will most probably be from your tribe. Half the country holds its knife like a pen, yet none have sat round my table. When the two tribes meet, it's awkward. Those difficult bottom-sniffing conversations seeking common ground are easy to conclude when two members of the same tribe meet, and difficult when you meet the other half.
There have always been working class Tories, because much of the working class is as comfortable with the certainties of heirarchy as a shire Tory, and doesn't much care for this freedom and opportunity nonsense, preferring a better boss instead. And it's interesting to watch the Tories dangle the protectionism and insularity the working class has long demanded. Middle class labour fabians and the working class methodists have always sat uncomfortably together. Brexit has shattered that coalition, the labour party has been handed to the idiot socialists and will die, unless somehow moderates can oust corbyn before 2020.
Which brings us to the Tory coalition. The high-Tory have promised the old certainties back to the white working class. Meanwhile, middle-class liberals who make up most of the parliamentary party are distinctly uncomfortable with much of what is being done in Brexit's name, but will stick with the Tories, because they offer the promise of power, and however dreadful Brexit is, Jeremy Corbyn is worse. A new coalition is being forged between the Tory squirearchy, and the Working class based on nationalism, social conservatism and heirarchy, directly taking Labour's core vote. This is why UKIP, a working class movement that thinks it *is* the conservative party, apes the style of a country gent. The working class have always got on well with the Gentry, sharing sociailly conservative values. Both despise the middle class.
Brexit split the country down a line more on class values, split the country and handed it to the socially authoritarian party. Whether this is the new politics, with the Tories moving from being the middle-class party to the working class party, as the Republicans did after the war in the USA, or whether the middle-class will wrest back control over both parties in time waits to be seen.
I suspect unless May softens her tone, and thows some bones to the liberals, her coalition will only survive until there's a credible opposition. A more appropriate division of politics would be a ConservaKIP'ish alliance of WWC and high-tory squires, vs LibLabCon middle-class liberals. Therea May seems to be actively seeking it.
Over the Channel, Emmanuel Macron and Marine Le Pen exemplify this split. The candidates of the parties of left, Socialists; and right, RPR are likely to be eliminated in the first round. Macron is likely to win comfortably. His movement 'En Marche!' was only formed a year ago. There's a lesson for British liberals there.

Tories have profoundly damaged the UK. You Should Join the Tories.

By Jackart ([email protected])

2016 happened because decent people don't join political parties, leaving the business of Government to socially inadequate, physically repellent gits with an axe to grind*. In normal circumstances, this makes politics easier for genuinely impressive people to progress through the flotsam of monomaniacs. To be a Grown-up in the Tory Party 1997-2010 was to be able to consider an issue beyond the EU. For Labour it's all about not dreaming of Strike Action by "the workers". Thus the Liberal Centre consolidated a hold on the country, but became complacent to the poison seeping into parties even as the Smug centrist consensus made everyone fat and rich.
There has been a steady, and persistent hollowing out of the political parties. Labour used to be allied to a Trades Union movement that delivered services - health insurance, education and so forth to its members. The Trades Unions of Pre-War Britain where an overwhelming force for good. Atlee's welfare state nationalised all the good the Trades Unions used to do, and so corrupted both the principle of welfare (now far, far from Beveridge's original vision of low, universal payments like Child benefit, topped up with contributory elements) and the Trades unions which became a mere tub-thumper for more state spending. This left the Labour party with the sole purpose of defending a welfare settlement that is not under threat, and a Trades Union movement whose purpose had been nationalised so simply became resistant to all and any reform which might make the system as is function better; unions a mere vested interest of public-sector workers. This isn't a place where people capable of holding more than one idea at a time feel comfortable, and so the Labour party was colonised by people who think not shaving is a political act.
This malodorous and poorly groomed cancer has destroyed the Labour party. It's over, there's no point being in Labour unless you're a Identity politics obsessed Corbynite who laments the end of the Soviet Union. 
Labour, 2010-Present
The Tories at least had the sense to try to vomit the most toxic of their nutters into a bucket marked UKIP, a bucket the dog is unfortunately returning to. The Conservative party my Grandfather joined (from CPGB, as it happens, Labour even back then were cliquey dick-heads) used to be a forum for the upper middle class (and anyone who aspired to join them) to meet, mate and do business. But the horrible young Tories of the '80s, and the Euro-nutters of the '90s meant that by 1997, the Tories were only really suitable for people who were prepared to discuss "Europe" endlessly in ever-more foaming tones, persuading themselves that the EU is a historic enemy like Napoleon, the Kaisar, Hitler or the USSR. To their credit, the Tory Leadership has long known what to do. All David Cameron ever asked of his party was to "stop banging on about Europe". They couldn't stop picking at the scab, and the result is a catastrophe that has already crashed the Pound, weakened the UK (perhaps fatally) and may yet cause a political crisis in Europe and embolden Putin to start rebuilding the USSR.
Tories, 1997-2010
The more say over policy and leadership given to the membership, the more the membership has dwindled (unless, like Labour, the membership criteria are designed to invite entryism for the purposes of choosing a leader - by people who've been quietly loyal to the Bennite project for decades). Giving members a say in who leads the party is absurd. Who the prime minister is, should be a matter for MPs, and MPs alone. It is they who must give the Prime Minister a majority and internal party democracy risks, well, exactly what has happened to Labour. 
However, that Rubicon has been crossed. Party members now expect a vote on the Leader. The question is what to do about this, and the answer is to choose to be a member of a party at all times, hold your nose if necessary. Do NOT identify with the party, but consider which is best placed to advance your objectives. At the moment, the foul bigots, monomaniacs and morons of UKIP are being re-absorbed from a position where they can do little harm beyond foaming at the mouth and masturbating to Daily Express editorials, to one where they can choose the next prime minister, and Mrs May isn't a healthy specimen. The ex-'KIPpers chance may come to choose their PM sooner than expected.
I'm often asked "How come you're still a Tory?"  
Were the Liberal Democrats stronger, I'd be considering them, but I don't trust them on electoral reform (about which they're as silly as Tories are about Europe). But as the Lib-Dems are so far from power, I don't see the tactical benefit of leaving the Tories in a huff, and I broadly agree with the Tories on everything except Brexit. What I'm worried about is the 'KIPpers who're returning to the fold. Unless you want a foul, divisive and ignorant Brexit headbanger to replace May in 2023 or so (Gove for example), Join the Tories, because thanks to Labour's meltdown, Tories and Tories alone will choose the next PM. All not joining a party does is strengthen those (*we) weirdos who still do. Labour moderates, disgusted by Corbyn should cross the floor to the Tories or Liberal democrats, instead of flouncing off to the V&A and opening the way for UKIPish Brexit-o-twats to fight and win a by-elections under Tory colours. Were Tristram hunt now a Tory, not only we could soften this brexit idiocy but also signal just how broad a church the Tories are. 40% of Tory members voted Remain. The tribe that needs to understand the value of a bit of entryism is the liberal centre, who need to abandon any loyalty to their Parties and go to where the power is. The Liberal Centre is complacent because they have for so long occupied the ground sought by all parties, they've not really had to compromise. 
At the moment the business of Government is, and will be for the foreseeable future, a Tory-only affair. That need not look like Nigel Farage, but it will, if Remainers abandon the Tories entirely.

The End of A 'Belle Époque'. 1991-2016.

By Jackart ([email protected])

The interlocking webs of policy which 'politics' seeks to knit are complicated. Whole books can be written on how two individual policies interact. PhDs in Economics are awarded for small snapshots of the whole cloth. Most people don't have the time to keep abreast of developments or read sufficient history to understand why some policies are bad. Thus, people use heuristics - rules of thumb - to make decisions  about that which they aren't expert. "Is this person trustworthy" is a key issue, and we tend to overweight the opinion of those near us. "He is my brother, and I say he's ok" says a friend, you are more likely to believe a mutual friend, than the opinion of a stranger on the same issue.

In the evolutionary past, such a question was a matter of life and death. People only really had to trust those with whom they shared a close genetic relationship. Since the development of agriculture, we've been steadily widening that circle of trust. The wider you spread that circle of trust, the richer your society will be. Even before it had a name, Free market economics allowed people to become blacksmiths, knowing others have water, food, shelter and so forth covered in return. More specialisation, greater productivity, means greater wealth.

Eventually, this requires trust in people we've not met. Towns' food supplies require that farmers unknown and distant supply the basics of existence. Nowadays, It's unlikely the west could quickly supply all available plenty currently manufactured in China. Nor could China supply quickly the complex components and tools shipped from Japan, Europe and USA. Both China, and "the west" are richer from the exchange. And yet, we still don't trust "globalisation".

Most persistent fallacies in political economics are the result of simple policies that appeal to some base heuristics, but which when applied to the larger and wider society, fail catastrophically. Thus egalitarianism in one form or another pops up every 3 generations or so and succeeds in making everyone equal, but some more equal than others, and even more, dead. Then nationalism comes along, and says it's all [another, arbitrarily defined group of humans with slightly different modes of speech] fault, leading to more waste and piles of corpses. And even when the results aren't catastrophic, we seek out the views of those who agree with us on say, Nationalism to inform our opinion on, say, whether or not people are responsible for climate change.

Which political tribes stumble into being right or wrong on any given issue appears arbitrary, because no-one's asking for the evidence before they decide on the policy. Instead of asking "what's right", we're asking what's popular (amongst the coalition of tribes that voted for me) right now. That an opponent comes out with an identical policy, for different reasons is reason enough to oppose something, forgetting completely prior support for it. After all, whatever [another political tribe] thinks must be wrong, right.

The Labour party opposes ID cards. The Labour party has always opposed ID cards. The Tory party is for the Free market and was never in favour of the Corn Laws. We have always been at war with Eastasia. Perhaps if we could think for ourselves rather than just accepting tribal dogma, we'd get better governance. But none of us have the time. So "Democracy" is merely a means to give temporary permission to one coalition of tribes to push through dogmas over many issues, until either the population notices, or the coalition of tribes breaks up, and the electorate takes a punt on the other tribe's prejudices for a bit, and then gets on with whatever they were doing before.

Society ultimately advances by eliminating prejudices it's acceptable to hold thus widening the circle of trust, and increasing riches. By falling back on ancient heuristics to answer the wrong question ("who's fault?" is the wrong question) 2016 democracy has delivered the worst political outcomes on a broad front, as a result of which, we are poorer, and more likely to start fighting as a result of the collapse in political trust we have seen over this year. The post Cold-War 'Belle Époque', which saw half of humanity, 3 billion people, lifted out of poverty, is over.

Idiots cheer.

Boston Dynamics and The Late Sir Terry Pratchett

By Jackart ([email protected])

Everyone knows how driverless cars will work: they will be like ordinary cars, except you read a book rather than acting as pilot. And so, people's understanding of what a technology can do is clouded by what the old technology it replaces does. Which means people without imagination, Head of IBM Thomas Watson, for example, say things like
"There may be a world market for maybe five computers"
and get it wrong. In 1943, computers were used for cryptography, and that's it. (At least he knew what a "computer" was, which few did back then). Predictions are hard, especially about the future. But it's probably worth noting here that the famous World Wide What? front page of The Sun, was in fact rather a good a spoof, by The Sun.

Boston Dynamics makes robots.


Who needs Robots? Well, like computers or the internet or driverless cars, the technology is coming. And it will change people's behaviour in many, unpredictable ways. For example, mobile phones were conceived as portable analogues for the phone on your desk or in your hall. SMS text messaging was added as an afterthought, but became THE dominant means of communication. Calling someone is now rude, often you text first to see if a call would be convenient. Who (apart from mums) leaves voicemail messages any more? Few predicted that change in our behaviour. The smartphone is now ubiquitous, and is more about accessing the internet than calling friends, but wasn't imagined before the internet, Except by Douglas Adams (and John Brunner of whom I'd not heard until I discussed the issue on Twitter). Driverless cars will be as close to the car, as the car is to a buggy and four. And robots, when they become ubiquitous, will be unlike anything we've considered.

I look at Boston Dynamics Robots, the big dog is conceived as a load carrying mule for soldiers on rough terrain, and I think of The Luggage, Rincewind's inscrutable companion on the discworld. I suspect everyone will one day have a robot the size of a dog to carry daily necessaries, following them round. You could send your luggage to someone else, by smartphone app to pick something up. Your luggage could take your shopping home and collect it from the store for you. Large luggages could be sent on ahead with bags. Small luggages could replace handbags and briefcases. The labour and time saving would be vast, spawning whole new areas of employment, servicing and modifying your faithful electronic companion and providing for the opportunities they create to effectively be in two places at once. Freed from the ownership of motor vehicles by the fact we'll be taking taxis everywhere, our Robot luggage will perhaps become the next status symbol around which society is built, replacing the car.

Like cars, I suspect the battery technology will be the limiting step, and like cars, I suspect the fuel cell will be the answer. Small fuel cells will one day power your smart phone too.

But think about the opportunities for people from smart phone. There are tens of thousands of app designers round the world now, a job that had barely been considered as recently as 2007, when the first iPhone was released, and that is similar to how the jobs which will be taken by the robots, will be replaced. That is why people who fear of a "post-jobs" future were wrong in 1816 and are still wrong 200 years later. The world's only limitless resource is human ingenuity.

Anway. I for one welcome our new robot overlords, and this guy should totally be locked up.


Fidel Castro is Dead. (Some of) his Legacy will Live on

By Jackart ([email protected])

Let's be clear, Castro was a murderous bastard who impoverished his country, and whose views on homosexuality and on the importance of brevity in speeches were nothing short of horrifying. It's true, Cubans do have access to better healthcare than many countries of equivalent GDP per capita, and if I had to choose a Communist hell-hole to live in, it'd probably be Castro's Cuba. But the Cuban healthcare system is not the fantasy of western dewey-eyed left-wingers, and Cubans often are excluded from what excellence there is, as it's one of the few means the country has of generating hard currency earnings. Rich foreigners get the best doctors, and more are exported to other successful "progressive" regimes like Venezuela.

"But he was an anti-imperialist". So why were cuban troops in Africa in support of the USSR, which was by any measure or definition an Empire? Anti-Imperialsim is just the justification leftists give for knee-jerk anti-Americanism. And the flood of people risking death to reach the USA should tell you all you need to know about the relative merits of America's and Cuba's system.

Contrasting the attitudes of the USA to Castro, to their attitude to equally murderous bastards like Pinochet misses the point. The US embargo on Cuba is one of the legacies of the Cold war, kept bubbling by the politics of Florida, home to so many Cuban-Americans. There is no Doubt that the US blocade has impoverished Cubans, and that with the fall in the Berlin wall and the collapse of the USSR, such an embargo was no longer justified. However politics are what they are. Fidel Castro's death provides an opportunity for further thawing in relations.

The USA supported "our son of a bitch" all over the world, turning a blind-eye to horrific human rights abuses, though often (albeit less often than we should) working behind the scenes to try and mitigate the worst behaviour. Thatcher is rarely credited with preventing the execution of Nelson Mandela, but she consistently urged Mandela's release, even as she argued against sanctions and branding the ANC "Terrorists". This is one reason why the cold-war piles of dead of Nasty fascist bastards are usually lower than those of nasty communist bastards. I also think the point made by CS Lewis holds. Right wing dictators rarely pretend to be GOOD, making their appeal more on effectiveness.
"The robber baron's cruelty may sometimes sleep, his cupidity may at some point be satiated; but those who torment us for our own good will torment us without end for they do so with the approval of their own conscience."
And one by one, following the collapse of Communism, the support from the USA and its allies for these disgusting regimes was withdrawn. Apartheid South Africa, much of South and Central America saw right authoritarian regimes fall. Genuine democracies were often created in the rubble. The USA didn't support dictators because the USA is an imperialist power, but because it IS a power, and with that comes responsibility. They judged at the time the alternative, Communism, was worse, and represented a genuine existential threat to the USA and its core allies.

This is why for example the USA and its allies mostly support the Regime in the Kingdom of Saudi Arabia. The Saudi regime is repellent, but given the probable alternatives wouldn't be nice, liberal, democratic-minded progressives, they'd be salafist nutcases who'd have access to billions of dollars of oil revenues and the legitimacy of being the Guardians of the Two Mosques. The House of Saud is all that stands between the West and a plausible salafist caliphate with sufficient legitimacy and money to one day threaten the west. We'd rather do business with nice, stable democracies under the rule of law. But seeing as we cannot do to every country on earth what we did to Germany in the late 40s and 50s, we make the best of the options given.

Castro appeared to be a true beleiver in Socialism, so he refused to recognise his philosophy had failed, and his island limped on, a socialist throwback in the age of globalisation. The current poverty of Cuba is partly America's doing, but mostly due to decisions made by Castro himself, policies which set him and the Cuban people at odds with the regional hegemon, in persuit of an evil idealogy. Fidel Castro was on the wrong side of history, and his people suffered because of his stubborness. Now he's dead, it's Cubans turn to make the most of the positive legacy - Cubans are the best-educated poor people on earth, and the mighty economy of the USA is right on their doorstep. There is going to be a lot of money to be made there, and this time, for the first time, Cubans will share in it.

Hail, Trump! God-Emperor of the Alt.Right

By Jackart ([email protected])

And Let's be honest, he's ghastly and despite brown-nosing by Nigel Farage, he's no friend of the UK's, because he doesn't value anything the UK brings to the table. Rumour has it, he asked Farage to intervene in an offshore windfarm decision affecting his Scottish interests, which suggests he doesn't understand the concept of 'conflicts of interests' when in elected office.

This further suggests Trump will attempt to use the office of President to enrich himself, rather than doing so after leaving office, as is accepted. All this is rather feudal; the office holder as gold-giver, distributing patronage and receiving tribute. He's an entertainer and showman, which hails to an even older tradition of politics: that of Imperial Rome, where emperors used state coffers to enrich themselves and their clients,while keeping the mob quiet with bread and circuses.

Donald J. Trump is psychologically unsuited to office in a mature democracy. He is thin-skinned, autocratic, insecure, ignorant, and completely without any understanding of the levers of power he now wields. Much like (later caricatures of?) Nero, Commodus or Caligula.

Despite (or perhaps because of) this, the adolescent losers of Alt.Right see Trump as a God-Emperor (no, really they do. Video surfaced today of people making Roman Salutes, saying "Hail Trump", and distribute Memes based on Games Workshop's futuristic figure-based tabletop wargame, Warhammer 40,000 where humanity is defended from Chaos by a psychic God Emperor). If Trump is Imperator, then the Secret Service is a Praetorian Guard. And how did the Praetorian serve Commodus, to pick one example?

Trump might, were he capable of reading a book, muse on the fact he's surrounded by armed men sworn to uphold the Constitution of the United States of America, and defend it from Enemies DOMESTIC and foreign. Thankfully, the USA is a mature democracy. Where once armed men acted as kingmaker, courts now do. For the simple reason Ignorance is no defence, and the fact that Trump's loathing of 'Washington' is fully reciprocated, I find it unlikely that Trump will survive his term alive and unimpeached. Unfortunately I cannot find odds on a Trump impeachment before 2020. Perhaps it's a racing certainty.

Sexism and the Loss Aversion Heuristic

By Jackart ([email protected])

Men are physically stronger than women, respond quicker to physical training, and suffer less injury under physical stress. Men are more robust, suffer less morbidity than women in almost all phases of life. Obviously these things exist in a normal distribution, but men's distributions are typically platykurtic - there are more men in the tails of the distribution than women. Thus, even where the means are near identical, such as intelligence, you'd expect to see more male geniuses, and imbeciles among men than women, who're more concentrated around the mean. Feel like taking issue with any of these statements? Then you might as well be a creationist.

Men are more accepting of risk, and will prioritise pay over flexibility. So you'd expect men to make up the majority of soldiers and miners and race car drivers. It also means you'd expect to see more men make up corporate boards, everything being equal. More men are more drawn to the cut and thrust of business, and are more likely to prioritise work over other commitments. Women value stability and flexibility more highly than men. This means women, on average don't choose to make the effort necessary to climb the greasy pole. Women (sensibly, in my view as I have done the same) are more likely to think other things more important.

Thus, the brute fanny-counting of media analysis of sexism and the "gender pay gap" ignores female choices and attributes, thus denigrating both women and men for the choices they make. Women for their part see their contribution to society in caring professions such as medicine (more doctors are now women, as well as nurses) and teaching denigrated because these women aren't seeking to be at the top of BAE systems, or whatever. Likewise men, when they see women are going to hired so they form 50% of the workforce of a mining company feel devalued for their skills and attributes because the only way BHP Billiton could make 50% of its employees women is by discriminating against the larger number of men who will apply to drive a bloody great truck miles from nowhere in a bloody great hole in the ground in the middle of a bloody great desert surrounded by nothingness, and live in towns whose bars serve tinnies through wire grilles, and where kicking each others' heads in represents the primary saturday night entertainment.

But worse, by forcing women into traditionally working class men's jobs, you further alienate and disorientate a bit of society which already feels put upon, neglected, belittled and scorned. This is why they voted for Brexit in the UK, and in the USA, will vote for Trump. Working class men are lashing out, because their raison d'etre, to provide for their offspring, has been nationalised, and no other opportunity for them has been provided and they as individuals have too often been thrown on the scrap heap, derided as workshy deadbeats. The working class used to have pride in providing for their family and often doing dangerous, dirty jobs to do so. Opportunity isn't "equal access to university", for which working class men is a middle-class rite of passage, but decent jobs that will allow them to support their family, but which is blocked by the petty credentialism that values paper qualifications over experience and dumb diligence over inspiration.

That loss of pride is agonising. And people mourn loss far more than they celebrate gain. The aim of this post-modern obsession with equality of outcome therefore might as well be to make men despise themselves and women feel inadequate for the inclinations their biology and society has fitted them. Men become 2nd rate women, and women become 2nd rate men. By all means allow everyone to seek their own path, but to imagine men and women will sort 50/50 everywhere is totalitarian in its foolishness and cruelty.

The EU Deserves what's coming.

By Jackart ([email protected])

One of the main reasons to oppose brexit is that the UK doesn't benefit from being "out" should the EU collapse. A disorderly break-up of the EU would damage the UK, independently of our status in or out. (any comment saying "it's better to bail early" will be deleted as a failure of comprehension read the post, please, it's that argument I'm dealing with). Indeed preventing a disorderly collapse should be the UK's priority. And when we were in, a disorderly collapse was unlikely. The UK kept the lid on Brussels insanity. Not only has Brexit given free rein to some of the very worst people in the UK, it also removes a brake on the insane Federasts  of Brussels.

Far from Remainers "talking the UK down", Brexiters have been doing so for decades - talking down the UK's influence in the EU to the extent we're actually thinking of walking out of the UK's proudest creation: the single market. It is now a shibboleth that the UK has "no influence in the EU", whereas the UK drove the single market, kept half the continent out of the poisonous grip of the Euro and pioneered enlargement to the east following the end of the cold war. The UK drove Russian sanctions to this day. The UK was one of the Big three and on many issues, more influential than France. The UK largely writes EU financial regulation for example (as is meet and proper).

But the EU over-reached. Voters, especially in the UK resented the EU's usurpation of the trappings of National sovereignty far more than the reality of "the laws made in Brussels" which was really just code for an underlying vision they (and I) don't like. And what is true of the UK is true of France and the Netherlands and everywhere else. Remainers like to mock the Be.Leaver's joy over the anticipated return of the blue passport. I however have long resented the words "European Union" above (ABOVE!) the crown on the front. It's like the bureaucrats are trying to rub the British People's nose in it. It's a symbol of something burning in the EU's core, which the average voter neither desires, nor trusts.

The ridiculous and unnecessary potemkin parliament with its farcical shuttle from Brussels to Strasbourg focusses the voters minds on the EU, without giving them any outlet to do anything about it. The EU looms much larger than it ought as a result of the charade of Euro elections. Democracy without a demos is pointless - what commonality do Socialist members from spain and the UK have?:

The EU was flawed, Thanks to the UK some of its worst excesses - the Euro for example were limited to countries that really wanted it. And now without a powerful country holding the reins and steering away from "ever closer union" the Brake that was put on at Maastrict and beyond will be removed. The EU will integrate itself to death, there will be chaos when the voters of Europe can take the tin-eared arrogance of Brussels no more. There was no need for all those millions of lives to be attenuated during that process. While leave voters will say "I told you so", a better analogy would be jumping out of a moving car suffering broken bones and extensive skin abrasions, but saying "it would have been worse" because the lunatic who grabbed the wheel when you bailed steered it directly into a tree.

Spending 1% of GDP to write trade and some business law could much more easily be done intragovernmentally, with a humble and small central bureaucracy. There is no need for "Presidents" and parliaments which lead to grandiose visions; visions which slam painfully, like the Euro, into the unyielding wall of reality. Unobtrusively aligning business regulation and deepening economic integration is necessary. A parliament, a flag, an anthem and a head of "state" are not. The EU has paid the price for this arrogant and pompous grandiosity.

Both the EU and UK are and will be significantly worse off as a result of Brexit. And now, just as Brexit is a bad idea that will be tested, so too will European integration. Both Brussels panjandrums and the brexiters fed off each others' fantasies. Both needed to believe integration was happening, even if it wasn't. Ultimately, the costs will become apparent to the UK pretty rapidly. The EU will suffer much more slowly. It's almost like co-operation is a non-zero-sum game, or something.

On Populism: What do we do? vs Who do we blame?

By Jackart ([email protected])

If you ask the wrong question, the answers will not work.

"Populism" is, like pornography, hard to define, but you know it when you see it. Wikipedia defines it thus
"a political ideology that holds that virtuous citizens are mistreated by a small circle of elites, who can be overthrown if the people recognize the danger and work together. Populism depicts elites as trampling on the rights, values, and voice of the legitimate people"
It's clear Farage's lauding of a victory for "mediocre ordinary, decent scum people" he was speaking in this vein. But I don't think this captures the essence of populism. Mainstream politicians "Managerialists" in the Populists' vernacular ask "how do we solve this problem". You can be a capitalist, or a socialist, believing in different answers, but at least you agree on the question. Populists aren't asking this question, but instead "who do we blame?". The answer given by Momentum and UKIP may differ: Bosses vs Immigrants, Capitalists vs the EU but the question is the same.

There's also the populists view that MPs rather than being representatives paid to exercise judgement, are delegates paid to vote on someone else's behalf. In this, Paul Mason and Douglas Carswell are in agreement. But this is simply mob rule and behind it is a fear that legislators may Go Native, if they're allowed thanks to the corrosive influence of "[insert boogeyman]" in their long-running campaign to keep the "real" people down. But perhaps legislators know best; they have exposure and access to what passes for facts in this field, and are paid to study it, maybe there's something in the idea of representative democracy after all.

It's always easier to imagine you're the victim of an elite conspiracy, subject to "discrimination" on the grounds of class or race, or at risk from being "flooded" by immigrants, than it is to answer the question "what to I do?". Whether you're running your own life, or that of a nation, what to do is hard, and one of the stresses of modern life is the extent to which people are free, which means they have to make choices. No longer can you just follow dad into the Factory. Because many suffer from crippling loss aversion, these choices are scary, which is why stupid people yearn to be led. They look for leaders who offer answers which fit their prior prejudices and make sense of a complicated world. Corbyn and Farage have made careers finding and stroking a tribe's prejudices, soothing their people's indignation against a world they feel is against them.

The reason populism is so toxic to political discourse is that in apportioning blame, they create a slipway for the launching of vastly damaging ideas. "It's all the EU's fault" leads to Brexit*. "It's all the Fat Cats' fault" and you have a country that looks like Venezuela. If you start blaming immigrants or minorities, well we saw where that went in the last century. It's also why the Brexiteers ran from office at the moment of victory. Delivery isn't in the populists' skillset. The permanent masturbatory pleasures of opposition are what they crave, always losing so they can keep telling their people the game's rigged against them. If they win, then all those inadequate people will have to start making choices and they feel completely lost again. Much easier to simmer in resentment against an immovable object which allows you to blame it, rather than yourself for your failings.

*This isn't a place for a debate on the merits or otherwise of Brexit. Any comments on that subject will be deleted.

One of the reasons for the Populist's success (please note the "one of" at the start of this sentence) is Russia on the internet. The internet allows people to form much denser ideological defences against reality. And into the internet, there is a wounded superpower, pouring poison, poison which people use as ammunition in the defence of their ideological redoubt. Putin's toxic little propaganda swamps like RT and Sputnik are manufacturing and promoting stories which appeal to the populist mindset. Notice how Racists will share RT stories about Immigrants raping white women while members of the Green party will share horror stories about fracking from the same source. Some of these stories will be true. But many are manufactured, exaggerated and twisted specifically to support any party or idea that causes problems to the democratic governments of the west. This is not a random process. It is directed and controlled by the intelligence agency which has captured Russia. Maskirovka raised to a governing principle.

One of the reasons for the UK's relative success as a nation is that up until now, we have been mostly immune from the allure of the populist demagogue. We simply don't have it in us to put too much belief in one man, whether as protagonist or antagonist. Let's hope Brexit is a flash in the pan, and not part of a widespread descent of mature democracies into populist demagoguery. We'll know in 12 months whether democracy can survive or whether, thanks to Trump, Farage and Le Pen, we're going back to pogroms and a summer "campaigning season".

Please let's stop listening to Putin' useful idiots pedalling fallacious simplicity, and start listening to fallible and all-too-human experts again. At least the experts are asking the right question.

Supporting other projects in the community

By Scott Helme

I've relied on a lot of different projects over the years that have helped me in various different ways and recently had the opportunity to start giving something back.

Running Report URI

We're lucky enough to have Michal Špaček with us on the team at Report URI and it was

IPv6-only hosting in 2020

By pdw

It’s now nearly five years since we started offering IPv6-only hosting, and what started out as a source of interesting projects for enthusiastic early-adopters has become our default for most hosting requirements. A few things have changed over the years that have made this possible: The death of Windows XP, the last significant OS with […]

A School Streets scheme at Larkrise school, Oxford?

By danny

Air pollution and road danger are among the greatest threats to children's health and lives in the United Kingdom; both are aggravated by motor traffic outside schools at pick-up and drop-off times. School Streets schemes offer a way of reducing this, through traffic restrictions outside schools during key periods of the day. Road danger and […]

Weekly Update 180

By Troy Hunt

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

If last week was the week where I felt like I was drowning in data that was still being processed, this week was the week where it came to light. Not all of it, mind you, I've still got ginormous volumes I'm disclosing but it certainly was a whole heap

Internet in a box

By [email protected] (RevK)

I have finished my cruise now, which was mostly holiday, but also some work. I did some training for my mates (mainly in C coding) and we did various coding as well (there were a few sea days). But now I am back I am making up the next version of my "internet in a box" that I take on cruises like this. I'm doing it now whilst I remember the last cruise in detail, even though my next cruise is some way off.

OK, that is not it - we have one of those, and it would be really cool if I could fit the bits in that box, but at present is is a tad larger... More like this...

So, what's in the box?
This is obviously somewhat overkill, so worth some explanation...

FireBrick FB2900

The FireBrick is a "swiss army knife" or network contraptions. It does a lot.

When you are trying to use internet on a ship you have a challenging, even hostile, environment. There are blocked ports and protocols, 700ms round trip latency (or randomly much more), packet loss at various levels, strange MTU issues, and seriously messing with TCP packets (acceleration). This can all change on the fly as you travel (the Panama trip was especially complicated).

To be clear, this is not stealing internet service - it is expensive and we pay for the premium, unlimited, steaming package for multiple devices. This does allow connection of devices that do not have WiFi or have a browser.

Whenever I take a FireBrick on a cruise we find new ways to improve it. This can be changes to handle high latency, or new features to handle some of the limitations. Even simple higher level protocols can struggle with the very high latency and low level packet loss. A lot of new features are the result of testing in this harsh environment and have benefitted the FireBrick code. Not sure I can expense my cruises as R&D just yet though, shame.

So, this alone, is one of the reasons for the crazy set up. The FireBrick can do various VPNs, UDP over faked TCP, TCP relaying, all sorts.

The main objective is to connect to the ship internet (WiFi) and provide internet to laptop or apple TV. For the apple TV to work in any expected way without regional blocks, it needs a working UK IP address in some way, and the FireBrick can do that.

The FireBrick can also monitor the connection in various ways and fall back, even to simple NAT over the ship's WiFi as last resort, and report status on an LED to make it obvious. If ever I fit this in one of those black boxes, the LED will not just blink red :-)

Aruba 501

This is a rather nice WiFi client. It connects to the WiFi and can do MAC cloning, where it will associate using the same MAC address the FireBrick is using. We found that the WiFi on ship filters other MAC addresses, and even locks down the connection after a little while if it sees more than one MAC. We were changing MACs every day until we managed to lock it down to no see any others.

Aruba AP-303H

Having connected to the Internet, and set up a VPN, we then provide internet over WiFi. It can be done with cables, but WiFi is fine and not as messy or such a trip hazzard. Previously I took a larger ceiling mount AP, but that gets hot, especially if not ceiling mounted. So this time I have smaller, and lower power, AP-303H units. I also have two, one facing each way, so the box can go in the corridor. Ships have big metal walls which make WiFi tricky. Even so, I am taking some 10m ethernet cables to allow me to place the APs to cover the whole cabin if necessary.

We actually had to set a hidden SSID, as we found that in at least one port we were seeing de-auth attacks. Interestingly this was not happening once we changed to hidden SSID. Even with the metal walls, we often see people running personal hotspots when in port, so it may be an attempt to stop that (AFAIK not legal to de-auth people like that, but who knows on a ship).

Update: Having two APs powered by PoE means I have more options - running a cable to place one, or both, APs, in more suitable locations in the cabin if they don't work in the box.

PoE injectors

This is another change from previous cruise - the last couple of times I took a nice 8 port Aruba PoE switch, which is quite big and has a big chunky power supply. This time I have three small PoE injectors which take a lot less space overall. There are some multiple port in-line PoE injectors which may be a good alternative to consider, but even with just one such unit I still need a power strip to power it and the FireBrick.

The AP-303H includes a switch, so if I need more Ethernet ports, they can provide them, so the bigger switch was not needed.

Power strip

The three PoE injectors and FireBrick mean a 4 way power strip - though I am considering making a lead with daisy chained C13 plugs and a C8 all on one lead perhaps. However, the 4 way strip fits fine. One option may be an IEC socket in the side of the Peli case so it can be closed. It looks like the whole lot is not generating enough heat for that to be an issue, but something to test.

Update: One idea is to use a 4 way IEC distribution board instead, which may well take less space.

Spare space

The whole box, even with all those bits taped in to place, has a lot of space. In fact I can pack my laptop, charger, mouse, mat, Apple TV, spare cables, phone charger, and so on, all in the one case. This means all of the tech in one small Peli case which then just sits in the corridor to provide "internet in a box".


Update: This allows me to bypass much of the hostile environment, and have clean Internet access on my own IP addresses. It even allows me to have a standard VoIP phone on the table in the cabin if I want. It allows devices that could not connect to ship's WiFi on their own (I had some of my IoT stuff on it). It is not trying to be the cheapest, or even the smallest (though I am trying to make it smaller). It mainly allows testing and development of the FireBrick in such an environment, and it is fun (for me), even if it is overkill.


A few more pictures. I decided to go for an IEC distribution panel inside, and fit connectors to the case itself...

Truck Proximity

See also: Farm animals and dinosaurs. I am so confident that there exists children's media that involves dinosaurs driving trucks on a farm that I'm writing this without even Googling to check.

Handling Huge Traffic Spikes with Azure Functions and Cloudflare

By Troy Hunt

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

Back in 2016, I wrote a blog post about the Martin Lewis Money Show featuring HIBP and how it drove an unprecedented spike of traffic to the service, ultimately knocking it offline for a brief period of time. They'd given me a heads up as apparently, that's what the program

Ringtone Timeline

No one likes my novelty ringtone, an audio recording of a phone on vibrate sitting on a hard surface.

Certificate lifetime capped to 1 year from Sep 2020

By Scott Helme

It's finally happening! We've had 2 failed attempts through the CA/B Forum and now Apple has decided to enforce a maximum lifetime of 398 days on certificates issued from 1st Sep 2020.

Previous attempts to reduce to 1 year

The 2 previous attempts to reduce certificate lifetimes to 1

Weekly Update 179

By Troy Hunt

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

On reflection, I feel this week's update was dominated by having a laugh at an IoT candle 😂 And that's fair, too, even though I then went and bought one because hey, this is gonna be great conference talk material! Delivery is going to be much later this year so don't

Grandpa Jason and Grandpa Chad

The AARP puts the average age of a first-time grandparent close to 50, and the CDC has some data. But I don't have first-parent age distributions for specific names, or generational first-child age correlations, so the dotted line is just a guess. Still, let's be honest: No further research is really *needed.*

RevK 2.0

By [email protected] (RevK)

So, I think I have svn reverted to 1.0, or maybe 0.9 now, as I have a cold, but my mates were talking of RevK 2.0 over the last month.

Largely because I let them talk me in to :-

So over all, a fun trip! I did not do the jet skiing, just took pictures.

Here is a small selection of the pictures...

What usage restrictions can we place in a free software license?

Growing awareness of the wider social and political impact of software development has led to efforts to write licenses that prevent software being used to engage in acts that are seen as socially harmful, with the Hippocratic License being perhaps the most discussed example (although the JSON license's requirement that the software be used for good, not evil, is arguably an earlier version of the theme). The problem with these licenses is that they're pretty much universally considered to fall outside the definition of free software or open source licenses due to their restrictions on use, and there's a whole bunch of people who have very strong feelings that this is a very important thing. There's also the more fundamental underlying point that it's hard to write a license like this where everyone agrees on whether a specific thing is bad or not (eg, while many people working on a project may feel that it's reasonable to prohibit the software being used to support drone strikes, others may feel that the project shouldn't have a position on the use of the software to support drone strikes and some may even feel that some people should be the victims of drone strikes). This is, it turns out, all quite complicated.

But there is something that many (but not all) people in the free software community agree on - certain restrictions are legitimate if they ultimately provide more freedom. Traditionally this was limited to restrictions on distribution (eg, the GPL requires that your recipient be able to obtain corresponding source code, and for GPLv3 must also be able to obtain the necessary signing keys to be able to replace it in covered devices), but more recently there's been some restrictions that don't require distribution. The best known is probably the clause in the Affero GPL (or AGPL) that requires that users interacting with covered code over a network be able to download the source code, but the Cryptographic Autonomy License (recently approved as an Open Source license) goes further and requires that users be able to obtain their data in order to self-host an equivalent instance.

We can construct examples of where these prevent certain fields of endeavour, but the tradeoff has been deemed worth it - the benefits to user freedom that these licenses provide is greater than the corresponding cost to what you can do. How far can that tradeoff be pushed? So, here's a thought experiment. What if we write a license that's something like the following:

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. All permissions granted by this license must be passed on to all recipients of modified or unmodified versions of this work
2. This work may not be used in any way that impairs any individual's ability to exercise the permissions granted by this license, whether or not they have received a copy of the covered work

This feels like the logical extreme of the argument. Any way you could use the covered work that would restrict someone else's ability to do the same is prohibited. This means that, for example, you couldn't use the software to implement a DRM mechanism that the user couldn't replace (along the lines of GPLv3's anti-Tivoisation clause), but it would also mean that you couldn't use the software to kill someone with a drone (doing so would impair their ability to make use of the software). The net effect is along the lines of the Hippocratic license, but it's framed in a way that is focused on user freedom.

To be clear, I don't think this is a good license - it has a bunch of unfortunate consequences like it being impossible to use covered code in self-defence if doing so would impair your attacker's ability to use the software. I'm not advocating this as a solution to anything. But I am interested in seeing whether the perception of the argument changes when we refocus it on user freedom as opposed to an independent ethical goal.



Rich Felker on Twitter had an interesting thought - if clause 2 above is replaced with:

2. Your rights under this license terminate if you impair any individual's ability to exercise the permissions granted by this license, even if the covered work is not used to do so

how does that change things? My gut feeling is that covering actions that are unrelated to the use of the software might be a reach too far, but it gets away from the idea that it's your use of the software that triggers the clause.

comment count unavailable comments

Picking Bad Stocks

On the news a few days later: "Buzz is building around the so-called 'camping Roomba' after a big investment. Preorders have spiked, and..."

Pushing files around with silly and unusual methods

Over the holidays, I had a bunch of time on my hands and found myself digging around in old boxes and cupboards, looking for things to clean up. In my travels through all of that junk, I turned up an old VHS cassette with some fun stuff on it, and decided I wanted to bring it onto the computers. More digging turned up an ancient USB capture device and a VCR that still worked.

That capture device no longer works on any of my Macs, but it DID work on the one cheapest-possible-laptop-from-Frys Windows box I keep around for those annoying things which won't work anywhere else. (Yes, even in 2020, there's still stuff that requires Windows to work, even though it's just twiddling files on a USB mass storage device. Uniden, I'm looking at you.)

90 minutes later, I had a 2 GB "m2ts" file hanging out on the disk of this cursed machine, and now I had the slight problem of trying to get it OFF there and onto a real box. One of the fun points about this system is that I don't trust it on my "real" network. It's on the "Internet of Shit" wireless VLAN which lets it talk to the Internet and nothing else. It can't connect inward to my other stuff.

[ Needless to say, I didn't want to put it on the normal VLAN. Just, nope. Besides, by being obstinate, I could have a little holiday "fun" and maybe get a story to write about later. ]

While I can connect TO the "IoS" network from my regular setup, there was nothing serving on the Windows box to actually answer the connection. I didn't feel like jumping through the whole WFWG, SMB, CIFS, whatever it's called this decade... thing on both ends for a one-shot file transfer.

I should mention that while it would have been possible to connect out to some other host, and then push it out there, that would have meant pushing 2 GB through a consumer-grade cable modem uplink, and that would take forever (and lagged everything in the house). So that was out.

Somehow, I needed to get the data to flow *back* from the IoS network to some host on the regular network, even though I can't open a connection in that direction. There wasn't any netcat on the Windows box so just "nc -l port < file" was out. But... they still ship good old ftp! Yep, the thing you used to use to just download a copy of Netscape Navigator so you never touched MSIE still exists in Windows 10.

Okay, you might think, so what. FTP can't help because it connects outward, and that won't work. Also, even without the firewall, it's not like I'm running a FTP server, so what is it going to talk to?

Ah yes, but FTP is complicated. It actually has *two* connections, and by default (active mode), the second one runs "backwards" to what you'd think as the client-server relationship. The control channel is in fact opened outward, but the data channel is set up by opening a listening socket and WAITING for someone to connect.

I just needed to get FTP far enough along to where it opened a listening port on the Windows box, and then I could connect to it from anywhere and it would feed me the data.

Step one was to stand up netcat listening on some otherwise-unused port on a box on the outside world. This would be my "FTP server".

Step two was to make ftp connect to it. Fortunately, it accepted port numbers so I could run that netcat above 1024 and didn't need to whip out rootly powers to get this done.

Step three was to speak enough "200 ok" type cruft down the pipe to the FTP client until it figured it had logged in and was settled down.

Step four is where I told the client to "put" the file, and that's when it shot a PORT line down the control channel. This told me exactly where it was listening: its (inside the NAT) IP address, and whatever port it had bound to. I had to respond with a 200 to the PORT line.

For step five, I just dissected the PORT line. The details of it are charming and suggest just how old FTP really is. In effect, it's sending the four octets of the IP (v4!) address it sees for itself, plus the two octets of the port number.

Did you get that? Instead of saying a single 16-bit port number like 2000, it's actually pushing out "high byte, low byte". This is where one of them is actually "worth" 256, so you have to do (A * 256) + B to get the resulting port number. Think "7,208" instead of "2000".

Presumably, it works this way so that you can just ingest a bunch of eight-bit values and not have to worry about parsing more. Octets, indeed!

Step six was then to take some regular box on my normal network and connect to the Windows machine's address on the IoS network using the port from the last calculation, redirecting stdout to somewhere useful.

A few minutes later, I had my file.

Of course, a few minutes after this happened, I told this story to some friends who have been actually using Windows in the past decade, and one told me that I "... could have just turned on OpenSSH server". So, yeah, this is not the Microsoft of old. OpenSSH shipping on Windows by default? It turned out that yes, indeed, it does. You just have to turn it on.

I had to find it under "optional features" and then dig up some 20+ year old brain cells to remember that "service manager" was a thing and you had to go in there to start stuff, but after that, it did come up.

Of course, next I had to figure out what to ssh in as. This box has you log in using the whole "First Last" thing, but sshd wasn't having that. Again, my friend came to the rescue: "run whoami". MORE Unixisms! That actually worked, and spit back something like "laptop-aslkfhdfkls\flast". I tried "flast" and that worked. Amazing. ssh into a Windows box is a thing... and sftp is too.

It turned out that the big long thing including the backslash will also work as a username, assuming you protect the backslash from being gobbled by your shell.

So, why did I know about this FTP anomaly? Well, one of the things you used to be able to do back in the old days was get on a FTP site which had access restrictions by bouncing through another site which was allowed to connect. But, for whatever reason, you wouldn't want to (or couldn't) store the file at the allowed site. Maybe you could only swing a TCP connection from their IP space and didn't actually have a client running there.

As a result, sometimes people would get the control connection going, and then would connect inward to the data port from the host where they /actually/ wanted the data to end up, and the FTP server would happily ship it off.

I guess this'll be the last time I do a three-way FTP hack to exfiltrate data from a Windows box. That's progress!

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?

The Sheets Of San Francisco

Finally, my 3D city maps return, and this time they're mapping the streets and hills of San Francisco.

Channels 2: October

What's happening in the world of Channels? How many times have I rewritten the API now?

New Zealand

Adventures in the land of volcanoes, unique birds, fjords, and long white clouds.