Site Redesign

As part of my site redesign, I'm moving everything off my old "markdamonhughes.com" and "markrollsdice.wordpress.com" domains into this site: Software Gallery, Tools, and RPG. Take a look at the front page, browse around, see if you like it. I'm open to advice at this point. I know I haven't done anything too weird with art and design yet, that's coming.

Content management in WordPress isn't trivial, but it's better than the ad-hoc pile of folders and PHP scripting I was doing. I'm still getting by with the standard media folder, but I'm usually disciplined about naming images so search works; there's advanced media manager plugins but I won't let it get to that point.

Many of the software pages are just "museums" right now. My iPhone software is not currently available (and likely never will be on the iPhone again; Apple's "everything is free" sabotage of developers means it's not possible to charge what software costs to make), but I will rerelease some of it as Mac/Marzipan ports when I get around to it. There's a couple of very cool apps like DungeonJournal (replacement for DungeonDice, but with a mapping & journaling tool!) that were never released properly, and I'd like to get those out. Brigand got adapted back into PerilarFK, so I'm not bothering with it.

I may import the old markrollsdice and dev blog/not-a-blog posts, still pondering on that.

World of Warcraft Classic

This is pretty exciting.

  • I started in original World of Warcraft as a Dwarf Hunter (IIRC, I made a Nelf Rogue first, but that did NOT work for me), determined quickly that I hated Alliance as a bunch of juvenile Nazi-wannabes and switched to the real heroes, The Horde!, played an Undead Mage, didn't progress as much as I'd like due to real life but had fun.
  • Burning Crusade was great, and rather stereotypically I started over with a Blood Elf Warlock (selama ashal'anore!) and maxed out, did some raiding, loved that version of the game. Outland is amazing, that's some of the best content WoW or any game ever made.
  • Lich King was OK but kind of same-y and grindy—why make Dalaran when Shattrath exists and is better? Why are there two indistinguishable forest zones and two indistinguishable undead zones?
  • Cataclysm wrecked everything in the world and in character; it did add some detail to areas that needed it, but it's not worth it.
  • Pandaria had a nice setting and the Monk was a fun class, with beer as a powerup drink!, but letting the Pandas choose their faction made no sense (Goblins in particular, and all the neutral-ish races in general, should've been able to choose, too!), and the higher-level content is trash.
  • Everything after is even worse. After 15 years, what we've learned is that Blizzard can't improve content, only make it worse; everyone good left after Classic and Burning Crusade, and institutionally they aren't able to hire best-of-breed writers or game designers. Restoring Classic is really the only option they have.

So, I've been following this WoW Classic thing a while, since in 2016 when the Nostalrius, RIP and Elysium private servers let me play classic "vanilla" World of Warcraft again; I was frustrated by bugs, and basically couldn't use airships or ships because they'd drop me halfway in an out-of-level zone or the ocean, but it was interesting to have a version of WoW that didn't suck. As previously, I played an Undead Mage; that or Warlock seems most likely when Classic goes live. I am what I am, which is an evil sorcerous corpse.

Crendor and ClassiCast have done excessively exhaustive dialogues of what they want from Classic, which is a super-conservative "No Changes!". I'm much more moderate about this. If they add achievements (added in Lich King), pet battles (added in Pandaria), barbershop (added in Lich King), and use new models (added in Warlords of Draenor), I'd be fine with that; those improve the game without changing any balance. Dungeon/Raid Finder wouldn't bother me, I likely wouldn't use them, since I loathe PUGs (pick-up groups, not tiny inbred dogs), but they're a boon to people in no guild or a small guild that can't organize those things. The actual gameplay should be like the last patch of Classic, or the last patch of Burning Crusade when/if they add that content.

I'd totally be up for getting a "Virtual Ticket" for Blizzcon just to try the demo, except it's $50! That's like, a case of beer and a bottle of whiskey, which is a far more entertaining weekend (please drink more responsibly than me). Minecon on Saturday is free; it's not a real convention anymore (I went to Minecon Vegas back when the audience was much more adult). How the fuck does Blizzard justify $50 for some videos?! So anyway guess I'll just watch Youtubes of the demo when they come out.

Rules for the OSR (Old-School Renaissance)

Housekeeping note: I'm still too busy with programming on the new Perilar, and some other things, to get back to my tabletop and/or online chat games regularly, but I'll be moving all my RPG stuff over to this blog from Mark Rolls Dice, I'd like to have one site to maintain which I own.

So, start with basic principles. How do I run games.

I'm a caveman from the '70s and '80s, so my Old-School is literally old and from school, as noted in Five Games. The Old-School Renaissance is my frozen caveman ass being thawed out to do it again.

There's a bunch of guides to how to do this, but they're kind of bullshit. Matt Finch's Quick Primer for Old-School Gaming is close to my view, and has gameplay dialogue examples which can be read in funny voices, but it goes on too long about irrelevant stuff. Principia Apocrypha and a bunch of other bloviating diatribes just go on forever, I started to nod off, make a little hand-puppet with my hand and flap its mouth up and down.

Here's my OSR principles:

  1. Let the dice fall where they may. ( Knights of the Dinner Table's Law )
  2. Be excellent to each other. ( Bill & Ted's Law, the inverse of Wheaton's Law )
  3. The Referee is always right, but the players can choose to stay or leave.
  4. Rules are just recordings of what we've previously done. We can change them at any time.

Like the Three Laws of Robotics, each principle is tempered by the ones previous: The Referee can override new rules. But, be excellent to each other. But, don't cheat and take away risk.

Don't Be a Dick

So, Wil Wheaton ( previously "I Hate Twitter" ) was just chased off the Fediverse (he still has an account on a siloed non-federating instance, which isn't really useful to anyone else). His last statement's pretty clear, so I put that down below.

"Please do your very best to be kind to each other. The world is a terrible place right now, and that's largely because it is what we make it."

I know some of the people doing the harassing. There's no point in even arguing with them: They've decided he's in Two Minutes Hate, perhaps because he has a friend whom they don't like, and won't consider "Don't be a Dick", or having empathy, tolerance, or self-awareness that some of them aren't such great friends to have, for one hot second.

While Gargron has condemned harassment, it doesn't fix the problem, since there are entire instances where 4chan-like behavior is accepted; all you can do is block accounts or those entire instances, and it still poisons the Federated timeline for a while.

I'm not sure any level of moderation fixes this shit.

This is why I highly recommend owning your own blog, and broadcasting that out to other services where people can read it; even better, read this and many other blogs in your RSS aggregator or RSS reader ( currently free! ) of choice. It's OK to put some ephemeral chat on other services, but remember those are owned by other people, and are easily attacked by angry, stupid mobs. If a stupid mob shows up here, I don't approve their comments and it's done. It's the Castle Doctrine of online posting.

Wil Wheaton @wilw@mastodon.cloud August 29, 2018, 3:02 PM https://mastodon.cloud/@wilw/100635779449174251 (will be a dead link soon)
I have been notified by an Admin here that they are getting 60 reports a day about my account. As far as I can tell, I'm not breaking any rules, and I've done my best to be a good person here. But this admin is going to suspend my account.

It's the Admin's instance, so I fully support their choice to eliminate a source of frustration, but something to consider: a person who is doing nothing wrong can be run off one instance by a mob from another instance. That seems ... not cool. 1/x

But it's been made very, very clear to me that I am not welcome in the Fediverse, and I hear you. I hoped to find an alternative to the birdsite where I could find the same fun community that existed over there in the beginning, and it's clear to me that I won't be finding that. Before I leave, I want to just make something very clear, because I've spent most of my life being yelled at by people who don't know me at all, and I want the record to be clear. 2/x

During GamerGate, I was dogpiled and mobbed and brigaded and attacked by thousands of accounts. I started using a blocklist that was supposed to help stop that. I did not know that the blocklist I signed up for also had a lot of trans women on it. When I found out, I did everything I could to remove those women from the list I shared. When there were still innocents on the list, I stopped sharing the list entirely. Despite this, a mob has decided that I'm anti-trans. 3/x

This lie that I am anti-trans, or anti-LGBQ, is deeply hurtful to me (I know it's nothing like the pain LGBTQ people deal with every day, as they simply try to exist in a world that treats them so badly, but it is still hurtful in its own way to me). I just want to make it extremely clear: that is a lie, and the people spreading it are misinformed.

So I'm leaving the Fediverse, which has treated me with more cruelty, vitriol, hatred, and contempt than than anyone on the birdsite ever did. 4/x

I know that I'm well-off, well-known, and as a CIS white hetro dude in America, I live life on the lowest difficulty setting. I know that I have very little to complain about.

But I still have feelings, and I really do care about the world and the people in it. What I see is a lot of anger and cruelty directed at the IDEA of me, from people who I just hope don't realize that it really does hurt me, in my heart, to be accused of being someone I am not, and to be the target of a hateful mob. 5/x

Anyway, take your victory lap and collect your prizes. You've made it clear that I'm not welcome here, and even though I disagree with the action this Admin is taking (banning me when I didn't break any rules doesn't seem right), I respect and support the Admin's decision to run their instance the way they see fit.

Please do your very best to be kind to each other. The world is a terrible place right now, and that's largely because it is what we make it.

Bye.

6/end

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. One of the best things about cybre.space is that it doesn't look like every other bland, neutral, anodyne Mastodon instance. 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.

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!