Blog

What I'm Watching: More of Love Death Robots

Apparently Netflix is doing 4 different ep orders, they say it's completely at random, though some people think it's based on gender, sexuality, age, etc. What horoscope does my robot show order reveal? Humans are idiots.

The Dump: Joe Lansdale story of a weird dump thing, videogamey CGI of of slime & trash, quick and obvious, but amusing. Not shown: Fuel-air bombing of the dump after missing persons are tracked there. ★★★½☆

Shape-Shifters: Military werewolves, realistic CGI, clearly the next Call of Duty game. Too much werewolf dick. The transformed state isn't as convincing as the Human. But not bad at the personalities and how shitty the military is. Author's Marko Kloos, a military fanfic writer. ★★★☆☆

Helping Hand: This is perfectly designed to piss me off (or any educated person). As anyone who's ever seen a spacewalk knows, astronauts don't work without a tether and a tight grip on their ship or station. It just does not happen. That was bullshit in Gravity, with idiots flying around on 5-minutes-of-fuel maneuvering packs that haven't been used since the '80s, and it's bullshit here, too. Dumb astronaut—again like Gravity a woman, which is so insulting to Peggy Whitson and other skilled woman astronauts—is knocked off station by space junk. I don't buy a cheap company sending out a lone astronaut, either: Launch cost for an extra body isn't much compared to a whole ship. And then her first solution is dumb, maybe 1kg of reaction mass thrown half-assed overhand won't move a 50kg body anywhere. Her second solution is even dumber—in reality, heat radiates away from a body very poorly in a vacuum. THAT'S HOW A THERMOS WORKS! YOU INCOMPETENT FUCK WRITER! Vacuum of space will chill you eventually, especially if you touch cold metal or regolith, but a floating body won't freeze solid for days. ☆☆☆☆☆ Claudine Griggs, hack "sexual politics" writer, I hate you and want you to get an education and then die of shame at your stupidity.

Fish Night: Interesting look, motion-captured CGI but so cel-shaded it looks hand-drawn. Probably took 10x as much time and money as simple rotoscoping and hand-drawing would've. Alas, I care nothing for the characters or the situation. Stop talking and start doing. Hunter & Dr Gonzo had "The drugs took hold around Barstow, on the edge of the desert", too, but then they did shit. Supposedly another Joe Lansdale story, but it's just nothing but a screensaver. ★★☆☆☆

Lucky 13: More Call of Duty, now in a space dropship but carrying Marines to terraforming stations on some planet. And the writer keeps calling the Marines "Soldiers" which at least modern ones don't like much. Love affair of a pilot and her dropship (AI? Maybe. It never speaks, but gets a camera POV.) is nice, and the dogfight videogame sequences are fine. It's not clear who the enemy are supposed to be, they're just as well-equipped, so are they a rival nation of Humans? Why would anyone bother shipping military to space to fight over an uninhabitable rock? Stupid premise, unexamined. Author's Marko Kloos again. ★★★☆☆

Zima Blue: Another Alastair Reynolds adaptation! Perfectly animated and told. The joke of Zima the beverage is a little weird against a serious story. The theme of transforming and abandoning unneeded complications is done several times in Reynolds (Diamond Dogs is another), but here is the best of those. ★★★★★

Blindspot: Mad Max/Jayce and the Wheeled Warriors/GI Joe do a train job with no planning, and get hosed down amusingly for it. All the nonsensical robot-on-robot violence we grew up with, but more swearing. Fuck yeah! Vitaly Shushko makes more of these ridiculous animations, too. ★★★★☆

Ice Age: A very light microscopic civilization take by Michael Swanwick (Vacuum Flowers!). Almost too silly to publish, the characters are utterly passive, but cute graphics for the micros. ★★★☆☆

Alternate Histories: Multiple ways for Hitler to die and consequences. Trivial, and I hate the stick-figure art, but amusing. Surprisingly by John Scalzi, who managed to make several actual jokes in a row! Maybe he wrote this before the brain injury that made him a humorless Internet troll. But it's about Nazis, so it gets no score according to Godwin's Law. He should have done the Lincoln one instead.

The Secret War: More Call of Duty with Soviets in fur coats in the snow during WWII, hunting monsters. And a story of making monsters, and the futility of being right in the Soviet Union. The monsters look like crap, almost literally, like the Xen in Half-Life. Written by David W. Amendola, another military fiction/horror writer. ★★★☆☆

Fin and Philosophy

And that's it for this season! More dumb combat and horror than robots in this half, and I do not appreciate that.

When I say "Call of Duty", that's not a compliment, I think the lowest form of Human slime make and play these mass murder simulators, and stories which are just "then I shoot everything wooo!" are by and for morons.

I have no objection to monster-killing if it illuminates something in a story, or in games if it's a drain on strategic resources (tactical RPGs with HP, MP, and gear to keep an eye on, and that's why my games are bright and happy AND bone-crushingly hard), but otherwise you leave those monsters alone, it's their world and you're just a morsel in it. Compare especially Beyond the Aquila Rift, where there are no "monsters" but these Call of Duty fuckheads would see one.

Total ratings are not bad, Scalzi and that incompetent Hand ep are all that's really bringing it down, but that glut of mediocre military content is hard to wade thru.

☆☆☆☆☆ 2
★☆☆☆☆ 1
★★☆☆☆ 1
★★★☆☆ 7
★★★★☆ 5
★★★★★ 2

What I'm Watching: Love Death Robots

Anthology series of adult SF cartoons, produced by David Fincher and Tim Miller (Deadpool director). Which is like Netflix said "hey, Mark, we made a thing exactly for you!" I <3 you too, Netflix!

18 episodes, I watched 8 so far, will see the rest next binge.

Sonnie's Edge: I instantly recognized this, but couldn't place it—how could I have seen it already? Impossible! Turns out it's adapted from a short story in Peter F. Hamilton's A Second Chance at Eden. What's weird is I remember it visually, where most of my SF reading I remember as text/lore with a few mental illustrations. Nicely animated 3D, a little bit videogamey and exaggerated. I already knew the twist but I don't think it's hard to figure out. ★★★★★

Three Robots: Walker, tiny walker, and weird pyramid robot explore a ruined city and talk too much. Despite withering contempt for Humans (which is entirely deserved), they don't have enough intelligence to avoid a trap. Meh, I don't like cats much, but people infected with Toxoplasma gondii will find this hilarious. CGI is adequate. Ah, it's a short story by John Scalzi, "Three Robots Experience Objects Left Behind from the Era of Humans for the First Time", which is why it feels like obvious jokes driven into the ground by a humorless boot. ★★★☆☆

The Witness: Rear Window/Run Lola Run with a stripper. Characters look like painted dolls, unfocused "camera" like an Italian giallo flick. Striptease could be erotic if they weren't so toy-like. Neatly tied up plot, nonsense surrealism but I like it. Alberto Mielgo has a number of other good animations and paintings. ★★★★½

Suits: Farmers in mecha fighting bugs. Weird 3D with cel-shading to look like a cartoon or plastic toys. This is pretty much daily life in Rifts, they even call the bugs "DeeBees" (dimensional beings in Rifts, no definition given here but maybe Damn Bugs?). Decent combat story, a little personality for the farmers, but not deep. ★★★½☆

Sucker of Souls: Archaeology/adventurer team explore a tomb and are not alone. Hand-animated mostly, I think they had to have traced over 3D in several places. Very aesthetically similar to Castlevania. Not much plot, and no chance of further adventures, but I like the team. Written by Kirsten Cross, who writes hack military-horror shovelware books; short form clearly suits her "talents" better. ★★★★☆

When the Yogurt[sic] Took Over: John Scalzi's shitty parody knockoff of Greg Bear's superb Blood Music, adapted into weird stick-figure and frizzy-hair CGI blobs, narrated ("tell, don't show") by The Brain^W Maurice LaMarche. Sadly no relation to The Stuff, which had a better plot, actors, and special effects. Fucking awful, everyone involved should be drowned in yoghurt. ★☆☆☆☆

Beyond the Aquila Rift: Short story from Alastair Reynolds! Spaceship has a bad wormhole jump/technobabble, ends up somewhere wrong, greeted by a person who shouldn't be there. Music is excessively on-the-nose. CGI is detailed but videogamey, and the space scenes look right out of some space shooter. ★★★★☆

Good Hunting: An evil man and his stupid son hunt a beautiful Hulijing (Chinese Kitsune), tragedy ensues. Then becomes a weird steampunk thing in Hong Kong. Then a superhero origin story? Hand-animated, good fighting motion, but very flat, I don't like the style. Based on a short story by Ken Liu ★★★☆☆

Guardians of the Galaxy 3

Hell yeah. I grew up with some of my favorite comics being ROM Spaceknight, Nova, Rocket Raccoon, Adam Warlock (in Marvel Presents, I think?), and so on… the Marvel space series were so much better than their ground superheroes. While the films are a little trashy, they're fun trash, and the music was just awesome.

But then some Nazis doxxed Gunn and Disney was like "I'm shocked, shocked I say, to discover that the writer of Tromeo & Juliet makes dirty jokes!", but happily have seen sense since everyone involved wanted him back.

So here's the music again:

Return of the Objective-C Jedi

[[[ These ]]] are your father's square brackets, the weapons of a Jedi Knight.
Not as clumsy or random as C++.
Elegant weapons for a more civilized age.

What's Different in Mulle-ObjC

This is like Objective-C circa 2010(?), good but not fully baked. Far better than circa 1986-2009, when it was a very thin translation layer over C.

  • No ARC (Automatic Reference Counting). This is just invisible sugar to hide retain/release/autorelease, and while ARC's convenient, it's trivial if you actually know how reference counting works. Don't really miss it.
  • No dot property syntax. [[myObj name] length] instead of myObj.name.length, and [myObj setName:newName] instead of myObj.name = newName. I can live with it, but I really did like dot syntax, even if it does "overload" the . operator and hide the distinction between methods and variables.
    • When dot syntax came out, Objective-C nerds came close to fistfights over this. You would not believe the venom some people had for it. Most of those nerds died or quit or got old & tired before fucking Swift came around, I guess.
  • No array syntax. [myList objectAtIndex:i] instead of myList[i]. This is a pain in the ass, I'll have to write some shorthand macros (or rather, go dig them out of my very oldest code).
  • No blocks. This one hurts, but it's a reasonable pick-your-battles decision. Classic: Write a method, dispatch to it, and call back success somehow. Blocks: create a weakSelf reference, enclose it, search-replace self in your block, pick one of a half-dozen complex GCD methods, get a memory leak because you retained something across the block boundary. This is annoying but logically simpler:
    [self performSelectorInBackground:@selector(computeData) withObject:inputData];
    
    - (void)computeData:(id)inputData {
        // create outputData
        [self setOutputData:outputData];
        [[NSNotificationCenter defaultCenter] postNotification:NOTI_DataComputed];
    }
    
  • Has object literals: @42 and @(var) create an NSNumber, @[] creates an NSArray, @{} creates an NSDictionary; dicts use key:value order, not the reverse order used in -[NSDictionary dictionaryWithObjectsAndKeys:], and array and dicts don't need a trailing nil, which was a constant source of mystifying bugs back in the day. Big win!
    • Hmn, crashes if you do something janky like [@[] mutableCopy]: mulle_objc_universe 0x1006adef0 fatal: unknown method 5e1b0403 "-getObjects:range:" in class 7aa0d636 "_MulleObjCEmptyArray"
  • Has for (id x in container) loops, using NSFastEnumeration. The 1.0 process of looping enumerations was awful, so this is very nice.
  • Huh, does have @autoreleasepool, so maybe I should use that instead of NSAutoreleasePool like a caveman? It compiles and seems to work.
  • Properties have properties assign/retain nonatomic/atomic nonnullable readonly, default is assign nonatomic, no "nullable" or "readwrite" flags needed. As it should be.
  • Weird isa define instead of pointer: blog post

TODO

  • I haven't set up an NSRunLoop or the equivalent of NSApplication (which is in AppKit, not Foundation), need to do that and then I'll have a working app template.

Writing Objective-C with Mulle-Objc

mkdir CLICalc
cd CLICalc
mulle-sde init -m foundation/objc-developer executable

This takes more or less forever.

… Still going. OK, finally done. I hate to think it's gonna do that every new project? Or whenever it updates?

Anyway, bbedit . (fuck Xcode), and add at the bottom of import.h and import-private.h:

#import <Foundation/Foundation.h>

Make src/main.m useful:

// main.m
#import "import-private.h"
#import "CLICalc.h"

int main(int argc, char *argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    CLICalc *calc = [[CLICalc alloc] init];
    [calc push:42.0];
    [calc push:69.0];
    double a = [calc pop];
    double b = [calc pop];
    NSLog(@"a=%f, b=%f", a, b);

    [pool release];
    return 0;
}

Create an Objective-C class, src/CLICalc.h:

// CLICalc.h
#import "import-private.h"

@interface CLICalc : NSObject

@property (retain) NSMutableArray *stack;

- (void)push:(double)n;
- (double)pop;

@end

and src/CLICalc.m:

// CLICalc.m
#import "CLICalc.h"

@implementation CLICalc

@synthesize stack = _stack;

- (id)init {
    self = [super init];
    _stack = [[NSMutableArray alloc] init];
    return self;
}

- (void)dealloc {
    NSLog(@"CLICalc dealloc");
    [_stack release];
    [super dealloc];
}

- (void)push:(double)n {
    [_stack addObject:@(n)];
}

- (double)pop {
    if ( ! [_stack count]) {
        // ERROR: stack underflow
        return 0.0;
    }
    double n = [[_stack lastObject] doubleValue];
    [_stack removeLastObject];
    return n;
}

@end

Doing that without a template was a little hard on the old memory, and I had to use DDG to look up some method names without autocompletion. But I'm pretty sure that's fine.

In mulle-ide, type update to add the new class to cmake: If you look in cmake/_Sources.cmake you should now see CLICalc.m listed.

Now craft to compile. You'll get a spew of crap, but hopefully no errors.

I am getting this, which I can't resolve:

/Users/mdh/Code/CodeMac/CLICalc/src/main.m:21:55: warning: 'NSAutoreleasePool'
      may not respond to 'init'
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
                                   ~~~~~~~~~~~~~~~~~~~~~~~~~ ^
1 warning generated.

But NSAutoreleasePool certainly has init, and it seems to not die?

% ./build/Debug/CLICalc
a=69.000000, b=42.000000

Hooray!

Yeah, this isn't amazing. Except: It's supposedly portable now. I can maybe rebuild this on Linux, or Windows? I dunno.

This is almost classic Objective-C, slightly enhanced from 1.0: We didn't have property/synthesize, or nice object wrappers like @() when I were a lad. I typed so many [NSNumber numberWithInteger:n]. So get used to the retain/release/autorelease dance. There's no dot-syntax for property access, type them [] like old-school. But hey, it's a proper compiled language with a nice object system and no GC pausing.

I tried importing Cocoa and got a ludicrous spew of errors, so Mac GUI is gonna be a challenge. But I could import SDL and use that for portable UI, since Objective-C is just C.

Sweet. I'll finish up the calculator's parser in a bit, but then see about doing something useful in it.

Interactive Python IDLE

When using Python from a shell, the REPL is fairly awful and doesn't let you copy-paste or save, except through the shell itself. I especially find that copy-pasting functions in is error-prone. There's a nice interactive environment for Python called IDLE (after Eric ): It's probably an application in your /Applications/Python 3.7 folder, or whatever other OS's do, or can be run with IDLE3 from the shell. Other than using ^N/^P for next/previous history line, it works pretty much exactly as you'd expect a GUI REPL to work, and lets you save your session as a text file, easy to extract some functions from later or use as a doctest.

Trouble is, IDLE doesn't automatically pick up the ~/.pystartup script; I had to remember to call it with IDLE3 -s, and there's no easy way to do that from the desktop, where I'm often lazily clicking. This has been frustrating me very slightly for years.

So: open Automator, new Document, add Utilities/Run Shell Script, and paste in:

IDLE3 -s

Save as an Application, name it IdleStart. The icon's ugly and generic, so I made a half-assed icon, copy it from an image editor or Preview, and paste into the icon in Get Info on the application.

python-foot

Now I have a nice stupid foot to click on, and get a proper REPL. The running program has a hideous 16x16 or 32x32 icon scaled up, which I don't think I can easily solve; I looked at the idlelib source and while I could patch it, it's not easily configured. Maybe later. There's also no way to specify the window location, which I'd like to have mid-left of my screen, but again, maybe later.

While I'm at it, the themes are garish, and the customizer is unpleasant. So I just edited this in ~/.idlerc/config-highlight.cfg, then picked Mark's Dark theme:

[Mark's Dark]
normal-foreground = #eeeeee
normal-background = #111111
keyword-foreground = #ff8000
keyword-background = #111111
builtin-foreground = #0099ff
builtin-background = #111111
comment-foreground = #dd0000
comment-background = #111111
string-foreground = #80ffdd
string-background = #111111
definition-foreground = #80ff80
definition-background = #111111
hilite-foreground = #ffffff
hilite-background = #808080
break-foreground = #ffffff
break-background = #808000
hit-foreground = #002040
hit-background = #ffffff
error-foreground = #ffffff
error-background = #cc6666
cursor-foreground = #ffffff
stdout-foreground = #ccddff
stdout-background = #111111
stderr-foreground = #ffbbbb
stderr-background = #111111
console-foreground = #ff4444
console-background = #111111
context-foreground = #ffffff
context-background = #444444

My current ~/.pystartup is short (in python2 it was much longer, since nothing worked right), just some common imports and functions I use enough to miss:

import os, sys
import math
import random as R
import re
import time
import turtle as T

def dice(n, s):
    t = 0
    for i in range(n):
        t += R.randint(1, s)
    return t

def roundup(n):
    return math.floor(n+0.5)

def sign(i):
    if i > 0: return 1
    elif i == 0: return 0
    return -1

print("READY")

Now if I click the foot and see "READY" above >>>, it's all working.

What I'm Not Watching: Umbrella Academy

Trying to watch Umbrella Academy, and it is so slow. The assassins are more fun than the "family", and they're in maybe 5 minutes per ep.

Two of the siblings are absolute monsters who should be drowned; exiling the tiny-headed gorilla to the Moon to fill sandbags until he dies was a good plan, but letting the two-faced mindbender, low-rent Kilgrave ripoff that she is, walk around loose and unmuzzled is just stupid. Doesn't help that I find both their actors/walking meatsticks stiff and incompetent, very obviously hitting marks and reading lines on a stage. Fire whoever hired these assholes.

Of the actual actors, Diego's an acceptable Daredevil/Batman/Punisher ripoff, but nothing new at all. The junkie necromancer would be fun, but played so broad and silly he's completely out of place in grimdark brooding land. "I waxed my ass with pudding!" is not a thing junkies say, dumbass writer. Normal girl who actually plays violin and writes is the only person in the family and she's beat down and useless; and Ellen Page has aged into a mousy little thing. Number Five is good, fucked up but interesting; that's the only positive reason to keep watching.

This bullshit of a CGI/robot ape butler and "mom" in an otherwise modern-tech universe is infuriating. If "dad" had AI and robotics that look exactly like real people or CGI animals, then he was already a superhero, didn't need six superhero kids. The entire world would be very different. It's like the Stepford Wives: You can solve world labor problems, bring about total prosperity and leisure for everyone… you use it to make one robot slave woman and keep going to bullshit job. Unsurprising, then, that the time traveller's "woman" isn't real, either.

And there's 37 other superheroes out there supposedly, zero mention of them by ep 3.

I'd like to see more of the time travel plot, and the assassins, but I don't think I can sit thru these fuckers whining at each other for hours.

★★☆☆☆

Mapping AnotherEden

I'm finally nearing the end of the 1st season main story; I have a boss in the Dimensional Vortex to fight (which I think I should level for), and what appears to be another chapter after that, probably a final dungeon & boss. My party's exhausted, beat down from so many magic-only enemies. Is it too much to want some simple foes Lokido can punch to death?

I played through Lokido's story quests, and… uh, I'm very surprised at a Japanese game handling this subject even remotely well. Lokido's rapidly become my favorite PC for story and smashing heads.

But in the mean time, there's an event! Update, head to Unigan's west gate, and start the quest, and you'll soon get Dierdre as a loaner char; once you finish a short quest she'll be a permanent PC. She's currently a ★★☆☆, but as you complete quest objectives she'll unlock 3-4. And there's a new dungeon with a material giving rewards for how much you collect; I think if you collect the quest, it won't be time-limited, but that's not clear, so I'm going to grind it to completion as fast as I can.

One thing that's been on my mind is the need to map. Early on, every dungeon is linear, super obvious, and generally has 2-4 areas before the boss. Later, there's backtracking, side areas with high-level horrors, switches and chemical triggers… So I'm back to mapping like it's 1984! Well, sort of. Graph paper's unnecessary for this, so I just make line graphs in my notebook, stairs (!, v, ^) are numbered by floor they go to, * is a sparkly, $ is a treasure chest, < is a horror, ? is an area I haven't done yet (spoilers for the Dimensional Vortex):

And I'm starting to make a levelling guide for my own use, just a list of areas with level of monsters & horrors. Then when I have another fresh summon, I can just drag them through slightly-harder areas with a healer to keep them alive, and be up to full level in minimal time.

Pulled a couple more times, got some perfectly nice ★★★★ chars and many junkers, but nothing I really needed, except an upgrade to Ciel. Been grinding Another Dungeon whenever I have time, and got tomes for a bunch of classes I don't have, and 1 book for Rakshasa, so I could have a ★★★★ frog samurai if I wanted… I'll hold off on that. I want to upgrade Riica and Amy (and once I finish the main story, Feinne) first; Aldo and Cyrus do nothing that a non-party char can't do better. There's just a stupid number of these ★★★ junk chars, I wish they were good for something; if they had story quests, or anything. I can level them for chrono stones, that's about it.

I'm still enamored of this game's scenery & music, and good hard crunchy turn-based combat. I can nuke most bosses long before they even hurt me, because I level, gear up, and prepare for their weaknesses and attacks. Filling in the last few items in the store can be a pain, though: Grind an area, get 3/5 of the mats I need for one thing. Go back tomorrow.

Buncha spoilery screenshots: