On Exaggerating the Consequences

Published at 09:09 on 30 April 2022

My last post mentioned in passing exaggerating the economic consequences of the pandemic.

I suppose I can take solace in how I am hardly alone in doing so. In particular, most central bankers did precisely the same thing, which motivated them to take actions to aggressively promote inflation and stimulate economic growth. We are now starting to pay the price (literally) of those inflationary policies.

In defense of the banksters, it is actually a logical choice to err on the side of avoiding a deflationary spiral. This is because the deflationary cycle is much harder to rein in than the inflationary one. During a period of deflation, one can profit simply by stuffing a mattress with cash, since falling prices mean that cash will become more valuable over time.

During a period of inflation, by contrast, it is best to be cash-poor and invested in physical assets. Central bankers can counter this trend by raising interest rates to the point where high compound interest more than cancels out how money is declining in value over time. Note that countering a deflationary cycle via adjusting interest paid (or in this case, charged) to savers is not possible, as it would imply negative interest rates, and if there are negative rates, one can easily beat them with a mattress stuffed with cash (0% interest).

(And no, it tends not to be literal mattresses stashed with literal cash. Safe deposit boxes full of bundles of C-notes are much more common.)

Central bankers know all of this, therefore their goal is never to stomp out inflation completely, as this is just too dangerous. (Remember, they will sometimes guess wrong, because economic forecasting is never 100% accurate.) Rather, the goal is to shoot for a low but not zero rate of inflation, a rate of inflation with enough of a safety margin to make triggering deflation extremely unlikely.

During the pandemic this was all complicated even more by being in something of unprecedented economic circumstances, and deflation did in fact start rearing its head in the early months. Seeing the danger in that, it is really no surprise the central bankers floored the economic accelerator pedal. It turns out they guessed wrong (also not a surprise, given the lack of precedent), so now we have an inflationary spiral.

But as bad as that is, it still beats the pants off an out-of-control deflationary spiral. Keep that in mind when you hear the righties moaning about big government, central bankers, fiat currencies, and (the lack of) gold standards.

The Post-Pandemic Future of Cities

Published at 08:39 on 30 April 2022

I basically predicted something like this would happen back in April, 2020, although as part of a post that exaggerated the total amount of coming economic disruption. I bet the same trend is happening in Canada, too, which is yet another reason (as if one is needed) to play it slow on any decision to purchase real estate anyplace in greater Vancouver.

One wrinkle I hadn’t completely foreseen (but probably should have) is the disconnect between commercial and residential real estate costs. It will be interesting to see how that one plays out. Hopefully, it will prove not too difficult to repurpose office buildings into residential ones, though the possibility of both regulations and architectural constraints largely preventing that cannot be discounted.

In the latter department, ultimately it wouldn’t stop the conversion any more than de-industrialization and just-in-time manufacturing stopped the conversion of vacant warehouse spaces to lofts, and the end result would, like lofts, be quirky spaces that initially appealed to artists and other creatives. Ultimately, however, can take a long time, so there may well be a prolonged period of high office vacancy rates coming.

More on the Twitter Sale

Published at 19:44 on 25 April 2022

Liberals Need to Calm the Fuck Down

Musk is not a fascist. He’s a boorish, emotionally immature capitalist. His political views don’t neatly fit into the political spectrum, largely because they are not particularly well thought-out. It’s not good that Trump and some other big fascists are about to get their platforms back, but it’s also not as if Twitter got sold to Peter Thiel, who is planning to appoint Steve Bannon as CEO.

As I Said, Expect Chaos

Musk doesn’t fully know what he’s going to do, other than he doesn’t like the “censorship” that Twitter has engaged in. Well, guess what? Terms of service are there for a reason. If Musk wants to basically scrap all terms of service, all editorial discretion, Twitter will promptly start turning into the sort of sewer that 4chan and the likes have long been.

At that point, the exodus (a real exodus, not just a few liberal drama queens crying about taking their toys and going home) begins. Also at that point, Twitter’s value (being the market leader in short-message social networking) starts rapidly evaporating into thin air.

As soon as that happens, expect the concept of terms of service to rapidly (and, to reiterate, chaotically) be un-scrapped. Musk is a capitalist. As such, he worships first and foremost at the altar of Mammon. Any development that promises to take most of his investment’s value away from him will prompt an immediate recalculation.

That is, of course, the most dramatic scenario. More than likely, it will be less dramatic than that.

Elon Musk Buys Twitter

Published at 14:11 on 25 April 2022

It’s Not Good News

He has said he intends to give fascists a platform on it, there is no good reason to doubt his intent to do that, and he now has (or soon will have) the power to do it. The conclusion here seems inescapable, at least in the short-to-medium term.

Expect Chaos

I won’t say exactly what chaos to expect, but expect it. And don’t expect it all to be easily predictable chaos.

Expect Surprises

Musk has more money than sense, and he has burned himself before. This is one reason why I expect chaos. Musk will act impulsively, this will bite him, then he will act impulsively in an attempt to counter the harm his earlier impulsiveness caused him.

This may even play out in ways that the fascists haven’t thought through: what if he decides climate change denial is a threat (it runs counter to Tesla’s business model, after all) and bans it from Twitter?

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.