Terrestrial Navigation

Amtrak, B-Movies, Web Development, and other nonsense

Page 4 of 7

Quick note on agent forwarding with Docker

I’ve been building a CI/deployment stack with GitLab CI, Docker, and Capistrano. I’m hoping to give a talk on this in the near future, but I wanted to add a brief note on a problem I solved using SSH agent forwarding in Docker in case anyone else runs into it.

In brief, I have code flowing like this:

  1. Push from local development environment to GitLab
  2. GitLab CI spins up a Docker container running Capistrano
  3. Capistrano deploys code to my staging environment via SSH

To do this elegantly requires a deploy user on the staging environment whose SSH key has read access to the repository on GitLab. I don’t want to deploy the private key to the remote staging server. The deploy tasks fire from the Docker container so we bake the private key into it:

# setup deploy key
RUN mkdir /root/.ssh
ADD repo-key /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
ADD config /root/.ssh/config

That part is relatively straightforward. Copy the private key into wherever you’re building the docker image (do not version it) and you’re good to go. Forwarding the key is trickier. First, you’ll have to tell Capistrano to use key forwarding in each deploy step. In 3.4.0 that looks like this:

 set :ssh_options, {
   forward_agent: true
 }

Next, you’ll have to bootstrap agent forwarding in your CI task. In a CI environment the docker container starts fresh every time and has even less state than usual. You need to start the agent and add your identity every time the task runs. See StackOverflow for a long discussion of agents and identifies. TLDR; add this step:

before_script:
 - eval `ssh-agent -s` && ssh-add

I experimented with adding that command to my Dockerfile but it didn’t work. This was the most common error: “Could not open a connection to your authentication agent.” The command has to be executed in the running container, which means in this case the CI task configuration, or the key won’t be forwarded and clones on the staging environment will fail with publickey denied.

The Changelog Is A Lie

Today at WordCamp Lancaster Ryan Duff gave a talk on “Choosing WordPress Themes And Plugins: A Guide To Making Good Decisions.” It jogged my mind about an incident on the WordPress.org plugins database I observed last year. This incident, though minor, illustrates the significant limitations with that place.

Two years ago–to the day–I called the WordPress.org plugins database a “swamp” and I stand by that. Ryan noted that there’s no canonical right way to select plugins and themes. You have to mitigate risk as much as possible. That means you have to look at a plugin in the round. WordPress.org gives you some tools for that: ratings, reviews, installation base, support forums. You can evaluate the social credit of the developer. You can review the code yourself, if you’re so inclined and have the technical background.

Here at Lafayette we use a plugin called Category Posts Widget. It’s pretty simple: it creates a widget which will display recent posts from a given category. Its original author released version 3.3 in August 2011 and then never updated it again. We’d been running it since 2010 or earlier. If we’d stumbled on it 2013 we’d have seen it was outdated and passed, but if a plugin keeps working you never really notice it’s been abandoned unless you have a regular review process (which we don’t).

In September 2014 a new author took ownership of the plugin and released an update, 4.0, which was of course automatically available for site owners. As we manage our multisites with git we have a code import process using svn2git, so we generally know how significant the changes are. Every plugin page on WordPress.org has a changelog, and the changes for this update sounded pretty routine:

  • Added CSS file for post styling
  • Now compaitable [sic] with latest versions of WordPress

Okay that sounds pretty helpful and…hey, check out the diff on those changes:

 cat-posts.php | 504 ++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 279 insertions(+), 225 deletions(-)

Wait, what? That plugin was only 262 lines long! What the hell?

At the risk of a tired metaphor this was a wolf in sheep’s clothing. The new author had inserted a completely new plugin with no upgrade path under the guise of an update. While it provided the same functionality, you would have to manually update your widgets. If, like us, you maintain multiple multisite installations with hundreds of sites, this simply isn’t an option. This support forum discussion gives a taste of the anguish for downstream users.

We dodged a bullet because of our internal code review process, but there are few external indications on WordPress.org about what happened:

  • As of today, the plugin has 80,000+ active installs. That no doubt includes those clients who, like us, stayed on version 3.3. In November, when WordPress still counted downloads and not installations, it had 300,000+ downloads.
  • It stands at 3.9 of 5 stars, with 8 5-star reviews and 3 1-star reviews. Tellingly, most of these reviews are from after the 4.0 update, and apparently from new users who weren’t burned by the update. Only one of the 1-star reviews flags the upgrade issue.
  • The author has 3 plugins, though if you dig in you notice he isn’t very active in the WordPress community and his other two plugins aren’t widely used. His plugins page shows 317,000 downloads, which sounds great until you realize almost all of those predate his involvement.

Nothing in the WordPress.org environment flags that the new author usurped the plugin, assumed the social credit generated by the previous author, and then pushed through a breaking update which raised hell on downstream production sites. Discussion after the fact showed that he either didn’t care or didn’t understand how serious this was. The offer to submit pull requests to GitHub was better than nothing…except that months later there’s been no activity and no pull requests have been accepted.

I’m not sure how you fix this. On the face of it, a new a developer assuming responsibility for an abandoned but popular plugin (or theme) is a Good Thing so outlawing it isn’t a solution. Maybe if WordPress.org tracked activation history and author history, so you could drill down and get stats? Alternatively, some way to flag when a plugin has a breaking change. But for now,

Gulp, it’s Code-Checker!

Code-Checker is a tool distributed by Moodle HQ which lets you validate code against core coding standards. You install it as a local plugin in a development environment and run it against specified files. It then spits out all kinds of nit-picky errors:

theme/stellar/layout/default.php

  • #76: ····<?php·//·echo·$OUTPUT->page_heading();·?>
    
  • This comment is 67% valid code; is this commented out code?
  • Inline comments must start with a capital letter, digit or 3-dots sequence
  • Inline comments must end in full-stops, exclamation marks, or question marks

Code-Checker leverages the PHP_CodeSniffer tool; in essence it’s a set of CodeSniffer definitions wrapped in a Moodle plugin. This adds a fair amount of overhead for testing coding standards–you shouldn’t need a functional Moodle environment, nor for that matter a web server.

My preferred integration tool is gulp.js, a task-runner built on node. It’s similar to grunt but without all the front-loaded configuration. There’s a plugin for gulp called gulp-phpcs which integrates PHP_CodeSniffer with gulp and lets you check the files in your project. Happily it was pretty simple to do this with Moodle.

First, you need to have PHP_CodeSniffer available in your development environment. This is how I did it on my Macbook:

cd /usr/local
mkdir scripts
cd scripts
git clone https://github.com/squizlabs/PHP_CodeSniffer.git phpcs

I then added that directory to my PATH:

PATH=/usr/local/scripts/phpcs/scripts:$PATH

Finally, I cloned in the Moodle plugin and added its standards definition to the installed paths for PHP_CodeSniffer:

git clone https://github.com/moodlehq/moodle-local_codechecker.git moodlecs
cd phpcs
./scripts/phpcs --config-set installed_paths ../moodlecs

At this point we’re ready to integrate it into gulp. We need to install the gulp-phpcs module and add it to the project:

npm install gulp-phpcs --save-dev

Now we provide a basic configuration in our gulpfile.js. This example will check all the php files in Lafayette’s Stellar theme:

// List of modules used.
var gulp    = require('gulp'),
    phpcs   = require('gulp-phpcs');    // Moodle standards.

// Moodle coding standards.
gulp.task('standards', function() {
  return gulp.src(['*.php', './layout/**/*.php', './lang/**/*.php'])
    .pipe(phpcs({
      standard: 'moodle'
    })) 
    .pipe(phpcs.reporter('log'));
});

Invoked from the command line, we get the same results as from the web interface, but faster and without the overhead:

[10:24:21] PHP Code Sniffer found a problem in ../theme_stellar/layout/default.php
Message:
 Error: Command failed: 
 
 FILE: STDIN
 --------------------------------------------------------------------------------
 FOUND 0 ERROR(S) AND 3 WARNING(S) AFFECTING 1 LINE(S)
 --------------------------------------------------------------------------------
 76 | WARNING | Inline comments must start with a capital letter, digit or
 | | 3-dots sequence
 76 | WARNING | Inline comments must end in full-stops, exclamation marks, or
 | | question marks
 76 | WARNING | This comment is 67% valid code; is this commented out code?
 --------------------------------------------------------------------------------

This also lets you create watcher tasks to catch errors introduced while developing.

Wait, let me finish!

This summer we have our student worker building out a set of Behat tests for our WordPress environment. We’ve started with smoke tests. For example, on www.lafayette.edu we’re looking at the following:

  • Are there news items? If so, do the links to those items work?
  • Are there calendar events? If so, do the links to the events works?
  • Does the “Offices & Resources” drop-down function? Do the links in that drop-down work?

That’s a short list of tests but it covers a lot of ground:

  • The RSS feed validity between the main site and the news site
  • The RSS feed validity between the main site and the calendar
  • Whether Javascript still works on the main site
  • The proper functioning of every link in the drop-down

If any of these tests fails there’s a non-trivial problem with the main page. In the first iteration, we ran into a problem with testing the links in the drop-down. This was the original test:

                When I click on "#navResources-toggle" 
                And I click the link <link>

This was within a Scenario Outline testing each link. It failed, each time, with some variation of the following:

 Exception thrown by (//html/.//a[./@href][(((./@id = 'foo' or contains(normalize-space(string(.)), 'foo')) or contains(./@title, 'foo') or contains(./@rel, 'foo')) or .//img[contains(./@alt, 'foo')])] | .//*[./@role = 'link'][((./@id = 'foo' or contains(./@value, 'foo')) or contains(./@title, 'foo') or contains(normalize-space(string(.)), 'foo'))])[1]
 unknown error: Element is not clickable at point (573, -163)

Googling suggested fiddling with the click location, which didn’t feel right. Triggering a drop-down menu and clicking a link is a simple enough use case. Simple problems should have simple answers.

Turns out this is a race condition and it reveals something about behavioral testing. The drop-down menu on the main page doesn’t open right away. We have some easing, timeouts, and animation which all mean that it takes a second or so to finish loading. During that time the links are actually moving from their starting point at the top of the page. Go try to clicking on the menu and you’ll see what I’m describing. This means that a normal user will wait for 1-2 seconds before clicking a link. We didn’t write the test that way, which meant that the location of link changed from the time we told Behat to click it and when Behat tried to click it.

The solution? Write the test like Behat is an actual user and build in that delay:

                When I click on "#navResources-toggle"
                And wait 2 seconds
                And I click the link <link>

The order of operations matters. Now, Behat doesn’t click the link until two seconds have passed, at which point the drop-down is done expanding and the links are in their final location.

The Monkey Hustle

I first saw Monkey Hustle at the 2004 B-Fest and I enjoyed more than any other blaxploitation film I’ve seen since, there or elsewhere. It holds a 4.8 on IMDb as of writing and was panned on its release. I’m here to tell you that it’s a good film and the critics be damned.

Poster_of_the_movie_The_Monkey_HustleIn a nutshell, Monkey Hustle is about various characters in a Chicago neighborhood, their interactions, and the looming threat of a new expressway (tapping in to the freeway revolts of the 1960s and 1970s). Monkey Hustle‘s detractors argue that the plot, such as it is, doesn’t hang together and that most of the scenes don’t relate to each other and make little sense. This is all nonsense. What we’ve got here is a film loaded with subtext, with characters who don’t know they’re in a movie and don’t feel a need to explain themselves.

Look at Daddy Fox (Yaphet Kotto) and Goldie (Rudy Ray Moore). No one tells the audience that, though rivals, they go way back and that Fox has some kind of claim over Goldie. We get that from their interactions. In the climax of the film Fox and Goldie use their connections to divert the neighborhood-threatening expressway. A lesser film would have told us some pointless story about how Goldie saved the alderman’s life (alluded to) or how the alderman owed Fox some favor. In the Monkey Hustle, it’s sufficient that they exercised their influence. Look at the melancholy expression on Goldie’s face at the block party–it cost him something to make this happen.

Much of the film is taken up with the small change of neighborhood life. Characters move in and out; threads are begun and abandoned. One critic leveled the charge that no one in the Monkey Hustle grows as a character. I’m not sure that’s true (the relationship between Win and Vi is one example), but let’s address that head-on. It’s less than a week in the life of a Chicago neighborhood. How realistic would it be for any of the characters, let alone a preponderance, to grow in that span, and to also reflect on it for our benefit? The older characters (Fox, Goldie, the Black Knight, Mr. Molet) are set in their ways–they aren’t going to change. Fox even says as much to Goldie, who upbraids him for refusing to get out of the small-time hustle (“Foxy, you’re my main man! You’re my main man!”)

The film was shot entirely in Chicago’s South Side in the mid-1970s and looks it. Several scenes take place in the now-demolished LaSalle Street Station. Along with The Sting (1973), it has to be one of the last films ever shot there, and possibly the only one in a contemporary setting. This also introduces a small goof when the band returns at the start of the film from a long tour by way of LaSalle Street, which by then handled only commuter traffic and the two remaining long-distance trains of the Rock Island. I hope the band enjoyed the Quad Cities and Peoria because that’s as far as they got.

There are problems, no doubt. Whatever the subtleties of the relationship between Fox, Goldie and the alderman Chicago’s politics did not and do not work that way, a point that Chicagoan Roger Ebert made in his own review (he panned it as well, while noting it did good business). I don’t see this as a major problem. Monkey Hustle is a slice-of-life feature; while a major event in the neighborhood is the expressway it is not the only event and does not upstage everything. We see a proto-community organizer several times; perhaps he had some successes of his own. A lesser film would give him a scene with someone as the film is wrapping up in which he discusses his victory, ignoring that in real life we don’t always get to champion our successes as they happen.

It’s an enjoyable flick and much better than its reputation. Go watch it on Netflix and see what you think.

Hard Ticket to Hawaii

Hard Ticket to HawaiiI need to say a few words about the late Andy Sidaris (note the spelling–no relation to David Sedaris). Sidaris forged a successful career in television, including 25 years with ABC’s Wide World of Sports, before striking out on his own in his mid-50s to write, produce and direct a series of B-grade action movies which today are known collectively as the Triple-Bs (“Bullets, Bombs, and Babes”). All of his films followed a basic formula; Hard Ticket to Hawaii was the second of the series and probably the best of the lot.

Your typical Sidaris flick has a couple female heroines (usually former Playboy playmates), some over-the-top baddies with mullets, and a bunch of cool-if-unnecessary gadgets. Sidaris loves him some gadgets. This flick features a large, remote-controlled helicopter that is somehow integral to the plot. Why? Probably because Sidaris either owned it or knew someone who did. Lots of stuff in this movie (like the cross-dressing assassin) has the feel of “hey, I know a guy who can do x“). Oh, and it’s all set in Hawaii, probably because Hawaii’s a nice place to be when you’re indulging yourself.

The plot, such as it is, involves a smuggling ring operating in the Hawaiian islands and the efforts by agents of an unnamed government agency to thwart them. You don’t watch a for the plot but rather for the absurdities contained within. The fight scene below, whose entire conception is absurd yet delightful. The subplot involving a toxic snake, of which I dare not reveal more. The ludicrous subplot involving Sidaris playing a version of himself producing a football show. The random martial arts stuff, since it’s an ’80s movie and they do that. The sublimely banal, badly-written dialogue. The cheerfully gratuitous nudity.

I first saw this at the 2010 B-Fest. It was in the 3 AM slot; right after The Room (which, happily, I’ve fallen asleep in front of no less than three times). 3 AM usually has real crap in it. The year before was Zardoz. Looking back I don’t even remember most of what was shown then, which means I feel asleep before that movie came on. This one was different. Everyone was awake and laughing madly at the spectacle before them. This might be the best B-movie I’ve ever seen. It’s in close competition with The Monkey Hustle and Plan 9 From Outer Space. It’s just fun.

Dark Side of the Moon

Dark Side of the MoonI’ve referred to Dark Side of the Moon in several previous reviews, so it’s probably time it got its own. Let’s state the important things upfront: it’s a lesser rip-off of Alien, it’s 85 minutes but feels longer, and I’d pay real money to see the crowd reaction to it at B-Fest.

In a nutshell, in turns out that Satan has set up shop on the far side of the Moon, and is terrorizing ships which wander into an ill-defined corridor between the Earth and the Moon which corresponds to the Bermuda Triangle. There’s an involved, badly written, inappropriately scored scene involving the film’s hero and numerology which explains all this, to the mounting horror of cast and audience alike.

That out of the way, the film has a reasonable B-movie pedigree. Robert Sampson (Robot Jox, Re-Animator) plays the ship’s pilot. John Diehl (Stargate) is…some crewmember. Never doped out what he does. The great Joe Turkel (Blade Runner, The Shining) plays the computer operator/engineer.  The model work is better than expected. Possessed members of the crew have evil green eyes, which is overused but effective at times (especially Turkel). Even the ship’s “Mother” (Alien) rip-off, an android named Lesli, is an interesting take on the concept if underdeveloped.

Still, it’s not very good. If you’re going to sell this crap you need better writing and better performances. Even good actors can only do so much with bad material, and these are (mostly) not good actors. The big reveal, which you see coming from a mile away, is ludicrous. The movie plods unforgivably. The laws of physics, important to space travel, take a real beating.

It’s worth seeing only if you believe my theory that it’s a missing link between Aliens on the one hand, and Ghost Ship and Event Horizon on the other.

Alien Predator

Following on from the screening of Creaturetonight’s selection provoked an argument five minutes in about who the hell selected it, and why. Liz having confessed to the deed, we moved on to speculating whether the entrails on-screen were real or especially good creature effects. Taking note of the quality of the entrails and the filming location (Spain) we decided they were real.

This is the first film by Deran Sarafian, who’s now chiefly known for his work on House, M.D. He’s come a long way. I learn from the credits that it was adapted from an original screenplay titled “Massacre at R.V. Park.” Aside from the lead characters (three American college students), everyone appears to be Spanish. Twenty minutes in as we watch a chicken meet its fate execution-style we suspect it was shot in Spain solely to get around American regulations. That or a tax dodge.

Anyway, what we’ve got here is a Spanish rip-off of The Andromeda Strain, but with an actual monster. On first glance this is a winning formula: enliven a portentous American film with additional action sequences and (one assumes) cheap exploitation. That’s what the Italians would have done. Instead the whole thing is weighed down by a badly-acted, badly-written subplot (main plot?) involving the three American students, including Lynn-Holly Johnson (as seen as James Bond’s spurned teenage love interest in For Your Eyes Only, another cringe-worthy performance). The other two are interchangeable brotards.

It has the same crazy-people village shtick as Gymkata, but it’s much less effective here. Since both films were shot in 84-85 it’s unclear to me whether one stole from the other or it’s just a case of parallel development. That, or there’s a village full of crazy people in Europe. There’s also no cheap exploitation. It’s not that I feel cheated. It’s just that if a film fails first as a science fiction film and then as a horror film as a viewer I start looking for a backend. There just isn’t one. All the characters are boring, loathsome, or one-shots, and none of their actions make any sense. Also most of them are dubbed incompetently. They talk in whispers when no one’s around and slowly during matters of urgency.

There’s a venerable tradition at B-Fest of shouting “WORDS!” at the screen during long, meaningless stretches of dialogue. We did a lot that watching this. It drags terribly. There’s a weird cross-narrative involving cars. Inexplicably cars repeatedly try to ram our main characters. We never see the drivers. These scenes aren’t really remarked on in-film and feel disconnected. Many scenes are shot in the characters’ RV. We get long, loving shots of it being driven from place to place.

It’s a pity that so much of the film is so awful–the creature effects are well done and used to good effect. The filmmakers are careful about revealing the creature. There’s one scene in particular where a sort of ground fog obscures it, but you see ripples in the fog. I liked that. I didn’t like much else. I don’t know why we finished it; possibly from a shared sense we might see it at B-Fest someday and it’s best to know what you’re in for.

Creature

It took two tries for Liz and me to watch this, according to Netflix. We don’t remember it; we definitely didn’t finish it. I don’t know why she wants to watch it; I’m just fascinated to see Klaus Kinski in a film not directed by Werner Herzog. The only other actor I recognize is Lyman Ward, one of those actors who just screams ’80s (you saw him as Ferris Bueller’s dad). The director, William Malone, is new to me. This was his first feature; most of his later work is in television.

CreatureI’d like to welcome our readers to yet another Alien rip-off. I’ll give this one odds against Dark Side of the Moon; to cover the spread it needs something better than Satanic Joe Turkel. Doesn’t sound like much but it’s a standard. In this film the planet is Titan and the MacGuffin is some kind of cylinder that apparently has bad stuff in it. In a wrinkle, there are two greedy mining companies instead of one. There’s also a character who’s either an android or the ultimate frosty female security officer.

The opening effects work rips off 2001 and then doubles down by ripping off Blade Runner’s soundtrack. Some of the foley sound is ripped off from Star Wars. Why a freighter landing sounds like an X-wing is anyone’s guess. After a few shots in space we’re on Titan and into what I assume is a cinematographer’s nightmare: dark shadows, flashing lights, ground fog, and indistinct corners. For all I know this was a shot in the basement of Pardee Hall with the lights out (now there’s a plot). This is such a cheat and it drives me nuts. Aliens, which came out a year later, managed dark shooting while still showing stuff on screen. LV-426 was a brooding, menacing locale. This just looks cheap.

Long stretches of boredom were finally interrupted by a crazed Klaus Kinski trying to sex up the android security officer, who then pointed a gun at him. It’s hard to take that scene seriously when you recall the stories of Werner Herzog pointing a gun at Kinski during the filming of Aguirre. Herzog’s never really denied that it happened. Kinski gives a decent performance as a German scientist (greedy company #2) that’s far, far better than the material. What the hell is he doing in this, three years removed from Fitzcarraldo?

This movie scored a 41 on the “End Scale.” This is when you pause a film in Netflix to see (a) how far you’re in and (b) how much more you have to endure. I checked 41 minutes in to Creature, and discovered we weren’t even halfway done. According to Liz this caused a pathetic whimper. I can’t deny it. Even Alien Predator scored somewhere in the low 50s. Oh the WORDS in this movie. It might be speech but it’s not communication.

There are too many characters for how little development they get. I can barely tell them all apart, and this isn’t helped by the ones who get offed earlier in the film coming back as zombie alien assassin familiars or some such. Hell if I know. About the only thing I can give the film credit for is making Lyman Ward’s corporate scumbag somewhat three-dimensional (when it all goes to hell he decides to just fight the alien instead of being craven).

Also the android character just disappeared. There’s this whole subplot with her requisitioning sedatives in the beginning of the film and it just goes nowhere. Even the characters in the film wonder where the hell she went. She finally appears at the end, explaining lamely that she “got lost.” And she’s not actually android. What the hell.

The film sort of redeems itself with a cheesy callback to The Thing From Another World. Sort of. Not really. Not at all actually. The end fight scene is ludicrous as you find out why you never see the creature. It’s really, really bad.

Run. As fast as you can.

Millennium

The late Lord Blake, attacking the unenviable task of evaluating Benjamin Disraeli’s skill as a novelist, recalled the Oxford concept of the “alpha/gamma” grade. Long story short, a reviewer would award this grade when confronted with brilliance mixed with baffling incompetence.

That’s how I’m feeling about Millennium right now. The concept has similarities to the inferior Freejack (though it’s been years since I watched that): humans from the 30th century are retrieving people from airline crashes right before they die, leaving the flow of history uninterrupted. Our main characters are an NTSB investigator (Kris Kristofferson), an operative from the 30th century (Cheryl Ladd), and a physicist (Daniel J. Travanti, best known as Captain Furillo from Hill Street Blues).

MillenniumThings are bad in the 30th century. The environment is severely degraded and all of humanity is barren. The people of the 30th century intend to use time travel to take people from the past who won’t be missed and then send them into a far future where the Earth is (presumably) more livable. That hangs together as far as that goes but I would think that a society which has mastered time travel could also master space travel and drop a colony somewhere. Pale blue dot and all that.

Anyway, as with most time-travel movies, the A plot revolves around a potential time paradox. That’s okay as far as that goes. The B plot, centered around the awkward relationship between Kristofferson and Ladd, really drags down the middle third of the movie. The effects work is variable; the opening air crash isn’t very convincing (in fairness, it’s better than the crash in Air Force One), but the time-travel effects look good. The makeup on the 30th century mutations is pretty darn good.

I want to like this movie. I think I did like this movie. Yet there are things that bug me. Travanti’s physicist is important but doesn’t have enough screen time. The concept of “time quakes” isn’t well-explained; why a temporal paradox would cause cascading destructive effects in the 30th century (but nowhere else?) isn’t explained either. Too much is elided in the final act. The character of Sherman the Robot is poignant, but underdeveloped. There’s also at least one inexcusable deus ex machina in the closing minutes.

It’s on Netflix; if you’re at all attracted to science fiction/time travel/Kris Kristofferson it’s worth a look. I think it’s better than director Michael Anderson’s other futuristic science fiction film, the overrated Logan’s Run.

« Older posts Newer posts »