I'll start with who, what, where, and when, followed by whither, whether, wherefore and whence, and follow that up with a big side-order of 'why' -- Douglas Adams, The Hitch-Hiker's Guide to the Galaxy, Episode 11

No One’s Backstory’s As Tragically Sympathetic Like…

So now that Cruella is out, we have to face up to it. Some people I think have hit it on the nose by saying that the thing that makes this one hard to swallow is that the Evil Queen is a fantasy-medieval character sorceress, and Maleficent is a fay, and Ursula is a supernatural creature, but Cruella is just, like, a rich person from the 20th century, and that’s too close to us. But anyway, one of the hot takes I see a lot in light of this is, “Just wait, their next live action prequel will be the story of a boy in 18th century France struggling to survive and overcome after his parents are murdered by the abstract concepts of literacy and female agency.”

So…

Gaston
No one clicks to view at full size like Gaston

The Politics of Zodak

There’s something that I think progressives misunderstand in the struggle for voting rights. They’re not wrong about their own position, but by failing to understand their opposition, they’re putting themselves at a disadvantage in winning the argument.

See, it is rightfully curious that so many conservatives can, with a straight face, insist that it is bad for democracy to ensure that people be able to vote – that it is more democratic to reduce the franchise, and that elections where more of the population vote are inherently unfair, illegitimate, or “rigged”. For the most part, I think progressives assume this is simply down to conservatives being lying sacks of shit who want to win by hook or by crook. And certainly that does describe a politically powerful segment of the current elected and, ahem, emeritus leadership of the Republican party, I don’t think it properly accounts for the opposition.

Frankly, I think you’ve got maybe 25%-30% of the Republican party who just outright believes that they should win every election by hook or by crook and elections be damned. And if you find that number insulting, remember, 27% on a survey is basically the “crazification factor”. There is no statement so completely inane, insane, outrageous or wrong that 27% of respondents won’t earnestly agree with it.

The trouble is that on top of that 30%, there’s another 30% who are wrong in a subtle broken-computer-in-a-60s-sci-fi-story sort of way. And it’s a hard kind of wrong to disillusion them about. To wit, they don’t know what “fair” means.

These are the people who will tell you that weather forecasts are inherently bullshit because “There’s always a 50% chance of rain: either it will rain or it won’t.” Because… Well, because they learned probability in middle school from a teacher who didn’t like math and haven’t given it a lot of thought since. Their mental model of what “fair” means is “like a coin-toss”. They have no other understanding of the concept of fairness. So they’ve internalized a notion that any time there are two options, “fairness” dictates that one option is chosen half the time, and the other option the other half. They like the idea of different parties controlling the White House and the legislature. They like the idea of alternating between Republican and Democratic presidents. They think that’s “fair”. And so, if they think that getting everyone to vote will cause one side to win way more than the other, in their mind, that is unfair completely regardless of the reason. Even if the reason is, “Because way more people want the Democrats in power,” that doesn’t change the fact that their notion of “fair” requires a near-equal divide of power between the parties, and thus more people voting is less “fair”.

I’ve had people tell me, on the issue of DC statehood, that it is reason enough to oppose it that it would create an extra blue state without creating a red state – they seem to believe that there is a requirement that states be added in red-blue pairs. Never mind that the current numerical distribution of states isn’t even. If we want things to be “fair”, it has to be a coin-toss.

And this attitude is not limited to Republicans, but the Republican leadership understands it and knows how to exploit it; the Democratic leadership doesn’t. So the Republicans say, “We want to gerrymander the districts so that each side will consistently get about* 50% of the seats,” and their audience says “Well that sounds fair.” The Democrats say, “We will balance the congressional districts so that they accurately reflect the 60-40 split in the population,” and the audience is outraged that the Democrats are trying a power grab to ensure they get 60% of the seats rather than the 50% which fairness dictates. (Hey, what’s that asterisk? Nothing, nothing. Well, it’s “When we say ‘about 50%’ we mean ‘We will consistently get 51-60, they will consistently get 40-49’,” but never mind that)

And the more the Democratic leadership says, “We just want it to reflect the actual distribution of poltical views,” the more both sides hear, “We’re not happy with a roughly-50-50-split and want more.”

This notion that fairness requires an equal probability of victory might sound strange given how closely it approaches the idea of “If the Republicans don’t have a majority of the people on their side, we should give them subsidies Affirmative Action From Each According to his Means To Each According to his Needs an advantage to make it fair.” But that’s not how they see it. Of course it isn’t.

But maybe it could be?


The title of this article is a reference to a character from He-Man and the Masters of the Universe. Due to the slipshod ’80s toyetic “We don’t give a crap about continuity, just sell the toys,” nature of the franchise, there was some confusion between different parts of the franchise whether the character of Zodak was a hero or a villain (I think it was originally just because he had clawed feet). Also whether it was “Zodak” or “Zodac”. As the franchise settled down and tried to wrangle some kind of continuity out of this weird-ass Conan rip-off, they settled on the explanation that while Zodak might be personally sympathetic to the side of good, his official loyalty was to the balance between good and evil, and thus he was duty-bound to help out whichever side was losing. Which was usually the bad guys, because He-Man villains were, for the most part, incredibly stupid.

This is definitely going to hurt my google pagerank

You ever hear the grammatical oddity, “Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo”? A grammatically correct and logically coherent sentence that is incredibly confusing and hard to parse and only has the one word in it over and over?

Turns out there’s another word you can do this with. I present to you, a sentence which means “[This is bad]: [low quality] [feces] (that) [low quality] [people of poor character] [defecated] [for the purpose of causing trouble] (themselves) [emit in an uncontrolled manner] [low quality] [substances of an unspecified unpleasant nature].”:

Shit: shit shit shit shit shitshit shit shit shit.

Collective nouns are in blue
Adjectives are in red
Verbs are in purple
Adverbs are in green
Exclamations are in black

 

 

Ross Codes: Pathological Switches

Some years ago, a then-colleague described me as “A Developer with a big D,” Which he quickly corrected to a capital D. Anyway, today I’d like to tell you about how C is insane.

So, an idiom not uncommon in the C programming language is the “switch” statement. It looks like this:

switch(x) {
case 1:	printf("Hello\n");
case 2: printf("World\n");
default: printf("Bye\n");
}

This all looks very sane and fine and if you were raised in the world of normal programming languages written in the 21st century by people who weren’t suspicious that the metric system was an agent of global communism, you might assume that what you’re looking at is just syntactic sugar and semantically, it’s the same as this:

if (x==1) printf("Hello\n");
else if (x==2) printf("World\n");
else printf("Bye\n");

Alas, you poor ignorant fool. If you know anything at all about C, you should know that C is not long on “syntactic sugar”. C does have, to my knowledge, one piece of completely pure syntactic sugar. And it is, of all things, the array index operator. Yeah. The array index operator is exactly literally the same as pointer addition. That is, a[b] means exactly the same thing as *(a+b). Which doesn’t sound like a big deal until you remember that addition is commutative, and consequentially, a[b] is the same as b[a]. Or worse, a[4] is the same as 4[a]. This is a good way to confuse someone with code. To make matters even worse, there’s reason to suspect that the reversed syntax was the original intention since in assembly language, the syntax [ax] means “Not ax itself; the memory cell whose address is currently in ax.”  No, a switch statement is actually a calculated GOTO. This isn’t a semantic control structure; it’s a jump table. One consequence of this is that it has to be able to resolve all the cases at compile-time. That is, this won’t work:

y=2;
switch(x) {
	case 1:	printf("Hello\n");
	case y: printf("World\n");
	default: printf("Bye\n");
}

Try that in gcc, and you’ll be told “case label does not reduce to an integer constant”. In other words, “I can’t be sure what ‘y’ is until the program is actually running, and it’s too late by then.” (In this little code snippet, you can indeed be sure. But this is C, so some other thread could be able to modify the value of y after that assignment, because C is like programming by sticking your hands into a big box of broken glass) So semantically, a switch statement is more like this:

if (x==1) goto case_1;
else if (x==2) goto case_2;
else goto case_d;
case_1: printf("Hello\n");
case_2: printf("World\n");
case_d: printf("Bye\n");

Only slightly more insane. Anyway, by now perhaps you have realized the thing that everyone donks up the first time they use the switch statement. If you run this code with x set to 1, it does the thing you told it to, but possibly not the thing you meant:

Hello
World
Bye

Yeah. It prints all three things. Because the code after the “case” label isn’t a block. The switch as a whole is. So execution just keeps going. To do the thing you probably meant, you actually want this:

else if (
switch(x) {
	case 1:	printf("Hello\n");
		break;
	case 2: printf("World\n");
		break;
	default: printf("Bye\n");
		break;
}

That last break isn’t strictly necessary, but it’s a good idea in case you add more code later. At this point, people coming from languages that were engineered by people not alive during the height of the popularity of LSD would probably say that this is dumb and it should just break automatically because clearly that’s what you meant. And loads of languages do this. They even allow freeform expressions in the cases so that it really is just a sugar coating over a series of if statements. Except, of course, this is C, and we wouldn’t give you a construct which was exactly as expressive as an if-else tree; the ability to fall-through isn’t a bug or an oversight; it’s the desired behavior. The reason for this, beyond a pathological hatred of first year computer science students, is that the switch statement’s “killer app” is not “Which of these should I do?” scenarios, but rather “How many of these should I do?”

for(x=0;x<5;x++) {
	printf("There was a farmer had a dog and Bingo was his name-o: ");
	switch(x) {
		case 0: printf("B");
		case 1: printf("I");
		case 2: printf("N");
		case 3: printf("G");
		case 4: printf("O");
	}
	printf(" and Bingo was his name-o.\n");
}

Yes, I can think of better implementations of the Bingo Algorithm. Shut up. My point is, the reason you use a switch and not a tree of if-then-else clauses is that you can treat the body of the switch as a big block that you can enter at various points depending on the combination o of things that need doing, which makes it very elegant for situations where there’s a multistep process you need to perform on some piece of input, but possibly your input already had the first few steps taken care of by someone else earlier.

But now, let’s go completely nuts… After all, a switch is just a structured goto, and the body is just a block. Which means…

switch(x) {
	case 1:	printf("Hello\n");
		if (y!=0) {
	case 2: printf("World\n");
		} else
	case 3: 
	break;
	printf("Surprise!\n");
	default: printf("Bye\n");
}

What? But yeah, C is fine with you doing this. So what happens? Madness.

X Y Output
1 0 Hello
1 Anything else Hello
World
Surprise!
Bye
2 Anything at all World
Surprise!
Bye
3 Anything (nothing)
Anything else Anything Bye

I need a drink. Yes, if x is 1 and y is nonzero, you can just ignore the switch altogether: Print “Hello”, then execute the if block, printing “World”, skip over the else block, and print “Surprise” and “Bye” because that’s what’s next. If y is zero, instead of executing the if, we execute the else, which skips us to the end of the switch. Okay. But now, if x is 2, we leap right straight into the middle of the IF. We don’t bother looking at y. We print “World”. We ignore the “else”, and that’s a little confusing if you are a normal, good-hearted person or even a Perl programmer, because how do you know what to do about the else? But it’s not that complicated: the close brace at the end of the “if” block is basically an invisible “Go to the next line after the else”. So we do that, which takes us to the line where we print “Surprise” and then “Bye”, helpfully labeled “default”.  If x is 3, now things get even stranger, because we jump in between the “else” and the “break”. But C, like a honey badger, don’t care. It’s just a line of code as far as the compiler’s concerned. So if x is 3, we jump right in front of a “break” and exit the switch without printing anything.

Does your brain hurt? Because notice that when x was 2, we fell through from the 2 case through the 3 case to get to the default case. The line that prints “Surprise” is clearly part of the 3 case, yet it can’t be reached in the 3 case.

It gets worse. Let’s go back to our first example and do something naughty:

switch(x) {
	case 1:	printf("Hello\n");
		int w[6];
	case 2: printf("World\n");
		printf("%d\n", sizeof(w));
	default: printf("Bye\n");
}

Now here, if you come from a reasonable sort of language like Perl, you’re troubled by this. If you come from Python, this might even wipe that smug smirk off your face, because even though Python doesn’t make you declare your variables, you probably get an uncomfortable tingle in your spine when you run into code where the scope of variables is nontrivial.

The scary thing, of course, is that if x is 2, you’ve jumped over the declaration of w. So does w even exist? Is w defined one way if x is 2 and you skip straight to case 2, but a different way if x is 1 and you fall through from case 1?

Don’t be ridiculous. This is C. “int w[6]” doesn’t really create anything. Here’s the assembly language emitted by the C compiler in-line between the two print statements:

[this space intentionally left blank]

You get a clue to what’s going on if you remove the first print statement. GCC will issue this error:

a label can only be part of a statement and a declaration is not a statement

Yeah. Declarations aren’t statements. They don’t compile into executable code. Instead, they’re instructions to the compiler about how it should arrange memory. “int w[6]” doesn’t mean “Go create a Thing which is an Array, having 6 cells for holding ints”. What it means is actually, “By the way, when creating the stack frame for this function, leave 6*sizeof(int) contiguous bytes there, which I will refer to as w.”

Being able to just shove in a variable declaration anywhere you like is a comparatively new addition to C. It wasn’t standard back when I learned this bullshit in undergrad a very long time ago. Used to be you could only do it at the beginning of a block. I’m not even sure that was ever standard, but GCC used to allow it. Originally originally, you could only do it at the start of a function. And that’s what’s going on here. That declaration is not an order to allocate memory; it’s part of the surrounding function‘s context. Mechanically, the “int w[6]: really “happens” back at the top of the function – that’s when the memory is allocated. Its placement within the switch statement is only defining its lexical scope – it’s telling the compiler which lines of source code are allowed to use the symbol “w” to refer to that block of memory; it has no meaning at run-time (You can prove this, if you like, by sticking a trivial variable assignment on either side, say “q=101; int w[6]; q=202;” and compiling with gcc’s “-S” option. Even if you can’t read assembly – and a C compiler’s output can be particularly irascible – you’ll be able to see the 101 and 202 on consecutive lines).

Well… Usually. Most of the time. Often. Because, of course, if you are an incredible dickwad, you can pull a stunt like this:

y+=10;
int z[y];

And now you’re boned. Because it can’t just go ahead and allocate that stack space as part of the function call, since it doesn’t know the value of y until runtime. If this were a sane language like Java, you’d just throw your hands up and say, “Actually no. Arrays shouldn’t live on the stack. w is really a reference to an array object which lives on the heap.” and C would laugh at you because that is nonsense and garbage collection is for hippies. That array has to live on the stack, because it has to have stack semantics. And the only way we can do that is if we embiggen the stack at runtime. If we do the same trick as before of emitting the assembly code, we’ll see that when you get to the place where we do the “int z[y]”, the assembly… Is a lot, really. The key thing happens all the way at the end, though, when it moves the stack pointer to accommodate the extra space, and then shoves a value into a local variable.

And here’s one thing that is subtle and different. It’s the one difference between a directly-declared non-variable-length local array and a pointer, and it’s a distinction that as far as I know, you can’t do anything with at the level of the C programming language. To wit: z is a local variable holding the memory address on the stack where the contiguous block of memory is. w is not. w is just the address of the contiguous memory block. When you access w[2], the code that’s emitted is, roughly, “add 2 * sizeof(int) to the constant value w. Add that to the base pointer, and look in that memory cell.” (Though it’s probably “subtract” rather than “add” because stack pointers are like electrons and the sign is wrong for historical reasons). When you do z[2], the code that comes out is “Add the constant value z to the base pointer and get the value from that memory cell. Add 2*sizeof(int) to that, and look in that memory cell.”  Basically, z behaves (at runtime) as it would if we’d declared it as “int *z = w”. Does this matter ever? I mean, it’s a couple more opcodes, but it’s 2021 and you absolutely do not care about that if you’re writing C. Possibly in some very pathological cases there’s some differing behavior you could trigger?

Speaking of pathological cases, how does all this nonsense figure into the switch? Well, let’s try it:

switch(x) {
	case 1:	printf("Hello\n");
		int w[y];
	case 2: printf("World\n");
		printf("%d\n", sizeof(w));
	default: printf("Bye\n");
}

And now we’ve finally found something so awful that even C won’t let you do it. Try to compile that, and C will politely tell you to get stuffed:

error: switch jumps into scope of identifier with variably modified type;

The compiler has noticed that you’ve dicked around with the size of the stack frame, and you should not be allowed to jump over that. This isn’t the message it used to print, for what it’s worth. When I first discovered this behavior way back in undergrad, the message it printed was rather more wonderful: “Can’t jump across dynamic memory contour.”

What would happen if you could? Here, dear reader, I must only say that I don’t know. The specification says only that we are not allowed to do it; it does not attempt to justify this decision. Remember when I said that the variably-modified type of the array made it very slightly and subtly different from a normal statically-sized array? That it’s really more like a pointer? Well, if you really want to jump over a stack allocation, in gcc at least (It’s not standard, and now that variably-modified types are a thing, those are recommended instead), you can do it like this:

switch(x) {
	case 1:	printf("Hello\n");
		int *w;
		w= (int *) alloca(y*sizeof(int));
	case 2: printf("World\n");
		printf("%d\n", sizeof(w));
	default: printf("Bye\n");
}

This is legal and it does the same thing as the previous code snippet, and the assembly language it compiles into is almost the same (I don’t actually understand the differences myself, but I suspect that they would optimize into a closer match if I turned on optimizations). Why does gcc allow this and not the other one? Remember, it didn’t allow the other form even before there was a specification telling it not to.

My best guess is that it offends the compile-time type checking. In particular, what does that penultimate printf print?

Well, now we get to that small oddity of how a locally-declared array is not quite the same as a pointer. Because let’s get rid of the switch and interrogate those variables…

int w[y];
int *z = (int *) alloca(y*sizeof(int));
printf("%d, %d\n", sizeof(w), sizeof(z));

What do you suppose comes out of that? Remember, under the hood, the generated code for w and z are pretty much the same. They’re both represented as a value on the stack which contains the address of another location on the stack. And yet, on a 64-bit system with 32-bit integers with y set to, say, 6, this prints “24, 8”: sizeof(w) is the size of the whole array – six four-byte ints – while z is the size of a pointer. The compiled code handling that “sizeof” is straightforward, if not all that interesting. sizeof(z) fetches the literal constant 8; sizeof(w) fetches the value that was stored in a register when the allocation occurred.

As far as I know, this is the only reason you can’t jump around the allocation: the compile-time type information would be wrong. If you could jump over the initialization of w, sizeof(w) wouldn’t be consistently defined. It’s not actually a problem for memory allocation at runtime: the stack frame will clean itself up when the function returns regardless of whether the allocation happened or not. This isn’t C++ where we need to be able to run destructors when the variable leaves scope.

But maybe there’s some other more subtle problem you could cause this way? Any C gurus out there with even darker wisdom than my own?

Back to the Bundle For Racial Justice, Page 3

Page 3 was a bit lighter on games that would run on my linux box, but here’s my impressions…

  • Pikuniku: Played well, pretty cute. Dylan had watched one of his Youtubers play this one, so he kept spoiling it for me. Also, while it starts up, it has a warning not to turn your computer off while the autosave icon is showing. I can’t tell if that’s a “We just left that in from the console port” thing or a deliberate parody.
  • Tape: Not a game. Some kind of project management software?
  • The Night Journey: Want to play this. No linux port.
  • Sleepaway: I guess this is another pen-n-paper game?
  • CanariPack 8Bit Top Down: Asset pack game making. I wish I could get my brain together enough to work on making a game.
  • Far From Noise: Another with no linux port
  • Codemancer: No Linux port, but an Android one. I like this game. It’s a kind of broadly Pokemonish Programming game: you play a student wizard in a world where magic takes the form of writing little scratch-like programs for your feisty animal familiar to execute. Hoping I can get the kids into it.
  • Serre: Another visual novel, which, I’ve mentioned, aren’t usually my thing. This one seems to be about a romance between a lonely young girl and an invading alien lady. I don’t care for the art style but the story is cute.
  • Wakamarina Valley, New Zealand: No linux port but it looks neat.
  • Vilmonic: This is more Dylan’s kind of game than mine, and after a few minutes something went squirrley with the controls causing my little dude to just continuously run downward.
  • Hidden Folks: A sort of Where’s Waldo kind of hidden objects game in a sketchy art style. Reminds me a bit of Highlights for Children.
  • Pagan: Autogeny, The White Door, Vignettes, Sagebrush, Tamashii: No Linux Ports
  • Intelligent Design: I found the game a little irascible. Evolutionary sandbox doesn’t sound like my thing. Also, the UI was too small. Finally, I’m left-handed, and the physical setup of my space precludes me from using the mouse right-handed. The reason I mention this is that while WASD is standard for movement, most decent games will also let you use the cursor keys, or at least remap the movement keys. This does not. It is incredibly inconvenient for me to use WASD because of the aforementioned “I have to use my left hand for the mouse” thing.
  • As We Know It: Another visual novel, this one a postapocalyptic romance I think. Visual style reminded me a bit of Goliath. Plot didn’t grab me really.
  • The Testimony of Trixie Glimmer Smith: Another visual novel. This one seems to be anthropomorphic animals and also Lovecraft? Soft pass.
  • Bonbon: Windows only
  • Death and Taxes: This is a ton of fun. You play a grim reaper in a bureaucratic afterlife in a way that’s reminiscent of Papers, Please, though the pacing is not nearly as frantic. It takes kind of a while to get to the point where the other shoe drops, but the art is fun and stylish and the relaxed pacing kept me from getting flustered.
  • Super Win the Game: Wow. Retro-styled puzzle-platformer that draws most heavily from, of all things, Zelda II: The Adventure of Link. The jump physics are a little weird, but it feels deliberate. Very wide open – I accidentally sequence-broke from the starting gate. Really enjoyed this, putting in about an hour before I noticed.
  • HUGE pixelart asset pack: Oof. Ever guiltier I feel about my failure to write the vidgams.
  • Signs of the Sojourner: No Linux port.
  • Game Development Cheatsheets – 2018 Edition: Not really sure what this is. It seems like job description posters for game dev jobs. Okay…
  • Jimmy and the Pulsating Mass: “Full length pixel RPG”? Yes Please. No Linux port? Fuck.
  • Task Force Kampas: Windows only, but I don’t like shmups anyway, so okay.
  • Glittermitten Grove: A fairy-themed colony management game. I think I might have liked this more when I was younger? I got overwhelmed pretty quickly and my fairies kept starving.
  • Silicon Zeroes: A puzzle game based on building circuits. Very similar to Nandgame, but with a bit of narrative and working at a higher level. I had fun with it and I plan to introduce Dylan to it.
  • Pixel Fireplace: Same libcrypto issue I’ve run into a few times. I am curious why so many of these games, apparently games without any obvious need for cryptography, have a dependency on a newish version of OpenSSL.

I also managed to sort out the dependencies for Haque and Minit, which I’d previously been unable to play. Both are sort of Zelda-esque Action-RPGs in an 8-bit style. Probably Speccy for the former and Apple 2 for the latter, though Minit kinda feels almost Arduboy. I liked Minit, whose gimmick is that you die (and restart back at home) every 60 seconds. Haque was a little too much noise for me.

Fiction: A Magic Carpet Ride

Anyway, here’s the punchline.


The pain was short-lived in that the concept of time had ceased to exist. It was, for the same reason, eternal. Zeke became aware of his own existence again in a void. There was nothing he could see, nothing he could hear, nothing he could feel, nothing he could smell, and nothing he could taste.

No, that wasn’t right. He could taste something. Strawberry lip gloss. Roxy was kissing him, and with that knowledge, his sense of touch returned. He was able to get his eyes open, but his brain was still scrambled from being stunned. He tried to ask a question, but what came out was closer to, “Flarb?”

“Vital signs are normal,” Lieutenant French said. “You were out for about five minutes.”

“Are?” Zeke asked. That was a real word, at least. He tried to remember how his hands worked.

“We’re definitely not on our Earth,” French said. “We’ve lost comms to Unified Space Command, and there’s no sign of the Sally Ride.”

Instead of trying to speak, Zeke managed to raise his eyebrows into what he hoped was an expression that conveyed the obvious question.

Roxy gave him an apologetic look. “Sorry,” she said.

Doctor Waller explained. “We patched into the phone network. Your mother’s number isn’t in service. Obviously, it’s been a few years, so it’s possible she changed it?”

Zeke tried to sit up, forgetting that he was strapped down. Roxy released the straps, and he tried to sit upright, failed, and slumped sideways. “Muh?” he asked. They followed his gaze to the viewport. The blackness of space had been replaced by blue skies and treetops.

“I didn’t anticipate that. Probably should have,” French said. “Our relative position changed when we jumped. I guess we’re lucky we ended up somewhere safe.”

“Maybe not just luck,” Waller said. “We know that the exotic matter is triggered by certain brain patterns, and it seems like it’s linked to a self-defense reflex. Possibly his subconscious influences exactly where we land. It might even explain why the universes he was drawn to resembled works of fiction from his memory. If that’s true, it might even be possible for him to learn to control it unassisted.”

“Where do you find a teacher for that?” St. George asked, sarcastically.

Zeke finally found his voice. “So where are we?”

“It seems pretty normal,” French said. “I think we’re in New York. Or whatever the equivalent of New York is in this universe. This looks like Central Park. Probably a good thing the cloak turned on automatically. I need to take some readings and adjust the calibration. And you’ll need a few hours to recover before we try again. It might help if you can figure out whether this universe maps to anything you know.”

St. George nodded to Mon’a. They produced a knit cap and pulled it down over their forked ears, then put on a pair of sunglasses to conceal their eyes.

Zeke tried to stand up and stumbled. Mon’a caught him. Zeke blinked a few times. “I remember now. Where I saw you before.”

“This is our first meeting.”

Zeke shook his head. “Not you-you. Your… Your actor I guess. I couldn’t place it because of the eyes. But a bunch of years ago you played the leader of a gang of underprivileged street toughs who befriended an Asian-American senator. Y’all were recurring characters in the last season before he became vice-president and the show ended. I liked that show.”

“Quite,” Mon’a said.

The six of them cautiously emerged from the hatch of the invisible space ship. The sun was shining, the air was sweet, the weather, pleasant. The crowd was sparse in this section of the park; no one seemed to take much notice of them.

“Keep a low profile,” St. George said. “Be on the lookout for…” He took a deep breath, mentally preparing himself. “Hijinks.”

“Hijinks?” Waller asked.

“Hijinks. Think about what kind of TV shows are set in New York. It’s basically fifty-fifty whether it’s a crime show or a zany sitcom.”

“That’s actually a good point,” Zeke said. And then he stopped talking, because he, among with the other four humans, stopped in their tracks to stare wide-eyed at a group of people a few yards off.

“It appears this universe has open contact with non-terrestrial life,” Mon’a said. “I do not recognize the species.”

St. George leaned toward Waller and said, sotto voce, “Okay. I didn’t really believe this whole TV Show Universe thing until right this minute. I think I owe you ten bucks.”

“I want to ask. Can I ask?” Roxy said, excitedly.

The members of SPACOM 3 quietly exchanged glances at each other. “We probably should go if we can,” French said. She was clearly struggling to show scientific detachment. “It would help with my measurements.”

“Quite,” Mon’a said.

“With your measurements?” St. George asked, skeptically.

“Yes, sir,” she said, stifling a giggle.

“Okay, go,” he said to Roxy. She skipped ahead.

“Excuse me,” she asked the four-foot tall creature. It turned its large, furry, orange head toward her and regarded her with large, googly eyes.

“Yes?” it asked. The inside of its mouth was flat black except for a tongue that looked painted-on, and it had no visible throat.

Roxy took a deep breath and with a broad smile, asked, “Can you tell me how to get, how to get to…”

Fiction: Mile Marker 24

It’s funny how ideas evolve. When I first had the idea that this is based on, the twist wasn’t even a twist. It only occurred to me a good twenty years after I first had the idea that Gabe wouldn’t explain his true nature to Dorothy from the outset. Now, I think it’s a fun reveal, though I’m not sure if it will really play out well as a full story – there’s obviously a big change in what kind of story you’re telling if you spend an extended amount of time believing it’s one kind of story and then it turns out to be a different kind. But me, I like things that transform into other things; I was brought up on a diet of kids shows about dudes who used magic swords to turn into Conan knock-offs and trucks that turned into robots. So, let’s see how it goes.


“Sorry, what?” Gabe asked. He glanced at the clock.

“Edgy. Distracted. I said you were edgy and distracted. Like the way you got distracted just now, ten seconds ago,” Dorothy said. “If you don’t want to help me study, you can just… I take that back. I need you to help me study.”

“Yes. Right. Sorry. Trigonometry. The cosine of the arcsine of x is the square root of one minus x squared,” He said. He looked at the clock again.

“Yes,” Dorothy said, “Except that it’s history. Are you okay?”

“Sorry,” Gabe said again. “Sorry. I… Can’t really explain.”

“Complicated?” she asked.

He didn’t answer, instead engaging in some kind of staring contest with the clock. “It’s okay,” Dorothy finally said. “Believe it or not I’m getting used to you. I know you’ll keep me out of trouble. Stay on the straight and narrow. Don’t break the rules. Don’t mess up the universe.”

Gabe looked down at her with a start, as though seeing her for the first time. “Don’t break…” he started. His face fell. With a faraway look, he quietly said, “There is no who we are but what we do. There is no us but what we choose.”

Dorothy dropped her pencil. “What was that? Where did you- That was me.”

Ignoring the question, he said, “I’ve been teaching you the wrong thing.”

She stood up, confrontational. “I wrote that. Part of it. Only it’s not done yet. How did you know that?”

“I’ve been keeping you out of trouble,” Gabe said. “I should’ve been helping you choose what trouble to get in. I need to get into some trouble right now.” He snapped back into focus. “You need to call emergency services. Right now.”

“What?”

“There’s been a car crash on route 170, near mile marker 24.”

“How did you- When?”

He looked at the clock. “About four minutes from now. You don’t have to tell them that part.” He reached into his pocket and took out a small gray square. Dorothy had seen it before, but only in brief glances; he’d always made a point not to call attention to it.

“How do you know? She braced for his usual “It’s complicated.”

She didn’t get it. “The same way I know about your poem,” he said. “I’ve read it.” He opened up the square like a compact and poked at it intensely.

Dorothy didn’t understand. “They have poems that haven’t been written yet in heaven?”

He looked up from the object in his hand, surprised. “Heaven? Oh. Oh! No. Look, when I told you I was your guardian angel, I didn’t mean it literally.”

He looked back at the clock. Not a lot of time, but he gave her a second anyway. “I’m from the future. About a hundred years. I am going to get in a lot of trouble for telling you this. Might not get see you again. But this rule is worth breaking. You need to make that call, and you need to make it right now.”

“But-” Dorothy tried.

Gabe tapped on the device in his hand, and then, quite unexpectedly, he put his hands on her shoulders. She looked at his hands in disbelief, then poked him with one finger, verifying that he was tangible. “Where I come from, you finished that poem. You finished it, and you called it Mile Marker 24. After the place where your stepsister died in a car accident. Make the call.”

He picked up her phone and put it in her hand. Reflexively, she took it and fumbled, trying to dial. “You can-” she tried

“Yeah,” Gabe said. “Not supposed to, but I can. I have to go. I don’t know if I can help, but I’ve got to try. If I…” He didn’t know how to finish.

Dorothy had glanced down at her phone as the call connected. Her eyes flicked back up just in time to catch the edge of a flash as Gabe vanished.

Fiction: On My Way

Another thing I wasn’t planning. SPACOM 3 was just supposed to be a cute cameo in a story that was mostly about Zeke’s struggle with the existential nature of living in a teen drama, and whether it was morally acceptable to date a fictional character. But I had so much fun writing them that I figured what the heck.


Lieutenant French tightened the straps holding Zeke to the partially-reclined chair in the middle of the drop ship, then placed the trigger in his hand. It reminded him of the buzzer from the quiz bowl game show he’d done back in high school. That had only been a couple of years ago, but it felt a lot longer.

“When you push the button, it will trigger a phased energy discharge. It’s based on K’lap’rr stunner technology, so there’s no chance of permanent damage, but it will stimulate the same part of your brain as a near-death experience. If our theory is correct, that should trigger the exotic matter particles.”

“Cool, cool,” Zeke said with a bravado he didn’t feel. “I shoot myself and hopefully it zaps this space ship back to my home with all of us inside. Or maybe it just zaps me personally back home, and I get to enjoy the view from geosynchronous orbit very briefly.”

“Low-Earth Orbit,” French corrected. “Geostationary orbit is much farther out.” She winced as it set in that this was not a helpful response.

“Why do I have to push the button myself?”

“We talked it out with Doctor Abermarle, and…” She wobbled nervously. “We’ve taken every precaution, and the theory is solid. But this is uncharted territory, and there’s no absolutes. Given that, we decided that it ultimately had to be your decision.”

Mon’a leaned uncomfortably close and coldly said, “As we are not enemies, it would be… Awkward for any of us to be the direct agent of your demise.”

“We’re coming with you, to who knows where,” St. George said. “So it’s not like we don’t have skin in the game.”

“Well thanks,” Zeke said. “And despite my sarcastic tone, I actually do mean that. You didn’t have to come with us.”

“Based on the fact that you were able to travel to Sparrow’s Folly twice while you were in your car, but the times you jumped outside of it, you ended up somewhere else, we believe that the exotic matter in your brain is influenced by a surrounding ferromagnetic field,” Lieutenant French said, “We’ve altered the internal magnetic field of the drop ship based on the precession of your unique quantum signature. If the theory is right, that should send you to your own universe. But there are constant terms in the calculation we can only estimate, so it may take us a few tries to calibrate it.”

“But that also means it might be hard for you to go home afterward,” Zeke said. “Why take the risk?”

“It’s your sunny disposition,” Doctor Waller said, standing up from the flight controls.

“No it’s not,” Zeke said.

“No it’s not,” St. George agreed.

“That is not the reason,” Mon’a added, dispassionately.

Waller shrugged. “Okay, it’s her sunny disposition,” he said, pointing a thumb at Roxy.

“What can I say? I’m cute as a button.”

“And you’re taking all this very well,” Waller said. “Most people on this version of Earth take a while getting used to the space ships and the aliens.”

“You get a lot of aliens in Sparrow’s Folly?” St. George asked.

“Once in a while for the Halloween episode, but otherwise, no,” she said.

“You are unperturbed by the prospect that your metaphysical nature derives from a work of fiction relative to your partner.” Those familiar with Mon’a’s speech patterns could tell this was a question.

Roxy shrugged adorably. “I’m nineteen. I think it’s pretty normal for a nineteen-year-old to think she’s the center of the universe. I just happen to have documentary evidence that it’s literally true in my case.” She squeezed Zeke’s hand. “I got your back, jack. Now or never. Ready?”

“I feel like I could stretch this out a little longer,” Zeke said.

“Just lay back and think of home,” she told him.

“Or failing that, somewhere nice. One of those fun beach shows,” St. George said. “Nothing too murdery. Try to avoid kaiju.”

“No zombies,” Mon’a said, neutrally.

“I hadn’t thought of that. Thanks.” Zeke sighed, and put his thumb on the button. “I hope this doesn’t hurt,” he said as he pressed it.

Then the entire universe was pulled inside out through a microscopic hole in his brain.

 

Fiction: Domo Arigato 1

Dipping once again into the pile of “Stories I meant to write decades ago,” this is actually an idea I had way back in the ’80s, but it took several decades for the key element of the climax to come to me. Now, the material is maybe a little dark given how young I was at the time, but keep in mind that I had just come off of Captain Power. Also, the original idea was a jukebox musical, but that doesn’t translate well to prose.


Rick set Lauren down on the couch and checked her eyes. They’d already turned gray. Fine silver lines had started to trace paths along her temples. “Who is she?” Daryl asked.

“A friend,” Rick said, “But not for long if we don’t do something.” He found one of the two android weapons on the table where he’d left it earlier, took out the power rod. “This is how they did it. They call it a sillicizer. It changes organic matter into…” He trailed off.

Everyone else just watched in confusion as Rick crossed to the time machine and opened a panel on STEVE’s housing. He placed the silvery rod into a test tube mounted to the inside of the panel and closed it. “STEVE,” he said. “Use your sample analyzer to invert the molecular structure and create a reversal agent,” he ordered.

STEVE looked up at him with no expression from the rounded screen. “An-na-na-na-lyzing,” the computer stammered. “Scan process will ta-ta-ta-take one-one hundred trillion cycles. All cir-cir-circuits busy.”

“She’s getting cold,” Daryl said, checking Lauren’s pulse. “Do we have that kind of time?”

“No chance,” Rick said. “I have to go back. They must have an antidote.”

“It’s too dangerous,” Casey said.

“She saved my life. I have to do something. Besides, we can’t just leave her here. If she changes, she could–” His eyes moved around the room, landing on the bin of parts. “I have an idea. STEVE, prime the time machine.”

“Un-un-un- Error. Circuits are busy. Do you w-w-wish to cancel the current job?”

Rick looked flustered for a moment. “Oh. Okay. Right,” he said. He walked around to behind STEVE, opened a different panel, and started rapidly hammering on a keyboard inside.

“What is it?” Casey asked.

Rick kept typing. STEVE’s image vanished for a second then reappeared. “Circuits r-r-ready. Starting time machine warm-up.”

“The professor was a genius,” Rick said. “STEVE is amazing, even by today’s standards. But he’s still an ’80s computer. Single threaded, single tasking. He can only do one thing at a time. But when I rebuilt him I used a modern CPU to run his program in a virtual machine. So I can add a simple task scheduler to run multiple jobs in parallel. It’s a little bit of a kludge, since STEVE’s program doesn’t have any access to the task scheduler, but it should work for now.”

STEVE’s eyes followed Rick closely as he returned to the parts bin and began quickly plugging pieces together. A coil of wire. A large bar magnet. A wah-wah pedal. “What are you doing?” Casey asked.

“I’m going to threaten them,” Rick said. “I’m going to march right into the robot headquarters and make them give me the antidote.”

“I thought you said they took over the whole world,” Daryl said. “You can’t just take them on.”

“Not a lot of choice,” Rick said. He stepped close to Daryl and looked down at Lauren. “I’ve got something they need. Something they’ve waited a long time to get their robot pincer hands on. Hopefully I can make a deal.”

“T-T-Time machine ready,” STEVE chimed.

Casey shook her head. “Don’t do this. It’s too dangerous.”

Rick kissed her cheek. “I have to do this.” She frowned, but looked over to Lauren on the couch and gave a grudging nod.

She slipped off her ring and placed it in the socket on the time machine. Rick did the same. As the time machine started to light up with purple energy, Casey returned her ring to her finger. Rick instead slid his into a clip on the device he’d built and pressed down the pedal. “Fifteen minutes,” he said. “If that’s not enough time…” A quick glance at Lauren confirmed that she was changing rapidly.

Casey struggled to find a response. “Stay safe,” was all she could choke out before a violet ribbon stretched out from the emitter on the time machine to Rick’s ring, whisking him twenty years into the future.

Fiction: SPACOM 3

Colonel St. George rubbed his temples and sighed. “Let’s try this again. Two days ago, you interrupt my lunch to tell me things you shouldn’t have any way of knowing. Then, this morning, you somehow manage to break into one of the best-protected installations on the planet. And you’re telling me that you knew how to do that because of a television show. Have I got that right?”

Zeke laid his head on the table in frustration. He hadn’t expected this to be easy, but plowing on through blind faith wasn’t getting him anywhere. “I get that it sounds dumb,” he said. “But come on. Didn’t this already happen to you guys once?”

St. George shot a glance to Doctor Waller. “Any idea what he’s talking about?” Waller’s shoulders twitched in confusion.

Zeke sat up, processing. “That hasn’t happened yet, has it? Okay. That helps.”

“Now you’re saying you’re from the future?” Waller asked. He’d been playing the “good cop” role so far, but he sounded frustrated. Which was fair, given how long they’d been at this.

“No, definitely not the future,” Zeke said. “I told you. I’m from a parallel universe. Or whatever. I don’t know. I’m not a scientist. Well, I mean, I am, I guess. But not that kind of scientist. The normal kind who doesn’t study wormholes and aliens and parallel universes.”

Waller nodded and sighed. “And in your universe,” he said, almost, but not quite completely suppressing a skeptical tone, “We’re a TV show.”

“That’s creative,” St. George said.

“Ted, you have to admit, some of the things we’ve been through make a lot more sense as ratings stunts,” Waller said. “Like the time-”

St. George silenced him with a glare. “Not in front of the suspected alien agent.”

“See, this is what I mean,” Zeke said. “If I knew exactly where we were in your storyline, I could prove at least some of what I’m saying by predicting the future. But you won’t tell me anything. Do you still have the Klepton truth machine? You could plug me into that and it would tell you that I’m telling the truth.”

Waller shook his head with what looked like genuine sympathy. “There are some forms of mind control that give it false readings. Maybe you really do believe what you’re saying, but you’ve been brainwashed. Or, if you’re telling the truth, how can we know it will even work on someone from your universe? From your perspective, this is all fiction, isn’t it?”

“Again with revealing sensitive information to the weirdo,” St. George said, exasperated.

“Maybe at first, I guess,” Zeke said. “But I’ve been living in a teen drama for two years now. I am totally over any sort of prejudice toward the ontological nature of someone’s plane of existence. You should hear who we elected president.”

“Let’s pretend I’m humoring you,” St. George said. “How did you get here?”

“Car crash,” Zeke said. “Two years ago, I was driving up 40 in a bad storm, and I lost control and went into the guardrail, and when I woke up, I was in a hospital in a small town in Rhode Island surrounded by a cast of quirky, attractive, quick-witted characters that I recognized from the hit basic cable teen drama Sparrow’s Folly. I spent two years trying to figure out a way to get home. I tried interfering. I tried not interfering. I tried just driving back to my own house, and I do not want to talk about how that went. Then, six weeks ago, I tried going skiing. And the ski lift broke and I very nearly died, and now I’m here. Well, a few other places first, but here eventually. I’m simplifying. Fortunately, that whole incident where everyone in Columbus lost three hours was still in the papers, or else I’d never have figured out where we were.”

“And this doesn’t seem a little hard to believe to you?” Waller asked.

“Well sure,” Zeke said. “I realize that the most rational explanation is that none of you are real and this is all a coma dream. But that’s not an actionable hypothesis even if true; I can’t just will myself out of a traumatic brain injury, can I?

“So, assuming this is a real world and I am really doing the things I think I am, I wandered around town until I found that diner where you guys hang out, and when you blew me off, I wandered out into the woods and found the ventilation shaft you used when you needed to sneak the Jindro out of the base. And I was expecting you to catch me right away, but I was hoping I’d be able to dazzle you with my inside knowledge.”

“This was a bad plan,” St. George said, wryly.

“That’s fair,” Zeke said, depressed. “But you must know I’m human by now. You get those Precursor bio-scanners in season three. Can that detect that I’m from a parallel universe? I can’t remember if it ever came up.”

“There is something unusual in your scan,” Waller conceded. “But we don’t know what it means. We’d need to compare it to something that we could confirm was from a different universe.”

Zeke had an idea. “Ooh, what about a portal token? SPACOM 5 could send you one of those.”

St. George and Waller exchanged a long look, silently arguing something. St. George conceded. “SPACOM 5 was lost, presumed KIA. I’m not even going to ask how you know about them.”

Zeke lit up. “You don’t know!” he almost shouted. “That’s it. That’s the thing. I can help you. I need a piece of paper. I hope I remember this.”

Another silent conversation, and Waller slid his notepad across the table. Zeke started writing furiously. “SPACOM 5 is alive. Well, mostly. They’ve probably lost a couple people by now. They got out before the supernova. The Precursor device was a portal into luminous space.”

“Luminous space?” Waller asked.

Zeke kept writing. “It’s a parallel universe. But the usual kind, not a TV show universe. They call it that because the vacuum energy is different so empty space glows and the stars are black. And yes, I know that doesn’t make sense. There’s a running gag where any time someone tries to explain it, they get cut off. Here.”

He pushed the notepad back. Waller studied it. “This is the language of the Precursors,” he said. He pointed to the first line. “This is their name for Earth.”

Zeke nodded, excitedly. “And the second one is the dinosaur planet where you found the weather machine. I think that should be enough for you and Lieutenant French to work out the math. They’re not just names. They’re coordinates. The names tell you where the planet is.”

St. George gave Waller an expectant look. He nodded. “That’s possible. We have some fragments of other Precursor planet names. Samia should be able to work out an algorithm to translate.”

“I want to make a deal,” Zeke said.

“A deal for what?” St. George asked. “And what does this have to do with SPACOM 5?”

He pointed at the third line. “That’s the name of a Precursor outpost. That’s where you find the second portal. The one that lets you contact SPACOM 5. I am just giving that to you, no strings attached. Save you a couple of months, maybe save some lives. You scan a portal token, figure out how to tell if someone is from a parallel universe. Hopefully you start trusting me.”

“What about the deal,” Waller asked.

“I want your help. I want to go home. Or back to Sparrow’s Folly. Or ideally, back and forth to either one whenever I want. Occasional vacations to that kid’s show where everything’s made of candy.”

“Why?” Waller said. Simultaneously, St. George said, “I love that show.”

“Because I know another name. The big one. The Precursor home planet. Look, you guys give all the planets serial numbers and that’s great for you, but I can’t remember a single one of them, so I can’t help you with which ones are good and which ones are bad. But I can remember the ones with names. I can skip you all the way to the end of the series without you spending years wandering around hyperspace looking for clues and accidentally waking up Cthulhu or Space Godzilla. At least one of those happens. Depends on how literal you’re being.”