The Daily Parker

Politics, Weather, Photography, and the Dog

The virus doesn't care about your beliefs

Herman Cain, former CEO of Godfather's Pizza and notoriously uninformed candidate for the Republican nomination for president in 2012, has died of Covid-19:

Cain, 74, was hospitalized earlier this month, and his Twitter account said earlier this week he was being treated with oxygen in his lungs. It is unknown where Cain contracted the virus.

As a co-chair of Black Voices for Trump, Cain was one of the surrogates at President Donald Trump's June 20 rally in Tulsa, Oklahoma—which saw at least eight Trump advance team staffers in attendance test positive for coronavirus. Trump campaign spokesman Tim Murtaugh has told CNN that Cain did not meet with Trump at the Tulsa rally.

NPR is reporting that he contracted the virus at the Trump rally; but given our inadequate testing in the US, who knows for sure?

As Cain was a Black man completely uninterested in civil rights (or much of anything outside of himself), there is no small irony in his death on the eve of the funeral of John Lewis in Atlanta, which three former presidents (and zero current ones) are attending at this hour.

Meanwhile, this morning, the current president Tweeted absolute nonsense about the upcoming election, clearly trolling the media to distract from the single-worst economic downturn in the history of the United States.

The Know-Nothings irritated me because it was always obvious that their anti-science and anti-intelligence belief system would someday cause great harm to a great number. Now I'm close to enraged that they are actually doing it. Cain was one of the dumbest of the Know-Nothings. He did not need to die; his own aggressive ignorance killed him.

The evil that men do lives after them; the good is oft interred with their bones; so let it be with Herman.

We really can't take much more of this

The president and his eldest son both promoted a video, since taken down by all the major platforms, that featured what they seem to believe passes for medical expertise:

After social media companies removed a viral video showing doctors spreading unsubstantiated information about the novel coronavirus, a phrase inspired by one doctor’s past claims began trending on Twitter: demon sperm. It turns out Stella Immanuel has a history of making particularly outlandish statements — including that the uterine disorder endometriosis is caused by sex with demons that takes place in dreams.

The video showed a group that has dubbed itself America’s Frontline Doctors, standing on the steps of the Supreme Court and claiming that neither masks nor shutdowns are necessary to fight the pandemic, despite a plethora of expertise to the contrary. It was live-streamed by the conservative media outlet Breitbart and viewed more than 14 million times — fueled by a tweet by Donald Trump Jr. and multiple retweets by President Trump, which have since been deleted.

In the viral video, Immanuel made the unsubstantiated claim that hydroxychloroquine is a “cure for covid,” the disease caused by the coronavirus. As a previous Post story put it: “There is no known cure for the novel coronavirus or the disease it causes," according to the Centers for Disease Control and Prevention and the World Health Organization.

As the Daily Beast’s Will Sommer first noted, Immanuel has asserted that many gynecological issues are the result of having sex with witches and demons (“succubi” and “incubi”) in dreams, a myth that dates back at least to the “Epic of Gilgamesh,” a Sumerian poem written more than 4,000 years ago. She falsely claims that issues such as endometriosis, infertility, miscarriages and STIs are “evil deposits from the spirit husband.”

Furthermore, Sommer reported that in “a 2015 sermon that laid out a supposed Illuminati plan hatched by ‘a witch’ to destroy the world using abortion, gay marriage, and children’s toys, among other things, Immanuel claimed that DNA from space aliens is currently being used in medicine.” She also offered prayers through her website to remove generational curses transmitted through placenta.

Josh Marshall cites this as evidence that we're "trapped with the abuser:"

Much as abuse victims don’t fully grasp the extent of their victimization before escaping their abusers, there are aspects of this dark era we’ll only see clearly in retrospect.

It is commonplace that victims of abuse and predation only fully grasp the degree of their victimization once they’ve exited from it.

We are all in a similar situation writ large. In but one comparatively trivial example the President has spent much of the last 48 hours arguing over his support for a hydroxychloroquine pushing conspiracy kook who claims that medicines are created with ground up alien DNA and that many basic gynecological conditions are caused by women having sex with demons.

That’s actually happening.

During a pandemic.

This is of course a comparatively minor example of the insanity and predation.

We won’t come back from this quickly. Indeed, Trump losing an election won’t even end it.

English writer John Cassidy agrees in principle:

To most of the world, the [1969 moon] landing symbolized American leadership and power. It wouldn’t be accurate to say that most of the people I grew up with loved the United States, or even openly admired it. But beneath the British condescension, there was also a respect for America: its technological know-how, its organizational efficiency, its democratic traditions, and its sheer heft. When my dad was away, working in Scotland, he saw the U.S.S. John F. Kennedy sail up the Firth of Forth. The vast aircraft carrier was almost a quarter of a mile long, he reported back to us in wonderment.

A half century later, the rest of the world is looking on in horror as this country lurches from one disaster to another. Trapped in a leadership vacuum created by the narcissistic reality-TV star who occupies the Oval Office, the United States seems powerless to arrest the spread of a pandemic that most industrialized countries contained months ago. As the cumulative number of infections surpasses four million, an economic rebound that began when many states prematurely reopened their economies appears to be stalling. And, with an election just three and a half months away, that same President, in a desperate effort to save his political skin, seems intent on creating violent clashes in some of America’s biggest conurbations.

From the Roman Republic to Weimar Germany, and to Russia and Turkey in this century, history shows that democratic decay is a gradual process, and authoritarian leaders rarely, if ever, achieve unchecked power without the acquiescence of some elements of the political establishment. America isn’t there , and hopefully it never will be. At this moment, though, its claim to be a model for other countries is looking horribly tattered. The election can’t come soon enough.

No, it bloody well can't.

Two stark comparisons

First: the difference between how Garmin handled a global outage that lasted 5 days, and how SendGrid managed one that lasted 5 hours. SendGrid handles billions of emails per day, including for Microsoft and other massive companies. So SendGrid going down didn't inconvenience a few athletes and pilots; it crippled Fortune-500 companies' marketing departments. (And it delayed a scheduled release on my own team.)

Within about an hour of their outage, SendGrid created an incident response page to which they posted updates every half-hour. They clearly stated what was going on and how they were trying to fix it, even as they were discovering for themselves what had happened:

Contrast that with Garmin, who still haven't really explained what happened or why it took so long to resolve the outage. (They finally declared their remediation "complete" yesterday, almost 6 days after the outage started.)

Second: the difference between how Germany (and other rich countries) have handled Covid-19 and how we have. Josh Marshall looked into the numbers:

The head of Germany’s equivalent of the CDC told reporters today that he’s “very concerned” about the rising case numbers in the country and accuses Germans of becoming “negligent” in their adherence to mitigation measures. He has good reason to be concerned.

Today Germany reported 638 new cases of COVID. That comes out to .76 cases per 100,000 residents. Let’s round that up to 1 new case per 100,000 for good measure. (The need for round numbers will become clear.)

Today New York State had 3 cases per 100,000. So Germany is concerned by 1/3 the number of cases as we have in New York state, a state which is probably controlling the disease as well as any other state in the country.

Florida today had 43 cases per 100,000. Florida’s outbreak is more than forty-three times the size relative to population.

To state the point baldly, Germany is very concerned about a rise in cases that would still be dramatically better than any other part of the United States. They’re ramping up border restrictions to get things back under control and chiding the population to redouble its collective efforts.

[S]eeing this as, "well, look, everyone’s having problems." Or "we’re not the only ones having new outbreaks" or "we can’t go back to shutdowns…" ... only captures how Americans are having a hard time grappling with just how many universes away we are from what is happening in other countries which are comparably affluent, industrialized and able to mount an effective response.

We’re failing that badly.

Anthony Fauci was on BBC just now, struggling not to call the president out on his criminal negligence. Only 98 days until we can vote the bastard out.

Another outage

Even as Garmin picks up the pieces from what they now admit was a massive ransomware attack, bulk email provider SendGrid has gone down spectacularly.

I use SendGrid, as does my company, for status emails and such.

Here's my problem, though: I have a code update to put out that specifically targets a bug in SendGrid's .NET library that they claim to have fixed. My automated build pipelines won't release new code unless all the unit tests pass. Right now, the SendGrid tests fail sporadically, and at least one fails every time the tests run.

Ah, technology.

How to pass secrets into your custom log target

Today I finally solved a problem that has nagged me for months: Given a .NET Core 3.1 Web API, NLog, and a custom log target for NLog, how could I pass secrets into the log target using Azure Key Vault?

The last bit required me to add Azure Key Vault support to the InnerDrive.Logging NuGet package, which I did back in February. The KeyVaultSecretProvider class allows you to retrieve secrets from a specified Azure Key Vault. (I'm in the process of updating it to handle keys as well.) Before that, you'd have to put your secrets in configuration files, which anyone on your development team or who has access to your Git repository can see. For example, to use our SendGridTarget class, you would have to put this in your nLog.config file:

<extensions>
	<add assembly="NLog.Web.AspNetCore"/>
	<add assembly="InnerDrive.Logging"/>
</extensions>

<targets async="false">
	<target xsi:type="SendGridTarget"
	        name="sendgrid"
		apiKey="{supposedly secret key}"
		applicationName="My Cool App"
	        from="service@contoso.org"
	        to="admin@contoso.org"
	/>
</targets>

That is...suboptimal. Instead, you want to use a class that implements ISecretProvider and inject it into the SendGridTarget class through this constructor:

/// <summary>
/// Creates a new instance of <see cref="SendGridTarget"/> with
/// a specified <see cref="ISendGridSender"/> implementation.
/// </summary>
/// <param name="sender">The <see cref="ISendGridSender"/> to use</param>
/// <param name="secretProvider">The <see cref="IConfiguration"/> to use</param>
/// <param name="apiKey">The API key to use</param>
public SendGridTarget(
	ISendGridSender sender, 
	ISecretProvider secretProvider = null, 
	string apiKey = null)
{
	IncludeEventProperties = true;
	if (null != secretProvider) Configuration = secretProvider;
	if (!string.IsNullOrWhiteSpace(apiKey)) ApiKey = apiKey;
	_sender = sender;
}

And now I'm going to save you about 30 hours of research and frustration. To get NLog to inject the secret provider into the target, I added this method to Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IComponentContext container)
{
	// Setup code elided
	ConfigureLogging(container);
}

public static void ConfigureLogging(IComponentContext container)
{
	var defaultConstructor = ConfigurationItemFactory.Default.CreateInstance;
	var secretProvider = container.Resolve<ISecretProvider>();
	ConfigurationItemFactory.Default.CreateInstance = type =>
	{
		if (type == typeof(SendGridTarget))
		{
			var sendGridSender = container.Resolve<ISendGridSender>();
			return new SendGridTarget(sendGridSender, secretProvider);
		}

		return defaultConstructor(type);
	};
	LogManager.Configuration = LogManager.Configuration.Reload();
	NLogBuilder.ConfigureNLog(LogManager.Configuration);
}

(Note that the ISecretProvider and ISendGridSender classes need to be registered with your dependency-injection framework.)

Today was a good day.

Lunchtime reading

It has cooled off slightly from yesterday's scorching 36°C, but the dewpoint hasn't dropped much. So the sauna yesterday has become the sticky summer day today. Fortunately, we invented air conditioning a century or so ago, so I'm not actually melting in my cube.

As I munch on some chicken teriyaki from the take-out place around the corner, I'm also digesting these articles:

Can you believe we're only 99 days from the election? How time flies.

Must be summer

It is hot in Chicago: 34°C that feels like 38°C because of the 22°C dewpoint. Last night the temperature didn't even go below 77°C. I helped a friend move a couple of things into storage this morning and I'm now soaked through. Parker hates it especially because he has two fur coats. (He deposited a significant amount of one of them around the house this week, though.)

I plan to spend the rest of the day inside with my air conditioning.

You know where else it's way too hot? East Antarctica. And that could cause problems for everyone on earth.

Working later than usual

I kind of got into the flow today, so things to read later just piled up:

And wait—you can make risotto in an Instant Pot? I might have to try that.

With apologies to Ron Shelton

– He lollygags around the Rose Garden. He lollygags on his way to the Hill. He lollygags in and out of the Oval. Do you know what that makes him? Larry?

– A lollygagger!

– A lollygagger. What's his record, Larry?

– Won in '16!

– Won in '16. How'd he ever win one?

– It's a miracle!

– It's a miracle. This is a simple game. You throw the ball, you hit the ball, you catch the ball. You got it? Now we have got a global pandemic raging for months. Hearing's at 8 in the morning.

– Ball, catch, throw, elephant, TV!

– ...

– ...

– Donnie, this is the toughest job a country has. But...the electorate wants to make a change...

(Original here.)

Garmin offline

Four days after I switched from Fitbit to Garmin, all of Garmin's online services have gone offline:

The problems with those services also mean that a range of features can't be used on Garmin's own devices: it is not possible to create new routes to go running or cycling, for instance, or to share those activities on services like Strava once they are completed.

The devices themselves continue to work as normal with the data they do have, however, meaning that any data collected during the outage will be safe.

Garmin wrote on its official Twitter pages that the problems were also affecting its call centres, leaving users unable to get in touch through calls or online messages.

"We are currently experiencing an outage that affects Garmin Connect, and as a result, the Garmin Connect website and mobile app are down at this time," it wrote.

"This outage also affects our call centres, and we are currently unable to receive any calls, emails or online chats. We are working to resolve this issue as quickly as possible and apologise for this inconvenience."

This is not what Garmin customers want to see:

The error message on the Garmin Connect website suggests the problem is with their Cloudflare equipment:

Update: Based on Garmin employee's social-media posts, ZDNet now reports that the company experienced a catastrophic ransomware attack, most likely a new strain of WastedLocker. Fortunately, my Venu can hold 200 hours of data. So as long as they get it back up within a week or so, I shouldn't lose anything—unless the ransomware attack already destroyed my data from this past week.