The Daily Parker

Politics, Weather, Photography, and the Dog

Weather Now update

I just released a couple of minor fixes to Weather Now. Build 8126 has slightly tidier top and nav bars, and I can configure the front page "latest weather" list on the fly. Previously the list lived in a static application config file that I could only change by redeploying the app.

Enjoy.

Reading while the CI build churns

I'm chasing down a bug that caused what we in the biz call "unexpected results" and the end-users call "wrong." I've fixed it in both our API and our UI, but in order to test it, I need the API built in our dev/test environment. That takes about 18 minutes. Plenty of time to read all of this:

Finally, the Times explains how last year's 257 traffic fatalities in New York City undermine the claims that "Vision Zero" is working. But Strong Towns already told you that.

OK, build succeeded, fix is now in Dev/Test...on with the show!

Who could have predicted this?

As professional narcissist Elon Musk threatened, on Thursday Twitter abruptly ended their verified "blue check" program. Suddenly, Twitter users had no way to know for sure whether tens of thousands of government agencies, celebrities, journalists, and other people whose jobs depend to some extent on their credibility, were who their Twitter accounts purported to be.

It only took two days for someone to hoax the City of Chicago:

Impostors posing as Chicago government officials, including Mayor Lori Lightfoot, posted a series of tweets early Friday morning falsely claiming that North Jean Baptiste Point DuSable Lake Shore Drive is being permanently closed.

The accounts posting the false tweets claimed to be Lightfoot, the Chicago Department of Transportation and the Illinois Department of Transportation. Their posts were seen by well over 100,000 people early in the day, according to Twitter data.

The impersonation effort came just a day after Twitter removed verification from accounts that had been previously verified for the purpose of credibility. Twitter CEO Elon Musk’s controversial decision to remove the “legacy” verifications took away the authenticated status of all three of the impersonated accounts.

Before Friday, the usernames of the true mayoral account, CDOT account and IDOT account had all previously appeared alongside a blue check mark signaling that the accounts had been proved to actually represent the authorities they claimed to represent. However, those check marks were taken away Thursday because of Musk’s decision.

New York City's government also had their own problem.

But this highlights a real problem: in a disaster, or an election, how will people know what information is real? I think "by not using Twitter" seems like the right answer but I also don't think Twitter will fully die by next November.

I didn't publish on Twitter very much before. Today, I'm just standing on shore, watching the ship sink. But it's a big ship, and its sinking will foul the environment for a long time.

Clear, cool April morning

The clouds have moved off to the east, so it's a bit warmer and a lot sunnier than yesterday. I still have to wait for an automated build to run. For some reason (which I will have to track down after lunch), our CI builds have gone from 22 minutes to 37. Somewhere in the 90 kB of logs I'll find out why.

Meanwhile, happy Fox News On Trial Day:

Finally, I've started reading The Odyssey, so I applaud National Geographic's article this month on the history of the ancient world in which Homer set the poem.

And hey, a bug

Not five minutes after my last post, I discovered a completely borked feature, caused by a change to the way Azure.Data.Tables executes queries.

The Daily Temperatures feature stores data in the same table as the History feature. Each row represents a weather report, where the table partition key is the weather station identifier and the row key is the date and time of the report. So, for example, the first row of data for Chicago-O'Hare in the 2023 table has a partition key of KORD and a row key of 20230101-0051.

Climate records use a row key of "Climate-" and the date. So yesterday's climate data for Chicago-O'Hare has a partition key of KORD and a row key of "Climate-20230415". Easy to remember, and easy to construct queries.

To that end, the original (.NET 6) code looked like this:

var query = 
	from entity in table.CreateQuery<ClimateRecordTableServiceEntity>()
	where entity.PartitionKey == locationId
		&& string.Compare(entity.RowKey, lowerRowKey, StringComparison.InvariantCultureIgnoreCase) >= 0
		&& string.Compare(entity.RowKey, upperRowKey, StringComparison.InvariantCultureIgnoreCase) <= 0
	select entity;

When I upgraded to .NET 7, I naïvely just changed the first line, to this:

var query = 
	from entity in table.Query<ClimateRecordTableServiceEntity>()
	where entity.PartitionKey == locationId
		&& string.Compare(entity.RowKey, lowerRowKey, StringComparison.InvariantCultureIgnoreCase) >= 0
		&& string.Compare(entity.RowKey, upperRowKey, StringComparison.InvariantCultureIgnoreCase) <= 0
	select entity;

When confronted with a 30-day query, though, it spun off into the abyss and crashed the whole app.

The correct code looks like this:

var query = table.QueryAsync<ClimateRecordTableServiceEntity>(entity =>
	entity.PartitionKey == locationId
		&& string.Compare(entity.RowKey, lowerRowKey, StringComparison.InvariantCultureIgnoreCase) >= 0
		&& string.Compare(entity.RowKey, upperRowKey, StringComparison.InvariantCultureIgnoreCase) <= 0);

See, now the filter part of the query goes inside the method call. (There's an extra step in reading the async results back, too.)

So the effect of the naïve fix was to hit the table 30 times getting back the entire partition each time. Remember that all of the weather reports go into the table? So, yeah, the 2023 table already has something like 7.5 million rows, or about 2,500 in each partition. So it tried to read 75,000 rows just to bring back 30. Oopsi.

I'm deploying the fix now.

New Weather Now build

It took a few weeks at odd hours, but I have finally deployed the latest version of Weather Now (5.0.8507). I didn't update anything visual, but all the plumbing got a refresh. It's now running in .NET 7 (until November, when .NET 8 comes out), and I did a top-to-bottom review of its asynchronous code.

The app now runs noticeably faster, and I believe the corrections to the async bits will cure the nagging (but invisible) problem of thread exhaustion that happened from time to time.

Now I can start making some other fixes and adding some long-missing features. Really, I just needed to get back into the swing of it.

My domain name is 25 years old

On this day in 1998, I registered braverman.org, and just a few weeks later built the first draft of what became this blog. When I registered it, only about a million domain names existed, though 1998 turned out to be the year the Internet exploded worldwide. Just seven years earlier, only 100 .org names existed, so braverman.org may be one of the oldest .orgs out there. (For comparison, there are just about 350 million registered domain names today.)

Of course, the 25th anniversary of braverman.org hasn't yet become a global holiday, so a few other things happened in the last 24 hours:

  • The Democratic Party really wants US Senator Diane Feinstein (D-CA) to retire, as it has become painfully clear she can no longer perform her duties in the Senate, preventing us from confirming new judges. Seriously, ma'am, go.
  • We also want Justice Clarence Thomas (R) to go, especially after a new revelation that he sold property to the billionaire "friend" who has taken him on half-million-dollar vacations. Seriously, sir, go.
  • At least his colleagues on the Supreme Court all seem unimpressed with the "independent state legislature" bullshit espoused by some right-wing Republican state legislators.
  • New Republic's Timothy Noah thinks "remote work sucks," but (our hero writes from his open and airy home office just steps from his dog and refrigerator) not all of us do.
  • Paul Krugman explains how immigrants are saving America's economy.
  • The New York Times has a lot of good things to say about Chicago hosting next year's Democratic National Convention.
  • Your local, urban apiary might actually be hurting your neighborhood.

Finally, we have another gorgeous day in Chicago, a bit cooler than yesterday where I live thanks to delightful lake breeze, but still more like July than April. 

Ja, er ist der Super Man!

Often when I think about Elon Musk, Spike Jones' 1942 hit "Der Feuhrer's Face" comes to mind. Substack, whose links Musk recently banned from Twitter, brings us A.R. Moxon's similar thoughts:

If you were the world’s smartest man, after all, you’d have turned your apartheid inheritance into the world’s largest fortune, and since you haven’t done that, you aren’t the world’s smartest man. Why, you might not even be a man, the definition of which is something the world’s smartest man seems to have some opinions about.

And one other rather minor thing the world’s smartest man is doing …

He has gone and bought himself a social networking platform. It’s called Twitter and maybe you’ve heard about it. I sure have.

[A]fter he bought Twitter, we have all seen what it means. It means insisting on fostering a place for unrestricted free speech while banning reporters who are critical of him, and bringing back the sorts of abusive actors who had been banned for using their hate speech to threaten and harass other people off the platform. It means insisting that the platform should be unbiased while currying favor from far-right extremists and propogandists and even doing their bidding in real time. It means creating a subscription model that demolishes the existing verification structure and claiming that doing so will create a level playing field, even while describing the new playing field as a deeply divided hierarchy based not on value of one’s thoughts, but on one’s willingness to pay. It means firing most of the staff and pulling apart various load-bearing aspects of the platform’s framework and replacing it with a post-it note. It means doing a lot of things that destroy the value of the platform, in other words, which make more and more of the people who gather on Twitter and create its value wonder what the point of continuing to write on Twitter is.

It all makes me think, as you might expect, of Beavis and Butthead.

Heh heh. Heh. Heh heh. Musk as Cornholio? Oh, my, yes.

Oh, I almost forgot: NPR has left the platform and its 8 million followers, on the reasonable grounds that they “are not putting our journalism on platforms that have demonstrated an interest in undermining our credibility and the public’s understanding of our editorial independence:”

"At this point I have lost my faith in the decision-making at Twitter," [said NPR CEO John Lansing]. "I would need some time to understand whether Twitter can be trusted again."

The only surprising thing here is that anyone has faith in the decision-making at Twitter anymore.

(Note: The Daily Parker is a contributor to National Public Radio.) 

Asyncing feeling

I spent all day updating my real job's software to .NET 7, and to predominantly asynchronous operation throughout. Now I have four stubbornly failing unit tests that lead me to suspect I got something wrong in the async timing somewhere. It's four out of 507, so most of today's work went fine.

Meanwhile, the following stories have backed up:

Finally, a very rich person is very annoyed after his or her private jet got stuck in the mud at Aspen's airport. It seems the guy sent to pull it out of the mud maybe needed another lesson on how planes work, because he managed to snap the nose gear right off the $3.5 million airplane. Oopsi. (There's video!)

Twitter's long slide into irrelevance

I woke up this morning to about 450 error messages because our team's Twitter account got suspended at midnight UTC—that is, at 7pm last evening. No one knew about it because we never considered Twitter errors critical enough to keep them in our inboxes; they all go to an Outlook subfolder. Apparently, Twitter finally decided that our 15-minutes-apart API calls violated a policy, but we never got informed that this would happen or that we needed to correct something.

As near as I can figure out, Twitter's new pricing structure gives developers access to post 1,500 Tweets per month for free, but doesn't allow searches. Our app doesn't post, it only reads Tweets. The "Basic" level costs $100 and allows reading 10,000 Tweets per month. Anything more than that and you have to apply for an Enterprise license—and they don't disclose pricing information online.

Our app read about 12,000 Tweets per hour because each API call brought back about 2,000 Tweets at a time. And as far as we knew, that was what we signed up for. We even have code that checks whether we're approaching the API rate limit so we can pause the API calls.

All of this happened on the same day that Twitter decided National Public Radio is "state-affiliated media," i.e., in the same category as TASS and North Korea's "news" channel. NPR is not amused:

NPR operates independently of the U.S. government. And while federal money is important to the overall public media system, NPR gets less than 1% of its annual budget, on average, from federal sources.

Noting the millions of listeners who support and rely upon NPR for "independent, fact-based journalism," NPR CEO John Lansing stated, "NPR stands for freedom of speech and holding the powerful accountable. It is unacceptable for Twitter to label us this way. A vigorous, vibrant free press is essential to the health of our democracy."

NPR officials have asked Twitter to remove the label. They initially assumed it was applied by mistake, NPR spokesperson Isabel Lara said. "We were not warned. It happened quite suddenly last night," Lara said.

In response to an NPR email for this story seeking comment and requesting details about what in particular might have led to the new designation, the company's press account auto-replied with a poop emoji — a message it has been sending to journalists for weeks.

Mastadon user Rod Hilton posted this in December, which perfectly captures  the value of Twitter's infantile owner:

He talked about electric cars. I don't know anything about cars, so when people said he was a genius I figured he must be a genius.

Then he talked about rockets. I don't know anything about rockets, so when people said he was a genius I figured he must be a genius.

Now he talks about software. I happen to know a lot about software & Elon Musk is saying the stupidest shit I've ever heard anyone say, so when people say he's a genius I figure I should stay the hell away from his cars and rockets.

I figure, I'll keep Twitter as long as some of the people I like keep posting on it, but I know the app will eventually fail. It's a little annoying that our research at work has to stop, because now I have to build an API adapter for a new app.

I can't help but compare Musk to Eddie Lampert, the guy who destroyed the department store Sears. I despise sociopaths like Lampert, but at least Lampert had a definable business strategy and extracted value from tearing the brand apart. Musk really isn't all that smart, and Twitter isn't all that valuable. "Say what you want about the tenets of National Socialism, Dude. At least it's an ethos."