Feb 102021

Sometimes, simple programming mistakes make for interesting glitches.

Take this image:

No, this is not something that a gravitational lens would produce. Or any lens.

Even-numbered multipoles in a gravitational lens produce images that have fourfold symmetry. This allows me to reduce the amount of computation needed to generate an image, as I only need to generate one quarter; the rest are just copied over.

But this is not true for odd-numbered multipoles. This image was supposed to represent the J3 multipole, which would yield a triangular shape.

Unfortunately, I generated it accidentally by assuming the symmetries of an even-numbered multipole.

I kind of like the result, even though it is of course scientifically worthless. It still looks neat though.

 Posted by at 12:36 pm
Nov 192020

In recent years, I saw myself mostly as a “centrist liberal”: one who may lean conservative on matters of the economy and state power, but who firmly (very firmly) believes in basic human rights and basic human decency. One who wishes to live in a post-racial society in which your ethnicity or the color of your skin matter no more than the color of your eyes or your hairstyle. A society in which you are judged by the strength of your character. A society in which consenting, loving adults can form families regardless of their gender or sexual orientation. A society that treats heterosexuals and non-heterosexuals alike, without prejudice, without shaming, without rejection. A society in which covert racism no longer affords me “white privilege” while creating invisible barriers to those who come from a different ethnic background.

But then, I read that one of the pressing issues of the day is… the elimination of terms such as “master/slave” or “blacklist/whitelist” from the technical literature and from millions upon millions of lines of software code.

Say what again?

I mean… not too long ago, this was satire. Not too long ago, we laughed when overzealous censors (or was it misguided software?) changed “black-and-white” into “African-American-and-white”. Never did I think that one day, reality catches up with this Monty Pythonesque insanity.

It is one thing to fight for a post-racial society with gender equality. For a society in which homosexuals, transsexuals and others feel fully appreciated as human beings, just like their conventionally heterosexual neighbors. For a society free of overt or covert discrimination.

It is another thing to seek offense where none was intended. To misappropriate terms that, in the technical literature, NEVER MEANT what you suggest they mean. And then, to top it all off, to intimidate people who do not sing exactly the same song as the politically correct choir.

No, I do not claim the right, the privilege, to tell you what terms you should or should not find offensive. I am simply calling you out on this BS. You know that there is/was nothing racist about blacklisting a spammer’s e-mail address or arranging a pair of flip-flops (the electronic components, not the footwear) in a master/slave circuit. But you are purposefully searching for the use of words like “black” or “slave”, in any context, just to fuel this phony outrage. Enough already!

Do you truly want to fight real racism? Racism that harms people every day, that prevents talented young people from reaching their full potential, racism that still shortens lives and makes lives unduly miserable? Racial discrimination remains real in many parts of the world, including North America. Look no further than indigenous communities here in Canada, or urban ghettos or Native American villages in the United States. And elsewhere in the world? The treatment of the Uyghurs in China, the treatment of many ethnic minorities in Russia, human rights abuses throughout Africa and Asia, rising nationalism and xenophobia in Europe.

But instead of fighting to make the world a better place for those who really are in need, you occupy yourselves with this made-up nonsense. And as a result, you achieve the exact opposite of what you purportedly intend. Do you know why? Well, part of the reason is that decent, well-meaning people in democratic countries now vote against “progressives” because they are fed up with your thought police.

No, I do not wish to offer excuses for the real racists, the bona fide xenophobes, the closet nazis and others who enthusiastically support Trump or other wannabe autocrats elsewhere in the world. But surely, you don’t believe that over 70 million Americans who voted for Donald J. Trump 17 days ago are racist, xenophobic closet nazis?

Because if that’s what you believe, you are no better than the real racists, real xenophobes and real closet nazis. Your view of your fellow citizens is a distorted caricature, a hateful stereotype.

No, many of those who voted for Trump; many of those who voted for Biden but denied Democrats their Senate majority; many of those who voted for Biden but voted Democratic congresspeople out of the US Congress: They did so, in part, because you went too far. You are no longer solving problems. You are creating problems where none exist. Worse yet, through “cancel culture” you are trying to silence your critics.

But perhaps this is exactly what you want. Perpetuate the problem instead of solving it. For what would happen to you in a post-racial society with gender equality and full (and fully respected) LGBTQ rights? You would fade back into obscurity. You’d have to find a real job somewhere. You would no longer be able to present yourself as a respected, progressive “community leader”.

Oh, no, we can’t have that! You are a champion of human rights! You are fighting a neverending fight against white supremacism, white privilege, racism and all that! How dare I question the purity of your heart, your intent?

So you do your darnedest best to create conflict where none exists. There is no better example of this than the emergence of the word “cis” as a pejorative term describing… me, among other people, a heterosexual, white, middle-class male, especially one who happens to have an opinion and is unwilling to hide it. Exactly how you are making the world a better place by “repurposing” a word in this manner even as you fight against long-established terminology in the technical literature that you perceive as racist is beyond me. But I have had enough of this nonsense.

 Posted by at 10:46 pm
Nov 112020

Did Microsoft just offer me a 14-year old driver as a new update for Windows 10? Oh yes, they did!

But that’s okay… why fix something if it is not broken? Though I do wonder, if it is indeed a 14-year old driver, why was it not part of Windows 10 already? But never mind.

On the plus side, last night Windows 10 performed a feature upgrade along with security updates, and the whole upgrade process finished in well under half an hour; the reboot and installation phase only took a few minutes and so far, as far as I can tell, nothing is broken. Nice.

 Posted by at 12:36 pm
Jun 082020

Long overdue, but I just finished preparing the latest Maxima release, version 5.44.

I am always nervous when I do this. It is one thing to mess with my own projects, it is another thing to mess with a project that is the work of many people and contains code all the way back from the 1960s.

 Posted by at 2:11 am
May 222020

I am one of the maintainers of the Maxima computer algebra system. Maxima’s origins date back to the 1960s, when I was still in kindergarten. I feel very privileged that I can participate in the continuing development of one of the oldest continuously maintained software system in wide use.

It has been a while since I last dug deep into the core of the Maxima system. My LISP skills are admittedly a bit rusty. But a recent change to a core Maxima capability, its ability to create Taylor-series expansions of expressions, broke an important feature of Maxima’s tensor algebra packages, so it needed fixing.

The fix doesn’t amount to much, just a few lines of code:

It did take more than a few minutes though to find the right (I hope) way to implement this fix.

Even so, I had fun. This is the kind of programming that I really, really enjoy doing. Sadly, it’s not the kind of programming for which people usually pay you Big Bucks… Oh well. The fun alone was worth it.

 Posted by at 12:16 am
Sep 132019

My favorite cartoons are Kliban’s cats, but the Dilbert comic strips represent a close second.

Today’s Dilbert offers a perfect demonstration why.

I could actually be the consultant that Dilbert’s pointy-haired boss is looking for. Over the years, I learned one very important thing about this business: As a consultant, my job is to offer my best advice to my customer, but then whatever decision they make, it’s theirs to make, not mine. My job is to continue supporting them to the best of my abilities.

In my career, I have seen customers make bad decisions that destroyed their projects. I offered my advice. When it was ignored, I did not take it personally. Neither that nor judging the customer are part of my job description. That is not to say that I do not feel regret, or that I did not often second-guess myself: Could I have offered better advice? Could I have been more convincing? Why was my advice not accepted?

But judging? Nope. That would be rather unprofessional.

 Posted by at 12:02 am
Jun 052019

And before I forget: Last week, wearing my release manager hat I successfully created a new version of Maxima, the open-source computer algebra system. As a result, Maxima is again named one of SourceForge’s projects of the week, for the week of June 10.

The release turned out to be more of an uphill battle than I anticipated, but in the end, I think everything went glitch-free.

Others have since created installers for different platforms, including Windows.

And I keep promising myself that when I grow up, I will one day understand exactly what git does and how it works, instead of just blindly following arcane scripts…

 Posted by at 1:50 pm
Mar 302019

Content management software that I use, Joomla! and WordPress in particular, have been complaining for a while now that the PHP version that runs on my servers is outdated and potentially unsecure. Not exactly true, as PHP 5.4 remains part of the official Red Hat/CentOS release, but it would certainly be prudent for me to attempt an upgrade.

I tried to do just that last night, on a test server. And it was a miserable failure, a waste of many hours that I will never get back, to make no mention of the heightened risk of cardiovascular disease due to my elevated blood pressure caused by all that frustration.

The relatively easy part? PHP 7 complaining that its just-in-time compilation feature ran out of memory. Easy-peasy, I can disable JIT. Check.

But then: several of my Joomla! sites refused to run, with a cryptic and ultimately meaningless error message and nothing in the logs. And at least one Joomla! site just got itself into an infinite redirect loop. But why?

I tried many things. I kept looking for answers on Google. Nothing worked. Eventually I took two of my Joomla! sites that are very similar in nature, and began comparing their settings, side-by-side. One worked, the other didn’t. Why?

I then stumbled upon a custom Joomla! module, one that I wrote to support some ads that appear on my sites. This module was installed on the site that failed, but not used on the other. I disabled the module and, presto, the site was working with PHP 7. I re-enabled the module and the site was dead again. So… why?

Well, the module contains some PHP code. Which, after some preamble that allows it to connect to the internal data structures of Joomla!, begins the real work by accessing the MySQL database that contains the actual ads:

$conn = mysql_connect("localhost");
$res = mysql_query("SELECT PAGEID,ADTEXT FROM ...


You see, mysql_ calls have been deprecated and REMOVED from PHP starting with version 7.

And I have hundreds, if not thousands of lines of legacy code* (including, e.g., my calculator museum at rskey.org) that rely on this old library.

So I guess that PHP 7 upgrade will have to wait a while longer. Looks like I have no choice but to rewrite the affected pieces of code everywhere, as there is no other long-term solution. (Even if I find a third-party PHP plugin that re-enables mysql_ codes, how long will that continue to work? How reliable will it be?)

What a muckup. Grumble. And I do have other work to do.

 Posted by at 10:40 am
Mar 252019

The other day, I started listening to Google Music’s personalized music stream.

I am suitably impressed. The AI is… uncanny.

Sure, it picked songs that I expressed a preference for, such as songs from the golden age of radio that I happen to enjoy. But as I continue listening, it is presenting an increasingly eclectic, enjoyable selection. Some of it is quite new, from artists I never heard about, yet… it’s music I like. For some reason (maybe because I am in Canada? Or because it knows that I am trying to improve my French? Or was it a preference I once expressed for Édith Piaf?) it started presenting a whole bunch of French music, and again… some of it is quite likable. And now that I purposefully sought out a few classical composers, the AI realized that it can throw classical pieces at me as well, which is how I am suddenly listening to Schubert’s Ave Maria.

As a matter of fact, the eclectic choices made by Google’s AI remind me of two radio programs from the CBC’s past, long gone, long forgotten by most: Juergen Goth’s Disc Drive and Laurie Brown’s The Signal. Both these shows introduced me to music from excellent artists that I would otherwise never have heard about.

And now Google’s AI is doing the same thing.

I am also getting the sense that the more I listen, the bolder the AI becomes as it makes its choices. Instead of confining me to a bubble of musical genres of my own making, it is venturing farther and farther away from my presumed comfort zone.

Which is quite impressive. But also leaves me wondering how long before our machine overlords finally decide to take over.

 Posted by at 7:27 pm
Mar 012018

I am playing with JavaScript and HTML5. Three-dimensional transformations.

Cable News Network

It's more fun than I thought. And gives a whole new meaning to the word, "spin", as I am listening to CNN.

 Posted by at 9:20 pm
Dec 252016

Today, I was trying to explain to someone the difference between entering a Web site’s address in the address field of a Web browser, vs. entering a search term in Google. I was not very successful. In the end, it doesn’t really matter… Google happily accepts a Web site address in its search field, and all modern browsers accept search terms in the address field, passing it on to the preconfigured search provider.

But this experience reminded me of a clip from Star Trek IV: The Voyage Home. It’s when Scotty and McCoy talk to a factory manager and Scotty tries to show the chemical formula for “transparent aluminum”. When McCoy suggests the use of a computer, on old Mac sitting on a desk nearby, Scotty first tries to talk to it; and when McCoy helpfully points at the mouse, Scotty picks it up as though it was a microphone tries talking into it.

What I realized is that thirty years later, we basically gave up on the idea of trying to educate users. If that computer was built today, with users like Scotty in mind, we’d just put a damn microphone into the bleeping mouse. It’s just easier that way.

 Posted by at 10:09 am
Feb 062016

I just came across this gem of an example of bad coding in the C language.

Most C implementations allow arrays as function arguments. What is less evident (unless you actually bothered to read the standard, or at least, your copy of Kernighan and Ritchie from cover to cover) is that array arguments are silently converted to pointers. This can lead to subtle, difficult-to-spot, but deadly programming errors.

Take this simple function, for instance:

void fun(int arr[100])
    printf("REPORTED SIZE: %d\n", sizeof(arr));

Can you guess what its output will be? Why, arr is declared as an array argument of 100 ints, so the output should be, on most systems, 400 (ints being 4 bytes in length), right?

Not exactly. Let me show you:

int main(int argc, char *argv[])
    int theArr[100];

    printf("THE REAL SIZE: %d\n", sizeof(theArr));
    return 0;

On a 64-bit Linux box, this program compiles cleanly, and produces the following output:


Similarly, on Windows, using a 32-bit version of Microsoft’s C compiler, I once again get a clean compile and the program outputs this:


The morale of this story: Array arguments are pure, unadulterated evil. Avoid them when possible. They offer no advantage over pointer arguments, but they can badly mislead even the most experienced programmer. Compilers still allow array arguments, mainly for historical/compatibility reasons I guess, but it is unconscionable that they don’t even provide a warning when this abuse of syntax happens.

 Posted by at 9:45 am
Nov 272015

Fourteen years ago, I embarked on a small hobby project: A compiler for an ultra-simple programming language I called W, a language specifically designed to produce short 16-bit DOS programs. It has the distinguishing characteristic of having neither keywords nor types. The only data type on which it operates is a 16-bit machine word (hence the name, W).

I then wrote a few pages about this language that are still featured on my Web site.

Today (not for the first time) my project was rediscovered. Apparently not everyone realized that this was an old project (I now changed the configuration of the project page to make sure its creation date is visible.) The link went a little viral, as it was featured on both Reddit and Y Combinator. Which explains why, when I woke up this morning, I saw my server under a far heavier load than usual.

It was interesting to look at the comments on these two sites. Some liked what I have done. Others were critical, not sure why; it was a hobby project, after all, I wasn’t trying to win any accolades. But there was one particular comment on Reddit, by user MarshallBanana, that I really liked:

“What a bastard, making something for himself for fun. He sure deserves some shit for that.”

 Posted by at 7:18 pm
Sep 212015

Back in my misguided youth, I spent a couple of years developing game programs for the Commodore 64.

It all started in 1982, when a friend of mine and I dropped by at the office of a newly formed company, Novotrade. We heard somewhere that these folks have a new personal computer in their possession, one with a whopping 64 kilobytes of random access memory (an almost unheard-of amount at the time), and they are looking for programmers.

It was all true. The Commodore 64 was there and they were indeed looking for talented programmers. Thus we got to meet Ferenc Szatmári (a physicist-inventor who later on had a profound influence on my life) and others, who explained the deal: Novotrade was about to enter into a business relationship with a British company, the idea being that Hungarian programmers will be writing game software for Commmodore’s brand new personal computer. As part of this arrangement, a prototype Commodore 64 (of West German manufacture, with serial number 000002) was already there, available for us to study.

As it is well known, the Commodore 64 went on to become one of the most successful personal computers of all time. Our games did not fare that well; truth to tell, they weren’t that great. The games we ended up developing were “chosen by committee,” so to speak, from game ideas sent in by the public in response to a Novotrade-managed contest. Still… we were proud of introducing some rather novel programming techniques. Specifically, highly efficient graphic algorithms were developed by two of our teammates, Imre Kováts and Márton Sághegyi, which allowed us to create 3D-ish full screen animations like a moving horizon or a floating iceberg.

Floating iceberg? Yes… one of our games was called Arctic Shipwreck, and it required the player to balance an iceberg by moving a friendly mammoth around while trying to avoid stepping on some poor survivors of a shipwreck… until rescue arrived. Oh, and there was a rather nasty bird of prey, too, that occasionally came and plucked a survivor for lunch.

Not very entertaining, to be honest. Yet for some reason, this game remains much liked by the dwindling community of Commodore 64 enthusiasts. Most recently, it was featured in a nice German-language article on TrueGamer.de; the author of that article, Boris Kretzinger, also interviewed me via e-mail for C64 Scene, an electronic magazine published in the form of Commodore 64 disk images (!).

 Posted by at 6:55 pm
Jan 072015

For years, I’ve been using the online TV guide provided by ZAP2IT to check what’s on TV. Generally speaking, I’ve been satisfied with their service.

Until last year, when they introduced a whole new layout. Which, in my considered opinion, was a significant downgrade (makes me wonder if they were perhaps inspired by Windows 8).

Today I noticed, to my considerable pleasure, that the old layout is back. I now have the option to “Switch to Classic View”. Which I promptly did, without hesitation and with no plans to change my mind.

Now I am no usability or ergonomics expert, but I do have 30-odd years of experience in IT, and I know a thing or two about user interface design. Here are two illustrations that show why, in my considered opinion, the old format is far superior to the new one. First, the new version, with some of its shortcomings highlighted:

And now here are the same shows, in the old format:

So much easier to view! So much easier to find things of interest!

When they switched to the new format, I wrote an e-mail to complain. I did not expect a meaningful response. Noticing the link today, inviting me to switch back to the old format, was a most pleasant New Year’s surprise. I wrote to them again, thanking them for making the old format available. I hope it stays that way.

I know, I know, let this be the biggest problem in my life, when people are suffering and dying in various corners of the world. For what it’s worth, I never for one moment forget how lucky I am to be able to enjoy the luxury of life in a country like Canada. But this stupid TV guide still bugged me :-)

 Posted by at 9:17 pm
Nov 192012

I am reading articles about the slow sales of Windows 8 and complaints about its user interface. All valid, I think. Indeed, there is an easy way to explain in two points why I would not recommend anyone to upgrade to Windows 8 on the desktop:

  1. Value added by Windows 8 over Windows 7 for the typical desktop user: None. (To be sure, there are some minor improvements, including speedups. But they are more than offset by the incomprehensible removal of the Start button and the equally incomprehensible move away from the Aero interface, which is actually quite nice.)
  2. Difficulties created by the schizophrenic nature of Windows 8 (“Modern” vs. “desktop”) and the cumbersome nature of a touch-oriented interface on a desktop computer: Lots.

In other words, you are paying a huge price (not the dollar cost of a Windows 8 license but price in the form of re-training yourself or your employees, and the inevitable productivity loss due to a very confusing schizophrenic interface) and you essentially get nothing in return.

Maybe Microsoft will fix all this with Windows 9. Maybe Ballmer has to go first.

 Posted by at 8:57 pm