quinta-feira, novembro 30, 2017

The Risks of Universal Enfranchisement: "Starship Troopers" by Robert A. Heinlein



Word of warning. I’m going to discourse both on the book and on the Verhoeven’s movie.

He didn't include them as "grunts" probably because the training was sufficiently hard that most wouldn't have made it. If you read the description of the training it wasn't just 12 weeks square-bashing, it reads far more like Special Forces.

It might also have been because he was paying lip service to a society kind of modelled on 50s America where the ladies were the home-makers and females in the frontline weren't even on the radar.

However, having said that, we have the fabulous line about females in high rank and esteem:

"If the Almighty ever needs a hand to run the universe: hot ship pilot Yvette Deladrier" after Starship commander Deladrier brakes her ship's orbit to recover a lander that has blasted off late and which otherwise would miss rendezvous and all on board would perish. I’ve heard from a lot of my friends saying the movie version is utter shit. I’m not so sure. The thing is, Verhoeven was a master of taking existing texts and subtly pushing them into satire by overdoing Hollywood/MTV filming tropes. The viewer was encouraged to look at the films as broad entertainment and then ask what the actions of the heroes had to do with American culture. He did the same with Joe Eszterhas's scripts for “Basic Instinct” and “Showgirls”. “Basic Instinct” is a detective story where the 'hero' is someone who's already gotten away with murder because of his badge, and who shoots another innocent victim before the film is out, while the 'villain' is never actually shown to kill anyone. She's chiefly a suspect because of her sexuality (which is why GLAAD picketed the film) and lack of shame about it. “Showgirls” meanwhile depicts a vision of Las Vegas as a patriarchal dystopia where every woman is judged on her body and literally every male character is a predator of some kind. The fact the film is framed as a “Star is Born” story is even better when you consider all the revelations going on in Hollywood right now. If anything, it's timelier than Starship Troopers.

The movie is the opposite of the book. The movie is not in earnest, the book is. It's probably a failure of Verhoeven's in that respect. “RoboCop” was seen as a satire from the get-go. I don't think there are enough sign-posts in “Starship Troopers” to stamp it as a satire outright, although it clearly is in hind-sight.

Verhoeven's early life was under the Nazis. When the movie came out Iwas on an internet forum and we were relentlessly trolled by a few young Americans who took it seriously as an action film, as some kind of heroism to emulate. It was actually a while before the film was released in the Portugal, so I didn't have much to say until I saw it. That's when the satire was obvious to me, but I also realised how teenagers would just go with the fascism (not even realising it was fascism) and feel it was a good thing. The problem was that, just as in “Robocop” (and “Showgirls”, to be honest), Verhoeven's satire comes within some superb plotting and film design that, if one is not careful, might actually seem sincere. Unbelievably, a lot of critics just didn't get it at the time, especially American film critics. I wonder if they didn't want to get it - far too close for comfort to an attitude among many in American society (and not just American society): a simplistic good versus evil narrative with the only solution being to crush the evil-doers with overwhelming force.

As to the accusation that Heinlein was a fascist, you need to remember that he wrote most of his works over fifty years ago, in a VERY different world from ours. I want to say, he was the first one to have a Japanese American Hero - Jeff Mitsui in "Sixth Column", the first to have a Hispanic hero - heck a bunch of them - in "Starship Troopers" - Juan and Simon Rico, Carmen Ibanez, David "Dizzy" Flores - all of them quite literally "white-washed" by that never-to-be-sufficiently-smartaleck Verhoeven in the movie. Col Dubois and "Ace" Smith were both black in the book, but "White-washed" in the movie. In "The Star Beast" - the true hero was the Assistant Secretary General of the United Nations, Samuel Kikui, a Masai tribesman from Kenya, with a Doctorate from Cambridge. In "Stranger in a Strange Land" - Judge Jubal Early spoke Arabic, "because he wanted to read the Quaran in the original Language of the Prophet." As I said, the book was written in the 1950's so must be read in the context of that time - not 'fiercely rightwing' at all. Robert Heinlein's attitudes changed as the times changed - communes and homosexual love featured in his books and not in a negative way. I feel the book and movie are far too divergent to reasonably discuss both as if they were the same. Each is its own standalone message and art. It's similar to the Japanese movie Kairo and its American remake “Pulse”. Even though both included a similar starting premise and “Pulse” even had some exact shot-for-shot scene recreations from the original, the stories diverge wildly and both show a very distinct difference between the cultures in how they tell stories and what they tell stories about. But "Heinlein is a conservative, white fascist" because that is a useful shibboleth for those who get their information from other people, who are too busy to actually read what they are condemning. Heinlein had a long fascination with the risks of universal enfranchisement. This is of a piece with American concerns about majoritarianism. In “Expanded Universe”, he goes through a few ways in which the right to vote might be restricted in aid of better governance and decision making. My favourite example is his suggestion that only women be allowed to vote, because men have made such a god awful mess of things for such a very long time. It's never clear how serious he's being, except insofar as he is concerned that democracies often make idiotic decisions (alluded to in “Stranger in a Strange Land”, also). And honestly, in this world of Trump and Brexit, he's got plenty of company, even if lots of us still hew to Churchill's dictum in the end. Because of a few "brain bugs" is considered a fascist? The mass insects were brainless ferocious foot-soldiers. Round these parts, of course they'd be considered misunderstood and victimised. The humans weren't great, but we can’t make the bugs to be the good guys, right? The future Earth depicted in “Starship Troopers” didn't have nationalities just a common Earth citizenship. Plus men and women of multiple races fighting and showering together. What could be more democratic? Epic comprehension malfunction on the part of some of the readers, so to speak.

Piece of advice. Don't watch the film - read the original book! It predates the film about 40 years and - shock, horror - in the book our hero Rico is of good, solid South-American stock (as is the school's math-wiz, Juanita, on which Rico has a mild crush). Worse, he doesn't get the girl. Nobody dares tell Donald, in case he would reach for his tweeter...

Heinlein speaking as Heinlein put his money where his mouth was - joining the navy and serving his country. As a volunteer; he memorably denounced conscription under any circumstances as slavery.

quarta-feira, novembro 29, 2017

Argghh, Just One More Go Mum: "Exploring Tetris On My Own"



"but...but...the Spectrum is for educational purposes Mum! Honest, look it comes with a game called Chess and Scrabble!"


Ping pong, Pacman, Defender, Elite, Sabre Wolf, Manic Miner, Jetset Willy, Tekken Sensible Soccer, Mario, Sonic, NHL, PES, Fifa, COD, Forza, Dirt, Bubble Burst, Candy Crush, Donald Trump, Mickey Mouse... Never affected me in anyway whatsoever, thinking back, I still haven't handed in my Technical Drawing homework due in 1985. "Argghh, just one more go mum."


I grew up with a commodore 64 and ZX Spectrum. I use to play games obsessively, especially Elite but it never impacted my social and family life. Apart from a bit of cop killing and drug, slave and alien artifact trading here and there I have grown up to be a well rounded member of society

I seem to be the only person in public spaces sitting staring into space, thinking without a device of some kind. Looking at other people using their phones, it seems that we're at the point where they're virtually programmed to reach for their phones as soon at every conceivable opportunity without even thinking about it. Often going through the same cycle, checking text, mail, news. Seems the whole concept of independent reflection has gone out the window.

In fairness sitting by yourself and staring into space in public was considered a bit odd even before computer games and smart phones. I feel the same way about people who can only run if they do so with headphones, that on some level they are saying 'Running is crap and I need this ear candy to make it bearable'.

It just depends if you have an addictive nature or not. Everyone's brains are wired differently. Our brains goe haywire with dopamine and serotonin whenever we receive a positive feedback. Doesn't matter if it's a blackjack, some under 20 team in Uzbekistan winning, landing a dragon punch in SFII, scoring a Tetris, looking at porn, reading or writing reviews... I'm just a born addict and will keep on doing that thing, usually addictive stuff.

Tetris. Ah. Those were the days...It's a beautiful game except when the pieces start falling faster. I always played with the sound off to reduce the stress but the pile-up . . . (deep breath) . . . .is always on the horizon . . . (deep breath) . . . .(deep breath) . . . .(deep breath) . . . .

What follows is something I concocted to while away the time when I was dealing with tossers I won't say where...

NB: Next step is porting the the following Tetris Engine to Android, which is already under way. The hard part is finished (e.g., collision detection, rotation matrices, and so forth).

Python Tetris Engine:


import simplegui
import random

BACKGROUND_COLOR = "White"
WIDTH = 700
HEIGHT = 600
BOARD_WIDTH = 10
BOARD_HEIGHT = 20
BOARD_UPPER_LEFT = (300, 75)
BLOCK_SIZE = 25
START_POSITION = (3, 0)
gameInPlay = False
score = 0
time = 0
vel_y = 0
next_piece = None
speed = 15

# global game objects
piece_O = None
piece_I = None
piece_T = None
piece_L = None
piece_J = None
piece_S = None
piece_Z = None
piece_B = None
board = None
pieces = None
pos = [10, 10]
current_piece = None

# test shape of one block
SHAPE_ONE_BLOCK = ["X"]
SHAPE_ONE_BLOCK.append("B")
SHAPE_ONE_BLOCK.append("Green")

SHAPE_O_0 = [["O", "X", "X", "O"],
             ["O", "X", "X", "O"],
             ["O", "O", "O", "O"],
             ["O", "O", "O", "O"]]
temp = []
temp.append(SHAPE_O_0)
temp.append(SHAPE_O_0)
temp.append(SHAPE_O_0)
temp.append(SHAPE_O_0)
SHAPE_O = []
SHAPE_O.append(temp)
SHAPE_O.append("O")
SHAPE_O.append("Yellow")

SHAPE_I_0 = [["O", "O", "O", "O"],
             ["X", "X", "X", "X"],
             ["O", "O", "O", "O"],
             ["O", "O", "O", "O"]]
SHAPE_I_1 = [["O", "X", "O", "O"],
             ["O", "X", "O", "O"],
             ["O", "X", "O", "O"],
             ["O", "X", "O", "O"]]
SHAPE_I_2 = [["O", "O", "O", "O"],
             ["O", "O", "O", "O"],
             ["X", "X", "X", "X"],
             ["O", "O", "O", "O"]]
SHAPE_I_3 = [["O", "O", "X", "O"],
             ["O", "O", "X", "O"],
             ["O", "O", "X", "O"],
             ["O", "O", "X", "O"]]
temp = []
temp.append(SHAPE_I_0)
temp.append(SHAPE_I_1)
temp.append(SHAPE_I_2)
temp.append(SHAPE_I_3)
SHAPE_I = []
SHAPE_I.append(temp)
SHAPE_I.append("I")
SHAPE_I.append("LightBlue") ##ADD8E6

SHAPE_T_0 = [["O", "X", "O"],
             ["X", "X", "X"],
             ["O", "O", "O"]]
SHAPE_T_90 = [["O", "X", "O"],
              ["X", "X", "O"],
              ["O", "X", "O"]]
SHAPE_T_180 = [["O", "O", "O"],
               ["X", "X", "X"],
               ["O", "X", "O"]]
SHAPE_T_270 = [["O", "X", "O"],
               ["O", "X", "X"],
               ["O", "X", "O"]]
temp = []
temp.append(SHAPE_T_0)
temp.append(SHAPE_T_90)
temp.append(SHAPE_T_180)
temp.append(SHAPE_T_270)
SHAPE_T = []
SHAPE_T.append(temp)
SHAPE_T.append("T")
SHAPE_T.append("Purple")

SHAPE_L_0 = [["O", "O", "X"],
             ["X", "X", "X"],
             ["O", "O", "O"]]
SHAPE_L_1 = [["X", "X", "O"],
             ["O", "X", "O"],
             ["O", "X", "O"]]
SHAPE_L_2 = [["O", "O", "O"],
             ["X", "X", "X"],
             ["X", "O", "O"]]
SHAPE_L_3 = [["O", "X", "O"],
             ["O", "X", "O"],
             ["O", "X", "X"]]
temp = []
temp.append(SHAPE_L_0)
temp.append(SHAPE_L_1)
temp.append(SHAPE_L_2)
temp.append(SHAPE_L_3)
SHAPE_L = []
SHAPE_L.append(temp)
SHAPE_L.append("L")
SHAPE_L.append("Orange")

SHAPE_J_0 = [["X", "O", "O"],
             ["X", "X", "X"],
             ["O", "O", "O"]]
SHAPE_J_1 = [["O", "X", "O"],
             ["O", "X", "O"],
             ["X", "X", "O"]]
SHAPE_J_2 = [["O", "O", "O"],
             ["X", "X", "X"],
             ["O", "O", "X"]]
SHAPE_J_3 = [["O", "X", "X"],
             ["O", "X", "O"],
             ["O", "X", "O"]]
temp = []
temp.append(SHAPE_J_0)
temp.append(SHAPE_J_1)
temp.append(SHAPE_J_2)
temp.append(SHAPE_J_3)
SHAPE_J = []
SHAPE_J.append(temp)
SHAPE_J.append("J")
SHAPE_J.append("DarkBlue") #00008B

SHAPE_S_0 = [["O", "X", "X"],
             ["X", "X", "O"],
             ["O", "O", "O"]]
SHAPE_S_1 = [["X", "O", "O"],
             ["X", "X", "O"],
             ["O", "X", "O"]]
SHAPE_S_2 = [["O", "O", "O"],
             ["O", "X", "X"],
             ["X", "X", "O"]]
SHAPE_S_3 = [["O", "X", "O"],
             ["O", "X", "X"],
             ["O", "O", "X"]]
temp = []
temp.append(SHAPE_S_0)
temp.append(SHAPE_S_1)
temp.append(SHAPE_S_2)
temp.append(SHAPE_S_3)
SHAPE_S = []
SHAPE_S.append(temp)
SHAPE_S.append("S")
SHAPE_S.append("Green")

SHAPE_Z_0 = [["X", "X", "O"],
             ["O", "X", "X"],
             ["O", "O", "O"]]
SHAPE_Z_1 = [["O", "X", "O"],
             ["X", "X", "O"],
             ["X", "O", "O"]]
SHAPE_Z_2 = [["O", "O", "O"],
             ["X", "X", "O"],
             ["O", "X", "X"]]
SHAPE_Z_3 = [["O", "O", "X"],
             ["O", "X", "X"],
             ["O", "X", "O"]]
temp = []
temp.append(SHAPE_Z_0)
temp.append(SHAPE_Z_1)
temp.append(SHAPE_Z_2)
temp.append(SHAPE_Z_3)
SHAPE_Z = []
SHAPE_Z.append(temp)
SHAPE_Z.append("Z")
SHAPE_Z.append("Red")

class Board():
 
    def __init__(self, upper_left_corner):
        self.upper_left = upper_left_corner
        self.upper_right = (upper_left_corner[0] + (BLOCK_SIZE * BOARD_WIDTH), self.upper_left[1])
        self.lower_right = (upper_left_corner[0] + (BLOCK_SIZE * BOARD_WIDTH), self.upper_left[1] + (BLOCK_SIZE * BOARD_HEIGHT))
        self.lower_left = (self.upper_left[0], self.upper_left[1] + (BLOCK_SIZE * BOARD_HEIGHT))

        # setup grid
        self.grid = []
        for i in range(BOARD_HEIGHT):
            row = [None] *  BOARD_WIDTH
            self.grid.append(row)
     
    def draw(self, canvas):
        for c in range(BOARD_WIDTH):
            for r in range(BOARD_HEIGHT):
                if self.grid[r][c] != None:
                    block = self.grid[r][c]
                    draw_block(canvas, (self.upper_left[0] + (BLOCK_SIZE * c), self.upper_left[1] + (BLOCK_SIZE * r)), 1, BACKGROUND_COLOR, block.get_color())
        canvas.draw_polygon((self.upper_left, self.upper_right, self.lower_right, self.lower_left), 1, "Black")

    def fill(self, pos, piece):
        self.grid[pos[0]][pos[1]] = piece
     
    def empty(self, pos):
        self.grid[pos[0]][pos[1]] = None
     
    def isEmpty(self, pos):
        return (self.grid[pos[0]][pos[1]] == None)
 
    def isRowFull(self, row):
        for col in range(BOARD_WIDTH):
            if self.grid[row][col] == None:
                return False
        return True
 
class Piece():
    def __init__(self, shape, pos = None):
        self.color = shape[2]
        self.type = shape[1]
        self.shapes = shape[0]
        self.shape_index = 0
        self.shape = self.shapes[0]
        self.width = len(self.shape[0])
        self.height = len(self.shape)
        if pos != None:
            self.x = pos[0]
            self.y = pos[1]
     
    def __str__(self):
        s = ""
        s += "Piece (shape = " + self.type + ", color = " + self.color + ")\n"
        s += " (width = " + str(self.width) + ", height = " + str(self.height) + ")\n"
        for row in self.shape:
            value = ""
            for col in row:
                value += col
            s += value + "\n"         
        return s
 
    def isValidRotation(self, direction):
        if direction == "CCW":
            if self.shape_index == len(self.shapes) - 1:
                idx = 0
            else:
                idx = self.shape_index + 1
        else:
            if self.shape_index == 0:
                idx = len(self.shapes) - 1
            else:
                idx = self.shape_index - 1
        temp_piece = Piece([[self.shapes[idx]], "temp", "Blue"], (self.x, self.y))

        canRotate = True
     
        #Check top side
        for row in range(len(temp_piece.shape)):
            for col in range(len(temp_piece.shape[row])):
                if temp_piece.shape[row][col] == "X":
                    if (temp_piece.y + row) < 0:
                        canRotate = False
                     
        #check down side
        for row in range(len(temp_piece.shape) - 1, -1, -1):
           for col in range(len(temp_piece.shape[row])):
                if temp_piece.shape[row][col] == "X":
                    if (temp_piece.y + row) >= BOARD_HEIGHT:
                        canRotate = False
                     
        #check right side
        for row in range(len(temp_piece.shape)):
            if "X" in temp_piece.shape[row]:
                reversed_row = list(temp_piece.shape[row])
                reversed_row.reverse()
                offset = reversed_row.index("X")
                if (temp_piece.x + temp_piece.width - offset) > BOARD_WIDTH:
                    canRotate = False
     
        #check left side
        for row in range(len(temp_piece.shape)):
            if "X" in temp_piece.shape[row]:
                offset = temp_piece.shape[row].index("X")
                if (temp_piece.x + offset) < 0:
                    canRotate = False
                 
        #check for overlaps
        for row in range(len(temp_piece.shape)):
            for col in range(len(temp_piece.shape[row])):
                if temp_piece.shape[row][col] == "X":
                    if temp_piece.x + col >= BOARD_WIDTH or temp_piece.y + row >= BOARD_HEIGHT:
                        canRotate = False
                    elif temp_piece.x + col < 0 or temp_piece.y + row < 0:
                        canRotate = False
                    elif not board.isEmpty((temp_piece.y + row, temp_piece.x + col)):
                        canRotate = False     
     
        return canRotate

    def rotate_ccw(self):
        if self.shape_index == len(self.shapes) - 1:
            self.shape_index = 0
        else:
            self.shape_index += 1
        self.shape = self.shapes[self.shape_index]
        self.width = len(self.shape[0])
        self.height = len(self.shape)
 
    def rotate_cw(self):
        if self.shape_index == 0:
            self.shape_index = len(self.shapes) - 1
        else:
            self.shape_index -= 1
        self.shape = self.shapes[self.shape_index]
        self.width = len(self.shape[0])
        self.height = len(self.shape)

    def get_color(self):
        return self.color
 
    def get_width(self):
        return self.width
 
    def get_height(self):
        return self.height
 
    def move_left(self):
        canMove = True
         
        for row in range(len(self.shape)):
            if "X" in self.shape[row]:
                offset = self.shape[row].index("X")
                if (self.x + offset) - 1 < 0:
                    canMove = False
                elif not board.isEmpty((self.y + row, self.x + offset - 1)):
                    canMove = False

        if canMove:
            self.x -= 1
         
    def move_right(self):
            canMove = True
         
            for row in range(len(self.shape)):
                if "X" in self.shape[row]:
                    reversed_row = list(self.shape[row])
                    reversed_row.reverse()
                    offset = reversed_row.index("X")
                    if (self.x + self.width - offset) + 1 > BOARD_WIDTH:
                        canMove = False
                    elif not board.isEmpty((self.y + row, self.x + self.width - offset)):
                        canMove = False

            if canMove:
                self.x += 1
     
    def move_up(self):
            canMove = True
         
            for row in range(len(self.shape)):
                for col in range(len(self.shape[row])):
                    if self.shape[row][col] == "X":
                        if (self.y + row - 1) < 0:
                            canMove = False
                        elif not board.isEmpty((self.y + row - 1, self.x + col)):
                            canMove = False

            if canMove:
                self.y -= 1       
 
    def move_down(self):
            canMove = True
         
            for row in range(len(self.shape) - 1, -1, -1):
                for col in range(len(self.shape[row])):
                    if self.shape[row][col] == "X":
                        if (self.y + row + 1) >= BOARD_HEIGHT:
                            canMove = False
                        elif not board.isEmpty((self.y + row + 1, self.x + col)):
                            canMove = False

            if canMove:
                self.y += 1
             
            return canMove
 
    def get_blocks(self):
        positions = []
        for row in range(len(self.shape)):
            for col in range(len(self.shape[row])):
                if self.shape[row][col] == "X":
                    positions.append((self.x + col, self.y + row))
        return positions
     
    def draw(self, canvas):
        for row in range(len(self.shape)):
            pos_y = BOARD_UPPER_LEFT[1] + (BLOCK_SIZE * self.y) + (BLOCK_SIZE * row)
            for col in range(len(self.shape[row])):
                pos_x = BOARD_UPPER_LEFT[0] + (BLOCK_SIZE * self.x) + (BLOCK_SIZE * col)
                if self.shape[row][col] == "X":
                    draw_block(canvas, (pos_x, pos_y), 1, BACKGROUND_COLOR, self.color)
                else:
                    draw_block(canvas, (pos_x, pos_y), 1, BACKGROUND_COLOR, BACKGROUND_COLOR)
 
    def get_position(self):
        return (self.x, self.y)
 
def draw_block(canvas, pos, line_width = 1, line_color = "Black", fill_color = None):
    block = [(pos[0], pos[1]), (pos[0] + BLOCK_SIZE, pos[1]), (pos[0] + BLOCK_SIZE, pos[1] + BLOCK_SIZE), (pos[0], pos[1] + BLOCK_SIZE)]
    canvas.draw_polygon(block, line_width, line_color, fill_color)

def draw(canvas):
    global time
    global gameInPlay
 
    time += 1
 
    if gameInPlay:
     
        if (time % speed == 0):
            piece_moved = current_piece.move_down()

            if current_piece.get_position() == START_POSITION:

                gameInPlay = False


            if (not piece_moved):
                lockdown_handler()
                create_new_piece_handler()

        for i in range(BOARD_HEIGHT):
            check_full_rows_handler()
         
        # draw next piece
        positions = next_piece.get_blocks()

        color = next_piece.get_color()
     
        pos[0] = BOARD_UPPER_LEFT[0] + (BOARD_WIDTH * BLOCK_SIZE)
        pos[1] = BOARD_UPPER_LEFT[1] + 60
     
        canvas.draw_text("Next Piece", [pos[0] + 20, pos[1] - 40], 20, "Black")

        for i in positions:
            draw_block(canvas, [pos[0] + (BLOCK_SIZE * i[0]) - 50, pos[1] + (BLOCK_SIZE * i[1])], 1, BACKGROUND_COLOR, color)
         
    current_piece.draw(canvas)
    board.draw(canvas)
 
    # Game Over Check
    if not gameInPlay:
        width = frame.get_canvas_textwidth("Game Over", 50)
        canvas.draw_text("Game Over", (BOARD_UPPER_LEFT[0] + (BOARD_WIDTH * 0.50 * BLOCK_SIZE) - (width * 0.50), BOARD_UPPER_LEFT[0] + (BOARD_HEIGHT * 0.5)), 50, "Black")
 
    # Instructions
    offset = 275
    text_score = "0000" + str(score)
    text_score = text_score[-4:]
    canvas.draw_text(text_score, (BOARD_UPPER_LEFT[0], BOARD_UPPER_LEFT[1] - 25), 50, "Blue")
    canvas.draw_text("left arrow = move piece left", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 20), 15, "Black")
    canvas.draw_text("right arrow = move piece right", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 40), 15, "Black")
    canvas.draw_text("down arrow = move piece down", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 60), 15, "Black")
    canvas.draw_text("'z' = turn piece counter clockwise", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 80), 15, "Black")
    canvas.draw_text("up arrow = turn piece counter clockwise", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 100), 15, "Black")
    canvas.draw_text("'x' = turn piece clockwise", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 120), 15, "Black")
    canvas.draw_text("'n' = new game", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 140), 15, "Black")
    canvas.draw_text("'space' = drops the piece", (BOARD_UPPER_LEFT[0] - offset, BOARD_UPPER_LEFT[1] + 160), 15, "Black")

def init():
    global board
    board = Board(BOARD_UPPER_LEFT)
 
    global piece_O
    piece_O = Piece(SHAPE_O)
 
    global piece_I
    piece_I = Piece(SHAPE_I)
 
    global piece_T
    piece_T = Piece(SHAPE_T)
 
    global piece_L
    piece_L = Piece(SHAPE_L)
 
    global piece_J
    piece_J = Piece(SHAPE_J)
 
    global piece_S
    piece_S = Piece(SHAPE_S)
 
    global piece_Z
    piece_Z = Piece(SHAPE_Z)
 
    global piece_B
    piece_B = Piece(SHAPE_ONE_BLOCK)
 
 
    global current_piece
    global pieces
 
    pieces = [SHAPE_O, SHAPE_I, SHAPE_T, SHAPE_L, SHAPE_J, SHAPE_S, SHAPE_Z]
 
    current_piece = Piece(random.choice(pieces), START_POSITION)
    global next_piece
    next_piece = Piece(random.choice(pieces), START_POSITION)
 
    global gameInPlay
    gameInPlay = True
 
    global score
    score = 0
 
    global speed
    speed = 15

def move_left_handler():
    current_piece.move_left()

def move_right_handler():
    current_piece.move_right()

def move_up_handler():
    current_piece.move_up()

def move_down_handler():
    current_piece.move_down()

def rotate_ccw_handler():
    if current_piece.isValidRotation("CCW"):
        current_piece.rotate_ccw()
 
def rotate_cw_handler():
    if current_piece.isValidRotation("CW"):
        current_piece.rotate_cw()
 
def keydown_handler(key):
    if key == simplegui.KEY_MAP["left"]:
        current_piece.move_left()
    if key == simplegui.KEY_MAP["right"]:
        current_piece.move_right()
    if key == simplegui.KEY_MAP["down"]:
        current_piece.move_down()
    if key == simplegui.KEY_MAP["up"]:
        if current_piece.isValidRotation("CCW"):
            current_piece.rotate_ccw()
    if key == simplegui.KEY_MAP["z"]:
        if current_piece.isValidRotation("CCW"):
            current_piece.rotate_ccw()
    if key == simplegui.KEY_MAP["x"]:
        if current_piece.isValidRotation("CW"):
            current_piece.rotate_cw()
    if key == simplegui.KEY_MAP["space"]:
        drop_piece_handler()
    if key == simplegui.KEY_MAP["n"]:
        new_game_handler()

def check_full_rows_handler():
    row_to_pop = None
    for row in range(BOARD_HEIGHT):
        if board.isRowFull(row):
            row_to_pop = row
    if row_to_pop != None:
        board.grid.pop(row_to_pop)
        row = [None] *  BOARD_WIDTH
        board.grid.insert(0, row)
        global score
        score += 1
        global speed
        if (score % 5) == 0:
            speed -= 2
 
def lockdown_handler():
    positions = current_piece.get_blocks()
    color = current_piece.get_color()
    for i in positions:
        board.fill([i[1], i[0]], Piece(['X', 'B', color]))

def drop_piece_handler():
    while (current_piece.move_down()):
        pass
    lockdown_handler()
    create_new_piece_handler()
         
def new_game_handler():
    init()

def create_new_piece_handler():
    global current_piece
    global next_piece
 
    current_piece = next_piece

    next_piece = Piece(random.choice(pieces), START_POSITION)

def check_ccw_handler():
    print current_piece.isValidRotateCCW()
             
frame = simplegui.create_frame("Antao", WIDTH, HEIGHT)
frame.set_canvas_background(BACKGROUND_COLOR)

frame.set_keydown_handler(keydown_handler)

frame.set_draw_handler(draw)

frame.start()

init()

terça-feira, novembro 28, 2017

Darkness Changes Nothing: “Replacement” by Tor Ulven



“There’s no point trying to tell yourself that darkness changes nothing; maybe she believes that, maybe she doesn’t, but in any case it’s wrong, because darkness happens, it fills a space, and it could also be full of something like the way a drawer is full of silverware, or the earth is full of insects that scatter in panic when you lift a rotten log, even though darkness could also be a balloon, a balloon filled with black air.”

In “Replacement” by Tor Ulven

Because of its brevity and yet countless fathoms-deep complexity coupled with what is not easy text I tend to consider “Replacement” as an example of a novel that sifts the casual reader from the committed enthusiast. In the same vein as “Heart of Darkness” by Conrad and “Wild Highway” by Bill Drummond & Mark Manning in terms of seriousness of theme in a small expertly packed parcel, but providing a rather more difficult text to engage with,“Replacement” is an significant novel on many levels.

“Replacement” carries a matching authorial mood of darkness that is perhaps the seeds of meta-fiction; you are aware that the style of the telling of the tale is intricately woven into the fabric of the tale itself. The clarity and simplicity of the authorial voices in the two books above-mentioned is not present and you, the reader, are called upon to grapple with the text as part of the experience the book is offering up. And it's a hell of a lot shorter than “Moby Dick”.

I would even go as far as to say that is one of my favourite books of all time, even though I dislike being asked to list my favourite books as I always seems to find it almost impossible to pinpoint five or ten novels that I would recommend above all others. Ulven wrote several very good books but with this one he comes closest to my heart. 'He had something to say. He said it.' This short book should be read in schools and universities , and then re-read and re-read....

I just fear that many great writers will be overlooked and, eventually, unfairly forgotten in the mists of time. Some people insist on the 21st century novels because they are supposedly related to the language they use and the world in which they live. However, literature is not only about new, new, new and modern, modern, modern, but about history, change, freedom... No one should put chains around such complex short stories, novels and novellas written with great skill and understanding. Ulven was ahead of the world and time in which he lived, and wrote, and the darkness that plagued him from within was presented and developed through a masterful narration on many levels (historical, psychological, ethical, asthetical, etc).

A haunting book. Vividly inner settings of the mind, claustrophobic, and full of non-existent-and-self-exculpating characters that Ulven clearly either pitied or despised or both. Are there really characters in this book or is just Ulven’s mind playing tricks on him? Always seems twice or thrice its length simply because of the density of the material and its slow pace - you just canNOT skim read this book!

A verdict on the darkness of the human heart. I love listening to Handel's Messiah at this time of year, which groups together the beautiful passages which speak of Light breaking into darkness, while reading this book was an absolute killer:

'The people walking in darkness
have seen a great light,
on those living in the land of the shadow of death
a light has dawned.'

(Isaiah 9)



segunda-feira, novembro 27, 2017

Fictionalizing Philosopher: “Philip K. Dick and Philosophy - Do Androids Have Kindred Spirits” by Dylan E. Wittkower



‘In Blade Runner, also, it is an authentic relationship to Being that is taken to be what essentially ensouls both humans and replicants. Such is the import of Roy Batty’s famous final soliloquy:
“I’ve seen things you people wouldn’t believe. Attack ships on fire off the shoulder of Orion. I watched C-Beams glitter in the darkness at Tannhäuser Gate. All those moments will be lost in time like tears in rain. Time to die.”’

In “Philip K. Dick and Philosophy - Do Androids Have Kindred Spirits” by Dylan E. Wittkower


I just wanted to say that in my opinion any attempt to construct a coherent interpretation pf Phil Dick’s universe is missing the point. To be able to to construct a Weltanschauung of Dick’s writing we should focus only on philosophy. In all of Dick’s fiction time and causality are of the essence. The point is that, once time and causality become malleable, there is no hope of forming a solid, consistent interpretation of events in Dick’s fiction. That leads to our questioning the Nature of Reality. The focus shifts from epistemology - the problem of knowledge - to ontology - the way different realities are produced. This shift, according to Brian McHale, is precisely what defines the transition from modernism to postmodernism. In its resistance to coherent interpretation, "Ubik" is similar to certain more "literary" works of the 60s, for example the “nouveau romans” of Robbe-Grillet, or Richard Brautigan's "In Watermelon Sugar". (Granted these are very different stylistically). Is it because Dick is writing SF that so many assume the incoherence is sloppiness rather than a deliberate rhetorical strategy?

I think Robbe-Grillet was perhaps deliberately, not just stylistically, trying to put thinking and theorizing about the art of writing into the structure of his novels to create novelty, as writing, which he called “Noveau Roman”. I don't know what Brautigan was trying to do, but Phil Dick's subjects and concerns about reality weren't about writing per se, but about living. I don't think he was trying to deliberately create a new kind of writing or novel. That doesn't mean his works are narrowly interpretable, but many, many SF novels have time travel, space/time warps, and so on, but are interpretable. Interpretations or readings are just perspectives which aren't meant to be the truth, the whole truth and nothing but the truth. Reasonably consistent interpretations are possible, such a everything-is-perfect's Jungian analysis. Works like Phil Dick's makes people want to interpret them and present many overlapping and partial possibilities of interpretation and perhaps ultimate impenetrability.

I have no argument with postmodernism but postmodernism and its theorists don't have a clue what produces realities anymore than anyone else does or ever did, let alone Phil Dick’s. Maybe science will get there one day, but people do with novels what they do with things like 'postmodernism' itself: they talk about them, try to understand more about them, what they are, what they aren't, explain them, how and why they exist, their consequences and so on and so on. The alternative is to remain silent and that is hardly what postmodernists do. What the world is lacking is not the expressed opinions of postmodernism. Anyway I am just saying talking and writing about the meaning of things, whether it is Phil Dick's novels, postmodernism or philosophy itself isn't missing the point. These are postmodern times and we all live in them, but we are still just people. Nobody reads to just say, this is impenetrable or there is no final sense to be had here. Not for long. Why bother?

Having said this, I didn't mean to suggest Dick and Robbe-Grillet are coming from the same angle at all - but where they arrive has some similarities, to my mind. Phil Dick is in fact a humanist from start to finish; Robbe-Grillet is sceptical of humanism; indeed he begins by trying to expunge anthropomorphism from fiction. His starting point is an attempt at objectivity. However, his later work moves away from this and presents deliberately contradictory narratives (roughly from “Project for a Revolution in New York” onwards). As with later Phil Dick, there seem to be several different parallel universes existing in something like quantum superposition.

Dick is interested in simulated realities from very early, but his earlier works (“Time out of Joint” for instance) reveal the reality underlying the illusion. Whilst Phil Dick always believes there is an underlying reality, and an authentic humanity, he becomes increasingly sceptical about our ability to discover it and to discriminate between reality and illusion. Later Dick is full of longing for the transcendental, for final revelation, but he always suffers profound doubt. Certainty is never possible. This is found in his attitude to his religious experiences as well as in his fiction.

Baudrillard seems to be on a similar wavelength here. He asks how certainty is possible in an increasingly mediated reality, where simulation is extremely difficult to distinguish from reality.

I think the rise of modern media has something to do with this interest in ontology and constructed realities from the 60s onwards. Some thinkers - e.g. the critic Darko Suvin - see Phil Dick's move to ontology as decadent; they believe the earlier fiction is more socially engaged, and the later stuff mere metaphysical navel-gazing. I'm not so sure. There is more going on in late Phil Dick than philosophical masturbation, just as later Robbe-Grillet is more than just a literary parlour game.

I am the last person to demand social engagement, or reject it, and coincidentally I am also the last person to find writing that addresses writing itself to be literary parlour games. In fact I prefer the latter depending on the execution. Certainty was abolished long, long ago, and the postmodern world view abolishes it all the more, incorporating it more into our lives as world view AND responding to the technologies that transform our lives and culture, especially of simulation or hyper-reality. Postmodernism has survived as a major interpretation of what all organism do, responding to milieus, explaining and theorizing about them, and, I believe, giving those who do so a VERY great deal of pleasure.

Criticizing Phil Dick as navel gazing or masturbation because he is committed to some higher order of being or reality and not to social engagement is certainly allowable, but such criticism is another perspective in an inevitable babble of perspectives (perspectives now being primarily written). But it is basically moralizing about what some people thing others SHOULD write about, similarizing others to yourself by rejecting their difference. But engaged in what? The politics or economics of hyper-reality? Postmodernism demands nothing of anyone, no one is a better postmodernist than anyone else. Postmodernism, for me, is something we can tap into and use its rhetoric and ideas, but no postmodernist can say my ideas ARE Postmodernism and if you deviate you are excommunicated or relapsed or anything else. Postmodernism permits, I think, religious fundamentalism, as narrow as you like, even if this or that postmodernist does not permit it. The religiomania may not BE a postmodernist of course.

Phil Dick is for me very interesting because his writing is so engaging on a human level while presenting visionary and INTERESTING ideas about reality. I stress interesting, not truthfulness. I am going from memory here (Brautigan is so many decades in my past I can't speak of him) but Robbe-Grillet's later novels, I only read one, I found lacking because, and I do NOT say I'm correct, it wasn't that interesting the way his earlier ones were. Writing about interpenetrating dimensions, and especially if you feel it is a deliberate meta-fictional ploy, isn't that interesting. Like Paul Auster's “Scriptorium” just felt contrived on the basis of theory and while I can't say it's wrong to do that, I can say it left me indifferent. I could use it as a good clear example of meta-fictional writing but as Literature I wouldn't recommend anyone read it, unlike the New York Trilogy. Phil Dick's shifting and interpenetrating realities both catch you up in the writing, AND make you think about them. Reading for just the ideas, you might as well read literary criticism. I definitely like literature that explores fiction and fiction writing as just one of those shifting levels of reality. Borges gives a nice simple model (apparently simple) in his short poem “Chess”, readily available by internet search. But it is hard to carry off as Literature, and not tiresome self consciousness about now rather old literary thinking.

There is so much rhetoric about postmodernism and philosophy in Phil Dick’s books that it constitutes an enormous body of writing, but it can't be turned into a binary system of yes or no where gatekeepers decide on which switch gets pulled. But trying to co opt it in that way is inevitable because we are all too human.

If I had to choose a word to define Phil Dick’s philosophy it would be: "uncertainty". We have lots of realities coming at us and can't choose anything with certainty although we can choose. Phil Dick in his essay “How to Build a Universe That Doesn’t Fall Apart Two Days Later” says:

To quote Xenophanes, another pre-Socratic: ‘Even if a man should chance to speak the most complete truth, yet he himself does not know it; all things are wrapped in appearances.’

We still live in a pretty consistent real world, but for Phil Dick WE DID NOT, i.e., we could be living in interpenetrated time periods. But in the end postmodernism, I think, says there is not definitive real in reality. Postmodernists can say and theorize and explain whatever they choose.

I guess another kind of identification would be with the writer's mind. Poe, in my opinion, addresses this without doing it, in “A Tale of the Ragged Mountains”, where one man's life is remarkably affected, using Mesmerism as the literary vehicle, by another man's writing, so that the first man, Bedloe, actually lives what is being written in real time. Phil Dick indeed has some power to let us look in his mind because he transcribes it, or is it his ideas. Maybe confessional writing does that too. But I am not so sure it is uniquely postmodern. I have thought about this, like in what is going on in Poe, but never quite experienced such a thing myself. I mean he keeps taking us into the minds of seriously disturbed individuals, but is it HIS mind, even part-time.

If you saw the movie “Hitchcock”, I think they were saying that “Psycho” was giving us a view of Hitchcock's mind, that he was having impulses to dark deeds and that is what motivated his film. So in a sense we are seeing into his mind when we see “Psycho”, although maybe we aren't being invited and it is indirect. It's the uncertainty in postmodernism that gives me at least the illusion of intimacy with the author. The stream of consciousness, suddenly appearing and disappearing ideas, thoughts that don't quite make sense and loop back on themselves, plots that don't follow rigid lines, they all give the slightly vertiginous feeling of being present inside a real mind and not just visiting a constructed alternative reality within a novel.

Well, in Phil Dick's case there is that sense of immediacy and seeing the mind of someone who is doing much, much more than just thinking up plots and executing him. But most readers sense it and it certainly seems a part of his genius. It's about ideas, but living ideas.

I must stop. As you have noticed I could write (and talk) about Phil Dick’s work all day long...I won’t bother you anymore.

Bottom-line: Should you read Wittkower’s collection of essays on Dick’s Philosophy and Weltanschauung? Absolutely. But you must be familiar with Phil Dick’s work (or derivatives thereof), mainly “Do Androids Dream of Electric Sheep?”, “Ubik”, “Solar Lottery”, Blade Runner (1982 movie), Total Recall (based on the short-story “We Can Remember It for You Wholesale“), Adjustment Bureau” (based on the short-story “Adjustment Team”, “Time Out of Joint”, “A Scanner Darkly” (re-read in progress), The Valis Trilogy, “The Man in the High Castle”, “Time Out of Joint” at least. I’m going to send this essay to Wittkower to ask him to include it in the book’s next edition...Nah. Just kidding.


SF = Speculative Fiction



domingo, novembro 26, 2017

Goodreads' Censorship: G.R. Reader's Off-Topic




The closest source I have to hand "the doctrine that knowledge, truth and morality exist in relation to culture, society, or historical context, and are not absolute" does seem to cover some of the arguments dealing with Goodreads' censorship. I don't deny that the world's a complex place but when you get down to the nitty gritty I don't see a third space we've carved out for yourselves between relative and absolute values. Literature is not just a social pursuit - if it was, it would be a hobby. Name an education free of the teaching of it in our society? And why would it be universal to our society in that way? It is, in Donne's sense, involved with our social sphere in a way that buying small-gauge railway models is not. But if you are determined that literature is just a social pursuit then indeed, we have no further point to discuss.

Amazon are compelling us. One may wish to view it simply as they are offering each of us a choice, and that if sufficient numbers of us choose then we will have in effect voted to change our society - in ways we may not have considered, in ways we may not want, in ways that a minority of us who have never purchased anything from them are powerless to resist. They are no more compelling us than cigarette manufacturers, or the government, or drug dealers, or manufacturers of greenhouse gases, or the nazis, and so on, and so on. I see the logic of laissez-faire capitalism, even extended to the cultural and social sphere. 

I think choice is worshipped as the paramount right by the penetration of society by the free market. I think we are frequently presented with choice where our freedom to decide is foreclosed: that we are kept "poor" to choose "cheap"; that a rich man's definition of choice is not that of the poor. To a great degree the strengths of civilised society have stepped forward from a balance of rights, not the fetishisation of choice. No one smokes to die: the issue for me is that choice is engineered to facilitate the option for death, because it is financially beneficial to a few, and that generally it is noticeable that those who rate the importance of choice most high, anecdotally, often are not those paying the price.

I would curtail choice when it comes to the issue of global warming because to be the last living thing on earth and to be able to say "Well, they had a choice" is an empty a philosophy as one could wish for.
Have you checked out your local independent book shop recently? Mine is amazing, they can get most books within 24 hours of ordering, they have a loyalty card scheme that over the books purchased more than matches Amazon's discounts. Also they pay their taxes and have happy, engaged staff who are more than happy to talk about books and offer recommendations. Somehow I don't think my local shop is unique.

Goodreads offers a wide choice of buying options, including iBookstore and Kobo (and Amazon, of course). The buying options can also be geo-sensitive, linking to national or regional chains, depending on the user's location. It is a minor part of their offering but Goodreads do sell books. They offer Goodreads authors the chance to sell ebooks directly through Goodreads, at quite favourable terms. It is reasonable to ask why Amazon has found it worthwhile to buy Goodreads. Not doing anything wouldn't make sense - less sense than jeopardising Goodreads' perceived neutrality. The obvious answer is that Amazon are increasing their influence on the whole of the book value chain with a view to funnelling more sales into Amazon. Goodreads and others like it are both the top and tail of the book selling value chain. That is, they are a post-sales forum for readers to air their views. These reviews, EVEN THE CRAPPY ONES, though, can stimulate further sales - or discourage them. Should Amazon want to - and I've no evidence they plan to - they could do subtle things such as create an algorithm which gave prominence to titles with 3+ ratings in their inter-reader updates, thus focusing on titles more likely to stimulate sales. Amazon can afford to have an aggressive ten-year plan and a passive, moderate short-term plan. Certainly they are putting in place everything they need to limit future competition. As far as I was concerned I waited, but I didn't like what they were doing and because of that, I took my "business" elsewhere. And there will always be an elsewhere, no matter how small. The most immediate problem could be for the high street book stores. Best sellers don't really make much difference to Amazon's sales model. An online seller has the same investment, expenditure and return on any given book, regardless of its popularity. For a bricks and mortar bookseller, it makes a big difference. A big part of a highest seller's expense is rental, If you amortise total floor space across available shelving, you can work out the cost of parking a slow seller vs a best seller and the consequent reduction in margin.

Goodread's data sharing for recommendations is painfully superficial (I work in this IT area; I know what I'm talking about), and its attempts at positioning Amazon as a company of passionate book lovers is embarrassing. There may be Amazon employees who "love the fuck out of some books", as I've seen elsewhere quaintly claimed, but there's a vast difference between loving titles and valuing books - and the latter is not theirs to control, but the company's. 

My other reservations are personal and belong in a different discussion.

sábado, novembro 25, 2017

An Operating System for a New World: "The Algorithm of Power” by Pedro Barrento


“ ’Are you saying that ecological balance has been achieved through the collapse of the consumer society, media and democracy?’ ”

In “The Algorithm of Power” by Pedro Barrento

The idea that authors have to know science to write SF is laughably reductive, comically self-important, Mr Science Degree probably, and just provably untrue, as non-scientists Ballard or Banks demonstrated, as but one of many. You can describe a technology without knowing how it works, as a character this might work better than any attempt at omniscience... depends on the book! Exposition can be narcotic but often needs resisting.

We've got 6, no wait 7.5, soon to be 10-11 billion people all shitting in the ocean (metaphorically),  and we've got all kinds of other problems besides global warming. Fixing global warming would just get us on a path to be able to even talk about the root causes (late-stage capitalism and overpopulation) that we can't even mention today without freaking people out. Mostly, but we could get along with many more people if all those people weren't operating under the belief that their lives will only have meaning if they have MORE. The economic system/cult we are busily exporting around the world puts very near zero value on all the valuable things in the world like human life and nature and water and air and our very biosphere, while making greed and waste and obsolescence and evanescent zeroes in bank computers the highest possible aspiration for any human culture. With our values so screwed up, we would still be slowly murdering the planet with a far lower population.

No, the idea of the novel as a piece of esoteric, self-indulgent showmanship aimed at making the reader feel part of some occult intellectual elite is dying a welcome, although belated, death. Barrento's novel is anything but.

Before the 20th century there were many great writers, many who we still consider to be literary giants. Mostly they wrote their novels and their plays to entertain, not as an exercise in intellectual masturbation. Yes, their writing contained high concepts and demanded intelligence and thought from the reader, but that is because the best, most sophisticated entertainment challenges people, not because challenging people is in itself entertaining - in fact iconoclasm and challenge for the sake of challenge is usually juvenile and boring. Even those great writers who wrote for other reasons - to enlighten, to persuade, to educate, were also mindful of the need to entertain and to elucidate, rather than to obscure. Which is why Aristotle and Plato remain largely unparalleled writers of philosophy (their philosophical work may have been surpassed, but not their ability to communicate their thought). People, outside of a dwindling self-proclaimed faux-intellectual elite whose position relies on the veneer of superiority of taste they project, have finally started giving up the pretense of giving a shit about meaningless, dull, drivel, and not before time. I think being challenged is entertaining; the best moments I have had in reading have been when a difficult text finally begins to yield something up, finally begins to make sense for me. That is, of course, a personal preference and, as you correctly point out, I'd rather read Aristotle or Plato than some of the self-reflexive guff pumped out by continental theorists in the 60s & 70s. I don't think challenge for the sake of challenge is particularly entertaining. Being challenged is fun when there is something to be gained from the challenge e.g. satisfaction in besting an opponent, a new understanding of a certain subject, an interesting new perspective, satisfaction in viewing the progress of a character or plot.

Naturally taste is to a degree subjective, and perhaps I am overly dismissive of work that I dislike, but I think that work can be difficult and demanding and also entertaining. I also think it can be difficult, demanding, and have no real merit, or at least little merit taking into the account the effort required to understand or decipher the work. There is no inherent value in being challenged for the sake of it. I was (and still am) curious as to what one may define as "meaningless, dull, drivel", though, as I suspect that the "meaningless" is probably redundant. Ok, there you have a point. To an extent whether someone derives value from a work is a matter for them, therefore to claim that a work is devoid merit is in most cases going to be unfair. I think my forceful words about this are more down to my personal experience in dealing with the type of condescending git who sneers at anything that doesn't bill itself as 'literary', although denying that anyone can find legitimate value in these works I suppose is premature and little better. Any reason to think that writing itself will be around in the future? Once upon a time, not that long ago, people lived without it. In a future of virtual reality and brain to brain interfaces who says it will still be needed? We've gone from oral storytelling, in which small groups made their own imaginative creations from the ever varying iterations of various storytellers - to writing in which one storyteller addresses the imaginations of millions - to cinema in which one storyteller eliminates the need for anyone to imagine anything. Maybe the next step is one story, one storyteller, one humanity, and no ability to imagine anything individually.

To produce difficult literature these days carries with it the stigma of being either anti-social or pretentious rather than being seen as a creative attempt to understand the world or at least, for the more ambitious, one's self. Big words, strange words, nuanced words, new words that open new doors of meaning and association - these are seen as failings rather than achievements, which makes me wonder just how lazily intolerant we are becoming. And this prejudice is coming from readers of the Books section of a rather intelligent portuguese newspaper which, on the whole, one would expect to be more inclined than most people to honour the exploration of our language and applaud attempts to use it to its limits. If you like simple reading, requiring fairly simple thinking, that's all well and good. Enjoy it as much as you can. And, if anyone should be critical of you for doing just that, I shall be among your defenders. Yet, why do you demand the right to simplicity and ease without criticism, but see fit to abuse and criticise those who prefer something different? Why is simplicity fine but difficulty not? Those who complain that some SF is pretentious are an unnecessarily difficult and boringly prolix of smug hypocrites of the worst kind.

We are, perhaps, in worse shape than I thought.

Technology does not equal progress in cultural manners. Our is an era in which high art has been relegated not by middlebrow work (which is also heading toward the sidelines), but rather by the innately vacuous. The tweeted novel, or the online game as narrative is, in nearly all cases, puerile, but these "efforts" seem to offer some immediate gratification. Once upon a time, no one would pretend they were anything but a trifle. Count on your fingers the living writers or choreographers who meet the standards of the ages -- compare that to the number who were working in the first half of the 20th century, the second half. Where is the next Joyce, Woolf, Beckett, Stein, Bessa-Luis or Zukofsky; the next Balanchine, Ashton, Cunningham or Bausch? We do have John Banville, but he keeps slumming on detective fiction. In contemporary poetry, the field is filled with a new type of academic poet -- trained by and for the proliferation of more academic poets -- none of whom seems to know the first thing about language. So long as the schools keep hiring them, they can keep the charade rolling, but for what? A paycheck and the ability to preen (my guess)There's no stopping the trend toward literature's marginalization, but it is very sad. Will this mean that in the future, some hypocrites’ canaries won't have the tools to appreciate the great works (Shakespeare, for instance), and will be satisfied by spreading virtual moon manure over patches of digital daisies on Mars?

Think we live in an age of fast pace and the novel has to and is changing to ride that. Look at action films today and compare them to the fifties for example and there is little comparison. Where films of the day built up to periods of action that involved being part of a story, today we have action and on occasion there may be some sort of story plot or not along the way. The up and coming generations have a tendency for fast paced and graphic action, whether cellular or written. Part of this fueled not only by cinema but video games that craft almost ceaseless action of varying degrees of realism and plausibility. The days of a crafted novel that brings you the age of Dickens or Shakespeare or even novels of even 3-4 decades ago, fall onto decline of popularity. They fail to move fast enough or evolve into something of riveting action. There will of course always be a percentage of patrons for the crafted novel but the percentage is dropping. We live in a culture of we want it and we want it now, everything has to be done by yesterday and for the younger generations rightly or wrongly the concept of reading is going the same way. Or maybe it is the uniformisation of many, where they only see themselves as a computer component in the scheme of a life and work that walks on the edge of boredom, that they demand action form such pleasures as film and book.

Whatever the reason the times are definitely changing.

Most people can send an email or browse a website, but asking the public to fully understand the issues here was like giving them the source code of the operating system and asking them to work out what wasn't working properly. Most people couldn't name a single person in the Cabinet. Half can't name their MP. Even people who ought to know better confuse the offices of the EU with those of the Council of Europe. And as for the public's knowledge of history - even Portuguese history - it is depressing. All of us have the odd gap in our knowledge, somewhere... a dangerous road that all western democracies have taken: reducing democracy to voting. Voting is an essential thing, but not the only thing. If enough people vote enough times but get no change, trouble awaits. (And how angry are the Brexit voters going to be when it turns out that EU citizens will still be able to rock up and work? When millions of pounds per week are still paid to Brussels? When all sorts of regulation still comes from Brussels?) In other words, when voting is little more than a charade, a sop to our sense of fairness, sooner or later people will feel cheated.

Is this SF dealing with climate change, new modes of ruler-ship, overpopulation, the collapse of ecosystems, T-Shirts-with-Satellite-Transmitters, how the Americans eat Portuguese stew, how a Portuguese Hari Seldon developed his own mode of psychohistory, and AI (incidentally, the ultimate question asked therein is whether an intelligent operating system can fruitfully direct human history or should be allowed to do so, a question that will surely figure in humanity's not-too-distant future; this is also asked in Dan Simmons' “Hyperion Cantos”; Simmons answers this question in favour of humans directing their own destiny galaxy-wise; Asimov leaves it unanswered; Barrento makes a brave attempt at explaining it in a Earthbound way).

Would this be the sort of novel where a small group of survivors spend all their time locked inside a small building breathing recycled air wondering whether it's time yet for their evening supper of arugula and peanut butter? Kind of like being on a space ship only it doesn't actually go anywhere because it's on a bigger space ship that keeps orbiting a star in a hostile universe that doesn't care if we live or die? The passengers just keep worrying about the hydroponic arugula crop and what they're going to do when they run out of peanut butter? Sort of like a really boring version of Red Dwarf? Nope. The “answer” needs SF-DONE-RIGHT and that’s what Barrento’s novel was able to do.

I hadn’t been so enthused by a SF novel written by a Portuguese author, since the publication of “Terrarium” by João Barreiros and Luis Silva in 1996 (I’ve recently read the 20 year anniversary re-edition and the novel still holds up pretty well after all these years).

NB: Pedro Barrento is a Portuguese Author writing originally in English. I received an ARC of this book in return for an honest review. The novel will be published January 2018.


SF = Speculative Fiction.

sexta-feira, novembro 24, 2017

Amazon Cloud Drive Shutting Down Unlimited Storage: Outrage galore!



My own motto when it comes to security: "There are two kinds of bikers: those who already did fall and those who will."

I was outraged by the cut of the QUASI-FREE Amazon storage space. I checked how much data I had stored and I have used a whopping 4Tb. 



AND THEY WANT ME TO PAY 236 EUROS PER YEAR!! Outrage galore!
Nope. Not gonna happen.

Amazon offered "unlimited" storage to paying users then acted surprised when people started using it "creatively". They could have remedied that by implementing a 2TB limit or whatever for paying users and left everyone on the free tier with a 25GB limit, but they chose not to.

That's fine, it's their prerogative, but to make out that somehow Amazon hands were tied is somewhat misleading. Welcome to the world of money. Cloud storage was inevitably to hold its trusting customers to ransom one day...

People often say "you don't need to keep high res originals unless you're going to print large copies", but I think that's a bit misleading. Maybe I'm a geek, but there are times when I want to zoom in to, say, a street sign and work out where I took an old picture (non-GPS), or look at the time on someone's watch, or perhaps crop it to just a single face to print a portrait or use it as a profile image; and if I only have a low res copy, that can be difficult or impossible. I never know what use I might have for a photo in the future, so I always want to keep the full-size originals just in case. Having originals makes a big difference if you want to crop and edit photos. Also, screen resolutions are never going to go down. The days when your 640 x 480 pixel photo filled a screen have long gone....

I have paid great heed to Schofield's Law for many years: "It's not IF your hard drive fails, its WHEN...".

For people who don't know:
  • Schofield's First Law of Computing states that you should never put data into a program unless you can see exactly how to get it out;
  • Schofield's Second Law of Computing states that data doesn't really exist unless you have at least two copies of it, i.e., two copies that don't have changes automatically synced between them and aren't stored in the same physical location.
  • Schofield's Third Law of Computing states that the easier it is for you to access your data, the easier it is for someone else to access your data.

NB: Roobags' addendum to Schofield's Laws: nothing exists without a link.

Personally I use a combination of local and cloud backup - best of both worlds. Sounds as if Amazon had an unsustainable business model. I work for a company which is (very) big in the area of Cloud services, and you need huge investment to provide the level of performance and resilience which customers expect these days. 

It amazes me that businesses are happy to entrust their most sensitive data to faceless corporations in other countries, where there is no way to verifying their integrity. The potential for industrial espionage and government snooping is vast and even more so after the Snowden revelations. May be ok for consumers, but I wouldn’t go anywhere near it for business. Sensitive data should be kept local to the company. Google Drive might be secure, but frankly I'd be surprised if they didn't harvest the data stored by its users, looking for some way to either make money from it or give the juicy bits to some US government agency. Folks should take a look at this tech conference showing exactly how the NSA and GCHQ are keeping track of your data. Just Google "30c3 To Protect and Infect" and follow the youtube link. If you think data is safe in the cloud or any data for that matter. You owe it to yourselves to educate yourself on what is really going on with your privacy and data safety.

And please, for the love of God, don't confuse backup with cloud storage. Cloud storage is great, but it's not a backup solution. Most of services listed are synchronisation solutions. Delete data from one place and its gone from all of them. More than twenty years of working IT (damn I feel old saying that!) tell me that most data loss is caused by user error, not hardware failure. You need a backup solution that lets you get to a file that was there yesterday, but has gone today (e.g. accidentally deleted by the kids) to protect your data (Schofield's Second Law of Computing). Cloud providers often don't explain clearly enough, is the difference between backup, archiving and sharing.

  • Backup: keep an immutable copy of your data as it existed at a certain time, in such a way so to be safe from catastrophic errors in the original.
  • Archiving: offload your data to somewhere safe, though possibly less convenient to use, in order to free space on your primary device.
  • Sharing: enable access to your data from multiple devices, or from multiple users.

A lot of grief would be avoided if the various providers explained the differences, and how to achieve them. 

You're also entrusting your data to a third party, they can go bust, get taken over, change their terms and conditions at a whim, get hacked, decide what was once free will now cost you. If you must use the cloud, make sure the data is encrypted for transit and decrypted again locally, which gives at least some protection… Not only the privacy issue but the viability of these companies as a going concern. Many internet service companies do not make a profit and rely on venture capital, some do not even have a actual business model that makes sense. After all, growth of the user base alone does not magically make one a successful business if they are not paying customers.

If one's data is important then it simply does not make sense to entrust that data to a company that may not even exist in a year's time.

My Modus Operandi to solve all these issues follows with some comments to help you along.

Offline backups are essential. My worst experiences have been with creeping data corruption either by, say, a failing hard disk or by malware. Deleting a file or saving changes that you shouldn't have made permanently are also common problems if you are using a system that syncronises. At home, in terms of the most important reason for doing backups, i.e. data loss due either to disk failure or a cloud provider going bust, a NAS configured as RAID 1 is a backup because if one disk fails, there is another copy. If you then attach a USB hard drive (of the same disk size as the NAS RAID 1) to the NAS, then that is a further backup. I accept that this does not cover you in the event of a fire or theft.  For that I'll be using an offsite backup (I use ShadowProtect). I remember a few weeks after I had started working at a company many years ago one of my co-workers said:

"What does this message mean "Tape Full. Insert next tape." ? "

"How long have you been getting it?" I asked, innocently.

"Oh, months and months".

Human error is a bitch! (apply Schofield's Second Law of Computing when we want to prevent data corruption; One wrong byte and the file may not be readable).

The local backup of my NAS drive means I have instant access, but if there were ever a house fire or the drive(s) failed, I would still have the cloud as a fallback (cloud backups are also managed automatically by the NAS). Back in the day, I remember paing US$90 for two years worth of access to 2Tb (1Tb as backup space and 1Tb as a sync drive) via IDrive, which used fully encrypted storage and transfer. The biggest downside to cloud storage is not space, but the bandwidth needed to make it effective. Unless you are on a direct fibre connection, even fast broadband is way too slow for routine use of large cloud storage due to the woefully poor upload speeds you generally get, since ISPs seem to fixate on download speed only. Roll on the day when affordable direct fibre to the home was widely available. Hence, you really do need a local solution for day-to-day storage.

Don't forget that even if you are careful about not deleting files that are synced, they can be corrupted - and the corruption will then replace the data in the backup destination. This is particularly important if you are worried about the ransomware viruses that encrypt your data and then demand money to unlock them - if you only have 1 backup, then the chances are the encrypted files will be backed up and you won;t be able to give the hackers the finger.

NB: I've been a Synology aficionado for a long time, but beware. Simple NAS has a lot going for it if you want backups you don't have to plug in or remember to start. However you might need to read those drives if the device fails. One possible route out might be to mount the drive in a USB attached enclosure as I did when I had a blackout with my NAS, then tried accessing it as an external drive using a bootable USB stick running Linux. Another might be to try adding a file system driver to a windows PC, a utility that allows Windows to read Linux formatted drives.

Bottom-line: The primary market for Cloud storage is the large corporate market, not the individual. For companies, Cloud storage simply has to be attractively priced compared to the cost of provisioning and operating their own data centre. Storage is cheap now a days, If you are careless enough to leave your documents in the cloud, when the cloud disappears taking your docs with it, that's what you get for taking the easy/cheap way out. Clouds move, shift and disappear, whether in the sky or on the Web. If you want to rely on something that isn't guaranteed to stick around and not under YOUR control, then you deserve whatever you get!

Bottom-Line 2: After setting up a backup procedure, be sure to actually restore or recover some backed up files to be quite sure the procedure works. It's not enough simply to use the backup software's "verify" procedure. You don't need to do this every time unless the backup is mission-critical (e.g., no more backups have been made). I'm also not a fan of backing up only important files, what I'd describe as "intelligent backup"; a full image of everything is better if you can afford the space and time. Someone I was advising back in the day, decided to rationalise the full tape backup I recommended, doing it rarely. He set up an "intelligent" procedure to back up all files and directories he considered important. Then two drives failed simultaneously (power issues), and he discovered he had no backup, a combination of an "intelligent" backup procedure that didn't do everything expected, and lack of a full file system image. This was largely resolved, by sending the failed discs to a disc drive recovery company with a clean room, but it cost thousands and took several days.

Bottom-line 3: If you encrypt the data, make sure you have good backup for the key to unlock it.

Prescription:

  • Starting downloading all the stuff from Amazon Clouddrive to a staging area:
(3 machines downloading my stuff)

  • My new 3 Tb HDD

  • My HDD disk (2 bays) with my new 3 Tb disk


  • My Synology NAS hooked up to my HDD Caddy




If you don't want to follow-up the "prescriptions" above, you can back up all your work on clay tablets. You can't be too careful...