Russ Nelson's blog

[ Home | RSS 2.0 | ATOM 1.0 ]

Fri, 28 Jan 2011

Why I want to be your Dictator

The most interesting parts of economics are the coordination problems. They come up whenever a problem can only be solved by coordinating with other people. To a very large extent, coordination problems can be solved by the combination of private property and price signals. Unfortunately, some problems don't get solved using only those two mechanisms.

We need a dictator. A constitutional dictatorship. One in which the dictator is strictly limited in power. One whose power can be taken away by a vote of a super-majority of the people. While I don't actually want to be a dictator, I want to get the coordination problems solved. From serious problems like the over-extension of copyright law, to the War on Drugs, to defending our national borders, all the way down to why we don't have any standard sizes for Li-Ion batteries? There are AAA, AA, C, and D sized cells for carbon-manganese (remember them?), alkaline, Ni-Cad, Ni-MH, and Lithium. Why not Li-Ion or Li-FePo? It's a coordination problem; nobody wants to make their device dependent on somebody else's batteries.

So, Vote Nelson for Dictator! I promise not to do anything for you that you can do for yourself!

Further topics in this category will list the things that I promise, as your dictator, not to do.

posted at: 20:55 | path: /dictator | permanent link to this entry

Mark XIV keyboard

I've given up on the Mark XIII keyboard. The problem is that the small PC board plus the brass barrier was too big to position close enough even for MY hands. I've got a Mark XIV keyboard which uses different switches (surface mount SPST very short displacement). Soldered the switches directly to the copper wires I suggested earlier, and ran wires to the bottom, weaving them into a grid holding the keyboard firmly. Got them as I wanted them and put polycapralone on both sides as reinforcement. Have a folding knuckle rest, thumb rest, and palm heel rest. It's by far the smalltest keyboard I've made so far.

I'm using a wired keyboard this time, to see how compatible I can make it. It's based on the Teensy. It's very similar to an Arduino, but it can take on a USB Keyboard flavor.

posted at: 20:55 | path: /chordite | permanent link to this entry

Mark XV keyboard

Sigh. So little time, so many keyboards. The Mark XIV keyboard, using surface-mount pushbuttons was utter fail. Had I actually looked at them, I would have seen that they can't withstand any sideways force at all. Consequently, they break when you look at them sideways. I only discovered this after arriving in India and finding three switches completely useless. Oh well, back to the reliable Marquardt switches. Will remove the surface mount switches and replace them with the Marquardt switches.

posted at: 20:55 | path: /chordite | permanent link to this entry

Review of Being Geek

I thought I would like O'Reilly's Being Geek, subtitled "The Software Developer's Career Handbook". It seems like a good idea, to have a book that helps you plan your career. The book is based on a set of blog postings by Michael Lopp, aka Rands.

The book explicitly plans to have minimal continuity betweeen chapters, the chapters instead calling out specific ideas. The idea is that you'll read the chapters as you need the information in the chapter. Unfortunately, this seems not to have worked. The chapters are opaquely named, and there's no overarching document which points you to one chapter or another to find out about a certain idea.

I'd say that the book needs a revision, in which a Guide To This Book chapter is added at the beginning. The idea is that that one chapter is designed to be read beginning to end, and points you to the chapters that explain one career arc versus another. Anyway, that's just my diagnosis.

posted at: 20:55 | path: /books | permanent link to this entry


JOSM doesn't support WMS Capabilities, so I created a crutch for it. These two programs (the first calls into the second) create three files for each state. One is the capabilities file downloaded from Seamless. Another one contains just the WMS URLs. Another one is an OSM file containing bounding boxes for each of the WMS layers. Load it into JOSM to see what layers cover what.

I find that it's helpful to initially turn on a WMS layer while zoomed out enough to see the entire bounding box. You get a very low resolution layer, but you can see if it overlaps your area of interest. Then you can zoom in enough, right-click on the layer name in the Layers box, and selecte "Change Resolution" to get a nicely rendered layer.


# pulled by hand from
all = """USGS_EDC_Ortho_Coastal

for one in all.split("\n"):
    state, url = one.split("\t")
    state = state.replace("USGS_EDC_Ortho_", "")
    # if for any reason, you need to run this program twice, comment out the following line
    print "wget -O %s.xml %s" % (state, url)
    print "./ %s.xml >%s.wms" % (state, state) follows:


from xml.sax import saxutils
import sys
import time

class OSM():
    nodenum = -1
    waynum = -1

    def __init__(self, outf=sys.stdout):
        self.outf = outf
        self.outf.write("""<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6' generator='osmgen'>
        self.startnum = None

    def point(self, x,y):
        self.outf.write("<node id='%d' lat='%s' lon='%s' />\n" % ( self.nodenum, y, x))
        self.nodenum -= 1

    def start(self):
        self.startnum = self.nodenum

    def stop(self, name=None):
        self.outf.write("<way id='%d' visible='true'>\n" % self.waynum)
        self.waynum -= 1
        for n in range(self.startnum, self.nodenum, -1):
            self.outf.write("<nd ref='%d'/>\n" % n)
        self.outf.write("<nd ref='%d'/>\n" % self.startnum)
        self.outf.write("<tag k='area' v='yes'/>\n")
        if name is not None:
            self.outf.write("<tag k='name' v='%s'/>\n" % name)

    def close(self):

class print_track(saxutils.XMLFilterBase):
    chars = None
    baseurl = None
    def startElement(self, name, attrs):
        if name == 'LatLonBoundingBox':
        # <LatLonBoundingBox minx="-79.810565637" miny="0" maxx="-71.8388440985" maxy="45.1013683371"/>
            osm.point(attrs['minx'], attrs['miny'])
            osm.point(attrs['minx'], attrs['maxy'])
            osm.point(attrs['maxx'], attrs['maxy'])
            osm.point(attrs['maxx'], attrs['miny'])
        elif name == 'Name':
            self.chars= ''
        elif name == 'OnlineResource':
            self.baseurl = attrs['xlink:href']
    def characters(self, ch):
        if self.chars is not None:
            self.chars += ch
    def endElement(self, name):
        if name == 'Name':
   = self.chars
            self.chars = ''
            if self.baseurl:
                print "%sservice=WMS&version=1.1.1&request=getmap&width=500&height=500&format=image/png&SRS=EPSG:4326&layers=%s&" % (self.baseurl,

from xml.sax import make_parser
from xml.sax.handler import feature_namespaces

if __name__ == '__main__':

    import sys
    # Create a parser
    parser = make_parser()

    # Tell the parser we are not interested in XML namespaces
    parser.setFeature(feature_namespaces, 0)

    osm = OSM(open(sys.argv[1].replace('.xml', '.osm'), "w"))

    # Create the handler
    dh = print_track()

    # Tell the parser to use our handler

    # Parse the input


posted at: 20:55 | path: /osm | permanent link to this entry

Potsdam Mapping Party

I'm holding my first mapping party in Potsdam, at First Crush on Saturday January 31st between 11AM and 4PM. A mapping party is an informal social get-together where people can learn more about OpenStreetMap, explore their community, and share their findings with other people. OpenStreetMap is a community-created free, open public map. If you don't know why one such is needed, well, come to the party and I'll explain!

More info is on the OpenStreetMap wiki.

posted at: 20:55 | path: /osm | permanent link to this entry

Unfinished Railroads 2

Was off to the Finger Lakes chasing unfinished railroads this weekend. Here's what I did:

Found traces of the Brookfield Railroad. They had big plans, but only graded parts between Brookfield and North Brookfield, connecting to the DL&W.; Never laid tracks, but there's miles of grading. Got a personal tour from Doug Keith, landowner of one section, plus a photo of their BR stock certificate.

Went up to Oneida Castle and found a few abandoned railroad bridges and abutments. Chased their railbeds a bit. Went to Madison County Clerk's Office and located a map of the Brookfield Railroad.

Then I went for a bike ride on the New York Central, which turns into the Canalway trail. Wanted to find an old trolley line which takes off up the hill from Canandaigua. Found it.

Found a bridge left over from the DL&W; (I think) which has had its approach completely plowed away, so the bridge is standing proud next to a stream.

Found some of the Ontario Midland Auburn Branch (which has been gone for like 130 years, so there's not much left to see).

All of that was Friday. On Saturday I went over to Ithaca, and found a few bridges from the trolley line from Auburn. Found a cut from the Inclined Plane which operated for about twenty years as the only railroad entrance into Ithaca. Then found the southernmost point of the unfinished Pennsylvania and Sodus Bay. Met up with an old college roommate and his family. Looked at the Lehigh Valley bridge over the Tunkhannock Gorge. Building THAT must have been scary (100' to the bottom). Then the LV bridge on the east side of Trumansburg.

Then some remains of the P&SB.; A trestle, a small bit of fill and culvert, then a slight cut through the woods and a couple more culverts. A formerly-deep cut still actively being filled by the farmer.

Then, the piece' de resistance: a matching pair of 30' tall abutments in extremely good condition, particularly for a railroad that was never finished. Called it a day and visited with friends in the area. Still might be more remains to the north.

That was Saturday. Sunday I got up early, drove down to Watkins Glen and rode the Catherine Valley Trail, formerly New York Central. Watkins Glen is still served from the north by FGLK, and Horseheads in the south by NS. A very nice stone dust trail very nearly connects the two (they're a few miles short on the south).

Then went hunting the Sodus Bay, Corning, and New York. This one was a bonus. I don't know much about how much of it exists, apart from something a Bob Scharf had photographed, which I have on my website. I did "Research by Knocking" on people's doors until I found somebody who knew somebody who knew something. Eventually, I got sent to Bob Scharf himself! He told me exactly where to find what I was looking for, which was great.

Then (no, I'm still not finished) I went up to Penn Yan and bicycled the Outlet Trail to Dresden. Bunches of railroad relics there, including whistle posts, mile markers, some forgotten tracks, an abandoned bridge.

In the waning sunlight, I found the Rochester and Syracuse Interurban line (which is now a power line -- practically all the trolley lines became power lines, because they were the pioneers of long distance power transmission -- they had to be!) Found the Cayuga Trail starting next to an abutment which had its fill cut down, so it stands in mute testimony to its former glory. The village of Jordan has on its main street a very railroady-looking building facing onto the main street which not-so-coincidentally had a trolley running down it!

And finally, I found where the trolley line crossed the Erie Canal right next to the highway and the Canalway Trail. Took a photo showing canal, highway, railroad, and bike trail, all in one!

posted at: 20:55 | path: /railroads | permanent link to this entry

Your body runs on sugar.

Your body runs on sugar. Period. Doesn't matter the source, except it really does. You can get it directly from sugar, by eating a candy bar. You can get it from carbs such as wheat, potatoes, rich, anything starchy. Or you can get it from fat.

Unfortunately, you can't actually digest fat. Your stomach can't deal with it. But the bacteria which live in your intestines can. So, you eat fat two days before the ride. You eat carbs the day before the ride. Then you eat sugary foods the day of the ride.

If you have no stored fat, like most serious cyclists, you HAVE NO CHOICE but to run off of eaten food. If you run out of that energy, you are DEAD IN THE WATER. Can't emphasize that enough.

Now, if you have stored fat, you can actually run off of that. You have to get your body to start digesting itself. As you might expect, your body does not do that lightly. When you get to the point where you need stored fat, your body will try to convince you to STOP doing whatever you're doing. You will become tired. You will become listless. You will become depressed. You will question why the hell you ever set out on the ride.

If you push through, your body will start to burn stored fat. If you have no stored fat, your body will start to burn muscle. This is extremely bad for your health, which is why your body will try to stop you. Push through only if you have stored fat.

Moral of the story: bring food unless you're trying to lose weight; in which case do not eat food (because that will stop the process of burning fat).

posted at: 20:54 | path: /life | permanent link to this entry

Our first apartment

Our first apartment was across the street from the doughnut shop. It had several interesting characteristics:

posted at: 20:54 | path: /life | permanent link to this entry

Gastric Upset

:) I have a theory about gastric upset: what you can successfully eat *and gain nutrition from* depends on your gastric bacteria load. If you change what you eat, you need different bacteria. Swapping out the bacteria is not a pleasant experience.

So it's not about food poisoning, but instead about food *type* poisoning.

posted at: 20:54 | path: /life | permanent link to this entry

Rail Trails #2

I have a goal of riding every named Rail-Trail in New York State. There are many more railbeds not used for trains anymore which are also ridable. They are usually unnamed, unsigned, and unpublished. I speculate that this is because the owner is either indifferent or away. I've ridden some of these but I'm more interested in getting the named trails ridden first. I'm maintaining the list of NY rail-trails on my Rutland Trail website.

This past year I rode 2/3rds of the Catskill Scenic Trail (got too dark), the eastern undeveloped end of the Orange Heritage Trailway plus about 200' of the trailway itself, and the whole of the Uncle Sam Bikeway.

Trails I've ridden:

Trails I haven't (yet) ridden:

posted at: 20:54 | path: /bicycling | permanent link to this entry

Rail Trails #3 #tags railtrail,bicycling

I have a goal of riding every named Rail-Trail in New York State. There are many more railbeds not used for trains anymore which are also ridable. They are usually unnamed, unsigned, and unpublished. I speculate that this is because the owner is either indifferent or away. I've ridden some of these but I'm more interested in getting the named trails ridden first. I'm maintaining the list of NY rail-trails on my Rutland Trail website.

I'm also uploading them to OpenStreetMap.

This year (so far) I've ridden on the Cato Fair Haven Trail (partial), the Genesee Valley Greenway (very partial -- it's 90 miles long), and the Webster Hojack Trail. Also rode a trail that I don't have in my database. Goes on the Lehigh south of Rochester (just off the RIT campus). Also a portion of the Clarence Akron Pathway; probably about half. Nicely paved, very popular trail. Also about five miles of the Canalway Trail in Rochester. Rode the Outlet Trail end to end. And all of the built portions of the Catherine Valley Trail.

Trails I've ridden:

Trails I haven't (yet) ridden:

posted at: 20:54 | path: /bicycling | permanent link to this entry

FGC '09

Got back from the Quaker Gathering in Blacksburg, Virginia yesterday. Yes, I ran the bicycling workshop. I didn't keep a close track of my rides, but I did at least 12-15 miles every day.

After four years of running the workshop, I had my first accident. Two riders were riding side by side on a rail-trail, and a local bicyclist (possibly speeding -- the posted limit is 15MPH) came down the other side and there was no room to swerve. Two of our guys went down. One had a cut and swollen hand, and the other got a cut and some road rash.

And, more sadly, a Quaker bicyclist got killed on campus. Bonnie Tinker was riding down a hill and a dump truck turned right just in front of her. She went down and under it. Split her helmet and her skull. I got to see the aftermath about two minutes later. Not pleasant. 'Nuff said.

posted at: 20:54 | path: /bicycling | permanent link to this entry

Garbutt, New York

The tiny village of Garbutt, New York had three railroads serving it: The Baltimore & Ohio, the Pennsylvania Railroad, and the Scottsville & Leroy.

posted at: 20:54 | path: /railroads | permanent link to this entry

Fixing RSS

RSS is a great technology, with a flaw. Currently, the way RSS works is that you have a URL pointing to an RSS feed. This feed dynamically changes to contain new entries as they're posted and removes old ones off the end as they age out. But the "feed" is a complete XML document. So in order to get updates, you need to fetch the entire document and examine it for entries newer than the last time you fetched the document.

In other words, polling.

The problem with polling is that it consumes resources. Much better to set up a communication point where the receipient (RSS client) waits for the sender to post new items. In other words, streaming RSS, or SRSS. Streaming XML is not a new concept. Jabber has been doing streaming XML for years now. The problem with following that concept is that Jabber is one-to-one communications. RSS is one-to-many. For small values of "many" a standard HTTP server will work fine.

But think of Britney Spears' RSSer feed. She'll have millions of followers, all of whom want to hold a TCP session open. This simply doesn't scale using a general-purpose TCP/IP stack.

So, imagine a TCP/IP stack designed for streaming RSS. It would be able to hold open literally millions of TCP sessions at the same time. Since it's sending out the same content to many different recipients, each session just needs a pointer into the content that has been sent so far, plus the remote IP address and TCP port, and maybe a retransmission timer or two.

When she posts something to her feed, it will be sent out using just two packets: one with the data, and another one ACKing the data. And yes, some of the TCP sessions will be dangling and will send a TCP RST. But the rest will receive their feed in real time, or as near as you can get there with 5 million TCP sessions to feed.

Now, all RSS clients will need to be modified to use SRSS. But the key here is that even if they don't, they'll still be able to fall back to RSS. As long as the server can understand an appended ?streaming=yes on its feed URL, the clients can be modified at whatever rate the author desires.

Been thinking about this for years, but I was prompted to write this up by a posting by Dave Winer suggesting that we could distribute the functionality of Twitter using an RSS client and people's individual RSS feeds. This is a great idea at that level of the IP stack, but when you go down one level to try to implement it, fetching a full RSS file every time you check for news is incredibly inefficient and slow. Much better to use SRSS so that when somebody posts to their RSSer feed, it appears immediately.

posted at: 20:54 | path: /opensource | permanent link to this entry

Made with Pyblosxom