Directions to Last Visitor, 2011


work forks

work forks

Directions to Last Visitor / All visitors


Secret of Mana

Core Memory



Tow truck towing a tow truck towing a tow truck

Tow truck towing a tow truck towing a car

Tow truck towing a tow truck

People are stirring. T...

People are stirring. The session must be almost over. With any luck you'll beat the crowds to the coffee and muffin bar. You reach towards your right front hip, slide your thumb under the gold chain, pull up and slip the watch from its pocket. Cupped in the palm of your hand it reads a quarter 'til... "Cut!... No, no, no!..." "Everyone wears a wristwatch these days!" Sure enough, they do. But why do they still sew that pocket onto their jeans? For decoration, I suppose. But what about that one large button? It has the look of a rivet, but look more closely. The rivet's head is covered by a thin metal cap. It hides the real rivet underneath, but in its place it presents instead the embossed image of a rivet head splayed through the center of a metal washer emblazoned with the Levi-Strauss logo.

The marketplace is full of such things. Hard plastic castings complete with screw heads and unnecessary parts. Soft plastic with molded-in textures of warp and woof and even stitching. Metered postage showing the bold anachronistic elements of the circular town mark and wavy cancellation. Copper cladding over zinc pennies. Steel cladding over copper quarters. All are efforts to make the new look comfortably old and familiar, or simply habits too deeply engrained to wash away.

Archaeologists, who make an academic practice of studying material culture change, while not the first to notice that yesterday's functional features become today's stylistic decorations, were at least the first to name the phenomenon:

Skeuomorph - An ornament or ornamental design due to structure... 1889: "The transfer of thong-work from the flint axe, where it was functional, to the bronze celt, where it was skeuomorphic." [1]

Skeuomorphs are material metaphors. They are informational attributes of artifacts which help us find a path through unfamiliar territory. They help us map the new onto an existing cognitive structure, and in so doing, give us a starting point from which we may evolve additional alternative solutions. They provide us with "a path" instead of "no path" at all, but as scientists we are ultimately interested in an optimal paths well suited to the problem at hand, if not simply the best solution possible. How many of the metaphors we use in evolutionary computing become skeuomorphic downloaded into our machines?

- Skeuomorphs and Cultural Algorithms

Eye Vacation






Read only memory

Another place where memory storage was needed was for entertainment purposes: the cylinders and punched disks that operate music boxes, and also the punched paper rolls in player pianos. There was an almost infinite variety of these devices, including some automata programmed by large wooden cylinders with metal pins. I’ve collected some things along these lines but I’ve been more interested in devices directly associated with computing. One very interesting technology that I found recently is cam memory. One example that I really like contains information on how to adjust from the local compass reading anywhere on the earth’s surface to true magnetic north. The memory storage unit consists of a very lopsided cylinder of aluminum that is actually a map of the earth. At first when I saw it I thought the device had been smashed, but when you look at it closely, you realize it’s been carefully machined. There’s a stylus that can be run along the axis of the cylinder, much like a phonograph needle, that reads the radius at any point around the surface. It’s this radius that encodes the deviation of the local magnetic field. It’s quite a beautiful object. There were also computational devices in aircraft navigation systems—you can still occasionally find these in electronics swap meets and junk yards—that have ball disc and roller integrators, which were able to mechanically monitor a plane’s direction and speed and translate that into latitude and longitude. Those are pretty amazing, and I’m sure were extremely costly to produce. Of course, you can do all that now with a few lines of computer code.




Prepare for love. Brace for war.

Mono/Chrono/Pneumatic Black


157 1/2 x 275 9/16 x 35 7/16 in. (400 x 700 x 90 cm)

Aluminium clock, lacquer, pneumatic control system

A lesson given by an A...

A lesson given by an American police instructor to a class of Iraqi trainees neatly encapsulated the program’s failings. There are two clues that could indicate someone is planning a suicide attack, the instructor said: a large bank withdrawal and heavy drinking. The problem with that advice, which was recounted by Ginger Cruz, the former deputy inspector general at the American Office of the Special Inspector General for Iraq Reconstruction, was that few Iraqis have bank accounts and an extremist Sunni Muslim bent on carrying out a suicide attack is likely to consider drinking a cardinal sin.





Adriana Lara, Screens

Tesla Factory


Thomas Bayrle, Boersenbericht, 1972, ed. 202/250, silkscreen, 63.5 x 36 cm


Generated maze

ACHTUNG — actions speak louder than words

Charlotte Johannesson

ACHTUNG — actions speak louder than words

Tapestry 1976, 100x150 cm.



Lucy McKenzie, Tomb Raiders, 2012. Oil on canvas


Twitter down, 7/26/2012 (Reason, Deadline)



trend.pdf (download)




    class Maze      DIRECTIONS = [ [1, 0], [-1, 0], [0, 1], [0, -1] ]      def initialize(width, height)        @width = width        @height = height        @start_x = rand(width)        @start_y = 0        @end_x = rand(width)        @end_y = height - 1        # Which walls do exist? Default to "true". Both arrays are        # one element bigger than they need to be. For example, the        # @vertical_walls[y][x] is true if there is a wall between        # (x,y) and (x+1,y). The additional entry makes printing        # easier.        @vertical_walls = {, true) }        @horizontal_walls = {, true) }        # Path for the solved maze.        @path = { }        # "Hack" to print the exit.        @horizontal_walls[@end_y][@end_x] = false        reset_visiting_state        # Generate the maze.        generate      end      # Print a nice ASCII maze.      def print        # Special handling: print the top line.        line = "+"        for x in (0...@width)          line.concat(x == @start_x ? "   +" : "---+")        end        puts line        # For each cell, print the right and bottom wall, if it exists.        for y in (0...@height)          line = "|"          for x in (0...@width)      line.concat(@path[y][x] ? " o " : "   ")      line.concat(@vertical_walls[y][x] ? "|" : " ")          end          puts line          line = "+"          for x in (0...@width)      line.concat(@horizontal_walls[y][x] ? "---+" : "   +")          end          puts line        end      end      private      # Reset the VISITED state of all cells.      def reset_visiting_state        @visited = { }      end      # Check whether the given coordinate is within the valid range.      def coordinate_valid?(x, y)        (x >= 0) && (y >= 0) && (x < @width) && (y < @height)      end      # Is the given coordinate valid and the cell not yet visited?      def move_valid?(x, y)        coordinate_valid?(x, y) && !@visited[y][x]      end      # Generate the maze.      def generate        generate_visit_cell @start_x, @start_y        reset_visiting_state      end      # Depth-first maze generation.      def generate_visit_cell(x, y)        # Mark cell as visited.        @visited[y][x] = true        # Randomly get coordinates of surrounding cells (may be outside        # of the maze range, will be sorted out later).        coordinates = []        for dir in DIRECTIONS.shuffle          coordinates << [ x + dir[0], y + dir[1] ]        end        for new_x, new_y in coordinates          next unless move_valid?(new_x, new_y)          # Recurse if it was possible to connect the current          # and the the cell (this recursion is the "depth-first"          # part).          connect_cells(x, y, new_x, new_y)          generate_visit_cell new_x, new_y         end      end      # Try to connect two cells. Returns whether it was valid to do so.      def connect_cells(x1, y1, x2, y2)        if x1 == x2          # Cells must be above each other, remove a horizontal          # wall.          @horizontal_walls[ [y1, y2].min ][x1] = false        else          # Cells must be next to each other, remove a vertical          # wall.          @vertical_walls[y1][ [x1, x2].min ] = false        end      end    end    # Demonstration:    maze = 20, 10    maze.print



┌───┬─────┬─────────┬───────┬───┐│┄┄╮│╭┄┄┄╮│  ╭┄┄┄┄┄╮│  ╭┄┄┄╮│╭┄╮││ │┆│┆──┐┆│ │┆──┬─┐┆└──┆┌─┐┆│┆│┆││ │┆│╰┄╮│┆│ │╰┄╮│ │╰┄┄┄╯│ │╰┄╯│┆││ │┆└──┆│┆└─┼──┆│ └─────┤ └─┬─┘┆││ │╰┄┄┄╯│╰┄╮│╭┄╯│       │   │╭┄╯││ └─────┴─┐┆│┆┌─┴───┐ │ │ │ │┆──┤│         │┆│┆│╭┄┄┄╮│ │   │ │╰┄╮││ ──────┐ │┆│┆│┆──┐┆└─┤ ┌─┘ └─┐┆││       │ │┆│╰┄╯  │╰┄╮│ │     │┆││ ┌─────┘ │┆├─────┴─┐┆│ │ ──┬─┘┆││ │       │┆│╭┄┄┄┄┄╮│┆│ │   │╭┄╯│├─┤ ──┬─┬─┘┆│┆┌─┬──┆│┆└─┴─┐ │┆┌─┤│ │   │ │╭┄╯│┆│ │╭┄╯│╰┄┄┄╮│ │┆│ ││ └── │ │┆──┘┆│ │┆──┴────┆│ │┆│ ││     │  ╰┄┄┄╯│  ╰┄┄┄┄┄┄┄╯│  ╰┄┄│

Liberator - First 3D printable gun

5e3f6194c63a398f5f167e1129d0237e.torrent (download)


335e17bd380c0d667e3d1a6cc0c7ccce.pdf (download)


Life in life

A video of Conway's Game of Life, emulated in Conway's Game of Life. The Life pattern is the OTCA Metapixel: - for more information, see The life simulator used is Golly - which has a built-in script to generate these metapixel grids (select a pattern, and choose "" from the scripts list).







M.C. Escher



Chris Burden, Gold Bullets (2003)