The Daily Parker

Politics, Weather, Photography, and the Dog

Houseguest

One of Cassie's old friends, who moved away about a year ago, has come for a 4-day visit. Sophie seems to enjoy being back in her old 'hood:

Sophie is very much a potato. Couch, bed, floor; still a potato. I just walked the two of them together around the block, and that is the last time I will attempt it. Cassie pulls forward, Sophie pulls backward, human is unhappy.

But Sophie and Cassie get along really well, in part because they both get along with everyone really well. So it'll be a fun few days.

The clusterfuck of Cluster B

Via Andrew Sullivan's Dish this week, I came across a pair of articles by art critic Christia Rees about the horrors of dealing with cluster-B personality disorders:

Cluster Bs are probably somewhere between 1 and 5% of the population. Usually they’re just irritating and high-maintenance. They drum up a lot of drama. We manage them. But the smarter, pressurized ones are like landmines, and the longer you live, the more likely you are to deal with one of them directly and intimately.

I used to think some people (or communities, or entire nations) were completely immune to being manipulated by malign opportunists, but now I know in my bones that anyone can be conned: the chinks in our armor stem from vulnerable parts that are fundamental to human nature: vanity and ego (business cons operate on these points of entry), a desire to be “seen” by someone who “understands”, a desire to have someone guide us, or, in turn, we decide to help out an intriguing person who responds especially to us. We enter these dynamics, these traps, in good faith, with rationalizations and often willed blind spots, that make sense in the moment. Carnage follows.

I’ve been writing another piece about artists’ relationship to their influences, and I watched the new documentary about Evan Rachel Wood’s history with Marilyn Manson, Phoenix Rising, with that in the back of my head, in the sense that I never found Manson convincing as a rock star, and I personally don’t know anyone else who does, either. That’s because when he arrived on the scene, we were already adults. His attention-starved schtick was aimed at gullible, disaffected kids (Wood was in fact still a teenager when she started up with him), because they were the ones who would not have spotted how forced and artificial his reference points were. Cluster B agendas are often undone by moments of sloppiness or incoherence. He didn’t register with us cynical professional critics because his tactics were stale, and the music wasn’t any good.

But being savvy and even smug about being able to spot from a distance one kind of Cluster B, the Marilyn Manson kind, doesn’t confer protection against all of them. These lizards take a lot of shapes, and their methods vary. A person raised by one can still fall into another’s web as an adult. A person who ended a friendship with a Cluster B at school can find themselves seduced by another one at their new job.

 

I remember interviewing the late Prof. Jeff Kraus at my alma mater, which also happened to be former US Senator Norm Coleman's (R-MN). Coleman had led a sit-in that shut down the university for two days to protest the Kent State shootings in 1970, so when I did a documentary in 1990, Coleman's name came up a lot. When I asked Kraus about Coleman, Kraus looked up at the ceiling with a weird smile on his face and said, "Norm Coleman...Norm Coleman. Norm Coleman would be at the head of any organization that would get him laid."

Rees' earlier article explains what a cluster-B personality looks like and how the Norm Colemans of the world need to sit down and grow up:

Here are some traits we associate with very young children: lack of emotional regulation; an inability to understand that someone can say “no” to them and it does not make that someone a monster (in psychology it’s called “splitting” or binary thinking); a need for attention and approval now; testing the limits of tantrums to get adults and other children to fold to their demands. Empathy isn’t quite available to them yet at this age, because empathy does not live in the toddler brain of me, me, me. And most kids grow out of it. 

People who have Cluster B personality disorders — Borderline, Narcissism, Histrionic and Antisocial — actually never grow out of the emotional cesspool that keeps them in this headspace, where no one else exists outside of what they can do for them. For a Cluster B person, other people are merely tools. Despite their age or status in the world, Cluster B people are still toddlers. It leads to behaviors that, in the adult world, would be considered pathological. Their interpersonal relationships are fraught, to say the least.

And the traits associated with Cluster B can start to metastasize to whole sectors of a community, or to a whole society. The seduction of identifying as a victim is huge right now — it’s where the power actually is. There are people playing victim on both the right and the left of the political spectrum. It’s a vicious kind of tail-eating snake, in that each side can yell about being victimized by the other ad nauseam.

There are now three generations of highly educated people out in the world who have taken up positions at all levels in our progressive institutions, who fully believe the oppressor/oppressed narrative… about everything. Bad-faith readings of other people’s intentions are built into this thinking. Victim status is built into it. That is the point. 

What a way to live. What a way to see the world. How nihilistic.

How Cluster B. 

I have experienced cluster-B disorders up close, more than once too close, and they left me feeling pissed off: at them, for wasting so much time and energy, and at myself, for not getting away from them sooner. So like Rees, I find it alarming that so few adults seem to run things right now, leaving the toddlers in charge. Woe to thee, O land, when thy king is a child.

Friday, already?

Today I learned about the Zoot Suit Riots that began 79 years ago today in Los Angeles. Wow, humans suck.

In other revelations:

Finally, it's 22°C and sunny outside, which mitigates against me staying in my office much longer...

Criticizing the police response hides the real issue

David Graham argues that emphasizing the bungled police response in Uvalde "risks eclipsing the bigger picture, which is that the gravest failures happened before the gunman arrived at the school and opened fire":

The fundamental problem, of course, is that semiautomatic weapons are easily available to nearly anyone in the United States with relatively little trouble. Some reporting indicates that the Uvalde shooter was a victim of bullying, and though this may have played a role in his psychology, bullying is universal and timeless; readily accessible assault rifles are not. Gun-rights advocates used to try to sidestep this argument, arguing that prospective killers would find other ways to kill if guns were harder to find, but these days, with their position ascendant in the legal system, they hardly bother, instead pointing out that courts are interpreting the Constitution to block most gun laws. They are correct, but that doesn’t negate the simple fact that easy access to guns is what makes this country different. The guns and ammunition used in Uvalde were legally purchased, and no police officer could do anything about them until the shooter began committing crimes—by which point even an effective police response would have merely limited, not stopped, the slaughter, given how much death a shooter armed with an AR-15 can inflict, and how quickly.

So-called red-flag laws, which allow courts to temporarily seize guns from people if they might be a danger to themselves or others, may indeed be a commonsense measure, but there’s precious little evidence that they are useful in stopping mass shootings. (They seem to work better for preventing suicides.)

Armed guards at schools, better preparation, fortifying schools—all of these have been proposed as good solutions, but few of them seem to work all that well in practice. Schools in Texas had already been “hardened,” but that didn’t prevent the horror in Uvalde. The school district had drilled for a mass-shooting event. No armed officer was stationed at the school when the gunman struck. (In Buffalo, a retired police officer serving as a security guard engaged and fired at the shooter, and authorities say he saved lives by buying time; despite this apparent heroism, 10 people died.)

We have solid evidence from the US and from around the world about what works and doesn't work to prevent mass shootings. Banning assault weapons works; hiding under desks doesn't. As Graham concludes:

[D]emanding that police respond more swiftly and courageously once the slaughter of schoolchildren has already begun is itself the mark of a broken society, which no longer seems able to ask that we prevent such killings in the first place.

Regulate crypto! And guns, too

Even though it seems the entire world has paused to honor HRH The Queen on the 70th anniversary of her accession, the world in fact kept spinning:

Blogger Moxie Marlinspike wrote about their first impressions of web3 back in January. I just got around to reading it, and you should too.

Oh, and plastic recycling doesn't work, and probably can't.

And here, a propos of nothing, is a photo of St Boniface Cemetery I took this morning:

Sticking with the good news for now

Because it's the first day of summer, I'm only posting fun things right now. First, I'd like to thank Uncle Roger for upping my egg fried rice game. Here's my lunch from earlier today. Fuiyoooh!

Around the time I made this delicious and nutritious lunch, a friend who teaches music in a local elementary school sent me a photo of the family of ducks she escorted from one side of the school to the other:

In other good news:

  • Believe it or not, today is the 55th anniversary of Sgt Pepper's Lonely Hearts Club Band. I remember the day in 1987 when it really was "20 years ago today." People born on that day are now old enough to be president. Yeek.
  • Chicago's heavy-rail system, Metra, will start offering unlimited system-wide monthly passes for $100 at the end of this month. Unless you live on the Rock Island or Metra Electric lines. Hiyaaah!

And...well, that's it for good news. Check back later when I have regular, horrifying news.

The price of too many guns

We're still grappling with the horror of last week's mass murder in Uvalde, Texas. Nick Meyer, a retired lawyer who grew up there, shares our horror but not our surprise:

First, you would be challenged to find a more heavily armed place in the United States than Uvalde. It’s a town where the love of guns overwhelms any notion of common-sense regulations, and the minority White ruling class places its right-wing Republican ideology above the safety of its most vulnerable citizens — its impoverished and its children, most of whom are Hispanic.

I wasn’t surprised to see the Republican panel of politicians at a news conference the day after the shooting, almost all White and in top positions of power in the community and the state, taking the lead. In Uvalde, the custodians of order — the chief of police, the sheriff, the head of the school district police — are Hispanic, but here they were largely silent. Unsurprisingly, they now bear the primary blame for the disastrous response at the school.

Bloomberg asks how that total police failure happened when fully 40% of the town's budget goes to police:

But determining what may have gone wrong during the police’s response to the attack will take more than scrutinizing city budgets. In fact, Uvalde’s police spending is not such an aberration. 

Policing is one of the few services smaller cities are set up to provide. For Uvalde, which has roughly 16,000 residents, the $4 million police budget is the biggest expense in the city budget this year, funded at a proportion that’s higher than some peers but far from abnormal. An analysis of a sampling of 15 other cities with populations between 15,000 and 20,000 in 10 states, some dominated by Republicans and others by Democrats, show that on average, policing accounted for 32% of their general-fund budgets in 2022. The average level in big cities is also around 30%, with cities like Milwaukee, Oakland and Phoenix spending closer to 40%.

In a way, these high percentages can be deceiving, because some small towns and cities aren’t set up to provide many other services, such as health care, social services or the expensive items that dominate most big-city budgets. Those expenditures are instead left to school districts, counties, states and larger entities with more resources to run those programs efficiently, according to Richard Auxier, a senior policy associate in the Urban-Brookings Tax Policy Center. That’s why policing makes up such a huge share of spending.

Retired FBI Special Agent Katharine Scweit, who created and ran the FBI's active-shooter training program, worries about training:

In the first few years after the massacre at Sandy Hook Elementary School in December 2012, the F.B.I. spent more than $30 million to send agents to police departments around the country. The goal was to train local officers how to handle active shooters so they would know how to go after a shooter with confidence and neutralize the threat.

Current protocol and best practices say officers must persistently pursue efforts to neutralize a shooter when a shooting is underway. This is true even if only one officer is present. This is without question the right approach.

We need to understand why that protocol was not followed in Uvalde. I am still confident the F.B.I.’s focus on training to this standard was right, but I’m less confident in its execution. The officers who responded may have been unprepared for conflict, which can lead to fatal results. Law enforcement officers need to be mentally prepared before they arrive on the scene, so they can respond immediately.

After Sandy Hook the federal government adopted the run, hide, fight model, which instructs students and teachers to run first if they can, then hide if they must and, finally, fight to survive.

I remember telling my children that if someone approached them in a car while they were walking, they should run as fast and as far as possible. Yet in many school settings we have mistakenly discouraged students from trying their best to simply stay alive.

Journalist Susie Linfield grapples with the "Emmett Till" moment:

The question of how much violence we should see, and to what end, is almost as old as photography itself. But the question gains urgency in our age of unfiltered immediacy — of the 24-hour news cycle, of Instagram and Twitter, of jihadi beheading videos, of fake news and conspiracy theorists and of repellent sites like BestGore, which revel in sadistic carnage. What responsibilities does the act of seeing entail? Is the viewing of violence an indefensible form of collaboration with it? Is the refusal to view violence an indefensible form of denial?

In the case of Uvalde, a serious case can be made — indeed, I agree with it — that the nation should see exactly how an assault rifle pulverizes the body of a 10-year-old, just as we needed to see (but rarely did) the injuries to our troops in the Iraq and Afghanistan wars. A violent society ought, at the very least, to regard its handiwork, however ugly, whether it be the toll on the men and women who fight in our name, on ordinary crime victims killed or wounded by guns or on children whose right to grow up has been sacrificed to the right to bear arms.

Despite the very real dangers of exploitation and misuse that disclosure of the Uvalde photographs would pose, I myself would like politicians to view them: to look — really look — at the shattered face of what was previously a child and to then contemplate the bewildered terror of her last moments on earth. But that would not mean that the jig is up. People, not photographs, create political change, which is slow, difficult and unpredictable. Don’t ask images to think, or to act, for you.

Uvalde may be the worst mass shooting in May, but it wasn't the only one. The US had 14 more over the weekend. I'm so glad we have Wayne LaPierre's thoughts and prayers to help us. And don't even get me started on the new "mental health" misdirection coming from the Republican Party.

Reading Excel files in code is harmful

I've finally gotten back to working on the final series of place-data imports for Weather Now. One of the data sources comes as a 20,000-line Excel spreadsheet. Both because I wanted to learn how to read Excel files, and to make updating the Gazetteer transparent, I wrote the first draft of the import module using the DocumentFormat.OpenXml package from Microsoft.

The recommended way of reading a cell using that package looks like this:

private static string? CellText(
	WorkbookPart workbook, 
	OpenXmlElement sheet, 
	string cellId)
{
	var cell = sheet.Descendants<Cell>()
		.FirstOrDefault(c => c.CellReference == cellId);
	if (cell is null) return null;

	if (cell.DataType is null || cell.DataType != CellValues.SharedString)
	{
		return cell.InnerText;
	}

	if (!int.TryParse(cell.InnerText, out var id))
	{
		return cell.InnerText;
	}
	var sharedString = workbook.SharedStringTablePart?
		.SharedStringTable
		.Elements<SharedStringItem>()
		.ElementAt(id);
	if (sharedString?.Text is not null)
	{
		return sharedString.Text.Text;
	}
	return sharedString?.InnerText is null 
		? sharedString?.InnerXml : 
		sharedString.InnerText;
}

When I ran a dry import (meaning it only read the file and parsed it without writing the new data to Weather Now), it...dragged. A lot. It went so slowly, in fact, that I started logging the rate that it read blocks of rows:

2022-05-29 18:43:14.2294|DEBUG|Still loading at 100 (rate: 1.4/s)
2022-05-29 18:44:26.9709|DEBUG|Still loading at 200 (rate: 1.4/s)
2022-05-29 18:45:31.3087|DEBUG|Still loading at 300 (rate: 1.4/s)
...

2022-05-29 22:26:27.7797|DEBUG|Still loading at 8300 (rate: 0.6/s)
2022-05-29 22:31:01.5823|DEBUG|Still loading at 8400 (rate: 0.6/s)
2022-05-29 22:35:40.3196|DEBUG|Still loading at 8500 (rate: 0.6/s)

Yes. First, it looked like it would take 4 hours to read 20,000 rows of data, but as you can see, it got even slower as it went on.

I finally broke out the profiler, and ran a short test that parsed 14 lines of data. The profiler showed a few hot spots:

  • 355,000 calls to OpenXmlElement<T>.MoveNext
  • 740,000 calls to OpenXmlCompositeElement.get_FirstChild
  • 906,000 calls to OpenXmlChildElements<GetEnumerator>.MoveNext

That's for 14 lines of data.

So I gave up and decided to export the data file to a tab-delimited text file. This code block, which opens up the Excel workbook:

using var document = SpreadsheetDocument.Open(fileName, false);
var workbook = document.WorkbookPart;
if (workbook is null)
	throw new InvalidOperationException($"The file \"{fileName}\" was not a valid data file");

var sheet = workbook.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == "Airports");
if (sheet is null) throw new InvalidOperationException("Could not the data sheet");

var sheetPart = (WorksheetPart)workbook.GetPartById(sheet.Id!);
var sheetData = sheetPart.Worksheet.Elements<SheetData>().First();
var rows = sheetData.Elements<Row>().Count();

Now looks like this:

var lines = File.ReadAllLines(fileName);

And the code to read the data from an individual cell becomes:

return columns.Count >= index ? columns[index] : null;

Boom. Done. Took 30 minutes to refactor. My profiler now says the most frequent call for the 14-row test occurs just 192 times, and teh whole thing finishes in 307 ms.

So let's run it against the full file, now converted to tab-delimited text:

2022-05-30 09:19:33.6255|DEBUG|Still loading at 100 (rate: 211.3/s)
2022-05-30 09:19:33.8813|DEBUG|Still loading at 200 (rate: 274.2/s)
2022-05-30 09:19:34.1342|DEBUG|Still loading at 300 (rate: 305.4/s)
...
2022-05-30 09:20:14.9819|DEBUG|Still loading at 19600 (rate: 468.6/s)
2022-05-30 09:20:15.2609|DEBUG|Still loading at 19700 (rate: 467.8/s)
2022-05-30 09:20:15.5030|DEBUG|Still loading at 19800 (rate: 467.5/s)

Well, then. The first few hundred see a 200x improvement, and it actually gets faster, so the whole import takes 45 seconds instead of 6 hours.

So much time wasted yesterday. Just not worth it.