I replied to someone on Twitter with an offhand remark doubting the goodness of the bicycles-as-vehicles principle, I thought I should explain it, because it’s not really simple.

I think we make two principal mistakes, cycling-as-sport, and the emphasis on bicycles-are-vehicles in the context of “vehicular” rules that are actually more automobile-centric than general.

Cycling-as-sport results in impractical bicycles.  A practical bicycle looks much like an English 3-speed, or even more so; wide tires, upright posture, a relatively comfortable saddle, and some provision for carrying stuff.  Also, fenders to keep off the rain, a chain guard to keep your clothes clean, and perhaps a built-in light.  Modern materials make an even fatter tire possible and also make the lights more effective.

In contrast, cycling-as-sport leads to bicycles variously specialized for high speeds on tracks, high speeds in road races, good handling and traction on actual mountain sides, and sometimes, good skills for tricks and stunts.  None of these bikes will keep your clothes clean, none has a fender, and they tend to lack mounting points for racks.  Racing bikes tend to position the rider in a bent-over aerodynamic posture, which is good for speed, but less good for visibility, less good in crashes (head down and forward is not good).  Mountain bikes by default are equipped with knobby tires for traction in mud, which are merely noisy and draggy on paved roads, and with wide handlebars for improved steering leverage on rough downhill terrain, which in urban traffic are a hazard in narrow spaces.  The skinny tires on road and track bikes aren’t noisy and draggy, but they are easily caught in road imperfections, vulnerable to road imperfections, and prevent you from easily riding anywhere except on well-paved roads.  You’ll also have to reinflate those skinny tires much more often.

What this means is that if some well-meaning person hears that they should bike to work, they trot down to their bike shop, and are presented with a wall (or two) of mountain bikes and a wall (or two) of road bikes and triathlon bikes, and perhaps a few “ohyeahtheseareourcitybikes” bikes off to the side.  There’s a good chance they’ll be sold a bike that they’re not comfortable on, and that doesn’t enable them to carry the stuff that they need to carry.  

And likely they’ll see, wonder about, and perhaps be sold, some of the bicycle-specific gloves, and socks, and shoes, and pants, and jackets.  This is mostly a waste of money, and in daily use, more steps added to the bicycle ride that aren’t really necessary.  And in the end, for them, bicycle commuting turns out to be impractical, why did I take the advice of those Dirty F*cking Hippies on the internet?

The sort of bikes we ought to be selling are much more common in Northern Europe; I saw a lot of them in Sweden and Denmark.  The cargo bike that I ride is sort of an extreme version of such a bike; lots of ability to carry things, no expectation that I would carry things in a backpack (my back sometimes does not like backpacks), nice fat tires, fenders, built-in lights, and a chain guard.  Basically I just get on and go, and the bike carries my stuff, and I sit super upright and see everything around me.

The vehicular cycling mistake is harder to describe, because for now, given the roads that we’ve got, vehicular cycling is partly right; roads are public ways, bicycles are a legitimate means of travel, and anyone riding a bike has the right to use those roads.  Vehicular cycling is also right when it points out the need to think about what drivers might be expecting; if you come from an unexpected direction, don’t be too surprised if drivers aren’t looking for you.

But, unfortunately, it fails when its proponents mistake a method that works for some people (including me) for a method that works for everyone. If, for some reason, you don’t feel comfortable riding in traffic, it’s not that vehicular cycling has failed you, instead you have failed vehicular cycling.  Unsurprisingly, this did nothing for improving cycling’s ride share when vehicular cycling was the only game in town, and in practice, the safety that it actually delivered (if/when taught to, and usually rejected by, most actual cyclists on the road) was unimpressive compared to safety improvements in other countries.

Vehicular cycling is also mistaken because the existing vehicular laws were first designed for cars, which means that they’re not necessarily the best fit for bicycles, and the safety margins and safety rules in those laws are often overkill for bicycles.. The need to hammer home “bicycles are vehicles” means that these differences are ignored, because it might undercut the message.  Changes to the laws “for bicycles”, whether Idaho Stop, Copenhagen Left, or bicycles-only counterflow lanes on one-way streets encounter initial default skepticism because “wait, bicycles are vehicles, now you are making special rules?” — there is an assumption that we need the “simple” bicycles-are-vehicles treatment because exceptions are bad and confusing.  And also because bicycles-are-vehicles, rule-following by bicyclists is claimed to be of paramount importance because after all those rules are for safety, and we created those rules so vehicles (ahem, “cars”) would be safe and not run into things and each other.  This is a problem, because in fact, for others on the road if not for themselves, bicycles are far safer than cars, and cyclists can see and hear what’s around them far better than drivers can, and even when they do crash into people or property, do so with orders of magnitude less energy and destructiveness.  But because we’ve made the rules our focus, safety discussions often get derailed into arguments about who follows what rules, and lose track of silly things like how to minimize deaths and serious injuries.

Vehicular cycling also fails because the laws, designed for cars, are in some sense designed more as a framework for blame than as a safety maximizer.  In countries with lower pedestrian fatality rates, “jaywalking” is not a law.  We use that law in the US to provide an excuse for crashing into pedestrians with cars, if we really cared about safety, we would use different laws (because countries that do better use different laws, and we could just copy from them.  There’s no need for research or innovation).  When cyclists, thinking of themselves as vehicles, internalize these same laws, their tendency is to be rude to pedestrians even when there is no need whatsoever and there’s no actual safety issue. “Rude” can mean gratuitous bell-ringing, yelling, or close passes, and it’s completely unnecessary.  It takes only a little forethought to not run into a pedestrian; they are visible, slow moving, we can even communicate with them in real time if we need to coordinate our motions (I do this all the time, it’s easy).  If we accept that rule #1 is to not run into pedestrians, that changes how we bike, and we quit expecting that “jaywalking” pedestrians ought to get out of “our way” (which is a ridiculous concept for a bicycle, we’re stupidly maneuverable).

Furthermore, even if you dispute the extent that our laws are a blame-framework, they are designed around the abilities and limitations of automobiles; someone on a bicycle has several safety options that drivers do not, but these options go unmentioned in the laws because the laws were designed for cars.

It’s important to remember that we’re not infinitely capable, and we’re best at what we practice.  If our default reaction to someone breaking the rules is to follow the framework of vehicular laws, on a bicycle that means it’s not the safest reaction, and in the rare case that time is tight and the default reaction matters, we’ll do the wrong thing.  So instead of thinking about jaywalking, and how it is our job to shame the law-breaking pedestrian (or to shame the wrong-way skateboarder, etc, etc), we should think about what is safest, and what our safety practices should be, and always do those.  Usually, this is some combination of modifying our path so that it passes behind the pedestrian, and so that there is so much clearance that there’s no need to alert them.  It means, if there are several dogs or small children around, that we should slow down, because we cannot possibly keep track of three or more randomly moving objects, and it would be a disaster to hit a child.  It means, in practice, to never ride between a dog and its owner, because (1) it’s common for dogs to turn back towards their owner and (2) invisible leashes are a thing.  In all these cases we can invent rules that other people should be following, or we can directly act to reduce risk.  Vehicular cycling’s emphasis on car-oriented rules leads us towards blame first, risk-reduction second, and when it really matters, that means we don’t do the best possible job of risk reduction.

I could say more, but this is probably enough. There are issues with vehicular cycling’s lack of safety-in-numbers, and with their blind spots regarding speed, and really anything that isn’t “biking like a car”, but, later.

More twitter tomfoolery

December 16, 2017

I wrote a Go program to install blocks from a file of Twitter IDs. It’s not on github yet because my development sandbox looks more like a development catbox, and I can’t clean it up too much because the program’s running right now and Twitter’s rate limited so it’ll be a while (at 5 blocks per second, about 10 days). Recall that my goal is to completely remove fascists and griefers from my Twitter feed, and from any conversation that I happen to be in — they shouldn’t even notice the opportunity to respond, never mind wasting anyone’s time with their crap.

At least as important as the program is the list of IDs to block.
It’s 4 million lines long, sorted from most-to-least-desirable-to-block order, so this is the only way to share it. I did some by-hand sampling, and the first 10% really are notably more obnoxious than the last 10%, so I may not run this all the way to completion.

package main

import (


var digits = regexp.MustCompile("[0-9]+")
var runtime = time.Now().Format(time.RFC3339)

type ConsumerAndAppKeysAndSecrets struct {
	ConKey, ConSecret, AppToken, AppSecret string

var caksFile = ".twitter/ids"

/* The .twitter/ids file contains four lines with string values
   obtained from the twitter developer api.

ConKey = "..."
ConSecret = "..."
AppToken = "..."
AppSecret = "..."

   For an App token and secret, you need to create an app here: https://apps.twitter.com/app/new
   This will then give you the option to create a consumer key and secret.
   (This useful information cribbed from
   https://stackoverflow.com/questions/1808855/getting-new-twitter-api-consumer-and-secret-keys )


func main() {
	caks := &ConsumerAndAppKeysAndSecrets{}
	blob, err := ioutil.ReadFile(caksFile)
	if err != nil {
		fmt.Printf("There was an error opening or reading file %s: %v\n", caksFile, err)

	err = toml.Unmarshal(blob, caks)
	if err != nil {
		fmt.Printf("There was an error unmarshalling contents of %s: %v\n", caksFile, err)

	api := anaconda.NewTwitterApi(caks.AppToken, caks.AppSecret)
	fmt.Println("Credentials = ", *api.Credentials)

	a := os.Args
	if len(a)  0 && i%1000 == 0 {
			flush(users, i)
			users = users[:0]
		user, err := api.BlockUserId(int64(u), url.Values{})
		if err != nil {
			errst := err.Error()
			if !strings.Contains(errst, "User not found.") {
				fmt.Printf("i=%d, u=%d, err=%v\n", i, u, err)
				flush(users, i)
		} else {
		users = append(users, user)

	flush(users, len(wlids))


type tomlWantsStruct struct {
	users []anaconda.User

func flush(users []anaconda.User, ending int) {
	buf := new(bytes.Buffer)
	if err := json.NewEncoder(buf).Encode(users); err != nil {
		fmt.Printf("There was an error encoding users: %v\n", err)
	fname := fmt.Sprintf("Blocked-%s-%08d", runtime, ending)
	err := ioutil.WriteFile(fname, buf.Bytes(), 0666)
	if err != nil {
		fmt.Printf("There was an error writing %v: %v\n", fname, err)

func readFileAsUint64s(filename string) (uids []uint64, err error) {
	var b []byte
	b, err = ioutil.ReadFile(filename)
	if err != nil {
	bids := bytes.Split(b, []byte("\n"))
	uids = make([]uint64, 0)
	for i, bid := range bids {
		s := digits.FindString(string(bid))
		if s == "" {
		var uid uint64
		uid, err = strconv.ParseUint(s, 10, 64)
		if err != nil {
			fmt.Printf("Failure to parse line %d of %s\n", i, filename)
		uids = append(uids, uid)

New Twitter Algorithms

November 5, 2017

My Twitter block list got unmanageably large, and blocktogether.org was not even able to remove blocks at any sort of a reasonable rate to help me fix it. So, I used my employer’s mighty-fine search engine to look for any Go packages for the Twitter API, and found Anaconda.
Read the rest of this entry »

The last time I did this, I had figures through 2011.
Now I have 2012, 2014 and 2105 (2013 seems to be missing).
Now in a Google spreadsheet, so you can look at the numbers directly and poke at the links if you want to see where the numbers came from.

In words — since 2009, each gallon of gasoline or diesel is taxed between 40 and 50 cents too low even if the only purpose of that tax is to pay for road construction and maintenance. Any other taxes (carbon, pollution, noise, congestion, health care) would be on top of that. This also does not include the maintenance or construction that we ought to be doing; this is just what is spent.

Totaled over all the fuel sold, each year since 2009 the annual shortfall totals somewhere between 75 and 100 billion dollars.

Read the rest of this entry »

Twitter algorithms

July 2, 2017

These are my rules for making Twitter more useful.

My goal, on Twitter, is a combination of finding fun and interesting stuff and to expose myself to (certain) other points of view. At work we have training on bias, unconscious and otherwise, and on techniques for reducing it and countering it. One of the instructors mentioned that you can’t just wish unconscious bias away; apparently repeated exposure to normalizing examples is required, but it takes time (this is yet another disturbing/annoying way that our brains resemble neural nets for machine learning; in this light, unconscious bias is just the result of a lifelong biased training set.)

Read the rest of this entry »

It’s a little depressing to look at how many hard it is to get all the different factions of the Democratic Party excited about helping each other. I wonder a bit if this is a case of scarcity pushing people towards fighting over scraps, and I wonder how much this is a case of Russians/Republicans using the internet to sow left-wing dissent.

At minimum, people ought to accept that each others’ problems are worthy. Is there really any question that blacks get a raw deal in this country? Or that people who are openly gay or trans are discriminated against? Or that women don’t get promotions and pay commensurate with their skills, productivity, etc? Or that unions are necessary in order to give workers an equal footing in negotiations over pay, hours, benefits, and worker safety? Or that many forms of pollution lead to statistically early death? Lack of an adequate social safety net is clearly a problem, and clearly one that can be solved, because countries that are less wealthy do a better job than we do — notably, they deliver life expectancy and lower infant mortality for less money per capita. They can afford it, so can we. Climate change? It’s happening. Slowly, but steadily, and it’s going to continue for decades-to-centuries after we finally decide to take it seriously; the only question is how fast it’s changing when enough of us finally get alarmed enough to really act. Education? College is stupidly, fantastically expensive, and to the extent this is Baumol’s Cost Disease, we should just subsidize it (other poorer countries manage to do this) and to the extent that it isn’t we should drive prices down by properly supporting public universities. Etc. These are all problems, and the Republican Party is on the wrong side of all of these issues. We shouldn’t pick just one, we should not be put off because we think labor is important but we’re a little nervous about the gays, or focus only on racism to the exclusion of college costs — there’s nothing wrong with wanting it all, we can have it all, and all of us deserve to have these problems addressed. There’s no mutual incompatibility between any of these issues.

And be a little more skeptical, say, when someone on Fox News tries to tell you that anyone who’s LGBTQ is a threat to the women and children. We’ve done plenty to make life unpleasant for people who aren’t “normal”; if someone’s out of the closet and you notice them, they must feel very strongly about it to put up with the social crap, and must have been truly miserable in the closet. This has nothing to do with your children, and everything with them wanting to live happier lives. Anyone who tells you otherwise is trying to con you into being mean to other people for no reason at all; ignore them, they’re evil.

Or, similarly, that someone might trot out some bogus statistics to try to make white people nervous about “black crime”. Some of these stats are flat lies, in other cases the data has been tortured into confessing things that aren’t true. In practice, most people are non-violent, most people are law-abiding (well, except for traffic laws, which everyone breaks very often, and traffic violence is actually a big deal). Don’t take the bait, anyone trying to convince you that blacks are a Big Crime Risk is just plain evil, ignore them, change the channel, turn off the radio. They’re trying to turn you into a racist and create dissent on the left.

There are bullshit artists trying to sow doubt about health care, too. One dishonest clown keeps trying to claim that Medicaid is worse than no health care at all, because people on Medicaid (as a population) are sicker than people who aren’t, never mind that if you’re poor and sick you’re much more motivated to sign up for Medicaid than if you’re merely poor, in which case that might seem like more of a hassle than it’s worth. This is what passes for serious statistical analysis on the right; these guys are sad, lying clowns, don’t let their obvious bullshit make you doubt the worth of providing health care.

And so on. There’s probably better examples but I’m a cis het white guy 1%er descended (father’s side) from a family with strong ties to Dartmouth, clearly I’m a traitor to my gender, race, ancestors, etc, it’s a wonder I get any of this right. The main theme is to not let one left-wing cause be split from another, and anytime you catch someone trying to do that, think about why. I honestly wonder how many of the alleged “hard-core Bernie-bros” that get noticed on the internet now are actually left wing or even American; disinformation is a real thing, and sowing dissent is a standard tactic. I supported Bernie, I sent him money, I like (or liked) his politics. But when he didn’t win the nomination, we’re done, support the nominee, got to stay focused on outcomes. I have several friends who did the same. Ask yourself *why* someone on the left would now be interested in prolonging the primary contest after we lost the general election. It makes no sense; the Republicans are uniformly terrible for everything Bernie Sanders has supported over the years, the Democrats are uniformly better, and we tried plenty hard in the primaries and Bernie didn’t make the cut. If we don’t unite, all of us, we lose ground.

Been meaning to write something, always too distracted to “do a good job”, as if getting nothing written was a good job. So….

Just now read a Copenhagenize article on bikes and trains saying something I had believed, but had no data to support. They have data. They also point out by example yet another way we do bikes wrong here in the US.
Read the rest of this entry »