John Ternus is the CEO of Apple, and Lake Ontario is still Lake Ontario

I present two screenshots I just took a few minutes ago, on September 1, 2026.

The first image is from Apple’s website. As of today, John Ternus is the new CEO of Apple, taking over from Tim Cook, who led the company since Steve Jobs’ death in 2011.

The second, of course, is from the Apple Maps app, correctly identifying the… uh… least great of the Great Lakes by the name it has had since long before either Canada or the United States existed as countries: Lake Ontario.

Now, of course, if you were to look at that same lake today on Google Maps, it would be incorrectly labeled as “Lake America” because… well, you know why.

I’ve been a map geek since I was a kid. Since before I had ever heard the name of the guy who decided Lake Ontario needed to be renamed. If you had told me that someday “She Makes Henry Eat Onions” would need to be changed to “She Makes Henry Eat Apples,” I’d have said “That’s about as likely as my very educated mother serving us something other than nine pizzas.” Well, times change. Still, the bar for renaming an international body of water should be even higher than the one for demoting a planet. (There are good reasons for renaming things, but a temper tantrum isn’t one of them.)

The timing of the decree that this change should occur was telling, because a similar decree was issued last year, and Apple fell in line almost as quickly as Google did. But not this time. What’s different?

This time, it was just days before Apple’s change of the guard. And just like how you “can’t” appoint a new Supreme Court justice in an election year (except when you can), I guess you can’t rename a Great Lake right before a new CEO takes over.

Where am I going with all of this?

For the past year and a half, let’s just say, Apple has handled certain situations in certain ways. And now they seem to be handling them differently. John Ternus is not Tim Cook. And John Ternus’s Apple is not Tim Cook’s Apple.

This seems like a rather absurd detail to dwell on, but I don’t think it’s an accident or a coincidence. Watch this space. (“This space” being Apple Maps.) Whether or not that lake gets renamed there will tell you a lot, I think, about how John Ternus thinks.


Postscript: I don’t really believe in synchronicity (nor do I believe my devices are surveilling me 24/7). But I also don’t think about planetary mnemonics, like… ever. The last time any phrase starting with “my very educated mother” crossed my mind was probably the same day I learned the term “dwarf planet.”

And yet, here’s something funny that just happened. I referenced that mnemonic in this blog post, and then, less than an hour later, as I have been working my way through the New York Times Connections archive, I happened to play the puzzle from April 23. I immediately spotted the most unlikely grouping of words.


Update, a few hours later: Oh well.

Screenshot

Postscript to my first experience running WordPress on PHP 7.0

This is a companion piece to my post from earlier today, When switching servers breaks code: a WordPress mystery.

It’s not much of a mystery anymore, but since this was my first, and somewhat unplanned, foray into working with PHP 7.0, I felt it was worthwhile to spend a bit more time today finally exploring which features from earlier versions are gone in PHP 7.0, so I’ll know if I am going to encounter any more challenges in the eventual, inevitable move to 7.0.

The best source I can find on the removals is this RFC from two years ago (!) that lists deprecated features under consideration for removal, all of which did eventually end up being removed. (I assume this is a complete list of the removals, since I can find no other more current list. But suffice to say it is clear that everything listed here was removed, even if it’s not all that was removed.)

I’m happy to see that the only thing in here that I have been using on any recent projects that was removed was the /e modifier for preg_replace(), which is what I uncovered as the source of the “mystery” in my last post. Of course, before this morning I’m not sure I even would have remembered that I was using it.

That said, I’m relatively confident that I am not using any of the other features, because while I had forgotten about the /e modifier, I at least know I use preg_replace() on a regular basis. Most of the other features in the list are things I don’t recall ever having seen before. Such is the nature of being a self-taught user of a language with over 5,000 built-in functions.

There’s only one other removed feature that I know I have used. A lot. It’s the mysql extension. It has been deprecated in favor of the mysqli extension for several years. But my own CMS, cms34, built originally in 2008 on the then-current version 1.2 of CakePHP, has mysql functions everywhere. I did eventually manage to update the platform to version 1.3.21 of CakePHP, but the leap to 2.0 was too arduous, and reworking hundreds of files to use mysqli functions was, likewise, something that never seemed justified. I stopped new development on cms34 in early 2014, but we still have many client sites running on it. I have committed to supporting them as long as necessary, but I am actively encouraging those clients to make the switch to WordPress.

The absolute incompatibility of cms34 with PHP 7.0 makes the merits of that switch a lot more obvious. And now the clock is ticking.

Bottom line for anyone who, like me, is still supporting legacy PHP 5 (or earlier!) code: change is coming.


Update! Well, OK, I was just searching in the wrong way. The official documentation for migrating from PHP 5.6 to 7.0 has lists of both removed extensions and SAPIs and changed functions.

When switching servers breaks code: a WordPress mystery

Earlier this week I launched a brand new WordPress site for a long-time client. Break out the champagne! But of course it’s never that simple, is it?

The client’s live server is a newly configured VPS running Ubuntu 16.04 LTS and PHP 7.0; meanwhile, our staging server is still chugging away on Ubuntu 14.04 LTS and PHP 5.5. So, clearly, a difference there. But I was pleased to find that, for the most part, the site functions perfectly on the new server.

But then the client discovered a problem: on one page, content from a custom post type query wasn’t displaying.

Here’s a short version of the pertinent code:

$people = new WP_Query(array(
  ‘order’ => ‘ASC’,
  ‘orderby’ => ‘menu_order’,
  ‘posts_per_page’ => -1,
  ‘post_type’ => ‘person’,
));

if ($people->have_posts()) {
  while ($people->have_posts()) {
    $people->the_post();
    ?>
    <article>

      <header><h2><?php the_title(); ?></h2></header>
      <div><?php the_content(); ?></div>

    </article>
    <?php
  }
}

Strangely, the_title() was working fine, but the_content() wasn’t. It had been — still is, in fact — working on our staging server, all other things within the WordPress context being equal. (Identical, up-to-date versions of the theme files and all plugins, and WP itself.) And the client confirmed that the content was present in WP admin.

I found, confusingly, that get_the_content() works, even though the_content() doesn’t. But of course you don’t get all of the proper formatting (like paragraph breaks) without some WP filters that the_content() applies, so I tried this:

<?php echo apply_filters(‘the_content’, get_the_content()); ?>

Still didn’t work. After a bit more research I was reminded that the pertinent function that filter runs is wpautop(), so I just called that directly:

<?php echo wpautop(get_the_content()); ?>

Now I have the content displaying nicely, but this is clumsy and I really do not get what might be different. I know the new server is running PHP 7.0 and our staging server is running PHP 5.5… but I’m struggling to understand what kind of changes in PHP could cause this specific problem.

Since get_the_content() works, and the_content() doesn’t, the problem has to lie in something that’s happening with the filters on the_content(). Why? Because the_content() calls get_the_content() right up front. In fact, there’s not a lot to the_content() at all. This function lives in wp-includes/post-template.php (beginning at line 230 in WP 4.6). Here it is in its entirety (reformatted slightly for presentation here):

function the_content( $more_link_text = null, $strip_teaser = false) {
  $content = get_the_content( $more_link_text, $strip_teaser );

  /**
  * Filters the post content.
  *
  * @since 0.71
  *
  * @param string $content Content of the current post.
  */
  $content = apply_filters( ‘the_content’, $content );
  $content = str_replace( ‘]]>’, ‘]]>’, $content );
  echo $content;
}

As you can see, it’s really just 4 lines of actual code. It calls get_the_content() to retrieve the content, applies filters, does an obscure string replacement (which I think I understand but is not really pertinent here), and then echoes the results out to the page.

It’s pretty clear to me that the problem has to lie in one (or more) of the filters in the 'the_content' stack. I have to admit that even after years of working with it, I only have a rather nebulous understanding of how hooks work, so I’m not even sure where to begin dissecting the filter stack here to pinpoint the source of the trouble.

Whenever I know something works in one place and doesn’t work in another place, the first course of action in troubleshooting is to try to identify all of the differences between the two environments. Obviously we have some big differences here as I noted at the top of this post. But I am going to assume that the problem does not lie at the OS layer. Most likely it’s either a difference between PHP 5.5 and 7.0, or, even more likely, a difference between the PHP configurations on the two servers… specifically, modules that are or are not active. See my previous post on The Hierarchy of Coding Errors for my rationale here. Also keep in mind that I personally was responsible for installing LAMP on the server and configuring PHP, and it’s pretty obvious that we’re looking at the sysadmin equivalent of #1 or #2 in that list.

The next step, were I to care to pursue it much further (and if I didn’t have 200 other more important things to do, now that I have the problem “fixed”), would be to run phpinfo() on both servers and identify all of the differences.

That’s one possible path, at least. Another thing to consider is that the_content() actually is working just fine in other parts of the site, so maybe it would be worth digging into that WordPress filter stack first.

At this point, because as I said I have a few other more important things to work on, I will probably leave the mystery unresolved here. But I’d welcome any ideas from readers as to an explanation for all of this.


Update! I just couldn’t leave well enough alone, so a few minutes after I published this post, with the client’s permission, I restored the old version of the template, turned on WP_DEBUG and installed the Debug Bar plugin. Jackpot! Debug Bar returned the following error message when I was calling the_content(), but not when I had my “fixed” code in place:

Screen Shot 2016-09-01 at 9.24.16 AM

Well, how about that? As it turns out, the problem is due to a filter I myself had added, using a previously written function. (That’s #3 on the hierarchy list.) Combine that with deprecated functionality that was removed in PHP 7.0, and problem solved. And I even figured out why the problem is only occurring on this page and not site-wide… because my filter only runs if there’s an email address link in the content.

A few thoughts from a nerd who actually DOES care about politics

Jason Kottke linked to a post by David Roberts on Vox today:

Tech nerds are smart. But they can’t seem to get their heads around politics.

This is a great article on nerds and politics, or their lack of interest therein. It addresses a lot of the misconceptions that cloud our understanding of the political landscape in America.

But even as it tears apart the false dichotomy between the two major parties (i.e. they are not “mirror images” of each other), it falls prey to that exact line of thinking with one example it gives.

A voter with one extreme conservative opinion (round up and expel all illegal immigrants immediately) and one extreme liberal opinion (institute a 100 percent tax on wealth over a million dollars) will be marked, for the purposes of polling, as a moderate.

OK, that’s a helpful illustration. Except. There really are people on the right (*ah-hem* Donald Trump) saying we should round up and expel all “illegal immigrants” (don’t use that term) immediately. But there is no one on the left proposing anything even close to a 100% tax on wealth over a million dollars.

It’s hard, even for people trying to expose the lack of a parallel on the left to the extremism on the far-right, to avoid thinking the far-left is populated by crackpots with ludicrously draconian, totalitarian ambitions. But those people do not exist. There is no “far-left” in American politics, equivalent to the far-right.

Even Bernie Sanders, who self-identifies as a socialist — in America! gasp! get me my clutchin’ pearls! — isn’t proposing things like that. The ideas coming out of the left are reasonable and rational, benefitting the vast majority of Americans (at the expense only of those who can easily afford it) while pursuing a progressive goal of greater equality and opportunity for all. They only seem “extreme” because they are so radically different from the course we’ve been traveling on for the past 30ish years.

The real fault of logic here is in assuming that the “center” of current American political thinking is anywhere near the true center of the spectrum of possibilities.

Confession: I wrote this as soon as I hit that “100% tax” line because it aggravated me so much. The rest of the article furthers most of the ideas I’m expressing here, and is far more detailed and well-researched. It is absolutely worth reading, above my rants, but I still think it’s worth calling out this particular example.

In a future post I’ll take on the other big issue I see with nerds and politics: that nerds’ general disdain for politics leads them into a superficial alignment with libertarianism. But that very disdain is also the reason why they don’t explore deeply enough to realize how problematic libertarianism is, and how much it really doesn’t represent their values.