Review: J.R. “Bob” Dobbs and The Church of the SubGenius (2019)

2021-04-19 - Reading time: 2 minutes
PROPAGANDA-FILM-PRAISE-CONTRACT-FULFILLMENT-FINAL2.DOC EXPORT SUCCESS page 1 of 1
temp.png

As a backer, it took a surprising amount of time to finally get access to the film.

And then when I finally received access, I sat on it even longer.

Some might consider that appropriate for the subject matter: I was void of slack and mad, and then received the slack at my leisure once I was given a choice.

That said, I'd had high expectations for the film -- my only concern being that the title would make it difficult to search for, or worse, drown out other Church propaganda.

But I was wrong on both counts: it's easy enough to search for, if you quote the title exactly.

And this documentary exceeded my expectations.

Sure, the Church "comes clean", finally. But if you've paid even a modest amount of attention to the Hour of Slack radio show, or other Church related materials over the years, there isn't REALLY a whole lot new here. If you're not a "Bobbie" and had a reasonably good sense of humor, you were already in on the joke.

But it's nice to have it "for the record" and all in one place. And the presentation just oozes quality, with some lovely animations interspersed among the heaps of old VHS recordings.

This is a terrific doc. I'm not sure about the appeal for those not already familiar with "Bob", but maybe it will awaken something in you. 😉

5/5

https://letterboxd.com/drfortyseven/film/jr-bob-dobbs-and-the-church-of-the-subgenius/


X-Day Countdown

2021-04-04 - Reading time: ~1 minute

A couple years ago, I created an Android Wear (now "Wear OS") watchface (on Google Play) that threw the gaze of "Bob" upon you while you read the time. If you tapped the clock, it would also show you a countdown to that magic hour of 7am on July 5th when you get whisked away just in time for the end of the world.

Wear OS sucks. But I enjoyed working on the watchface. And I wanted some exercise with Svelte. So here it is!

XDayCountdown.com!

I'm going to refine this a bit as time goes on. And I'm sure there's some subtle (or not so subtle) bugs in there.

There's no SECRETS yet (or are there?), but I hope to add something fun to help usher in The Moment when it comes. ;)

Source, of course, is available over here: https://github.com/Fortyseven/XDayCountdownSite/

xdaycountdown.jpg


Quick Review: Snyder's Justice League (Spoiler-free)

2021-03-19 - Reading time: 3 minutes

temp2.jpg

Reposted from Letterboxd: https://letterboxd.com/drfortyseven/film/zack-snyders-justice-league/

I've been very much critical of the whole "Release the Snyder Cut" movement. It's supporters were, more often than not, entitled, angry, vocal assholes.

Imagine my dread when the studio decided to capitalize on that movement and make it happen to bolster HBO Max.

Much to my surprise, this actually takes a mediocre movie and makes numerous improvements. Dare I say this is a much better film than Whedon's attempt with Justice League in 2017. It's by no means free of flaws, but the narrative flows better. The new content does a lot of fleshing out, too. 

And even though I'm, by far, not a fan of Snyder's visual style -- I heard someone refer to it as a "motorcycle grease" aesthetic. Visually this film fits better with the previous entries. (I do miss Whedon's saturation, at least.)

Was it worth the $70 million fucking dollars to fix the film? Absolutely not. Good lord! 

temp.jpg But the deed is done. No use complaining about THAT at this point.

The only real black mark on this take: it's FOUR hours long, with no real justification for that length other than to let you soak in the film's grease for long stretches as music fills the void. 

The length is going to make future viewings prohibitive. It'll keep this from making it the de facto version of Justice League, I think. And that's a shame, because it really is a "patch" that fixes a lot.

Finally, against all odds, I can actually say: I'd like to see Snyder do a sequel film. I dislike his style, but I'm finding myself unexpectedly invested now. He's turned me around on how I feel about this film in general.

That's nothing short of a personal miracle.

4/5


Behold your vector nightmare, Amiga fans!

2021-03-06 - Reading time: 6 minutes

Kickstart1_3[3].pngOver on Hacker News there was an entry about the "awful" Amiga Kickstart 1.x icon and why it looked the way it did. This led to a link over on Stack Overflow where it was revealed that this was graphic actually drawn in a vector style, as opposed to raster pixels.

They also provided the actual bytes used to render the graphic. I thought it'd be fun to write a little parser to render these bytes.

And so did several other people, apparently, as I'm discovering now. :|

Anyway, here's my humble Codepen. And if that goes down, the original code is below the embed. 😎

(I skipped flood fill because I used two.js for this, and didn't realize until it was too late that I'd chosen poorly. Easy enough to swap out the graphics library, but it's time to move on.)

See the Pen Amiga Kickstart vector parser by Toby D (@Fortyseven) on CodePen.

/*
Inspired by:
https://retrocomputing.stackexchange.com/questions/13897/why-was-the-kickstart-1-x-insert-floppy-graphic-so-bad/13901

2021-03-06
*/

const floppy = [
    0xFF, 0x01, 0x23, 0x0B, 0x3A, 0x0B, 0x3A, 0x21, 0x71, 0x21, 0x71, 0x0B, 0x7D, 0x0B, 0x88, 
    0x16, 0x88, 0x5E, 0x7F, 0x5E, 0x7F, 0x38, 0x40, 0x38, 0x3E, 0x36, 0x35, 0x36, 0x34, 0x38, 
    0x2D, 0x38, 0x2D, 0x41, 0x23, 0x48, 0x23, 0x0B, 0xFE, 0x02, 0x25, 0x45, 0xFF, 0x01, 0x21, 
    0x48, 0x21, 0x0A, 0x7E, 0x0A, 0x8A, 0x16, 0x8A, 0x5F, 0x56, 0x5F, 0x56, 0x64, 0x52, 0x6C, 
    0x4E, 0x71, 0x4A, 0x74, 0x44, 0x7D, 0x3C, 0x81, 0x3C, 0x8C, 0x0A, 0x8C, 0x0A, 0x6D, 0x09, 
    0x6D, 0x09, 0x51, 0x0D, 0x4B, 0x14, 0x45, 0x15, 0x41, 0x19, 0x3A, 0x1E, 0x37, 0x21, 0x36, 
    0x21, 0x36, 0x1E, 0x38, 0x1A, 0x3A, 0x16, 0x41, 0x15, 0x45, 0x0E, 0x4B, 0x0A, 0x51, 0x0A, 
    0x6C, 0x0B, 0x6D, 0x0B, 0x8B, 0x28, 0x8B, 0x28, 0x76, 0x30, 0x76, 0x34, 0x72, 0x34, 0x5F,
    0x32, 0x5C, 0x32, 0x52, 0x41, 0x45, 0x41, 0x39, 0x3E, 0x37, 0x3B, 0x37, 0x3E, 0x3A, 0x3E, 
    0x41, 0x3D, 0x42, 0x36, 0x42, 0x33, 0x3F, 0x2A, 0x46, 0x1E, 0x4C, 0x12, 0x55, 0x12, 0x54, 
    0x1E, 0x4B, 0x1A, 0x4A, 0x17, 0x47, 0x1A, 0x49, 0x1E, 0x4A, 0x21, 0x48, 0xFF, 0x01, 0x32, 
    0x3D, 0x34, 0x36, 0x3C, 0x37, 0x3D, 0x3A, 0x3D, 0x41, 0x36, 0x41, 0x32, 0x3D, 0xFF, 0x01, 
    0x33, 0x5C, 0x33, 0x52, 0x42, 0x45, 0x42, 0x39, 0x7D, 0x39, 0x7D, 0x5E, 0x34, 0x5E, 0x33, 
    0x5A, 0xFF, 0x01, 0x3C, 0x0B, 0x6F, 0x0B, 0x6F, 0x20, 0x3C, 0x20, 0x3C, 0x0B, 0xFF, 0x01, 
    0x60, 0x0E, 0x6B, 0x0E, 0x6B, 0x1C, 0x60, 0x1C, 0x60, 0x0E, 0xFE, 0x03, 0x3E, 0x1F, 0xFF, 
    0x01, 0x62, 0x0F, 0x69, 0x0F, 0x69, 0x1B, 0x62, 0x1B, 0x62, 0x0F, 0xFE, 0x02, 0x63, 0x1A,
    0xFF, 0x01, 0x2F, 0x39, 0x32, 0x39, 0x32, 0x3B, 0x2F, 0x3F, 0x2F, 0x39, 0xFF, 0x01, 0x29, 
    0x8B, 0x29, 0x77, 0x30, 0x77, 0x35, 0x72, 0x35, 0x69, 0x39, 0x6B, 0x41, 0x6B, 0x41, 0x6D, 
    0x45, 0x72, 0x49, 0x72, 0x49, 0x74, 0x43, 0x7D, 0x3B, 0x80, 0x3B, 0x8B, 0x29, 0x8B, 0xFF, 
    0x01, 0x35, 0x5F, 0x35, 0x64, 0x3A, 0x61, 0x35, 0x5F, 0xFF, 0x01, 0x39, 0x62, 0x35, 0x64, 
    0x35, 0x5F, 0x4A, 0x5F, 0x40, 0x69, 0x3F, 0x69, 0x41, 0x67, 0x3C, 0x62, 0x39, 0x62, 0xFF, 
    0x01, 0x4E, 0x5F, 0x55, 0x5F, 0x55, 0x64, 0x51, 0x6C, 0x4E, 0x70, 0x49, 0x71, 0x46, 0x71, 
    0x43, 0x6D, 0x43, 0x6A, 0x4E, 0x5F, 0xFF, 0x01, 0x44, 0x6A, 0x44, 0x6D, 0x46, 0x70, 0x48, 
    0x70, 0x4C, 0x6F, 0x4D, 0x6C, 0x49, 0x69, 0x44, 0x6A, 0xFF, 0x01, 0x36, 0x68, 0x3E, 0x6A,
    0x40, 0x67, 0x3C, 0x63, 0x39, 0x63, 0x36, 0x65, 0x36, 0x68, 0xFF, 0x01, 0x7E, 0x0B, 0x89, 
    0x16, 0x89, 0x5E, 0xFE, 0x01, 0x22, 0x0B, 0xFE, 0x01, 0x3B, 0x0B, 0xFE, 0x01, 0x61, 0x0F, 
    0xFE, 0x01, 0x6A, 0x1B, 0xFE, 0x01, 0x70, 0x0F, 0xFE, 0x01, 0x7E, 0x5E, 0xFE, 0x01, 0x4B, 
    0x60, 0xFE, 0x01, 0x2E, 0x39, 0xFF, 0xFF
];

class AmigaVectParser {
    constructor(bytes, elem) {
        this.palette = ["#FFFFFF", "#000000", "#7777CC", "#BBBBBB"];
        this.offset = [0,0];
        this.prevOffset = [0,0];
        this.curColor = 0;
        this.isDrawing = false;
        this.buffer = bytes || [0xff, 0xff];
        this.done = false;

        this.two = new Two({ width: 640, height: 400 }).appendTo(elem);
    }

    doCmd(cmd_pair) {
        if (cmd_pair[0] === 0xff) {
            this.isDrawing = false;
            if (cmd_pair[1] === 0xff) {
                // cmd_done
                this.done = true;
                return;
            } else {
                // cmd_colorSet
                this.curColor = cmd_pair[1];
                return;
            }
        } else if (cmd_pair[0] === 0xfe) {
            // cmd_floodFill
            this.isDrawing = false;
            this.pointer += 2; //TODO FLOOD FILL
            return;
        }
        if (!this.isDrawing) {
            // first coordinate in a poly-line
            this.prevOffset[0] = cmd_pair[0];
            this.prevOffset[1] = cmd_pair[1];
            this.isDrawing = true;
            return;
        } else {
            // continuing the poly-line
            this.offset[0] = cmd_pair[0];
            this.offset[1] = cmd_pair[1];

            let line = this.two.makeLine(
                this.prevOffset[0] * 2,
                this.prevOffset[1] * 2, // doubling up X/Y to make it easier to see at 640x400
                this.offset[0] * 2,
                this.offset[1] * 2
            );

            line.stroke = this.palette[this.curColor];
            line.linewidth = 1;

            this.prevOffset[0] = this.offset[0];
            this.prevOffset[1] = this.offset[1];
        }
    }

    draw() {
        let cmd = [0, 0];
        let pointer = 0;        
        this.done = false;

        while (!this.done) {
            cmd[0] = this.buffer[pointer++];
            cmd[1] = this.buffer[pointer++];
            this.doCmd(cmd);
        }
        this.two.update();
    }
}

renderer = new AmigaVectParser(floppy, document.getElementById("draw-shapes"));
renderer.draw();

The Queen's Mittens

2021-01-26 - Reading time: ~1 minute

bernie-mittens-qg.jpg