Press "Enter" to skip to content

Posts published in “Computing”

The art and science of mechanized thought.

[twenty twenty-four day ninety-six]: (eq (miss-p ‘lisp) t)

centaur 0

You know, Lisp was by no means a perfect language, but there are times where I miss the simplicity and power of the S-expression format (Lots of Irritating Silly Parentheses) which made everything easy to construct and parse (as long as you didn't have to do anything funny with special characters).

Each language has its own foibles - I'm working heavily in C++ again and, hey, buddy, does it have foibles - but I always thought Lisp got a bad rap just for its format.

-the Centaur

Pictured: a Lisp function definition (with the -p suffix to indicate it is a predicate) with the side effect of printing some nostalgia, and executing that statement at the Steel Bank Common Lisp command line.

[twenty twenty-four day eighty-two]: your abstractions are leaking

centaur 0

SO! My Facebook AND my credit card were both hacked within the last few months, so I was understandably freaked when I logged into the Library the other day and got a security warning. This SSL warning sometimes shows up when your network configuration changes - or when someone is trying to hack you - so I got off the conference network and used my phone's mobile hotspot. Unfortunately both the Library's WordPress control panel AND the main page showed the error, and I got a sinking feeling. Credit card got hacked a few months back, remember? And when I checked the certificate ... it had just expired.

Assuming that whatever service I use for SSL had expired due to that credit card issue, I tried to track it down in the WordPress control panel, but pretty quickly decided that digging through notes, credit cards and passwords in a public conference hall was one lapse in opsec too far. Later that night, I tried resolving the SSL issue, but found that something was wrong with the configuration and it couldn't update itself. Exhausted after a long day at the convention, I decided to get up early and attack the problem fresh.

The next morning, I found I had apparently set up WordPress to use an SSL tool which didn't play nice with my hosting provider. (I'm being deliberately vague as y'all don't need to know all the details of how my website is set up). Working through the tool's wizard didn't help, but their documentation suggested that I probably needed to go straight to the provider, which I did. After digging through those control panels, I finally found the SSL configuration ... which was properly set up, and paid through 2025.

WAT?

I re-logged into the control panel. No SSL warning. I re-opened the website. No SSL warning. I doublechecked on both another browser and another device. Both listed the site as secure.

As best as I can figure, yesterday afternoon, I hit the website in the tiny sliver of time between the old certificate expiring and the new one being installed. If I was running such a system, I'd have installed it an hour early to prevent such overlaps, but perhaps there's a technical or business reason not to do that.

Regardless, the implementation details of the "website is secure" abstraction had leaked. This is a pervasive but deceptively uncommon problem in all software development. Outside the laws of physics proper, there are no true abstractions in reality - and our notions of those laws are themselves approximations, as we found out with Einstein's tweaks to Newton's gravity - so even those laws leak.

Even a supposedly universal law, like the second law of thermodynamics that Isaac Asimov was fond of going on about, is actually far subtler than it first looks, and actually it's even subtler than that, and no wait, it's even subtler than that. Perhaps the only truly universal law is Murphy's - or mathematical ones.

Which brings us to the abstractions we have in software. In one sense, they're an attempt to overcome the universal growth of entropy, in which case they're doomed to ultimately fail; and they create that order with a set of rules which must be either incomplete or incorrect according to Godel's Incompleteness Theorem, which means they'll ultimately either fall short or get it wrong.

When developing and maintaining software - or deploying it and managing it in production - we always need to be on the lookout for leaky abstractions. We may think the system we're working with is actually obeying a set of rules, but at any time those rules may fail us - sometimes spectacularly, as in when my backup hard drive and internet gateway were struck by lightning, and sometimes almost invisibly, as in when a computer gets in a cruftly state with never-before-seen symptoms that cannot be debugged and can only be dismissed by a restart.

So my whole debugging of the SSL certificate today and yesterday was an attempt to plug a leak in an abstraction, a leak of errors that created the APPEARANCE of a long-term failure, but which was ACTUALLY a transient blip as an expired certificate was swapped out for its valid replacement.

What's particularly hard about leaky abstractions, transient failures and heisenbugs is that they train us into expecting that voodoo will work - and consciously trying to avoid the voodoo doesn't work either. On almost every Macintosh laptop I've used that has had wireless networking, it can take anywhere from a few seconds to a minute for a laptop to join a network - but once, I had the unpleasant experience of watching a senior Google leader flail for several minutes trying to get onto the network when I had to loan him my laptop to present in a meeting, as he kept switching from network to network because he was convinced that "if the network we're trying to join is working, it should immediately connect." Well, no, that would be nice, but you're sending bits over the fucking air like it was a wire, and connection failures are common. This was a decade and a half ago, but as I recall I eventually convinced him - or he got frustrated enough - to stop for a moment, after which the laptop finally had a chance to authenticate and join the network.

Debugging software problems requires patience, perseverance - but also impatience, and a willingess to give up. You need to dig into systems to find the root cause, or just try things two or three times, or turn the damn thing off and on again - or, sometimes, to come back tomorrow, when it's mysteriously fixed.

-the Centaur

Pictured: a blurry shot of downtown San Francisco, where the abstraction of taking a photo is leaking because of camera movement, and the same intersection, with less leakage from motion.

[twenty twenty-four day eighty-one]: a quick thought on the game awards

centaur 0

The awards ceremony for the Independent Games Festival (IGF) and the Game Developers Choice Awards (GDCA) are held back to back on Wednesday nights at GDC, and I tend to think of them as "the Game Awards" (not to be confused with the other award ceremony of the same title).

The awards are always a mixture of the carefully scripted and the edgy and political, with plenty of participants calling out the industry layoffs, the war in Gaza, and discrimination in the industry and beyond. But one of those speakers said something very telling - and inspiring.

See that pillar on the right? Few people sit behind it willingly; you can't see the main stage, and can only watch the monitors. But this year's winner of the Ambassador award told the story of his first time in this hall, watching the awards from behind the pillar, wondering if he'd become a "real" game developer.

Well, he did. And won one of the highest awards in his industry.

Who knows, maybe you can too.

-the Centaur

Pictured: Top, the IGF awards. Bottom, the GDCA awards. I don't have a picture of the Ambassador Award winner because I was, like, listening to his speech and stuff.

[twenty twenty-four post eighty]: that gdc filler post

centaur 0

At the Game Developer's Conference. I hope to have more to say about it (other than it's the best place to learn about game development, and has the awesome AI Summit and AI Roundtable events where you can specifically learn about Game AI and meet Game AI experts) but for now, this blogpost is to say, (a) I'm here, and (b), I'm creating some buffer so tomorrow I can write more thoughtfully.

Yeah, there are a few people here. And this isn't the half of it: it gets really big Wednesday.

Blogging every day.

-the Centaur

[twenty twenty-four day seventy]: fix it the way that works

centaur 0

So, this is worthy of a longer blog post, but the short story is, looking under the streetlight for your keys may provide visibility, but it won’t help you find them unless you have reason to think that you dropped them there.

A lot of time in software development, we encounter things that don’t work, and problems like stochastic errors and heisenbugs can lead software developers to try voodoo solutions - rebooting, recompiling from head, running the build again, or restarting the server.

These “solutions” work well enough for us that it’s worthwhile trying them as a first step - several times recently I have encountered issues which simply evaporated when I refreshed the web page, restarted the server, retried the build, or restarted my computer.

But these are not actual fixes. They’re tools to clear away transient errors so we can give our systems the best chance of properly functioning. And if they don’t work, the most important thing to do is to really dig in and try to find the root cause of the problem.

On one of those systems - where I literally had tried refreshing the web page, restarting the server, refreshing the code, reinstalling the packages, and rebooting the computer - the build itself was something that you had to run twice.

Now, this is a common problem with software builds: they take a lot of files and memory, and they can get halfway through their builds and die, leaving enough artifacts for a second pass to successfully solve the problem. I had to do this at Google quite a bit.

But it isn’t a real solution. (Well, it was at Google, for this particular software, because its build was running up against some hard limits that weren’t fixable, but I digress). And so, eventually, my build for this website failed to run at all, even after a reboot.

The solution? A quick search online revealed it’s possible to change the parameters of the build to give it more memory - and once I did that, the build ran smooth as glass. The “run the build again” trick I’d learned at Google - learned where, for one particular project, it was not possible to fix the problem - had led me astray, and overapplying this trick to my new problem - where it had partial success - kept me from finding a real, permanent fix.

So, if a fix feels like voodoo, stop for a minute - and search for a better way.

-the Centaur

Pictured: What do you mean, you haven't updated the package configuration for THREE YEARS?

[twenty twenty-four day sixty-seven]: my new game console

centaur 0

SO! I am the proud owner of ... an Atari 2600+! This console, a re-release of the original Atari 2600 from 47 (!) years ago, only a notch smaller and with USB and HDMI outputs. It plays original Atari cartridges, though, which shall be my incentive to hop on my bike and visit the retro game store in nearby Traveler's Rest which has a selection of original Atari cartridges among all their other retro games.

The first game I remember playing is Adventure, which came out in 1980, and, while I can't be sure, I seem to remember first playing it in my parents' new house on Coventry Road, which we didn't move into until early 1979, just before my birthday.

In fact, as I dig my brain into it, we played Breakout in the den of my parents's old house on Sedgefield Road, so we must have had access to early-generation Atari. Our neighbors when we moved had a snazzier Odyssey 2 :-), and a few years later another friend from school had an even better game console, though none of the second-generation units I looked up online seem familiar to me.

Therefore, by the process of elimination, either my parents got my Atari 2600 for Christmas for me sometime around 1977 or 1978, or one of our relatives or babysitters loaned us one when we lived on Sedgefield. I have distinct memories of getting a Radio Shack Color Computer in Christmas of 1980, a grey wedge of plastic with a massive 4K of RAM, and remember programming games on it myself - perhaps because I didn't have an Atari to play with; this makes me think that, at least at first, the Atari was actually the "better game console" my other friend from school had, and that I went over to their house to play.

Regardless, I solved the first level of Adventure in minutes after cracking open the Atari.

No big challenge, but apparently I still got it.

-the Centaur

Pictured: the box, and the unboxed start of Adventure.

[twenty twenty-four day sixty-six]: there’s no man so self-made …

centaur 0

"There's no man so self-made he bore himself in the womb."

No, I don't really have any deep thoughts here riffing off "an individualist so rugged ..." ... I just thought of the turn of phrase (when thinking about the same people) and thought it went well with this book I saw.

-the Centaur

Pictured: a book I found in a nearby Barnes and Noble, and a picture taken and sent to friends who heart heart reduplication.

[twenty twenty-four day fifty-six]: code rots

centaur 0

Only six months have passed since I last worked on the Embodied AI Workshop website, and now the code will not compile in a horrible mess of broken dependencies. I have tried two or three ways of installing it, including in place, from scratch, and even on a Parallels instance of Ubuntu in case macos was the problem. Nothing works. As a last-gasp effort, I plan on creating an AWS instance, in case Apple Silicon itself is the problem (I suspect it is, as one of the libraries has no Apple Silicon binary packages, and the instructions to recompile from source are roughly five years out of date).

But software is a mess. Occasionally you get something that's awesome (like Python - or Rust! Installation of the Bevy game engine was smooth as a dream) but more often things explode in a mess of unresolvable dependencies, and you're stuck between Apple locking everything down, Windows becoming spyware, and Linux not running anything you want at all.

I'd weep for the future, but I'm too busy hiding from it.

-the Centaur

Pictured: My software consultant, deciding discretion is the better part of valor. Actually, up top Loki has seen the installer for the rock border in the French Quarter, and below he is hiding from him.

welp, looks like my Facebook got hacked …

centaur 0

And Facebook is a perfect example of customer-service hell in which once one has lost one's account, there's no way to talk to a person who can get this unfucked.

What happened? As best as I can figure, someone attempted to hack my 2-factor authentication last night while I slept - I woke up to a text message from Facebook with a 2-factor authentication code.

What did Facebook do? When I went to check, I was logged out of Facebook on all devices, and I was told that my account was suspended for "not following their rules":

Is this possible? No. Since I rarely post, I'm pretty circumspect, and I primarily use it for Messenger to talk to a few old friends, I'm pretty sure that I wasn't doing anything that violated community standards.

And I sure didn't while I was sleeping.

Is there a way to fix this? No. I tried to follow their procedures, only to find I didn't have a linked auth.oculus.com account, because I didn't have an Oculus. And once you do create such an account, there is no mechanism to appeal a suspension - only this reference in the help files:

But, probably because these folks were trying to hack my account, they likely mucked with the email, so I never got an email from Meta about this - not even in my spam folder.

So the hackers did something bad with your account? Maybe? I can't tell. So, the next attempt is to report the account as compromised. There is a way to do that, which takes you to the following page:

But, since the hackers were likely messing with two-factor authentication and trying to break in to the account, we get back to the temporarily blocked state you have above:

Are you sure you were hacked? Pretty sure. The text came in at 2:23am, after I was already asleep.

As a last ditch effort, I remembered I had an open Facebook tab, so I tried to go screenshot it. It quickly logged out, but I got to see, very briefly, my old Facebook page, and could see the last activity was merely me using Messenger to talk to friends.

How could this be fixed? Easily. This is the kind of thing that a customer service representative, looking at the account, can resolve in five minutes flat over chat, just by looking at the calm history followed by a spike of hacked traffic. And it's the responsible thing to do for your customers.

But Facebook doesn't provide access for this - apparently except for business accounts. And, while I'm not happy with a lot of stuff Elon did at Twitter, this makes me more inclined to use services you pay for. X, in contrast, makes it very easy to appeal a decision via an easily findable and accessible form:

https://help.twitter.com/en/managing-your-account/suspended-x-accounts

The bottom line? Someone hacked me while I slept, and a decade plus of Facebook is gone - principally because Meta does not provide basic tools for customer support.

Welp, nothing to do but call Zuck out about it on Xitter ...

-the Centaur

UPDATE: There are forums, where people are reporting this issue, and customer support representatives for the Meta Quest are responding. Cross your fingers. But it wasn't at all obvious that this is a solution! We're getting help from people who aren't even support staff for the same product.

UPDATE UPDATE: Nope, nevermind, they just redirect you back to the Facebook help center, which as I already confirmed, can't help you.

UPDATE UPDATE UPDATE: Apparently Facebook has someone on Twitter who monitors for just this sort of thing. That is an unorthodox solution, but I've heard of the same thing at the Google. I'll reach out; we'll see. Cross yo fingies ....

UPDATE UPDATE UPDATE UPDATE: Apparently those people on Twitter are not affiliated with Facebook - there's a huge list people recommending various peeps as people who "helped me" and when you look at those users they don't appear to be affiliated with Facebook. So, no.

[twenty twenty-four post fifty-one]: worse than useless

centaur 0

So I recently came across a tutorial for game development that seemed pretty interesting, so I decided to give it a try. The tutorial was in Rust, a new language that I’d been hearing about, and so I thought it would be a good idea to learn that too.

I even found an online playground, https://play.rust-lang.org/, which lets you try out the language in the browser, much like the Go playground: https://go.dev/play/. I quickly started trying out some simple functions that I use a lot in a variety of languages …

… and got stuck right away on Rust’s lack of function parameters.

There’s a whole blogpost https://www.thecodedmessage.com/posts/default-params/ on why this antifeature is actually, in the minds of “Rustians,” is a good thing, but even that admits that the alternatives that the language provides “might seem worse than useless.” 

I’m sorry, I’ve gone through this kind of Stockholm Syndrome thinking before, where users held hostage to the good features of a language start coming up with excuses for its warts. For example, take the Go programming language. Programming Go felt like a breath of fresh air, but it was literally worse than useless for my use case - I had to write the software I wanted in C and then call it from Go. And the language itself had terrible warts from the terrible choices made by the core Go team - at the time I used it, no support for generics, endless proliferating error checks, and worst of all, an overly verbose unit test style which threw out everything we’d learned from Java and Python about how to write tests using semantically meaningful methods like assertIsNotNone or assertIsEmpty.

I’m not saying I’m not going to not learn Rust, nor that I’d never use Go again. Hey, one day I may be a convert! But, based on what I know now, I would never recommend these languages to anyone. My recommendations for programming languages remain the same "Big Three, Plus One": 

  • For most tasks, use Python. 
  • If you need speed, use C++.
  • If you work with a very large enterprise, consider Java.
  • If you’re working with a system that uses a specific language, use that language: C in the Linux kernel, Javascript on the web, Swift in iOS, Java in Android, PHP in WordPress, C# for Unity, and so on.

Many of the alternative languages that you can use - Go, Rust, Scala, Clojure, even my beloved Mathematica, Common Lisp, or J - are actually worse than useless for most tasks, for two reasons. 

  • First, most of them are less baked than the Big Three, and are less ready for developing real applications; they’re not chosen for their fitness to purpose, but instead chosen by zealots who are trying to make a point. Don’t be a zealot trying to make a point.
  • Second, working on these other languages actually detracts from making the Big Three better. The C++ of today is almost unrecognizably usable compared to when I first started using it, and Python and Java are rapidly adding new usability features as well.

That doesn’t mean we don’t try new things. C++ has mostly replaced C, and TypeScript is edging out JavaScript; who knows, perhaps, one day some variant of Go or Rust or Swift will become the dominant paradigm. (But, honestly, I hope not).

Nevertheless, I remember talking to a programmer friend about a refactoring I wanted to accomplish, and he angrily sketched out a better build system which could have solved the problem using a Turing-complete constraint language to figure out the dependencies.

I just remembered the famous quote from the creator of ANTLR - “Why program by hand in 5 days what you can spend 25 years of your life automating?” - and handwrote a script to solve the problem in an hour, and got on with my life.

-the Centaur

Pictured: Some of the older programming language books that I have in my stacks, most of which are now worse than useless for getting things done nowadays - though if you really love programming languages and learning how things work, they're more than priceless, now and forever.

[twenty twenty-four day forty-three]: neurodivergence by the numbers

centaur 0

So! While working on The Neurodiversiverse I've been reading up a lot on neurodiversity. According to Devon Price's Unmasking Autism, autism is massively undiagnosed, and for good---well, understandable---reasons. From parents concerned about their uncommunicative children or fans of cold geniuses on Sherlock and the Big Bang Theory, our culture focuses a lot on certain stereotypes of autism---while ignoring a much larger group of people who suffer from the same underlying conditions in their brains, but who are able to "mask" their behavior to appear much more "high functioning" or even "neurotypical".

As you might imagine, spending your whole day trying to react in ways that are fundamentally unnatural to you---and trying to hide the ways that you react that are natural to you---can stress people the fuck out. But many people never get a diagnosis---either because they're from a disadvantaged group, or because they don't want to risk the stigma and potential negative consequences of a diagnosis, or because they mask too well and no-on notices how they are suffering. But if you don't understand your condition, you may employ coping strategies which may actually do more long-term harm than good.

Well, now there are a lot of online tests and self-help books and even sympathetic therapists who can help people understand themselves better. While I've always known I was a bit strange---mostly solitary, typically withdrawn at family gatherings when I was a child, or explicitly labeled as having a weird brain---I've never pursued a diagnosis of any kind---in the past, because I didn't feel I had any trouble coping to the point that I needed help, and in the present, because having a disability label attached to you can have negative social and legal consequences that I have no interest in dealing with.

BUT! The personal stories of Unmasking Autism resonated a lot with me, and I now have friends who have gone through formal adult diagnoses of autism and ADHD, as well as an undiagnosed autistic friend who clearly is autistic and has to manage her life the way a masking autistic person does, but who did not pursue a diagnosis for precisely the same reasons that many other masking autistics do not pursue it: unless your condition is very severe, it isn't clear that a formal diagnosis can actually get you help, and it can often get you a lot of hurt. But UNDERSTANDING it, that, that we can now do.

So! And I note I again use "So!" at the start of a paragraph. Is that a verbal tic? Who cares? SO ANYWAY ...

Diagnoses of autism, and other neurodivergences! The neurodivergence I identify most with is Social Anxiety Disorder---in fact, this is the neurodivergence I chose for the protagonist of "Shadows of Titanium Rain", my own submission to The Neuroversiverse. But other people have suggested I have characteristics of OCD, or ADHD, or Autism, and I even went into therapy for stress and anxiety during the pandemic. So I decided to take five online tests: Social Anxiety Disorder, Autism, Anxiety, ADHD, and OCD.

The results are at the top of the blog---and I already gave away the game through the order I listed them. Normalizing all the scores from zero to a hundred, most of the tests put the boundary of "you've got the thing" at somewhere around 60-70% of the possible points you could score - let's call it at 2/3, or 66%, shall we? OCD scored the lowest - roughly 53%, which the test judged as "you've got OCD tendencies, but not OCD." ADHD was a little higher, 60%, and general Anxiety still higher, 63%. But none of these were over the "you've got it" thresholds for these tests---they just indicated a general tendency in that direction.

Things start to change with Autism: my test results for "Adult Autism" (*cough* MISNOMER) were 70%, well within the boundary of "you've very probably got it". Some of my friends are quite surprised to hear this, as they didn't see this in me at all; I guess my condition is "mild" and/or I mask very well.

But Social Anxiety Disorder? 86%, off the charts. And this wasn't a surprise: not only do I have a huge raft of coping mechanisms to help me deal with social situations, I also have some of the more subtle symptoms of Social Anxiety Disorder that you might not expect would be symptoms. For example, in certain socially awkward situations, I can partially stumble while walking. Most people, even those close to me, never notice that my foot briefly drags when we're walking and something socially awkward occurs - yet balance and coordination issues are a symptom of social anxiety.

Again, I've not pursued a formal diagnosis, and I don't plan to. But understanding these things about myself helps me understand why I've built a mass of coping mechanisms and masking strategies in my life---and can help me start to construct a healthier way to cope with the world within which I live.

If you feel alienated by your world, perhaps that's something you could try too.

-the Centaur

[twenty twenty-four day forty-one]: squirrel

centaur 0
der interwebs is kaput

Mt internet has been flakey, so I chatted with an AT-AT Druid online about it and they unexpectedly had a free repair tech slot the next morning. Send them? Yeah baby yeah!

After some kerfuffle with the confirmation, we got it scheduled and they showed up at 830 this morning only to find ...

The internet box half ripped off the house and the beginnings of what looked like a squirrel's nest in it.

Remember, folks, step one of network debugging is to check layer one of the stack: your physical equipment. "Your wires are loose" is the network equivalent of "Ain't got no gas in it" from Sling Blade.

So, hopefully, regular blogging will resume soon. Till then, enjoy this lovely blog post thumb-crafted on my phone.

-the Centaur

[twenty twenty-four day twenty-four]: in foggiest depths

centaur 0

One of the problems with computing is when it just gets ... foggy. Not when you're trying to do something hard, or when two pieces of software are incompatible, no. When things just sort of kind of don't work, and there are no known reasons that it's happening, and no reliable actions you can take to fix it.

Once this happened to me when I was working on a robotics device driver, and I realized the lidar itself was unreliable, so the only way to fix problems was to run each configuration ten times and keep average stats. Broken "worked" around ten percent of the time, whereas "fixed" worked around seventy percent of the time (approaching the rate at which the manufacturer's own software could connect to its own hardware).

Today, I ran into a seemingly simple problem with Anaconda, a Python package / environment management system. Conda lets you corral Python and other software into "environments" with different configurations so that potentially incompatible versions can be used on the same computer (albeit, not at the same time). It even gives you a handy indication about which environment is in use in your command prompt, like so:

There's a seemingly innocent blank line between (ThatEnvironment) and the previous line, yes? Not part of the standard Conda setup, but you can easily add it with a single line of configuration, changing the "env_prompt" to include an extra newline "\n" before printing the environment, like so:

Yeah, that line at the end. "env_prompt: \n({default_env})". In a conda configuration - a .condarc, or "dot condarc" file - which is almost as simple as possible. I don't even think the "channels" bit is needed - I didn't recall writing it, I think it just got added automatically by Conda. So this is almost the simplest possible change that you could make to your Conda configuration, done in almost the simplest possible way.

Except. It. Didn't. Take.

No matter what changes I made to the .condarc file, they didn't affect my Conda configuration. Why? I don't know. No matter what I did, nothing happened. I changed the prompt to all sorts of weird things to try to see if maybe my syntax was wrong, no dice. No amount of searching through manuals or documentation or Stack Overflow helped. I re-ran conda config, re-loaded my shell, rebooted my Ubuntu instance - nothing.

Finally, almost in desperation, I went back to my original version, and tried creating system-wide, then environment-specific configurations - and then the changes to the prompt started working. Thank goodness, I thought, and rebooted one more time, convinced I had solved the problem.

Except. It. Took. The. Wrong. Config.

Remember how I said I created a weird version just to see that it was working? Conda started reverting to that file and using it, even though it was several versions ago. It actively started overwriting my changes - and ignoring the changes in the environment-specific configurations.

So, I blew away all the versions of the file - local, system and environment-specific - and re-created it, in its original location, and then it started to work right. In the end, what was the final solution?

I have no idea.

When I started working on the problem, I wanted Conda to do a thing - print an extra blank line so I could more easily see a command and its result, separate from the next command and result. And so I created a file in the recommended place with a line containing the recommended magic words ... and it didn't work. Then I hacked on it for a while, it sort of started working, and I backed out my changes, creating a file in the same recommended place with a line containing the same recommended magic words ... and it did work.

Why? Who knows! Will it keep working? Who knows! If it breaks again, how do I fix it? Who knows!

This is what I call "the fog". And it's the worst place to be when working on computers.

-the Centaur

Pictured: Sure was foggy today.

Robots!

centaur 0

Still at the Conference on Robot Learning. LOTS of robot dogs were about, lots of diffusion model and transformer work, and lots of language model planning. More later, gotta crash.

-the Centaur

Too much to keep up with

centaur 0

When I was a kid, I read an article by Isaac Asimov complaining that the pace of scientific publication had become so great that he couldn't possibly keep up. When I was an adult, I realized that the end of the article - in which he claimed that if you heard panting behind his office door it was because he was out of breath from trying to read the scientific literature - was a veiled reference to masturbation. Yep, Isaac is the Grand Dirty Old Man of science fiction, and, man, we love you, but, damn, sometimes, you needed a filter.

Well, the future is now, and the story is repeating itself - sans Isaac's ending; my regular fiction is a touch blue so there's no need for my blog to get prurient. I'm a robotics researcher turned consultant, focusing on, among a kazillion other things, language model planning - robots using tools like ChatGPT to write their own programs. As part of this, I'm doing research - market research on AI and robotics, general research on the politics of AI, and technical research on language models in robotics.

A good buddy from grad school is now a professor, and he and I have restarted a project from the 90's on using stories to solve problems (the Captain's Advisory Tool, using Star Trek synopses as a case-base, no joke). And we were discussing this problem: he's complaining that the pace of research has picked up to the point where he can no longer keep up with the literature. So it isn't just me.

But the best story yet on how fast things are changing? Earlier this month, I was going through some articles on large language models my research - and a new announcement came out while I was still reading the articles I had just collected that morning.

Singularity, here we come.

-the Centaur

Test Post, Please Ignore

centaur 0
Nothing here to see. This is a test. This is another test. Again, nothing here to see. This paragraph is also a test. Test. Test. Test. And finally, this is one more paragraph. Test. Test. Test test test. -the Centaur P.S. This is to see whether the Classic Editor is still broken in WordPress. UPDATE: Yes, it still is! Leaving this here for now.

[eighty-seven] minus one-two-one: can i help? i think i can help

centaur 0

So, in case you don't own this cat, the little brow-furrowed face Loki is currently making is his "I really want your food but you're not letting me eat it, so I'm going to sit just at arms length and fume" face. He thinks if he waits long enough, he'll be able to sneak in and try some. My long arm thinks otherwise.

Anyhoo, while I said I wanted to put blogging at the first of the day to make sure it got done, it turns out that I was way more interested in making sure that I didn't fall grievously behind on my Camp Nano project, Dakota Frost #7, SPIRAL NEEDLE, nor miss any of my other responsibilities.

I'm mostly caught up now, so I'm trying to put blogging back on the queue. Interestingly enough, after my rant about blocks, the WordPress folks have reached out to talk to me about blocks. Talk about customer service! So I'm also blogging trying to replicate the bugs I observed the other day that set me off.

So far, I cannot replicate the cut-and-paste error, where trying to select all the text only copied part of it - it is entirely possible that the system had just gotten into a cruftly state, which can happen to any program of sufficient complexity.

I can, however, replicate the cut-and-paste problem I had, where trying to re-order sentences introduced new paragraph breaks in a way that's not standard for Word, Google Docs, or TextEdit. This is probably most directly attributable to the text being in blocks, but it might be fixable.

I also reproduced the "Where's Waldo" interface issue where I could not easily inject new blocks - though now I see that can be fixed with a carriage return followed by a slash, which is documented in the interface, it is also possible that at the time something was just wrong with my editor.

I also debugged the problem I had with the interface. In TextEdit, Word and Google Docs, the first line of your document is the first line of your document. In WordPress, it is invisibly a title, as opposed to the Classic Editor which distinguishes this with a different text entry box. This is also probably fixable.

But there are other strange errors. Like, the sidebar that let you change the properties of the post are normally present when I blog, but had disappeared when I started this post. Weirdly, not even the button to show them was present - I had to toggle several other buttons and then it appeared, just where I remembered it. Not sure what's going on there. Since I restarted my computer recently and re-logged into WordPress, perhaps this is a "sticky" setting that went away when I cycled my browser. Still investigating.

-the Centaur

Pictured: Loki, trying to help me study generative AI.

[eighty-nine] minus one-oh-six: i don’t know they’re literally incompetent …

centaur 0

This is your daily reminder that the Gutenberg editor of WordPress is a dumpster fire. I don't know that the people who made it are literally incompetent as far as technical coding goes: the bones of the program seem to be a well-functioning machine that rarely breaks down.

But Gutenberg is incompetent as a text editor, and whoever designed it was literally incompetent in terms of the "blocks" based design that they chose to push on all of us, because the "blocks" editor literally does not work as a text editor: basic things like selecting text, cutting it, and pasting in into a new place don't work, because the "blocks" break up your text selections and prevent you from maneuvering in the document.

Microsoft Word doesn't have this problem. Google Docs doesn't have this problem. Overleaf doesn't have this problem. Dropbox Paper does, a little, and it shares the incorrect (and I will fight you on that) "Where's Waldo" style interface which hides the text editor controls when you're not hovering over them, making them undiscoverable - perhaps Dropbox was also infected by "user experience."

But most damningly, the Classic Wordpress editor didn't have this problem. They had something that wasn't broke, and they didn't fix it with the incompetent thing they replaced it with, but they were so committed to forcing everyone to use their new thing, they broke the old one. (This is your daily reminder that using Classic Editor in modern WordPress destroys the formatting of the posts).

And I want to point out: the person who did this, Matt Mullenweg, did this to us on purpose:

We Called it Gutenberg for a Reason

It moves the WordPress ecosystem forward, but it also moves the whole web forward. Which is scary! Because change always is, and this is a big one. But a scary thing is usually a thing that leads to growth, if you can push through it. ... apathy would worry me a lot more than disagreement or controversy. Creating great software will never make every person happy. 

So, in case you have trouble parsing this ... Matt and his team wanted to push a technical change which benefited their "ecosystem" - likely, just some internals of their system that they wanted to clean up, which would make it easier to implement features no-one wanted - and they started with a mindset that interpreted their failures as user unhappiness and software problems as complaints, which people needed to just power through so they could get to their new world order.

Matt, you took something that worked and broke it, and replaced it with something which will literally never work. Text editing is not block editing, and it's never going to be. It's a serial string of tokens that encodes a proxy of speech, and if you try to impose blocks on it, your editor will fail, as yours failed me today.

I was working on a post. One not much more complicated than this one. But simply cutting and pasting text was something that the Gutenberg editor failed miserably at, and I was not able to successful edit my text. Even copying it out to Word took several tries, because not only did Gutenberg make it hard to select all the blocks, it did not even copy the text out of all the blocks, so I had to do it piecemeal.

I don't actually want to give up on Gutenberg becoming better. But I strongly feel the only way to successfully fix the interface it is to thow away the key metaphor behind it - the block. That's fine as a backbone behind the text which WordPress uses for rendering - but a text editor should manipulate text.

-the Centaur

Pictured: some nice flowers which the previous owners planted near a corner.

[eighty-six] minus one oh four: the nonsense continues

centaur 0

Above you can see the latest nonsense: today this is what the "new" Gutenberg editor on WordPress started showing me when I start trying to write a post. There are no text controls, the place to write is tiny, and most of the page is taken up by a "Featured Video" section that I have never seen before and never use.

I haven't updated WordPress recently. I've never, that I can recall, used the Featured Videos feature, and certainly haven't done so in the past ten or so posts. Yet the editor appears in this mode, even if I refresh the page to get a clean view. I just want to edit a document! Why is this interface doing everything but that?!

For clarity, below you can see the normal view I get when creating a post: a place to type text, along with text controls, with the video editor present only as collapsed bar (not visible in the normal view, but it's still there, way down on the bottom of the page).

Back in the old days, the industry promoted standards for keyboard shortcuts in menus so they would be easy and consistent to use - but early in the history of the Macintosh, Apple failed to deliver these in a point update, and started pushing the idea that we didn't need keyboard shortcuts, just the mouse. It's now even hard to find information on these standards, much less the articles that documented how they disintegrated - it's like these articles got scrubbed from the web, but it's more likely the original sites are gone, and any few that remain are now lost in a deluge of helpdesk articles on keyboard shortcuts.

Back in the old days, the industry promoted borders for windows to resize them, visible scrollbars to do things, and buttons with tooltips - but then a flood of print design people flooded software development after the introduction of the web, and the so-called "clean" look of print began to be applied to our tools. Nowadays, to resize a window you have to aim for its literally zero-pixel-wide edge, you need to dig in the settings to make toolbars appear, and finding the controls in an interface is a game of Where's Waldo, except Waldo is invisible most of the time, and sometimes moves around the screen to avoid your mouse.

These things aren't happening because software creators are trying to make their software usable: they're happening because they want to feel good about how it looks. Let's stop trying to make "user experience" happen: it's the wrong direction for software tools that people use, which requires a focus on usability.

The first test of your software is whether people can use it.

Usability is king, and only usability is usability.

-the Centaur

Pictured: The Gutenberg editor, which decided to start today in a mode I've never seen before. :-/

[eighty-five] minus one-oh-four: what even IS that?

centaur 0

Recently on Twitter I said everything's going to hell in a handbasket on the Web. Let me show you ...

Oh, wait, I can't show you, because WordPress's Gutenberg is not letting me paste a link. More properly, it's turning the link into a Twitter embedding. Now, that looks nice, and it seems like a nice feature, but I didn't want that, because Twitter is increasingly erratic, and I am afraid the Twitter embedding feature will go away when Elon Muskhead gets tired of suing people over his own stupid mistakes and starts mucking with the code again. So I just wanted to paste a link, and then the text, myself.

But I had to "hack" the interface to do it, first posting a different link, which I then edited to point to Twitter. Does that seem right to you? That's one thing that inspired my post. Let's try again to see it:

https://twitter.com/xenotaur/status/1677735989249298441

Anthony Francis @xenotaur
The Web feels like it is disintegrating. Popup ads everywhere, train wrecks at Twitter and Reddit, Threads is just mobile, sponsored results on Google, fake reviews on Amazon.

And here I am watching my 1,000 curated RSS feeds slowly vanishing, going "This is fine…" #ThisIsFine

ttps://twitter.com/xenotaur/status/1677735989249298441

Part of the problem is what Cory Doctorow calls the "enshittification" of the Web: first companies are nice to users and attract them; when they have users they screw them over for their business customers; and then they screw business users overs as they start to chase advertisers, eventually driving the users away.

I think that's right, but it's more than that: people lose sight of what the Web actually is. Web 1.0 is a place to share documents; Web 2.0 is a place where you can create them online. We've had ads and subscriptions in this place since their earliest days, and I don't mind them - I put "banner ads" on my early website to advertise people whose blogs and books I liked, for free, just to publicize them.

But losing sight of the purpose - turning editors into viewers, or documents into ads streams - means the reason people were here, to consume and create content, can no longer be accomplished. And that's going to ultimately kill the great grift that is modern Web advertising - but let's not kill the Web too!

As an on-point example, I offer the Gutenberg editor, which constantly hides from you the widgets needed to transform a piece of text into, say, a pull quote, because it is incorrectly (and I will fight you on this) trying to make the page look like a piece of paper, instead of a craftsman's tool for producing text, with all the bells, whistles and knobs needed to make it format right, much less look good. Want something simpler? Fine, try Notepad. Don't inject your bad UI design into my editor, which, as I remind you, I am forced to use on my platform, which I never wanted to, because they broke the Classic Editor to push this idiocy.

It's not that the features aren't useful. It's that the entire philosophy of "UX" - user experience - is wrongheaded, and we need to go back to the more basic principles of software usability. Usability is not "modern", usability is not "clean", usability is not "design" - only usability is usability.

And so, if you take a tool that is designed to produce text ... and try to make it look like a view of text ... you will inevitably end up with something that is not usable. And if your philosophy tricks you into thinking that that is OK, your philosophy will drive you to make decisions which make the interface less and less usable.

And that would be the end of rant ... except I have a counterexample at the top of the page.

This is a page that recently appeared in my reading. I will take the clean, modern, well-designed Gutenberg editor any day over what modern web pages have become. Look at that above! What even IS that? What is it supposed to be? Where did my article go? What are these different blocks supposed to be advertising? They're so layered over each other you can't completely see any of them. "Choose great value" sounds like a line from a badly translated JRPG.

As best as I can determine, somehow I scrolled down to read the rest of the article, and it jumped to a join between articles on an "infinite scrolling" page. While some infinite scrolling pages are OK, most simply aren't. Especially a page for an article: you can't read the article anymore with infinite scroll. It doesn't stop, and if the next article has a similar topic, it can even seem like a new heading, making you wonder what the connection is, but giving an opportunity to sell ads - leading to what I think happened here.

So, while trying to read, and thus, scroll through this content - an article which claimed that Doctor Who's time travel was surprisingly accurate, which is more true than most people know - the page jumped to a join between articles in the infinite scroll. Because the page "jumped", all of this just popped into view; it wasn't clear that I scrolled, or that scrolling would get me out of it). The layout completely hides the articles above and below, and the jumble of popups fall over each other, leaving me no context of what to click on.

If you try to turn a document reader into an ads stream, you will fail at doing both.

I fear for the future. Because I love the Web ... and it's killing itself.

-the Centaur

Pictured: a screen shot of screenrant.com, of a broken article on the science of Doctor Who, correctly recommended to me by Google News, and completely garbled by ScreenRant's infinite scroll and jumbled ad presentation, leaving me unsure of what, if anything, to do other than ... just close the page.

(Actually, I reloaded it from scratch, selected the text of the article, and printed it for later reading. I don't care if there's an ad on the page or not; that's fine. I just demand to be able to read the darn thing.)