Not a Surprise

Published at 08:51 on 27 June 2025

Today’s ruling should come as no surprise, as it is completely consistent with an earlier ruling by the same Supreme Court.

The problem is, as I wrote earlier, that there are six fascists on the Supreme Court. Fascists don’t care about judicial independence. In fact, they oppose it,as it gets in the way of the will of the leader they follow.

Starting to really look like the courts won’t save you, Nice Liberals.

A Few Final Points Re: Mamdani

Published at 18:06 on 26 June 2025

Because, really, it is not my point to make. It’s a decision for New Yorkers to make, of which I am not one.

But, at over eight million people, it is the largest city in the USA, and as such has more peoople living in it than live in most US states. That alone gives it a prominence that ensures what happens in NYC often doesn’t stay there. Then you have how it is a world-class artistic and cultural centre. Yet more prominence. If Mamdani wins in November, he will likely become one of Trump’s foils, and thus affect US politics as a whole. And what affects US politics affects world politics.

When New Yorkers say their city is the capital of the world, it is, in other words, no idle boast.

Andrew Cuomo has been so humiliated by his primary loss that most pundits are predicting he will entirely drop out of the race, and not even attempt to run as an independent in November. Not so for scandal-plagued incumbent Eric Adams, who has already loudly announced his candidacy.

Here’s another point, though: If Adams continues to hog the limelight, and the centrists line up behind him, he probably loses. Mamdani has already dispatched one corrupt centrist career politician and can probably dispatch another.

If the centrists line up behind someone like Jim Walden, however, they have a good shot at things. Not a sure one (there are no sure shots in politics), but a good one. Walden looks like an outsider who is free from the taint of scandal. It’s that, and not the democratic socialism, that was Mandani’s real secret sauce in the primary. Sure, Mamdani’s base loves that he’s a socialist, but that base alone is not enough to see him through to victory.

It’s not yet clear who the centrists will line up behind.

Right now, there is a lot of wailing and gnashing of teeth from some of the centrist crowd about the primary outcome. Something tells me that they wouldn’t be whining so hard if Cuomo had won, despite Cuomo being the very epitome of a corrupt, out of touch, elitist, career Democrat. You know, the sort of epitome that tilted enough swing voters to Trump the last cycle.

If that crowd really cared about electability, they would care about their own team’s electability issues at least somewhat. But they don’t. So yeah, they just might well fall in line behind Adams.

Or, in other words, the establishment just might just continue unwittingly helping Zohran Mamdani all the way to Gracie Mansion. Which would be fine by me.

Surprise! Mandani Wins!

Published at 10:48 on 25 June 2025

Well, not a complete surprise, because polling did show him surging in support, but a surprise nonetheless (the preponderance of polls still showed him missing the mark).

Paradoxically, I think, it shows basically what the support for Trump shows: that a significant number of Americans realize the political Establishment has not served them well and are upset at that Establishment.

Mamdani and Trump are on opposite sides of the political spectrum, so many political pundits cannot see this. But pundits are weirdos: they care a lot about politics. Most Americans do not care a lot about politics. Most Americans are stunningly politically ignorant, to the point that they are not even able to name their two Senators and one Representative in Congress.

Most Americans don’t think Trump is a fascist because most Americans have no idea what fascism actually is. To them, he’s just an outsider promising to shake things up. They can be convinced, with the right propaganda, to give his extremism a whirl (again, they realize the Establishment that Trump has disdain for has not served them well), or they can be convinced, again with the right propaganda, that he’s just too far outside the norm to be safe.

And, it turns out, many those same unsophisticates can be persuaded to vote for a candidate significantly to the left of that Establishment as well.

That latter point bears elaborating on. There are at this very moment democratic socialists opining that this election shows Americans (or at least New Yorkers) are coming ’round to their ideology. No they are not. They are merely dissatisfied with the political Establishment and what it has brought them, and are willing to entertain giving those from outside that Establishment a whirl.

Most Americans still have a generally negative connotation of what “socialism” means. Mamdani would have probably done better had he avoided that label. By which I mean he could have had exactly the same planks in his platform, just used slightly different branding, and done better as a result.

Donald Trump does not call himself a “red-white-and-blue American fascist,” a “21st century fascist,” or anything of the such. He could, and it would be an exercise in honest labelling, but he doesn’t. Yet one more example of why Trump is actually more politically savvy than most of the Left. (Of course he is. Just look at his winning record at the ballot box.)

Of course, this cuts both ways. The Establishment Democrats would have probably done better (and likely won) if they had put forth better standard-bearers than a disgraced mayor and a disgraced former governor. So what we have here is basically a situation in which one side’s incompetence cancelled out the other side’s.

But I am digressing here. The same Democratic Party Establishment that backed Cuomo in a desperate and ultimately failed effort to keep Mamdani from winning the primary is the same Establishment that is now only one for three in keeping the most extreme and unqualified candidate to ever seek that office out of the White House. (And when they did gain power, they refused to use it to crush fascism.) These are not people of either great political wisdom or great political morals, and we all need to spend a lot less time paying serious attention to what they have to say.

If Mamdani wins in November and accomplishes that alone, his victory will have meant something.

If, furthermore, his administration is a success and gets more Americans to seriously entertain more left-wing policies, it would be great. But even the former lesser case would prove politically beneficial.

Well, He Did

Published at 07:15 on 22 June 2025

Now we get to see how many Trumpers rescind their support for Trump as a result, and how many will convince themselves that Big Brother just increased the chocolate rations.

We also get to see how Iran retaliates. If Iran does not retaliate, it will show how weak and ineffectual the regime is, which will hasten its demise. Those who run that regime know this.

Iran gets to choose the time, place, and means of retaliation, and they will choose it with an eye to maximizing the surprise factor and the effectiveness of the mission.

Welcome to war.

Will Trump Attack Iran?

Published at 08:49 on 20 June 2025

Short Answer

Who knows? It will depend largely on his whim at the moment, and that is famously unpredictable.

Longer Answer

It is not the definitive “yes” answer that Rick Wilson seems to think it is.

Why? Because Trumpers are not what he thinks they are. Many Republicans warmed to Trump’s willingness to burn it all down in part because they felt betrayed by their own elite, who led the USA into a number of futile “forever wars” in the wake of the 9/11 attacks. Wilson is of course one of that old elite, he hates Trump, and this reality is therefore most unpleasant to him.

So he constructs an alternate reality in which much of the Right just became inexplicably depraved for no good reasons at all. And, conveniently enough, there are plenty of examples of depraved beliefs to back this whole “depraved” narrative up.

I sometimes interact with Trumpers online, and one common narrative they volunteer as to why they are what they are does fall back on these forever wars. It’s why they can so easily wave off all the concerns of the Never Trump crowd (largely dominated by those same neoconservatives who led the USA into those wars).

And keep in mind: this is what has been volunteered to me, repeatedly, for years now. It’s not some new stuff that some echo chamber media voices thought up on the spot just to help them argue “no, we don’t want to get more involved in the Israel/Iran war, trust me.” It really seems to be a genuine motive.

As such, I rate it as highly likely that if Trump does get the USA heavily involved, it will hurt him.

Sure, a lot of his base are fascist follower types who will pivot on a dime and not only argue but actually believe that Big Brother just increased the chocolate rations. A lot. But not all. Some won’t.

And Trump didn’t win by much, so he can’t afford to lose much support. He’s already underwater on most issues in the polls.

Getting the USA directly involved is highly likely to hurt Trump. And Trump might realize that, which reduces the odds that he will. It is revealing that his current line is that he will decide in “two weeks.” That seems to be his stock phrase for kicking the can down the road and often doing nothing at all.

Trump’s only loyalty is to himself. He has no loyalty to anything or anyone else, including Israel and/or Netanyahu.

Anyone giving almost-certain answers on this one is missing some important points.

Time and Date Done Right

Published at 22:15 on 17 June 2025

To avoid being simply negative and cutting others’ efforts down, I will contrast the shambolic time and date situation in Java with the superior one in Python.

The latter has two time and date packages. This is largely as a result of history. One, time, came early on, and basically is a way to call the Posix time and date functions from Python. The other, datetime, came later, and is geared to more advanced use cases.

I almost always just use time, because as I said earlier, by far the most common uses for a time datatype are to create an instance of one and to print it. For that, the traditional time library is more than sufficient.

But even datetime is so much better designed than its Java counterpart. Instead of nine absolute time types, there are three (a calendar date, a time of day, and a date with a time). Instead of two relative types, there is just one (which, really, is all one needs). Instead of an elaborate set of classes devoted to formatting and outputting a time, there is just a strftime method for each time object (and all the strftime‘s use exactly the same format-specifying mini-language, which is mostly compatible with the one used in the Posix/C world. The cognitive load of understanding it all is so much more reasonable.

As for the legacy class, its base time type is a Python floating point number. This is a value type, and as such avoids all the headaches associated with a mutable reference type. Its alternate time type is a Python tuple. Since tuples are immutable in Python, this also neatly avoids mutability headaches. And since standard, pre-existing data types are used, there is once more less cognitive load imposed on the programmer.

Since there is nothing fundamentally wrong with the older time class, it is considered just fine to use it in new programs. Because of course it is: it is the simpler of the two, and simplicity has long been a core value in the Python world.

It’s one of the reasons I can be so harsh on Java. They knew better, or rather should have known better. Python predates Java, and Python did not come up with this simplicity-as-a-virtue business. UNIX embodied it over two decades before Python popped onto the scene. By the time the 1990’s rolled around, UNIX had a longstanding reputation for being an exceptionally productive programming environment.

The principles were known. The Java world chose to ignore them, and has suffered as a result ever since.

Site Instability Update

Published at 14:27 on 15 June 2025

This site has been stable since I implemented a stopgap measure to prevent abusive crawling from taking it down.

Alas, the abusive crawling persists. It is happening in spite of robots.txt directing robots to avoid the troublesome URL. The robots in question also, contrary to best practice, contain no user agent information identifying themselves. Pure sleaze. I suspect one or more AI firms to be behind it, trolling the Internet for code to train their models on.

So a longer-term fix has now been implemented. The offending URL now always returns and HTTP 403 (Forbidden) response, about which RFC 2616 says “The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated.”

The returned response contains instructions for how to edit the URL in the browser URL window so as to reach the desired service, so humans once more have access to it. Effectively, this functions as a form of CAPTCHA.

It’s done via a CGI script. It doesn’t have to be, but it was easy that way. Rename the old script to the name that now accesses the service, and install the new one as a drop-in replacement for the old one at the original address. Plus, it keeps the URL similar so it’s relatively easy for humans to edit into the form needed to access the service.

The “script” is actually a compiled C program and not a script, because it has to be. Anything more resource-intensive might cause the abusive crawlers to take my site down.

Anyhow, problem (hopefully) solved.

On the Recent Protests

Published at 09:17 on 14 June 2025

There has been a lot of hand-wringing recently from many on the anti-Trump side of how the recent protests against ICE are doomed to be a disaster because they are not perfectly adhering to the ideals set forth by those wringing their hands.

Look, this is a stupid basis on how to judge things. No set of protests of any size and consequence is ever going to strictly adhere to any one individual’s pet set of standards for political protest. It’s just not going to happen.

This sort of unrealistically high standard is almost uniquely applied at home and nowhere else. Look at any other authoritarian country where open opposition emerges, and you will find incidents of, at the least, property destruction and retaliation in kind against police violence. Of course, the narrative is never about the property destruction or retaliation then. In fact, that stuff usually gets papered over in the mass media. But it’s fairly easy to find the images of burning vehicles and protesters throwing rocks at police if you look for them.

Almost never is there the “oh, dear, the protester’s tactics are going to alienate people from their cause” take for such protests abroad. Rather, the sign that protests are emerging at all is seen as a positive sign that the regime’s spell over its populace is breaking.

And yes, at this point, the USA is best understood as some form of a soft authoritarian regime. It’s really the only honest way to characterize a society where masked secret police go around disappearing people, with (up until the last week or so) very little resistance from the populace.

No, that doesn’t mean that optics are unimportant, or that there are not big issues on the American Left. I have written before on how much the American Left is an inward-looking subculture and of the necessity of any protest movement to break out of that subculture.

But that latter point cuts both ways. There is also a need for any protest movement to break out of the control of the Democratic Party and its allies. That crowd is so stunningly incompetent at the whole politics game that any leadership role on their part probably dooms opposition to ineffectiveness. What we don’t want is protests that can be turned on and off at the whims of the Democratic Party. We need the heat to stay turned up on Washington even after Trump is, one way or another, removed from office. The Democrats did very little to fight fascism under Biden and there is exactly zero reason to assume they will, absent a lot of pressure from below, do much about it again if they ever manage to regain power.

And this leads me to the really worrying thing about the planned No Kings protests. From what I have been able to determine, it’s all being run by a centralized leadership that is, in fact, closely linked to the Democratic Party.

We still have yet to see any sort of broad none-of-the-above movement emerge. This limits my optimism, although it is also true that in this sort of situation, any protests almost always beat no protests. So I am more optimistic than I was a month ago, but it will take significant changes in the nature of the opposition to Trump to raise that optimism to a truly significant level.

Why I Hate Java, Chapter No. Too-High-to-Count

Published at 10:31 on 13 June 2025

The time and date situation. Specifically, the new “improved” one.

Yeah, I get it. The old one is full of deprecated legacy cruft calls. Its fundamental time type is mutable (which is undesirable when writing multithreaded code). Plus it has an absolutely horrible name: Date refers to an object that holds the number of milliseconds since the UNIX time epoch.

On that latter point, I have no idea why the early Java dev team chose such a lousy name. They really had no excuse. About eight years prior, the Posix team chose time_t for their analogous data type. That had only one-second resolution so they later came up with a struct timeval with microsecond resolutions. Both are fundamentally reasonable name choices. Calling a time a time makes just so much more sense than calling a time a date. Just goes to show how long the brain rot has been prevalent in the Java world.

Speaking of that brain rot, Baeldung is one of the go-to sources for information in the Java world and their article on the new time and date API is a total hoot. It’s just one whopper after another. Let’s pick out a few of them, shall we?

Working with dates in Java used to be hard.
No, it didn’t. Not really, once you got over the weird naming convention of calling a time a date, and the fact that there were two classes for formatting a time. Because of course there were. This is Java, and we can’t do anything right. Got to write one weak, lame API and then a second one (also limited) to make up for the weakness and lameness of the first.
These were only suitable for the most basic tasks.
Bullshit, they were suitable for virtually every routine task. Only a tiny percentage of programs delved into the minutiae of dates, times, time zones, and calendars enough for the standard library to be insufficient, and that was not reason enough to clutter up that standard library with support for rarely-needed edge cases. It’s a reason for a third-party library of extended, specialized time and date functions to exist.
A first advantage of the new API is clarity
Bwahahahahahahahahaha! This whopper is so bad I could write several paragraphs about just how much of a whopper it is.

And now I shall write those paragraphs.

The new library has no fewer than nine absolute and two relative time classes. No, I am not making this up. They all differ in various subtle ways from each other, ways that will require one to spend no small amount of time reading documentation to figure it all out. And figure it all out you must, or your code will throw fatal exceptions and fail to run if you use the wrong class in the wrong place. This is apparently what Java-heads consider “clarity,” and feel so strongly that it is such that they set the term in boldface.

And that’s just times. Then there’s time zones. There are two time zone classes, again because of course they are. (Making three types of time zone in total once you add the legacy one which is still around. Oh, wait, I also forgot that there are now time zone ID objects, which differ from actual time zones in various subtle ways.) The two new zone types also differ in various subtle ways, and you have to study the documentation a while to understand these differences, too.

The most common uses by far for a time object are to create it and to print it. Manipulations are so far down on the list that they can be disregarded for purposes of discussing the most common uses. Let’s print the date in the preferred format for the current locale. For the old Date option, it is relatively simple:

Date now = new Date();
DateFormat formatter = DateFormat.getDateTimeInstance();
System.out.println(formatter.format(now));

After a lot of reading, eventually one figures out that the Instant (you might think they would call it Time or TimeStamp, but apparently some types just never learn, sigh) class is the closest analogue to the old Date class, and the new formatting class is DateTimeFormatter. Great!

Instant now = new Instant();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime();
System.out.println(formatter.format(now));

But that won’t even compile. Turns out you can’t construct an Instant, the constructor is now private. You must call the now static method:

Instant now = Instant.now();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime();
System.out.println(formatter.format(now));

Nope, still lose. Turns out formatting has been dumbed down. Formatters are now too stupid to come up with a preferred default style. You must tell it the style. To do that, you have to learn about (and introduce) an extra style-specifying class.

Instant now = Instant.now();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
System.out.println(formatter.format(now));

Yay! It compiles! Uh oh, it throws a weird exception when running.

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: MonthOfYear
	at java.base/java.time.Instant.getLong(Instant.java:604)
	at java.base/java.time.format.DateTimePrintContext$1.getLong(DateTimePrintContext.java:205)
	at java.base/java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:308)
	at java.base/java.time.format.DateTimeFormatterBuilder$TextPrinterParser.format(DateTimeFormatterBuilder.java:3363)
	at java.base/java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2402)
	at java.base/java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4848)
	...

Now you get the fun of delving into the Temporal interface and temporal accessors. Which it turns out doesn’t even help. The problem is not even there, it is someplace else. It turns out that the new formatter will accept arguments it is incapable of processing. There are nine date/time objects, remember? Which ones work at which times is a complicated set of rules. So not so fast! You have to take on the cognitive load of understanding all that too.

Eventually you hit on it. Time zones used to be part of formatting. Makes sense, right? A point in time is a point in time. What the clock shows for that point in time depends on your local time zone. But that’s too simple and logical for Java, so we’ve fixed it for you. Some edge cases might want to store times together with time zones. It’s easy enough to do that on one’s own (just define a class containing a time and a zone), but hey, let’s shove complexity at the programmer and support that edge case. It’s the Java way. Might as well support the notion of a time of day discombobulated from any notion of a zone, too, just in case someone might want that. As well as a whole batch of other possibilities. And since we want to format those objects, too, we can’t have a zone in the formatter. It must be in the time object itself. So we are passing the wrong sort of time object if we want to print out a local time with a zone.

After more studying yet, you finally determine that the one time of day class out of nine which we need is ZonedDateTime. Of course, Java being Java, you can’t just call the ZonedDateTime constructor with the Instant you wish to print. The constructor is again private and you must call a static method. And to top it all off, that static method is too stupid to have any notion of a default local time zone so you must fetch and furnish that as well. And at long last, you have arrived at the code to do what you want:

Instant now = Instant.now();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
ZonedDateTime printable = ZonedDateTime.ofInstant(now, ZoneId.systemDefault());
System.out.println(formatter.format(printable));

Of course, most programmers never get that far. The ones whose eyes don’t glaze over after learning there are nine different time types (they’re in a hurry and don’t have time for this lunacy), are probably going to give up when they run into the UnsupportedTemporalTypeException getting thrown on them. Again, they just don’t have time for this crap. The boss is wondering when the new feature that sales promised the important new customer will be ready. Trusty old Date works just fine, doesn’t spring weird surprises on them, and isn’t even officially deprecated (and probably won’t be for a good long time).

And then you have hardcore Java-heads expressing frustration and mystification as to why so many programmers are continuing to use the legacy API. Gee, I dunno why that might be. It’s just a mystery.

And the problem is, it’s like this all over the place in Java. Gratuitous complexity everywhere. Code in Java, and the cognitive load you must contend with is at least an order of magnitude greater than it needs to be, if reasonable and sane software design prevailed in the Java world.

Site Instability

Published at 21:12 on 7 June 2025

The robots are back, and crawling the hell out of my Mercurial repository that really can’t take that sort of rate of access. So this site has been more down than up recently.

robots.txt has been adjusted accordingly, but the offending robots are apparently working on cached data and still making banned requests. So I have temporarily turned Web access to the repository off. The requests continue, but now they get relatively cheap 404 responses involving only Apache, instead of having to fork and exec a Python CGI script to process each request, so they are no longer doing much harm.

When the robots stop trying to access that CGI script (probably in a day or so), I will re-enable Web access.