Yes, Ukraine Sank the Moskva

Published at 10:41 on 15 April 2022

No, I am not just blindly taking Ukraine’s assertion on it:

  1. The Russian claim that a fire broke out and it had to be abandoned just doesn’t make much sense. Nobody just abandons a ship, particularly a prize asset like the Moskva, because a fire breaks out. They try and fight the fire. If they couldn’t, this points to crew incompetence that is even more embarrassing than a missile strike.
  2. The Russians don’t even believe their own claim. Just look at this anthology of how the Russian state media is screeching in outrage at Ukraine over the sinking. Why all the outrage at Ukraine if Ukraine had nothing to do with it?
  3. The US Department of Defense has concluded, based on the available intelligence, that Ukranian missiles were responsible for the sinking.

Simply all of the best available evidence is pointing to it being a successful Ukrainian attack.

And it is a major loss for Russia. The Moskva was the flagship of Russia’s Black Sea fleet. This is the largest deliberate sinking of a ship since World War II. Large ships are not built overnight; it will take many years to complete constructing a replacement. In the meantime, Russia is not able to move a replacement into the theatre of combat from one of their other fleets because Turkey has closed the Bosporus to Russian warships.

Still an Anarchist

Published at 02:10 on 15 April 2022

And this most recent post basically says it all as to why.

This is totally a crisis of bourgeois politics. The radical left is a tiny and insignificant part of US politics. One bourgeois party went fascist, largely because fascism is compatible with, and is in fact a natural outgrowth of, the authoritarianism of the capitalist corporation. The other bourgeois party failed to do much of significance to oppose the fascists, because doing little of consequence (while soaking up political energy that might do more of it) is the political niche that party evolved to fill.

When the authoritarian transition completes, the USA will hardly be the first capitalist society to have gone fascist. The fascist form is merely one of capitalism’s natural forms. To be shocked at it all is to be shocked that some deserts contain cacti.

Really now, just what does one think the natural consequence of an authoritarian economic system, one contrary to the material interests of the vast majority, might be in an otherwise open and free society? That freedom is obviously a danger to capitalism, because freedom implies the freedom to pursue alternatives to capitalism.

The way to deal with that, without just throwing freedom away right off the bat, is to somehow create a culture of lies and indoctrination so as to snow the majority, or alternately to nurture anti-freedom attitudes in that majority (so that they perceive themselves to be better off if there are bosses in their midst). And once one does that, political freedom is always at risk because of the beliefs that make economic domination safe; it only takes a relatively modest additional amount of propagandizing to get to the point where full fascism becomes politically feasible.

I worked the above out decades ago, and when I worked it out, was the moment I consistently began self-identifying as an anarchist, because I knew that, if allowed to stand, bourgeois society would inevitably bring us to basically just the sort of place that it has now brought us. Unfortunately, and for a variety of reasons, the movement that I was part of failed in its historic task (at least for now).

And here, as they say, we are.

That I will, and have, when the time came, made alliance with those who are pro-capitalist but anti-fascist, does not mean I have ceased to believe any of the above.

U.S. Democracy Still at DEFCON-4

Published at 07:11 on 13 April 2022

The January 6th Committee says it has evidence that Trump willingly and knowingly broke the law during his presidency. Not only did he do that, but his lawbreaking fundamentally threatened the constitutional order, being geared towards unlawfully remaining in office after losing an election.

The January 6th Committee is also unsure about what to do next.

Put that in your pipe and smoke it. The political culture in the USA is so degraded that a president can directly conspire against the constitution and it still probably will not be enough to indict him.

Spare me any sanctimony about a rule of laws and not of men. In the USA, a President is god and can do whatever the hell he wants.

Don’t celebrate about the backlash against Russia being a backlash against authoritarianism. When the fascists prevail in the USA — as seems likely — democratic retreat will really shift into high gear worldwide.

I would like very much for the Committee and the Department of so-called “Justice” to prove me wrong on this, but I don’t expect it.

Putin Tries to Pivot

Published at 06:55 on 7 April 2022

With Russia conceding defeat in many battles (and make no mistake, this is precisely what they are doing), Putin’s announced intent is to concentrate on trying to whittle off the Donbas and Luhansk regions.

Now, something like this is what I originally expected Putin to do, and I originally expected Putin to succeed in doing it. That, however, was then. This is now:

  • Then, Putin would have been coming in with fresh troops, at full strength. Now, he is working with troop and materiel depleted by over a month of battles, battles that went rather worse for him than he believed they would.
  • Then, Russia was not sanctioned and isolated. Now, Russia is.
  • Then, troop morale had not been battered by over a month of combat and unexpected resistance. Now, it has.
  • Then, Ukraine had not been armed to the teeth by massive amounts of Western aid in the way that it now has.
  • Then, morale on the Ukrainian side was one of fear and trepidation. Now, there is rather more optimism, optimism borne of the reality of being able to fight back surprisingly effectively against Russia.

The trouble for Putin is: you can’t undo the past. What has been done has been done, and it makes the job of whittling off Donbas and Luhansk significantly harder than it would have been had that been the original war goal.

Making GUI Apps for Linux, Macintosh, and Windows

Published at 21:02 on 3 April 2022

Foreword

I collected this information about two years ago, intending to publish it here, yet never did. Before I lost track of it, I decided to do so this evening. Note that this information was correct as of two years ago; so there is a chance that some things have changed since then. (Though I am at present revisiting these topics, and so far I haven’t found any changes in what follows.)

Introduction

I’ve been mostly a back-end programmer and command-line guy. That, plus inertia, has caused me to not bother with supporting graphical user interfaces in the code I write.

Until recently, that is. There’s a few ideas I’ve had rattling around in my head that would be useful for others, but many of those other people are not computer geeks and would not be interested in opening a Terminal or Command Prompt app just to run my command-line programs.

As a result, I’ve been learning how to make normal, “clickable” apps that a normal person would be able to run without extensive training and hand-holding. Might as well share that knowledge with others.

What follows is likely to be particularly useful to those who, like me, are using something other than the normal, approved tools to code their apps. In my case, I’m using Kotlin, because it’s a modern language with a powerful, expressive syntax and it runs under the Java virtual machine, making it much easier to port my code to different systems.

Yes, there are “standard” programs to do all of the following. Without very few exceptions, I have found them to be poorly documented and geared to C/C++ developers. I found that attempting to bend these tools to my will was sufficiently difficult and painful that it was easier to forget about them and just do it all myself, mostly from scratch.

Linux (Gnome on Ubuntu)

To have an application that comes up as a clickable icon like all the other normal Gnome apps, one must install files in a number of places, primarily under /usr/share. It’s something of a mess, as the files that define the presence of a given app are scattered here and there, not collected in one place as they are on a Mac.

The easiest way to cope with this state of affairs is to do what everyone else does: make a Debian package (Ubuntu is Debian under the hood). Thankfully, .deb files are pretty simple: an ar archive with three members:

debian-binary
This consists of the string “2.0” followed by a newline. That’s it. It must be the first member of the archive.
control.tar.gz
Files that control the installation. The control (yes, control.tar.gz contains a file named control) file is the only mandatory one, though an md5sums one is highly recommended. This must be the second member of the archive.
data.tar.gz
The files to install. They all are relative paths (to root). I.e. if your package has an executable to be installed as /usr/share/program it will be in here as usr/share/program. This must be the third and final member of the archive.

Note that all files must be stored with the correct ownership information (usually as root, the superuser).

In order for a Linux application to look like a normal, clickable Gnome app, and for lintian to not complain a lot about your package, you need to have a number of files installed (i.e. present in data.tar.gz). For the purpose of this list, name refers to your application’s name, folded to lower case:

usr/bin/name
Most clickable apps on Ubuntu are also installed so that they may be invoked via the command line.
usr/share/applications/name.desktop
This is the main file whose presence enables your application to show up on the desktop.
usr/share/doc/name/changelog.gz
A description of the changes made to the package. This is compressed from a file that has a nasty, column-sensitive format; it is described in detail below.
usr/share/doc/name/copyright
A copyright message. If it refers to one of the standard licenses described in /usr/share/common-licenses, you should not include the full license terms in this file but instead end it with a reference to the common license.
usr/share/icons/hicolor/48x48/apps/name.png
At a minimum, you must define 48 × 48 an icon in the hicolor theme. The name of this icon file must match the name of the icon described in the .desktop file; for sanity’s sake, just use your application name.
usr/share/name
If your program has any data files, these go in this directory. For example, the .jar and .class files for a Java application will live here.
usr/share/man/man1/name.1.gz
There should be a manual page for your application, which should be in compressed form.

It is best to use dpkg to inspect a few .deb files for programs similar to yours to get an idea of what you need to define. A good source of such files can be the system package cache, /var/cache/apt/arhives.

Once you have a directory tree with the files you need, it is a simple enough matter to use tar and ar to create a .deb file:

echo 2.0 > debian-binary
cd data
find * -type f -print0 | xargs -0 md5sum > ../control/md5sums
tar -c -z --owner=0 --group=0 -f ../data.tar.gz *
cd ../control
tar -c -z --owner=0 --group=0 -f ../control.tar.gz *
cd ..
ar r name.deb debian-binary control.tar.gz data.tar.gz

After creating your .deb package, it is strongly recommended that you use lintian --info to check it. In general, you should be concerned about anything flagged at the E (error) level, and at least make an effort to reduce the number of W (warning) level messages that lintian reports.

One thing I don’t worry about is complaints from lintian about the manual pages not being compressed to the maximum level: I use an Apache Ant task, not the gzip utility, to generate my compressed files, and it has no option to select maximum compression. It makes no difference to the system, and the amount of space saved by using maximum compression over the normal level is insignificant.

The Changelog File

Welcome to the year 1967. You are at a keypunch machine preparing a data deck for an IBM 360 program. Be sure to follow the correct rules for which records get punched starting in which column, or you will be rewarded with lots of error codes IEBLINTIAN later!

Your changelog deck consists of a series of cards, which contains groups of records which describe changes made to your program. Each group of records must begin with a card punched starting in column 1, of the following format:

name (version) distribution; urgency=urgency

Things in bold should be typed verbatim; things in italics should be replaced with something appropriate:

name
The name of this package, consistent with the name used elsewhere
version
Pretty obvious. The version mumber.
distribution
Until and unless your package becomes a well-established part of the core distribution, this should probably be unstable.
urgency
This will usually be low.

Following this card, you may optionally have a blank card. The details of the change are introduced by a card with an asterisk punched in column three (columns one and two must be blank); the remaining columns on this card describe the change. If describing the change takes more than a single card, subsequent continuation cards are punched starting in column five.

After the description comes an optional blank card, followed by the card defining the programmer and date. This is done by punching hyphens in columns 2 and 3; the card has the following overall format:

  -- Joe Coder <joe@coder.com>  Thu, 30 Apr 2020 13:16:43 -0700

Note that the e-mail address must be in angle brackets, and there must be two blanks separating it from the date, which must be punched in RFC2822 format (the same as reported by the date -R command).

Macintosh

A Macintosh application (technically, an “application bundle”) is actually a directory whose name ends in .app and which contains but a single subdirectory, Contents. That subdirectory in turn must contain a number of files:

Contents/Info.plist
This is an XML document in a specific form, which is described here. If you are developing a Java application, see “Info.plist Java Notes” below. Apple provides a command-line program, /usr/libexec/PlistBuddy, which can be useful when generating or reading this file.
Contents/MacOS/something
This is the executable file for your program. It is OK for it to be an executable script in one of the standard MacOS scripting languages (e.g. a bash script). Its name much match whatever something you chose to associate with the CFBundleExecutable key in Info.plist.
Contents/PkgInfo
I have not been able to find much information on this file, but I believe it helps the Mac associate this application with certain file types. In the general case (no special associations required) it suffices to set the contents of this file to APPL???? .
Contents/Resources/something.icns
The application’s icons. See “Preparing Icons” below for more details on how to create this file. This file’s name must match whatever something you chose to associate with the CFBundleIconFile key in Info.plist.

That’s it for the mandatory contents. Any directory whose name ends in .app and contains the above structure should be recognized as a clickable application by the Macintosh. It is, of course, common for applications to contain read-only data, which is also contained inside the app bundle. For example, .jar and .class files for Java applications can be stored in Contents/Java. Applications can also use non-reserved keys in Info.plist to store configuration information and other data.

Info.plist Java Notes

Apple has a standard way of storing Java-specific information in Info.plist, under a Java element in the top-level dictionary. Unfortunately, using it will cause a Mac to attempt to run the app using a very old, Apple-customized Java runtime that isn’t even present on most Macs. Your users will see a dialog with a bunch of blather about the “legacy Java runtime” being needed, and even if they follow Apple’s suggestion and download that runtime, it is likely that won’t be able to run your application, because it is so obsolete.

Therefore, as Groucho Marx said about the doctor’s response to the patient who complained “It hurts when I do this,” don’t do that. I follow the Oracle convention of putting the entry-point class in JVMMainClassName, a package-relative path to my Jar file in JVMClassPath, a Java version specification in JVMVersion, and any extra options to pass to the Java environment in a JVMOptions array.

Actually, it doesn’t much matter. I could have come up with unique keys of my own (so long as they didn’t clash with any official Apple ones), and it would have worked just as well. MacOS is blissfully unaware of the significance of those JVM… tags, and simply ignores them. They are meaningful only to my defined CFBundleExecutable script, which has been coded to look in Info.plist for some of its options.

Preparing Icons

Mac application icons are stored in .icns files. These are actually a collection of multiple icons, defined for a variety of sizes. To create such a file, you must create a directory whose name ends in .iconset, and populate it with PNG images containing your icon in various sizes, as described here. Then use iconutil to generate a .icns file; assuming your directory was named name.iconset, you would type:

iconutil -c icns name

Windows

A clickable app on Windows is simply an executable (.EXE) file that contains an embedded icon which Windows will recognize and display.

If you create a jar file and set Main-Class in its manifest to point to the class containing your application’s entry point, Windows considers it to be an “executable jar” and will launch your application when you click on the jar file. That’s almost as good as a having a proper executable with an embedded icon, but it doesn’t have an embedded icon, so your app will display using the default icon that all jar files get.

The solution is to install Launch4j and use it to create a Windows executable with your icon of choice embedded in it. This is a free program, and I have found it to be well-documented.

If your application is sufficiently complex as to require a bunch of support files under Windows, then you will need to create a Microsoft Installer file. My apps have so far been simple enough not to require this, so I don’t have much help to offer in this regard yet.

Whiny Canadian Conservatives

Published at 17:17 on 31 March 2022

Much whining is made from Conservatives about how unfair the world is, because the Liberals got less votes than them, but still got to form a government. And now the NDP has agreed to enter into a confidence and supply agreement, maintaining the status quo for another three years. Doubly unfair!

Not quite. First off, let us review the results (via Wikipedia) of the most recent Federal election (only last year):

Party% VoteSeats% SeatsCoefficient
Liberal32.6215746.441.42
Conservative33.7412135.791.06
Bloc Québécois7.64329.461.23
New Democratic17.82257.390.41
Green2.3320.590.25
People’s4.9400.000.00

(More about that mysterious “coefficient” column later; it’s important! But I digress.)

Anyhow, pay attention to the two parties that just entered into that supposedly “unfair” agreement: collectively, they got 50.44% of the vote. Barely a majority, but a majority nonetheless. Suddenly, this agreement is looking a lot less unfair. But wait, there’s more: the Greens are also a left-of-centre party, and the Bloc advocates a social-democratic flavor of Quebec nationalism. Add those votes and we are now up to 60.41% voting for centre-left politics of some sort.

But you would never realize that, given how much the Conservatives whine about how life is so unfair, because they got more votes than the Liberals did, yet don’t get to form a government. Now, they do have a little bit of a point; the Liberals are arguably over-represented. This is where my coefficient comes in; it is the ratio of the percentage of seats in the House of Commons to the percentage of the overall popular vote. A number greater than 1 indicates a party is over-represented, and a figure less than one indicates it is under-represented.

No party has a coefficient as high as the Liberals’ 1.42, so they are over-represented, no doubt about it. But the Conservatives are at 1.06, just about parity. If you want to see who’s getting the shaft, look at the NDP. A fair system would mean 60 NDP MP’s; instead, there are only 25. No other party falls so short in absolute numbers of seats, though the Greens and particularly the People’s Party fare worse percentage-wise.

There are definitely criticisms to be made about first-past-the-post, but to insinuate that it is undemocratically giving Canada a centre-left government is not one of them. A completely fair allocation of Commons seats, in line with popular vote percentages, would achieve the same basic outcome.

On Siding with NATO

Published at 07:41 on 29 March 2022

There is a subset of the Left — probably not a majority, but definitely more than just a few people — that is very “both sides” about the war in Ukraine, refusing to see either side as being worthy of support. “Why are you siding with the US empire,” they ask.

My answer is: for the exact same reason I “sided with the Soviet empire” on the issue of East Timor in the 1980’s, when I first became aware of it: because that side was on the morally right side of that issue, defending a weaker nation that had been brutally invaded by a stronger one. The US Empire was strongly backing the invading nation, Indonesia, and the Soviet one was aiding the mostly leftist rebels fighting the invaders.

Just because both empires are seriously morally compromised does not mean that every last position either one takes on any issue taints that side of the issue beyond hope. That is not political strategy, that is oppositional defiant disorder. It is possible for a morally compromised empire — and all empires are evil — to nonetheless take a stand on a particular issue that is the morally correct one.

As morally compromised as the entire first Cold War was, it was also the case that the nations of Western Europe were much better places for human freedom than the nations of Eastern Europe. If you can’t acknowledge that plain fact, then you are simply not paying attention.

Once one got outside Europe, of course, the picture quickly got a lot murkier. The USA and its allies often supported brutal and kleptocratic colonial (and post-colonial neoimperialist) power structures. The USSR and its allies often opposed these same power structures (pity that the ones they set in place were seldom any better).

That the First World media generally ignores happenings in the Second and Third Worlds worked to the advantage of the US Empire, because, to reiterate, in Europe, the confrontation was also distinctly one between a world with more freedom and a world with less.

What this all calls for is nuance over simplicity. It is possible to acknowledge that what the West is doing in response to the invasion of Ukraine is generally what should be done, without going to the level of then concluding that anything the West does anywhere must be supported.

Why Biden Shouldn’t Have Said That

Published at 07:57 on 27 March 2022

Basically, because although NATO is on paper a multilateral organization, the USA is clearly and by far its most powerful and influential member, and therefore its de facto leader. Thus, any remarks of such character by a U.S. president help make Russia’s case that this whole thing is about a confrontation between NATO and Russia.

Since NATO is clearly more powerful than Russia and its allies, that, in turn, helps Putin reframe the narrative from one in which Russia is the aggressor to one in which Russia is being threatened by a yet more powerful alliance bent on ganging up against it. And the more Putin can do that, the more secure his position becomes.

Biden said what is obviously true: both Russia and the world as a whole would be better off without a fascist like Putin in charge. But by the very fact of saying it, he made that goal more difficult to achieve.

To reiterate: with great power comes great responsibility.

Biden Shouldn’t Have Said That

Published at 17:36 on 26 March 2022

“For God’s sake, this man [Putin] cannot remain in power.”

As much as I agree with the sentiment, the President of the United States has no business saying such things.

I can say such things… and get away with them. Biden cannot. I am just some random guy with a blog. Biden is President of the United States. As the old saying goes, with great power comes great responsibility.