Saving stuff before it vanishes down the memory hole.

Jan 26, 2017

UPDATE - 20170205 - Added Chrome plugin for the Internet Archive.

Note: This article is aimed at people all across the spectrum of levels of experience with computers.  You might see a lot of stuff you already know; then again, you might learn one or two things that hadn't showed up on your radar yet.  Be patient.

In George Orwell's novel 1984, one of his plot points of the story was something called the Memory Hole. They were slots all over the building in which Winston Smith worked, into which documents which the Party considered seditious or merely inconvenient were deposited for incineration.  Anything that the Ministry of Truth decided had to go because it posed a threat to the party line was destroyed.  This meant that if anyone wanted to go back and double check to see what history might have been, the only thing they could get hold of were "officially sanctioned" documents written to reflect the revised Party policy.  Human memory's funny: If you don't have any static representation of something to refer back to periodically, eventually you come to think that whatever people have been telling you is the real deal, regardless of what you just lived through.  No mind tricks are necessary, just repetition.

The Net's a lot like that.  There are literally piles and piles of information everywhere you look, but most of it resides on systems that aren't yours.  This blog is running on somebody else's server, and it wouldn't take much to wipe it off the face of the Net.  All it would take is a DMCA takedown notice with no evidence (historically speaking, this is usually the case).  This has happened in the past a number of times, including to an archive maintained by Project Gutenberg and documents explicitly placed into the public domain so somebody could try to make a buck off of them.  This is a common enough thing that the IETF has made a standard HTTP error code to reflect it, Error 451 - Unavailable for legal reasons.

So, how would you make local copies of information that you think might be pulled down because somebody thought it was inconvenient?  For example, climatological data archives?

Huginn: Writing a simple agent network.

Jan 15, 2017

EDIT: 20170123 - My reviewers have suggested some edits to the article, many of which I've applied.

It's been a while since I wrote a Huginn tutorial, so let's start with a basic one to get you comfortable with the idea of building an agent network.  This agent network will run every half hour, poll a REST API endpoint, and e-mail you what it gets.  You'll have to have access to an already running Huginn instance that can send outbound e-mail.  This post is going to be kind of lengthy, but that's because I'm laying out some fundamentals.  Once you understand those you can skip past the explanations and move on to the good stuff.

First, a little background - what's a REST API?  If you already know just skip down past the cut and move on, but if you don't know what I'm talking about I'll try to explain.  I'm going to assume that you've been able to install Huginn using my instructions or someone else's, or you've got access to a running instance.  I'm also going to assume that you're not a hardcore coder, you're someone who's trying to apply a useful tool to your everyday life.

At its simplest, an API (Application Program Interface) is a way to interact with a system or part of a system.  It's (hopefully) designed to be regular, which means that once you understand the basics you can apply that knowledge to figure out the more complex parts with a little messing around because the basics continue to apply.  Let's say that I've written a library called myLib, which implements a bunch of really annoying stuff (like opening and closing files and sorting elements of data) so you don't have to.  My library has a bunch of functions that carry out those tasks (openStupidFile(), readAllOfFilesContents(), sortIntegers(), sortFloatingPointValues(), searchThisCrapForAString()) when you call them in your own code.  Those functions are part of my library's API.  In the documentation are instructions for calling each function, which includes the arguments you need to pass to each function (e.g., openStupidFile() takes two arguments, a full path to a file and 'r' for read-only or 'rw' for read-write, and it returns a handle to the file that you can pass to another function or NULL if it failed).  The data type each function returns (the file handle or NULL value) is part of the API, as are the arguments each function takes (path to the file and 'r' or 'rw').

The same principle has been applied to the Web in several different ways.  What concerns us right now is something called the RESTful API (REpresentational State Transfer), which basically means interacting with a web service using HTTP verbs (GET, PUT, POST, and so forth) and referencing  URLs instead of functions in a library.  Like HTTP, requests are stateless, which means that you make a request, the server responds, and there's no further context beyond that.  You can think of RESTful APIs as fire-and-forget.  The general idea is that there is a web server of some kind, which could be a traditional one like Apache or a specialized one running inside a web app built around a server like which responds to those URLs in some way.  If you make a GET request to a URL, it'll send you some data.  If you make a PUT request you replace something on the server at that URL with something you send it.  If you make a POST request you create a new something on the server.  If you make a DELETE request that something on the server gets erased.  All of this depends on the HTTP verbs the server supports (not all REST APIs need to support all of them), your access permissions (not every account can do everything), whether or not you've authenticated to the server (it is sometimes the case that read-only access doesn't require an account but read-write access does require an account or an API token or something else along those lines), or who owns a particular resource (Alice's resources are read-only for every other account on the server, but read-write for her alone), of course.  REST makes life easier but it's not carte blanche to run hog wild.  Additionally, many REST API services enforce access limits - you get so many requests per minute, hour, or day and after that it returns errors.  For example, Twitter's API will return an Error 420 (enhance your calm) if you trip their rate limiter.

A long-forgotten Commodore game. Was it ever released?

Jan 14, 2017

UPDATE (20170120): The game may have been found!

Many years ago, maybe a year after 321 Contact magazine merged with Enter magazine, there was a review of a video game which seemed like it was a tie-in for the movie 2010: The Year We Make Contact.  The scenario was that you'd just gained access to the USS Discovery, and you had to repair all of the systems on board the ship to win the game.  As I recall, a free hint in the review was that you should repair HAL-9000 first, because he could help you figure out how to fix the rest of the ship.  I don't think I ever saw it in a store (then again, it's been over 30 years), nor do I recall reading about it in any of the other Commodore magazines I was reading at the time.  It may have been vaporware - an early review copy could have been sent out but it never actually hit the shelves.  I've searched for information about this game periodically over the years, and I've had searchbots prowling around looking for information about it as well (even dozens of permutations of likely titles for the work), and none of us have found anything even vaguely talking about it.

Oh, Internet hive-mind... did this ever actually exist?  If so, where could I find a copy?  And, most importantly, what was the title of the game?


As mentioned above, I think the game in question has been found. Jarandhel succeeded where I kept failing.  He was able to determine that the game's title is actually 2010: The Graphic Action Game, and it's not a Commodore title, it's a Colecovision title.  The screenshots certainly seem to match what I remember seeing in a magazine, and the game mechanics definitely fit what I recall.  The entire game has been described as being one big hacking minigame (warning: TV Tropes link).  Chances are there's an abandonware version of it floating around someplace, though I'll need to track down a Colecovision emulator to play it.

James O'Keefe caught trying to pull another fast one.

Jan 14, 2017

So, there's this guy named James O'Keefe.

He's got this problem: He likes trying to play Mission: Impossible and wreck the careers and lives of people he doesn't like by pulling scams, editing videos in interesting ways to set people up, and generally being the sort of person you'd eject from the party for being such a huge asshole that the Alpha Betas would throw him out on his ear.  He spent all of Election Day in 2016 tailing buses taking people to the polls in an attempt to intimidate them into not voting.  He's cost a couple of people their jobs.  He's also been paid to do other people's dirty work, including breaking and entering and wiretapping, and his video editing skills are creative to say the least, but he relies upon shock value to cover up the fact that he's talking out of his ass.  His track record shows that there's a 50/50 chance that he'll burn himself while trying to pull a black op (and I'm being much too polite because the guy's not even a mall ninja).

He's up to his old tricks again, only this time his reputation preceeded him and he was caught in the act when the groups he approached turned the tables on him by using his own tricks.  O'Keefe and Allison Maass (one of his employees) approached two organizations, Americans Take Action and the journalist group The Undercurrent, and offered them thousands of dollars if they would disrupt the inauguration on 20 January 2017 by shutting down bridges and inciting a riot.  Two versions of the video are available, an edited version in a news segment by The Young Turks (including some behind-the-scenes discussion that you really should watch) and longer video footage which is damning, to say the least.  When last I heard, trying to pay people to cause riots and generally wreak havoc was a felony in the United States.

What's it like having synaesthesia?

Jan 03, 2017

What's it like not having synaesthesia?

That sounds like a flippant answer, but it's quite the truth.  I can't remember a time when I didn't experience sounds (music, in particular) in a deep, visceral way that involved more than just my sense of hearing.  For the longest time I thought everybody's experience of life was like mine.  I thought everybody cried when they heard violin music.  I thought everybody felt waves of cold and prickles when they heard sounds made up of square waves (yeah, I'm dating myself, aren't I?)  Didn't everybody shiver and see starbursts of pink and purple light when they heard a particular chord progression on the radio (strangely, the original Also Sprach Zarathustra doesn't have that effect on me - must be the pedals Andy Summers used in the studio)?  Didn't everybody feel... pain... when they just heard something shrieking or screaming, like bus brakes or the scream of a dentist's drill (note: video of actual drill-and-fill; feel free to not click on it)?

To answer my (rhetorical) question another way, everybody seems to be synaesthetic to some degree.  Take a look at this image.

Now, tell me: Of what you see in that image file, which one is Kiki and which one is Bouba?

Upgrading Bolt CMS to v3.x.

Jan 02, 2017

Since PivotX went out of support I've been running the Bolt CMS for my website at Dreamhost (referral link).  A couple of weeks back you may have noticed some trouble my site was having, due to my running into significant difficulty encountered when upgrading from the v2.x release series to the v3.x release series.  Some stuff went sideways, and I had to restore from backup at least once before I managed to get the upgrade procedure straightened out with the help of some of the developers in the Bolt IRC channel on Freenode.  If it wasn't for help from rossriley it would have taken significantly longer to un-fuck my website.

Here's the procedure that I used to get my site upgraded to the latest release of Bolt.