What I Told the FCC
Tyler Cipriani Posted

I think that new FCC proposal for “Restoring Internet Freedom” would completely destroy the internet. Should this proposal go any further, the internet will no longer be recognizable within a very short amount of time. I’m worried that I will no longer have a place on the internet because my internet activity and work isn’t designed to invade people’s homes and privacy to sell them things they don’t need. Non-profits on the internet are dead.

This proposal is entirely rent-seeking by big ISPs. ISPs will make more money without providing any additional service for users, and the FCC would be enabling it all.

Big Disclaimer

This is a post where I feel it is important to make absolutely clear that my views are my own and do not represent the views of my employer(s past or present)

My comments to the FCC

The FCC has opened their proposal to public comment and I encourage you to do so.

Here’s what I wrote:

I am a Colorado resident and I’ve worked as an internet engineer for my entire professional career (small disclaimer that my views are my own and do not represent those of my employer), and I’m worried that new FCC rules may allow large ISPs to destroy the internet.

The current state of the internet is possible because ISPs aren’t selling tiers of websites to their users. If we create internet fast-lanes, then we create a tiered internet. This is currently the way cable channels already work: if you just want CNN and ESPN you can pay one amount, but if you want HBO you pay a little more. The problem is that the internet is constantly in flux, there are constantly new websites being built. This is a major driver of economic growth and is good for everyone who uses the internet.

If you start offering internet fast-lanes, internet tiers become possible: if you just want Facebook and Google then you pay one amount, but if you want Wikipedia you pay a little more. Ipso facto, Wikipedia is unavailable to a portion of the internet population.

There may be those who make the argument that this is how the free market works: if Wikipedia were good, people would be willing to pay more for it; however, this artificial choice between Google and Wikipedia is only made possible by a perversion of the design of the internet. Bits of information are bits of information, an ISP is arguing that websites should pay more while it offers the same service. ISPs want Netflix to pay more than Google for them to move 100 bytes from the internet backbone to your house. Moving 100 bytes from the backbone to someone’s house, the so-called “last mile”, is same amount of work whether those bytes are from Google or Netflix so why should Netflix have to pay more?

Meanwhile, large ISPs that move bits from the internet backbone over the “last mile” do not compete with one another by means of designed but unspoken collusion. The suggestion that an internet user should have to choose between Google and my blog is being made by companies that make all of their money by rent-seeking and now demand more money for less service. Consumers are not being protected, only ISP shareholders are.

This proposal has the net-effect of censoring the internet so that only websites that have enough money to pay protection fees to ISPs will be available to people. This proposal is censorship that stifles freedom and innovation and will destroy the internet.

/me drops mic.

08
Posted

To see posts by date, check out the archives

What I Told the FCC

Posted

by

Tyler Cipriani

Deterministic Turing Machine in Python
Tyler Cipriani Posted

Below is a Turing machine implementation based on the example in Understanding Computation by Tom Stuart. The Turing machine is an entertaining thought exercise that makes computer science feel a bit like poetry. Most things I learn on about computers on a day-to-day basis are decidedly unpoetic.

"""
Deterministic Turing Machine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is a turing machine written in python. This code closely follows code from
chapter 5 of the book _Understanding Computation_ by Tom Stuart.
This is basically a Finite State Machine with a tape.
"""

import collections


LEFT = 'left'
RIGHT = 'right'
BLANK = '_'


Rule = collections.namedtuple('Rule', [
    'state',
    'head',
    'next_state',
    'write',
    'move'])


def rule_applies(rule, state, tape):
    """Determine whether a rule applies to a state."""
    correct_state = rule.state == state
    correct_read = rule.head == tape.head
    return correct_state and correct_read


def follow_rule(rule, state, tape):
    """Follows the current rule."""
    if rule_applies(rule, state, tape):
        state = rule.next_state
        tape.middle = rule.write
        tape.move(rule.move)

    return rule, state, tape


class Tape(object):
    """Represents the tape in a turing machine."""
    def __init__(self, left=None, middle=None, right=None, blank=BLANK):
        """Initialize and show initial state."""
        self.left = left or []
        self.right = right or []

        self.middle = middle
        if self.middle is None:
            self.middle = blank

        self.blank = blank

    def move_right(self):
        """Move tape one unit right, add blanks as needed."""
        self.left = self.left + [self.middle]
        if self.right:
            self.middle = self.right.pop(0)
        else:
            self.middle = self.blank

    def move_left(self):
        """Move tape one unit left, add blanks as needed."""
        self.right = [self.middle] + self.right
        if self.left:
            self.middle = self.left.pop()
        else:
            self.middle = self.blank

    @property
    def head(self):
        return str(self.middle)

    def move(self, direction):
        """Move tape left or right."""
        if not direction in [LEFT, RIGHT]:
            raise RuntimeError('Unrecognized direction "%s"' % direction)

        if direction == LEFT:
            return self.move_left()

        if direction == RIGHT:
            return self.move_right()

    def __repr__(self):
        """Tape state with current head in parens, like _12(3)4."""
        out = '{}({}){}'.format(
            ''.join(map(str, self.left)),
            self.middle,
            ''.join(map(str, self.right)))
        return out


class DeterministicTuringMachine(object):
    """This is a turing machine."""
    def __init__(self, state, tape, accept_states, rules):
        """
        Initialize machine
        :state: - integer - that represents the current state of the machine
        :tape: - Tape - the machine's tape
        :accept_states: - [integer] - represents states when the machine has
                                      exited successfully
        :rules: - [Rule] - list of rules for the machine to follow
        """
        self.state = state
        self.tape = tape
        self.accept_states = accept_states
        self.rules = rules

    @property
    def accepting(self):
        return self.state in self.accept_states

    @property
    def stuck(self):
        """Stuck when we have no next rule."""
        return not self.next_rule

    @property
    def working(self):
        """Working when not done and we still have rules to apply."""
        return not (self.accepting or self.stuck)

    @property
    def next_rule(self):
        """Get next rule."""
        rules = self._find_rules()

        if rules:
            return rules[0]

        return rules

    def _find_rules(self):
        """Find a rules we can apply."""
        applicable_rules = [rule for rule in self.rules
                            if rule_applies(rule, self.state, self.tape)]

        return applicable_rules

    def step(self):
        """Apply any rules we can find."""
        _, self.state, self.tape = follow_rule(
            self.next_rule, self.state, self.tape)

    def run(self):
        while self.working:
            self.step()

This machine contains objects for a tape (Tape), rules for a machine to follow (Rule), and an object representing the state of the Turing machine itself (DeterministicTuringMachine).

Incrementing binary numbers

Given the appropriate set of rules, this machine can perform general computing tasks. In the book, the rules for incrementing a binary number are used as an example.

We start with the number 10111 (A.K.A, 23), which we’d like to increment by 1 to get 11000 (A.K.A., 24). To begin we set the tape with the number we’d like to increment with the read head of the tape resting on right-most digit of the binary number:

This machine will have three available machine “states” that help to define the rules for the Turing machine to follow. When the machine is in a particular state, and encounters a particular condition (i.e., the read head is over a particular number) it will follow a particular rule – that is, it will write either a 1 or a 0, move the read head either LEFT or RIGHT, and, possibly, change machine state. These rules are based on machine state in combination with a read condition.

The machine will start in state 1. When the machine enters into one of the accept_states, the machine will stop processing. The only accept_state for this machine is 3.

If we call the step method of the state machine we can trace how it follows rules.

Since it was in state 1 and the read head was over a 1 it followed rule Rule(state=1, head='1', next_state=1, write='0', move=LEFT) – it wrote 0 in its current location, it moved the read head LEFT, and stayed in the 1 state. Since the state is still 1 and the read head is once-again over a 1, the same rule will be followed again:

Calling the run method of the machine will continue to follow the defined rules until state 3 is reached:

Turing machines are magic, I guess is what I’m saying.

May 2017
S M T W T F S