What I'm Watching: Star Wars the Last Jedi

In the "that took a long time" category, I finally hit play on SWTLJ in my Netflix queue. I've been disappointed in all the new ones, so I didn't expect to like this. I'm drinking cheap wine and not in a great mood, perfect.

SPOILING THE ENTIRE MOVIE STOP DO NOT CONTINUE UNLESS YOU DON'T CARE, WHICH IS TOTALLY REASONABLE. THIS SUCKS

Holy shit this starts dumb, with Poe crank-calling Hux. I thought that was a joke meme, but no, it's actually a scene with "Admiral Hugs" and "your mother" jokes. The single fighter vs giant starship point defenses thing is nonsense especially since they should have learned since the Death Star. The bombers have really shitty fire control systems, and then somehow are gravity-fed. In space. They're not missiles, they're "bombs" which drop "down". What is down? So stupid.

Old Man Luke is annoying, but he's doing the Yoda thing, so annoying is in character for once. That's the only plot- and character-consistent thing I see in this shitshow.

Drinking intensifies.

The long tail chase with the few Resistance and First Order ships, and the centralized command system they use where one shot can behead the fleet, is so stupid. Scatter the ships to the wind, with randomized meetup locations, and no amount of tracking will help. Everyone in here is an idiot; Finn's attempt to flee is the only sign of sanity.

Now let's zoom off to a sidequest at a casino, like I do in JRPGs; sure, sure, fate of the world, first I have to race and breed Chocobos. The casino should be fun, altho it looks too much like a modern Vegas casino. Instead it's preachy because Rose hates fun. Also there's no way these scruffy degenerates get into a classy casino with a dress code. Also nobody in this will be implanted with Ovion eggs, or have Cait Sith join their party, which is what they deserve.

The endless "psychic phone calls" between Rey and Kylo are like a teenage soap opera, and the low-tech camera cutting is awful. Can't be bothered to even project force ghosts in the scene? Actually, now that I think of it, there are very few scene wipes for transitions in this, which is why it feels so jarring. It's all hard cuts with no context. The director's incompetent.

Burning down the Jedi "library" is typically ham-fisted metaphor for Disney Star Wars burning all the Expanded Universe and classic Star Wars. They don't care, and the callow youts of today aren't capable of reading. Yoda drones on and on, which is not at all Yoda-like, but the writer's a moron and doesn't know or care.

The mutiny is terribly executed. Admiral Bligh, er, Holdo is incompetent, but Poe has no idea how to use handcuffs or a brig? Abandoning warships so you can hide, when the First Order fleet still has scanners, is moronic. Instead of all but 6 ships exploding, it really should be all.

Drinking intensifies.

Snoke's always been a bad ripoff of the Emperor, but at least the hologram in The Force Awakens left the possibility he'd be 1m like Yoda; nope, he's human-sized, and basically parrots the Emperor's lines from Return of the Jedi. The duel in the throne room isn't bad, not amazing but the only good, Star Wars-like content in this film so far.

The only characters with any chemistry in the entire movie are Poe and BB-8. In The Force Awakens, it looked like Poe and Finn were gonna hump right on camera; they barely look at each other here. Rose tries to pull off a relationship with Finn, but it's not there.

I look back at Star Wars, and the love quadrangle between Luke, Leia, Han, and Chewie was amazing. They were junkies hooked on each other. Leia and Luke only meet once in this movie and it's a quick, tired goodbye. Chewie has some cameos (and a bizarre infestation of CGI animals) but is never around Leia, and then vanishes. R2-D2 and C-3PO also get one line together.

The CGI animals and rocks in multiple scenes are so awful, they make Lucas' "special editions" look tasteful. This isn't quite Star Wars Rebels level of shitty cartoon CGI, but it's bad, very inappropriate.

Luke's death is pointless, repetitive of Kenobi's duel with Vader, because the moron writer can't write anything new, only recycle. The Just For Men beard before that is preposterous, though (worse than fake-young CLU in TRON: Legacy, which at least A) was set in a videogame, and B) is a vastly better film than this).

I knew going in that this would be bad, Extruded Star Wars-Like Product, but holy fuck. It's one of the worst-written, worst-acted things I've seen in forever.

In The Last Star Wars Movie, I suggested terminating the franchise, but still ranked TLJ above the Prequels-Which-Don't-Exist. I may have overestimated this trash.

★☆☆☆☆ and may the Force not ever be with you, Rian Johnson.

Julia

Interesting language, originally a math/statistics package but now as general-purpose as any lang. More or less Pythonic, though it has some type-annotation stuff, and heavily-optimized Julia looks like a mess of annotations with your code buried somewhere inside.

The Mac version comes as a dmg with an app (which I'd prefer for easy install/uninstall), or brew (which I prefer not to use). The app just launches a single command in a new Terminal window; add that path/bin to the PATH in your .profile, e.g.:

export JULIA_HOME="$HOME/Applications/Julia-1.0.app/Contents/Resources/julia"
export MANPATH="$MANPATH:$JULIA_HOME/share/man"
export PATH="$PATH:$JULIA_HOME/bin"

And now in Terminal:

% echo 'println("Hello, world!")' >hello.jl
% julia hello.jl
Hello, world!

The only way I can see to make it compile to a binary is embedding, and I'm not clear on how you package that with a full Julia distribution yet. That's unfortunate. I like REPL workflows as much as anyone, but binaries are what "normal" people run.

Getting Started

<voice tone="excessively chipper"> Let's read the manual! </voice>

Syntax is nicer than usual: function/end, if/elseif/else/end, for/end, while/end, begin/end, let/end, which beats the hell out of Python's def, if/elif/else; to say nothing of abominations like Swift's "func". No do/while loop, which is annoying especially for file processing, but I suspect that can be fixed with macros.

There's a lot of ways to write functions, which is nice but allows some ugly choices. Anonymous functions are x->x^2 or function(x) x^2 end; named functions can just be assigned f(x)=x^2 or written in full:

function f(x)
    return x^2
end

Whitespace is not significant, and indentation is not enforced, which is a major bummer for style-enforcing-structure, but I'm sure sloppy jerks will love that.

You can use tuples for multiple returns, or as ad-hoc structures:

> point(x, y) = (x=x, y=y)
point (generic function with 1 method)
> p = point(13, 2)
(x = 13, y = 2)
> a, b = p
(x = 13, y = 2)
> a
13

It's pass-by-reference, not copying, so be careful with mutable data.

My only real kvetch so far is that arrays are 1-indexed and column-major, like FORTRAN, not 0-indexed and row-major, like C. For a numeric package, that makes sense, but for other programming tasks it's frustrating and error-prone, see EWD 831.

This is a functional language, and there are no classes/inheritance/methods, however "methods" are functions which are overloaded based on types, and can be used like class methods:

> quack(x::Int64) = "int $x"
> quack(x::Float64) = "float $x"
> quack(1)
"int 1"
> quack(6.66)
"float 6.66"

As well, you can use closures to make pseudo-classes, the same way you do in Scheme:

let state = 0
    global counter() = (state += 1)
    global counterReset() = (state = 0)
end

struct (immutable) and mutable struct make "Composite types", and can make objects the usual way:

struct Point
    x
    y
end
pointDist(p::Point) = sqrt(p.x^2 + p.y^2)
Base.show(io::IO, p::Point) = print(io, "{$(p.x),$(p.y)}")

> p = Point(6, 6)
{6,6}
> pointDist(p)
8.48528137423857

The default constructor can be overridden at the end of the field list, it's defined as Point(x,y) = new(x,y). The "toString" equivalent there is ugly as hell, but there's a ton of options for overloading it by type of output.

There's a lot of fucking around with generics and strong typing (for weak minds), but ignore all that crap.

Interfaces are a somewhat messy use of several methods to create pseudo-types; define the basic interface methods for your type, and most things calling those interface methods will work. So, a couple iter() functions and you have an iterable, and so on. This would work much better if Julia had an actual OOP class system and real interfaces, but Python half-asses interfaces the same way and aside from being 1000x slower than you'd like, it gets by.

Quickly skimming modules, seems pretty standard import mechanism, but I don't see any way to make something private. OK, I'm bored of reading docs. Let's do something. Something semi-practical here, my standard RPN calculator, one command per line.

Docs/libraries are kind of a mess, Vector is discussed in Base.Arrays, push!/pop! methods are discussed in Collections (an interface). parse is under Numbers, not Strings, as one might expect.

eof() does the extremely unfortunate thing of blocking for input, so it's utterly useless in a main interactive loop.

… About 30 minutes later, I have a working, final version. Well, that was pretty easy, and it's a clean implementation, other than the interactive loop.

Next time I open this, I'll put it in a module, and tokenize the line instead of requiring just one token per line, and have some command-line argument to suppress help and prompts.

I should also investigate IJulia which is a Jupyter notebook, which seems like the "expected" way to make it interactive and handle graphics or media.

RPNCalc.jl

#!/usr/bin/env julia
# RPNCalc.jl
# Copyright ©2018 by Mark Damon Hughes. All Rights Reserved.

stack = Vector()

function checkStack(n)
    if length(stack) < n
        error("Stack underflow: Needs $n values")
    end
end

function parseLine(s)
    s = strip(s)
    if s == "+"
        checkStack(2)
        b = pop!(stack); a = pop!(stack)
        push!(stack, a + b)
    elseif s == "-"
        checkStack(2)
        b = pop!(stack); a = pop!(stack)
        push!(stack, a - b)
    elseif s == "*"
        checkStack(2)
        b = pop!(stack); a = pop!(stack)
        push!(stack, a * b)
    elseif s == "/"
        checkStack(2)
        b = pop!(stack); a = pop!(stack)
        push!(stack, a / b)
    elseif s == "="
        checkStack(1)
        println(stack[end])
    else
        push!(stack, parse(Float64, s) )
    end
end

function main()
    println("RPN Calc: Type numbers or operators (+, -, *, /) one at a time, = to show top of the stack, ^D to end.")
    while true
        print("> "); flush(stdout)
        s = readline(stdin, keep=true)
        if s == ""
            println("Goodbye")
            break
        end
        try
            parseLine(s)
        catch e
            println(e.msg)
        end
    end
end

main()

Beyond Cyberpunk Web Design

What I want to note here is the UI in the original BCP and Billy's app. Borders filled with wiring and lights. Knobs and switches. Big chunky click areas. Punk rock, graffiti art. When you click things, audio and animations tell you something happened. Not so much the "Jacking into the Matrix. Into the FUTURE!" clip.

It's much easier to find and read information in the web version, but it's not fun. It's ugly and boring. Like almost everything on the web and apps these days, from Jony IVE-1138's sterile white room prisons where you're tortured for daring to have a personality, to all these endless linkblogs.

There are places with personality, but not many. The web looks like shit. Update: Brutalist Websites has some GeoCities-like aesthetics in a few. Others are sterile voids.

And that's bothering me about this blog. It looks OK, the stolen Midgar art and my '80s neon colors set some kind of tone, but it can be so much more. So in the weeks and months to come, I'm gonna be doing some redesign, make this into something weirder, if not full-on GeoCities. The RSS feed should be uninterrupted, but I'm going to put a lot more resources on the front page.

Liberation in Art but not in Your Stupid Life: 2112, Real Genius, TRON, and Ready Player One

In which art is not blamed for the problems of the world:

2112

A man in a controlled, music-less dystopia finds a guitar, learns to play, and feels joy. The priests of Syrinx who rule the system in the name of "average" (a la Harrison Bergeron) crush him. The ancients of rock who created the guitar return and liberate the system with a prog rock concert.

Our world could use this beauty
Just think what we might do
Listen to my music
And hear what it can do
There's something here that's as strong as life
I know that it will reach you

Don't annoy us further!
Oh, we have our work to do
Just think about the average
What use have they for you?
Another toy that helped destroy
The elder race of man
Forget about your silly whim
It doesn't fit the plan!

TRON

A game designer dude lives in exile above his arcade, robbed by evil AI & corporate suit. His ex and her dork boyfriend let him into the building, and he goes into the computer world, which the evil AI & corporate suit rule as well. The ancient soul of the machine gives the dork's program access and lets it play Breakout against the AI, and the game designer sacrifices himself, liberating the inner world, deleting the evil AI & firing the corporate suit, restoring the game designer to power in the real world.

Greetings, programs!

Real Genius

A too-young, too-uptight student works for an evil professor, but makes friends with other weirdo students and loosens up. The evil professor and the military trick the weirdos and make a death ray from their work. The ancient student in the closet emerges and the weirdos hack the death ray and turn the evil professor's house into popcorn.

All for freedom and for pleasure
Nothing ever lasts forever
Everybody wants to rule the world

Ready Player One

A boy in a crapsack world, literally in a trailer home on top of trailer homes, finds solace in ancient movies and games from a book by an ancient nerd. The corporation which rules the world and the virtual world crushes him and his friends. The ancient nerd's program runs, and gives the boy power and he liberates the virtual world and the real one.

After a long silence she asked, "So what happens now?"

Just Stories

These stories, they're just stories of their time.

2112 didn't end the "Moral Majority" or censors. The PMRC of Syrinx was founded 6 years later to destroy rock 'n roll and rap; the PMRC is gone but Tipper Gore still lives and hates, and music is still censored; remember Fuck You, by CeeLo Green? You probably only heard the censored radio version "Forget You".

TRON didn't end centralized computing, AI, or thieving corporate assholes. Today EA has ruined large gaming, and Google & Amazon make AIs that will probably kill us all.

Real Genius didn't end all CIA/military weapons. Today the babykillers have unmanned drones that can fly anywhere and assassinate anyone (and any bystanders/witnesses).

Ready Player One didn't make the real Internet a "safe space". Facebook, Twitter, or Google can still track you, filter what you see, and give Nazis access to harass you.

This is not a failing of art, it exists for fun or catharsis, and to give you coping strategies. It is not a magic spell to fix everything.

So, you can do something inspired by art; make art yourself; or, if you are completely useless, just whine unreasonably about art and be held in contempt.

TBL Has Some Regrets

"We demonstrated that the Web had failed instead of served humanity, as it was supposed to have done, and failed in many places … [increasing centralization of the Web] ended up producing—with no deliberate action of the people who designed the platform—a large-scale emergent phenomenon which is anti-human."
"While the problems facing the web are complex and large, I think we should see them as bugs: problems with existing code and software systems that have been created by people—and can be fixed by people."
"You don’t have to have any coding skills. You just have to have a heart to decide enough is enough. Get out your Magic Marker and your signboard and your broomstick. And go out on the streets."
Tim Berners-Lee, Vanity Fair

On the contrary, Tim, the World Wide Web is very human, and these are not "bugs" or "emergent": It's not a perfect crystalline utopia inhabited by rule-following robots reading RDF tags, but instead it's like an organically grown city, with a mix of lovely things and nice people, and also back alleys and skyscraper offices full of predators. There's surveillance systems everywhere because the predators wanted surveillance, paid engineers well to make them, and it's much harder to stop Internet surveillance than spray-painting a closed-circuit camera.

The Internet didn't create spies, tyrants, or marketing scumbags; the Stasi managed to spy on everyone, and they barely used the few shitty Soviet computers they had. Madison Avenue invented scumbag marketing long before they had "data" supporting their psychological manipulations. Of course now the same kind of villains at the NSA, KGB (FSV & SVR these days, same thing), and Facebook are going to use modern computer networks to spy and manipulate. A poster-board sign isn't going to convince them to stop.

"Oh gosh I just realized I've spent my life deceiving people, and that's wrong!", said absolutely no spy ever. (The Spy Who Came in from the Cold is fiction)

Getting more people connected is somewhat positive and empowering for the "last billion"; although you, presumably fellow first-world libertarian/liberal/con-but-not-an-asshole-servative reader, may well not like the political and religious programming the last billion have…

But even if everyone has a computer & unfettered Internet access, it's not going to make everyone freer, they're just more entries in Facebook's databases. The only cheap mobile phones are Android, which is run by and for the benefit of Google's surveillance systems. You can release any kind of utopian decentralized system, and people will say "I want Facebook and Youtube… and what are ads?" and many will end up in it by social pressure and marketing.

Some of us do what we can to exist outside of those networks, but don't get too idealistic about it, or you end up crazy or yet another dead martyr.

Cyberpunks or Just Punks?

It's not that I don't like Neuromancer, it might be in my top 10 favorite books (but more towards the bottom of that list), but every time I see it mentioned as the "seminal cyberpunk epic", I roll my eyes, because I know these people have never read another cyberpunk book, there were others before Neuromancer and long after.

So educate yourself, make yourself less eye-rolling to me. Here's a little tiny reading list. When you're done with that, hit the KUOI archive on the right, find my Cyberpunk page, work through that. Or maybe I'll pull it out of archive and update it by then? There's a lot in the last 10-15 years since I touched the page.

First:

Then:

WWDC 2018 Predictions

Opening Video: Emotional music. Mortuary full of coffins. Crying mourners. THEN! Light shines from one casket after another: iDeath! The iPhone app that live-streams to and from inside your casket so your loved ones never have to let you go! SOMBER!

Item 0: Apple's best year ever, look at this literal mountain of cash and gold they can swim in like Scrooge McDuck, at the new Apple spaceship campus! KA-CHING!

Item 1: Apple announces the end of mechanical keyboards. If you filthy heathens in non-sterile, non-white-void rooms can't take care not to spill Coke (or coke), crumbs, hair, or microscopic dust particles into Jony IVE-1138's perfect butterfly switches, jamming them up, and then have the audacity to sue, then you just don't deserve them. All replacement and new-issue keyboards will be sealed-in, membrane keyboards like the Atari 400. COURAGE!

Item 2: Apple announces the end of C, C++, Objective-C, AppleScript, Javascript, and Swift, in favor of a new cross-platform language: Workflow, acquired last year. Kids and junior developers alike will love learning to code with easy visual blocks. Expert developers can eat shit and die use remote APIs to implement code on their own web server. SWEET!

Sub-Item: Apple is responding to Developer's Union by hiring the Pinkerton Agency. There will be no trials of any kind. BEATINGS FOR ALL!

Item 3: New Macs! Finally, the new Mac-itecture is here: ARM, iOS, with an Intel emulator that runs up to 20% as fast as a real Intel chip in this rigged demo. Available 2019 or 2020, they really want to get this right, so all existing Macs are EOL today. POWER!

Item 4: Apple announces all-new game development tools, streaming from a home server or iCloud Games server, just like Steam Link but, you know, for the children!, with Apple's 30% cut and no expensive $9.99 games, only "free" IAP games allowed. Obsolete native iOS games will be phased out over the next 6 weeks as OpenGL is deprecated and then unsupported, and Metal only supported on MacTruck platforms. BEEP BOOP (nobody at Apple has ever played a videogame, so this presentation's kind of awkward).

One More Thing: HomePod now supports stereo, a mere 87 years after radio, records, and movies went stereo. Surprise announcements of vinyl LP and 8-track addons for the HomePod Hi-Fi shipping this Fall, and another U2 album in your iTunes library today! ROCKIN'!

Quite a lineup you got there, Timmy Cook! Don't ask how Steve would run the company, you do it your way!

The HTTP Sky Is Falling, Says Chicken Little

Dave's explanation is just absolutely wrong, and he has to know this, he's lying to frighten you away from security; I don't know why. Google's not planning censorship, just a warning being provided that a site taking your personal information is not secure.

Will this break plain HTTP sites?
No. HTTP sites will continue to work; we currently have no plans to block them in Chrome. All that will change is the security indicator(s).
Chromium: Marking HTTP as Non-Secure

Even if Google Don't Be Evil was Evil, you could still use Free-as-in-Drugs Firefox or whatever, and can just use curl to archive sites, or even by hand:

% telnet example.com 80
GET / HTTP/1.1
Server: example.com
(hit return twice, ctrl-D to end)

But you shouldn't be trusting anything you see or entering anything on an HTTP page.

If you connect to a site over HTTP and you do not fully control the wires from your computer to the server, that site can be spoofed and spied on. If you use public wifi to talk to HTTP, your logins and credit cards WILL be stolen. Guaranteed, some jackass in your Starbucks is wiresharking your connection.

Even if you think you have a secure connection, anyone on the routers between you and the server can read your connection. Routers are not secure, they have been routinely compromised.

The only protection you have against these "Man in the Middle" attacks is TLS (successor to SSL), using HTTPS instead of HTTP, SSH instead of telnet, SFTP instead of FTP, emailing with MIME and SMTP over TLS instead of unsecured ports, iMessage or Signal instead of IRC or Twitter & Facebook "direct messages" (which have bever been hidden from their staff).

In the early days of the ARPAnet and Internet, there was no security and we couldn't do much about it, but to resist warning people about insecure sites now is irresponsible.

New Electron Dance

No, wait, that's the Neutron Dance, I get those confused.

Electron

Since abandoning any hope of the iOS App Store paying my bills, I've had to look back at the web or desktop. My current available time-at-computer and energy these days isn't sufficient for a day job or even contracts, much to everyone's dismay. So time for another hard look at the situation.

I like working on my Mac, but Mac isn't that big a market. I also want to ship on Windows (and Linux, I suppose). Objective-C is one of my favorite languages ever, Cocoa & UIKit (on iOS) were great APIs, AppKit on the Mac much less so, but since Apple's killed Obj-C and it's not portable, my happy years of typing [ ] are over.

WHAT HAVE YOU DONE?!

Swift might be the worst mental disorder to strike programmers in decades. Swift is orders of magnitude slower than Objective-C, crashes constantly, the moving-target "spec" creates incompatible changes every year, and because they're too stupid to standardize a binary interface, every program has a 20MB+ blob of Swift runtime. For a single-platform joke language perpetrated by a C++ bozo who fucked off after a year to play with cars. So I'm all too happy to say good riddance to that bullshit. I mean exactly this: If you're using Swift, you either don't know better (it's OK to say you don't know!), or are defrauding your employer for hours, or have something wrong inside.

13 years ago, Project Builder/Interface Builder was a pretty good dev toolkit since I could use a real editor (BBEdit) with it, but Xcode locked that out, and then as Apple sucked in more tools over time, it sucked harder and harder; I can't stand the rickety deathtrap these days. I was getting by in JetBrains' AppCode, but still had to use Xcode for Interface Builder (RIP) and to get builds onto a device half the time. Xcode is a crashy, substandard pile of shit with maybe the worst editor in any IDE in history. Syntax highlighting stops working at random, for most of a decade it has code-completed "nss" as "NSStreamDelegate" rather than the slightly more useful "NSString" (before that it couldn't code-complete at all!), I could go on for hours or days about how Xcode kicks you in the input/output ports every time.

And the worst part is you can't fix the fucking thing, no user-serviceable parts inside, Radar is a black hole, no scripting or plugins. Just bend over and take what Apple Developer gives you good and hard. It's kind of a relief that current Xcode doesn't run on the last stable MacOS version (Sierra).

I'll stick with BBEdit for text and Atom for code, thanks. If I'm angry at Atom I can fix it myself or file a publicly-trackable ticket; I'm rarely angry at BBEdit but I can ask Rich to fix it.

So I'm writing web-type software in Javascript, with Node or Electron behind it. Javascript aka ECMAScript has become a good language in the last 5-10 years, and the V8 runtime in Node/Electron runs close enough to native now for most needs. I love that I can just write UI in HTML again. No fucking around with Apple's bullshit of deprecating APIs out from under me (I "get" to rewrite alert/menu code again?!), or promising to support SpriteKit/SceneKit across iOS & Mac and then doing fuck-all on either. WebGL (or Three.js, anyway) isn't fast enough for complex scene-graphs, but 2D work in Canvas is mostly fine (and it gets better every year, instead of bit-rotting like unused S*Kit APIs). localstorage in a web page isn't enough for any real program, thus Node is needed to reach the filesystem.

I slander Swift for leaving a giant runtime turd in every program, but Electron's the same way: It has to contain a browser, Node, and system APIs. But I'm not at the mercy of Apple's marketing-driven dev tools.

Certain Mac nerds obsess about Purity of Essence, insisting that everyone should love Xcode, Swift, and AppKit, and that use of any other technology is an abomination to the end-users, whom they clearly love more than me. Can you hear that slurping sound? That's someone fellating Apple marketing. Roughly 4 billion more people are familiar with web pages and will find a web-like UI more comfortable.

I intend to keep up my experiments in Scheme and Pascal when I have time, I'd far rather have small, fast, native binaries on every platform, but shipping beats purity.

Progress is being made:

tile-20180426-map

tile-20180426-view

(the + road texture there will get replaced soonish)