Fear, uncertainty, and doubt

Fear, uncertainty, and doubt (FUD) is as old as time. In a nutshell, it’s a disinformation tactic. You put out false information, engendering fear, in the hope that you can manipulate people toward a particular outcome favorable to you. No, I’m not talking about Donald Trump and the 2024 US election. I’m talking about Matt Mullenweg, WordPress.org, and Automattic over the last month.[1]

My introduction to FUD was in the late 1990s. I was in high school, I was playing around with Linux, and I was a regular poster on Slashdot. This was the high-water point of Microsoft trying to undermine public confidence in open source in general and Linux in particular. This was the period of the “Halloween documents” and SCO v. IBM. Rather than compete on the technical merits, Microsoft sought to create an environment where companies were afraid to adopt open source technologies because of nebulous licensing or patent concerns. The fact that these efforts ultimately failed doesn’t change how much time and money was spent combatting them. The opportunity cost was high.

Which brings me back to WordPress. I wrote yesterday (“The call is coming from inside the house”) about Matt Mullenweg’s seizure of Advanced Custom Fields on the WordPress.org plugins repository. I mentioned in passing that he also banned WP Engine from the repository. Something I didn’t mention is that logging into WordPress.org now requires you to attest that “I am not affiliated with WP Engine in any way, financially or otherwise.”

Read More

The call is coming from inside the house

I’ve written a few times about challenges with plugins on WordPress.org. Eleven years ago, as a comparative newcomer to WordPress, I wrote “Draining the swamp,” about a difficulty with an abandoned plugin. Later, I wrote “The Changelog Is A Lie” after a user usurped a plugin, hollowed it out, and replaced it with something else. I never thought we’d be in the situation that we are today, where WordPress.org has undermined the trust in the WordPress.org plugin repository. As they first said in Black Christmas, the call is coming from inside the house.

It’s beyond the scope of this post to fully review the dispute between Matt Mullenweg and WP Engine (see this article in The Verge for a good summary as of October 4). The latest development is that Mullenweg has usurped the free version of Advanced Custom Fields on the WordPress.org repository. The official announcement implies that the ACF team abandoned the plugin. This is inaccurate at best: Mullenweg banned the WP Engine developers from the WordPress.org repository, and blocked WP Engine-hosted sites from accessing it. Under the circumstances, switching the updating mechanism away from WordPress.org was the only responsible course of action available.

It’s a neat trick. You ban a developer from the repository, then announce that you’ve found a security issue, don’t let them release a patch for that issue, and then usurp the plugin because they haven’t fixed the issue. A tweet from WordPress claims justification under Guideline 18 of the plugin guidelines. It’s difficult to see how that guideline justifies this action. The developer hasn’t abandoned the plugin. The security issue wasn’t serious, and it’s been fixed. Put another way, if this is justifiable under Guideline 18, then there is no limiting principle.

Read More

That vacant stare

On a shelf on a Barrister bookcase in my library, between Leonard Mosley’s The Druid and Marie Vassiltchikov’s Berlin diaries, is the 1941 edition of William L. Shirer’s Berlin Diary. Shirer was an American journalist who spent 1934-1940 reporting from Nazi Germany. Although he subsequently authored several books, his real value is as an eyewitness to what was happening there and his impressions of the people.

His entry for August 9, 1939, records a conversation with a “World War [I] officer of proved patriotism.” Germany’s unprovoked invasion of Poland is three weeks in the future. In March, Germany had abrogated the Munich agreement and occupied Prague, along with the rest of Czechoslovakia. Shirer records the officer asking of him:

Why do the English butt in on Danzig and threaten war over the return of a German city? Why do the Poles [sic] provoke us? Haven’t we the right to a German city like Danzig?

Read More

Notes on Cypress and visual regression testing

I’ve been playing around with Cypress for end-to-end testing ever since I heard Paul Gilzow’s talk on the subject (“Introduction to Automated End-to-End Testing”) at the 2024 WPCampus conference. We did a pilot ten years ago to implement some limited E2E testing using Behat but it didn’t get very far. Building your own Behat suite without core support was a heavy lift (our Moodle plugins are a different matter).

We did build out some functional testing for our Microsite, which is a static copy of our WordPress theme, implemented in Twig. I took the opportunity of yet another chromium/selenium issue to reimplement our tests in Cypress, and to add visual regression testing for our components. An added complexity is that the tests need to work cross-platform: in developer local environments and in our continuous integration environment. It’s working, but there were a few challenges.

First, I got started by installing the Cypress Visual Regression package. Unsurprisingly, you’ll need the virtual framebuffer (xvfb) package installed. You’ll also want a consistent headless browser across all systems. Chrome is an easy answer, but I’m sure others would have worked. This is what my CI configuration looked like on a Debian-derived container:

Read More

Old PHP versions in devenv

I maintain a project that still uses PHP 7.4 (long story) so I need to build out my local environment with that version. Sourcing a Nix package for PHP 7.4 isn’t an issue; the nix-phps repository maintains PHP 5.6-PHP 8.4. The tricky part was adding that package to my local devenv.sh environment. Devenv supports PHP, but by default the PHP versions are limited to what’s in the devenv-nixpkgs repository, which starts at PHP 8.0.

I went down a few blind alleys, followed some outdated documentation, and generally overthought this. Devenv has awareness of older PHP versions; they’re simply not enabled by default. The first thing you need to do is enable the nix-phps repository. You can do that with this command:

1
devenv inputs add phps github:fossar/nix-phps --follows nixpkgs

Read More

Running Moodle cron in devenv

I have a Moodle development project coming up and this is a good a time as any to experiment with setting up a Moodle environment in devenv.sh. One immediate issue is that Moodle depends on background tasks running almost constantly. Devenv has a set of supported services and cron isn’t one of them. Devenv does support the concept of processes, which are just background tasks. Can I apply that Techmint article on How to Schedule a Linux Job Without Cron?

Sure can:

1
2
3

processes.cron.exec = "while true; do php public/admin/cli/cron.php ; sleep 60 ; done";

Read More

Measuring the Raritan Valley Line

Like many railfans (including the great E. M. Frimbo) I keep track of my mileage. I have a spreadsheet with the trains and routes I’ve been on, including dates and most importantly distances. I can tell you that I passed 100,000 miles on Amtrak on January 7, 2020, on the Capitol Limited, roughly 163 miles west of Washington, DC. This means I can I get a little obsessive about determining mileage, and can send me down a rabbit hole if it’s unclear what distance I traveled.

Railroads used to include mileage information in their timetables. Amtrak did right up until the discontinuance of paper timetables in the last few years. For railroads in Europe, the best source of information are the railway atlases published by Schweers + Wall. These maps are extraordinarily detailed, showing lines and distances (in kilometers). For the US, the best source of distance are employee timetables. As the source suggests, these are internal documents used by employees. They show distances, sidings, speed limits, and include various rules governing operation. Distance doesn’t change all that often, so older employee timetables can still be useful.

I’ve made 14 trips on NJ Transit’s Raritan Valley Line since 2016. But first, a nomenclature issue. The Raritan Valley Line is both a physical piece of infrastructure and a service that uses that infrastructure and the two are not coterminous. The service runs from High Bridge, New Jersey (Raritan on weekdays) to Newark, New Jersey. A limited number of trains continue from Newark to Pennsylvania Station in New York, but usually you transfer in New York.

Read More

Around Long Island Sound

It started over a cup of coffee. My friend Nate and I were having coffee at ThreeBirds. I was back from HighEdWeb North Carolina and getting ready for WPCampus. He was basking in a delightful trip that he’d taken to DC recently and was interested in replicating the experience–a trip taken for the trip’s sake. We didn’t set ourselves many parameters, save that we’d like to knock it out over a weekend and we wanted to travel by train wherever possible. We settled on circling Long Island Sound.

Long Island stretches 118 miles, from New York City to the Atlantic Ocean. North of it lies Connecticut. There are two ferries that cross it, one between Bridgeport and Port Jefferson, about halfway across; the other between Orient Point and New London, at the eastern end of the island. The Long Island Rail Road comes within a mile of one ferry and eight miles of the other. The various rail services on the Northeast Corridor have direct service to the ferry terminals in Connecticut. We devised a plan involving eight trains, three ferries, and two buses. Looks simple on the map, right?

Read More

Moving from nix flakes to devenv

Back in October I started using Nix to run my local authoring environment. I stayed with it, found other use cases for Nix, and then co-presented (with Jason Woodward) at WPCampus 2024 on “Using Nix to Define WordPress Dev and Test Environments.” The monster has definitely escaped the laboratory at this point.

While working up that talk I discovered devenv. I think of devenv as a wrapper or overlay for Nix flakes and it does two things that I immediately found useful:

  1. It wraps the complex Nix syntax into a set of declarations for adding languages, processes, and services.
  2. It provides a text-based interface for managing those processes and services.

Read More

Night of the Demon

It’s in the trees, it’s coming!

You’re an academic from the United States and you’re in England to visit a few of your collaborators. You’ve organized a small conference about the work of a fellow academic who leads a Satanic cult. He’s a fraud and you’re going to expose him. When you arrive in London you find out that one of your collaborators died in a freak accident the night before. There are strange clues in his notes. You visit the British Museum and the arcane work mentioned in the notes is missing. While you’re at the museum the cult leader visits you and after a conversation that is at turns fascinating and disturbing, he informs you that you have three days to live.

Night of the Demon features modern, skeptical people who do not believe in spiritual evil encountering people who not only do believe in that evil but know for a fact that it exists. This is distinct from the original Wicker Man or Midsommar; the pagans in those films believe, but neither film provides evidence for the fact of their belief. Night of the Demon, made in 1957, walks a similar path to The Devil Rides Out, Rosemary’s Baby, The Omen, and The Exorcist. The execution, however, has some distinct features.

Read More