Period Sites with Period Browsers – Machines No. 99 and 100

I’ve just added two somewhat interesting machine/browser combinations to Period Sites in Period Browsers.

Machine 99 – Windows 98 RTM x86 with Grail 0.6

Grail 0.6 running on the release to manufacturing version of Windows 98. Grail 0.6 is interesting as it’s a cross platform browser written by Guido van Rossum in Python and uses the Tcl/Tk windowing toolkit for display. Was Windows 98 the ideal platform for Grail? Probably not, but it did run and it did pretty well with pre-millennial web pages…

Continue reading

More XKCD

I’m still rather taken by XKCD comic no. 1305 – Undocumented Feature from just over a decade ago…

Alt: And it doesn’t pop up a box every time asking you to use your real name. In fact, there’s no way to set your name at all. You just have to keep reminding people who you are.

…though I suppose these days the final caption should probably be switched to ‘But at least it’s not fucking Reddit…’

Missing Objects from Go Channels or: The coder is an idiot and used a queue like a slice…

This is probably self-evident to most sensible, educated people out there but… Golang Channels are queues and not slices!

An Idiot Writes…

So the following code looks superficially right – push the numbers 0 to 33 into a queue and then read them out with a loop, printing them to the screen as you go – except, when run, you’ll only get the numbers 0 to 16. Try it here and see.

package main

import (
	"fmt"
)

func main() {
	c := make(chan int, 100)
	for i := 0; i < 34; i++ {
		fmt.Println(i)
		c <- i
	}
	fmt.Println("===")
	fmt.Println("length")
	fmt.Println(len(c))
	fmt.Println("===")
	for i := 0; i < len(c); i++ {
		a := <-c
		fmt.Println(a)
	}
	fmt.Println("===")
}

So what’s the problem? Well, c – our Go Channel – doesn’t stay the same length after you interact with it. Why? a := <-c (the command to get the first object in the channel) alters the size of the channel as it removes the retrieved object – so a 34 object channel becomes a 33 object channel after we retrieve our first number meanwhile our counter, i, continues to count upwards until i is high enough that i < len(c) fails and the for-loop ends before the channel has properly drained.

Enlightenment…

The simple solution is to get the length of the channel once and to use that for your counter. Try it here.

package main

import (
	"fmt"
)

func main() {
	c := make(chan int, 100)
	for i := 0; i < 34; i++ {
		fmt.Println(i)
		c <- i
	}
	fmt.Println("===")
	fmt.Println("length")
	fmt.Println(len(c))
	fmt.Println("===")
	max := len(c)
	for i := 0; i < max; i++ {
		a := <-c
		fmt.Println(a)
	}
	fmt.Println("===")
}

More…

And why was I using a loop with a counter in it? Because I wanted to produce a numbered list of results and I was too lazy to read it out into a slice and then work with that. A better solution would probably involve replacing our channel reading loop definition as follows…

 for i := 0; len(c) > 0; i++

Counting Chrome Tabs on MacOS (Or, I have an open tabs problem!)

Another aide-mémoire; open Chrome tabs can, on MacOS, be counted via the following incantation. This particular incantation will pull the tab count from all open windows – minimised or otherwise – without the need to activate Chrome in any way.

osascript -e{'set text item delimiters to linefeed','tell app"google chrome"to url of tabs of windows as text'} | wc -l

Which, when run on my currently open set of tabs, comes back with a number slightly higher than 4,000.

Continue reading

Night of the Mini Dead (Love, Death & Robots)

This is a funky little thing – Night of the Mini Dead, from Netflix’s Love, Death & Robots. Apparently it’s from the show’s third season which, having firmly bounced off the first season (twice!), I’ve not yet seen. The uploader looks to have chopped it into two parts, though neither part is excessively long.

Part One

Part Two

And The Now Obligatory VFX Breakdown

There’s also a nifty VFX breakdown showing how the majority of the piece is actually augmented stock photography overlaid with GCI and with a tilt-shift effect applied.