Bike-related articles

January 12, 2018

An internet bikey friend is a new-ish assistant professor of transportation, has a pile-o-books to read. I figured, why not skim off the best/most-interesting of everything I collected in Evernote over the last few years, and make a dump of it, perhaps some will be useful, perhaps it won’t.

An amazing summary of stuff
Cycling, Health and Safety (OECD)

English bike commuter health/mortality study (striking results, I think there is some selection effect)
Danish mortality study
Cycling for Freezing Gait in Parkinson’s Disease (video)
Physical activity, self-report vs reality (picture of poster)

Road capacity

45 bikes in 23 seconds (video)
27 bikes in 18 seconds (video)
25 bikes in 25 seconds (video)
24 bikes in 16 seconds (video)
22 (?) bikes in 9 seconds (video)
Videos illustrating road capacity different ways (article and videos)
Estimating Capacity of Bicycle Path on Urban Roads in Hangzhou, China
Operational Analysis of Uninterrupted Bicycle Facilities (Level of Service for bike paths?)

Bicycling injury hospitalisation rates in Canadian jurisdictions (Teschke et al, helmet laws)
Vancouver drivers at fault in 93% of collisions with bicycles: city report
Bicycle Use and Cyclist Safety Following Boston’s Bicycle Infrastructure Expansion, 2009–2012
Cyclist’s video of annoying crash, shows how a driver can “not see” what is right in front of them. (video)
Cycling safer than driving for young people, new study suggests
Study blames drivers for bike crashes (study not perfect…)
30x higher hospitalization rate for helmeted Dutch cyclists (blog, great illustration of selection effect)
Risk compensation and bicycle helmets
Florida bike crashes: 7 things that may shock you (news study)
Wearing a Bicycle Helmet Can Increase Risk Taking and Sensation Seeking in Adults
The influence of a bicycle commuter’s appearance on drivers’ overtaking proximities
Drivers overtaking bicyclists: Objective data on the effects of riding position, helmet use, vehicle type and apparent gender.
Florida bike distance passing study, somewhat replicates Ian Walker’s study
Cambridge, MA bike crash data

How many people use commuter rail? (in Boston — blog, generally interesting)

Crash injury/mortality rates by mode of travel (US).
Crash injury/mortality rates by mode of travel (England).
Crash injury/mortality rates by mode of travel (Canada).
The cost-effectiveness of bike lanes in New York City.
How driving a car into Manhattan costs $160
94% of bike riders wait at red lights
Why people jaywalk (looooong video)
People assume biker breaks law despute contrary video evidence
Comparison of cyclist and driving ability to hear
Understanding congested travel in urban areas
Transport transitions in Copenhagen: Comparing the cost of cars and bicycles (paywalled)
What is the optimal speed limit on freeways? (paywalled)

Auto air pollution
MIT air pollution deaths study
Air Pollution and Criminal Activity: Evidence from Chicago Microdata
The list of diseases linked to air pollution is growing

Auto safety
International road safety comparisons
Pounds that kill (Anderson & Auffhammer SUV unsafety article)
Car helmets
Car headband
SUVs’ risk to others admitted by industry
CDC: TBI Death causes
CDC: TBI Hospitalization causes
Literature Review on Vehicle Travel Speeds and Pedestrian Injuries
Effects of Speed on Pedestrian Fatalities
The fatal injuries of car drivers (head injuries sole cause 23%, co-cause 18%)

Stuff I wrote
These tend to include links to spreadsheets and source documents, should anyone care to check my work.
Hypothesized mechanisms for US safety-in-numbers.
Bike share does not need helmets. Per-trip, it’s a lot safer than driving. There are caveats and quid-pro-quos — but the Cs and QPQs have larger effect than helmets.
We subsidize driving, yes we do.
Videos of not-quite right hooks, in case anyone wants to know what they look like.
A graph, by zipcodes, of the cumulative US population density.
Distributions for trip distances, for commutes and trips and general, and also a cumulative graph of the distance traveled. TLDR=”Lots of trips are short, but long trips matter because they are long. Commutes are 26% of trips but 35% of miles.”
Various ways of looking at road damage. It’s not presented as well as I would like unless you’re comfortable with log scales.
E bikes in China (back in 2011 the boom was well under way)

Videos I made
Tortoise and hare. Biking is that much faster, zooming ahead is useless and unsafe (video)
Why run reds (video)
Ticketing bikes and reducing safety (video) (catch the ped pass at 1:27, oh well)
A 10 minute chunk of my morning commute, with various events and commentary

Bell Curves

January 12, 2018

No, not the racist bullshit artist’s book.

One thing I realized a few years ago is that for human attributes, bell curves are everywhere. The standard examples are things like height and weight, but why not, say, strength, or patience, or organizational skills, or empathy? Some people have more, some people have less, and there’s no particular reason to treat them as much different from (say) physical strength; something that we possess in different quantities, and something that we can improve within bounds, but that improvement itself takes work, and the bounds are real.

“Work” generalizes similarly. We can get tired of walking, of lifting, of thinking, of maintaining a pleasant attitude, and so on.

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)

Back in 1997 the New England Lily Society (then, the New England Regional Lily Group) hosted the annual meeting and show of the North American Lily Society in Burlington, Massachusetts. Among other things, “we” (not me, but other then-members) designed and built a huge number of stem holders, which we have used for years ever since in our own shows. We’re hosting the show again in 2019, and may need more stem holders. I have a few (because otherwise they would have been thrown out as excess), and I thought I shold record and publish their dimensions. It turns out that for some of the larger trumpet-oriental crosses a larger base is needed, and the largest stems also inhale so much water (for respiration and/or bud opening) that a larger reservoir is necessary. But for most lilies these work great.

The stem holder has a wooden base and a removable stoppered PVC insert. The PVC is thin-walled (2mm), outer diameter appears to be 1-and-5/16 inches, length 11-and-5/8 inches. The base is stepped, with a 5-and-half inch square by 1-and-half-inch high bottom part (clearly cut from US “2-by-6”) and a 3-and-a-half by three-quarters top part (clearly cut from US “1-by-4”). The base has a central hole for the PVC to wedge into (pretty tightly, too) that is 1-and-a-half inches deep by 1-and-5/16 inches diameter.

New England Lily Society stem holder.

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 »

I guess people think I am tedious on this subject (people on Facebook think I am tedious on this subject), but bike share is very safe. By design, it can count the number of trips. We’re pretty good at counting deaths, too. In over 100 million trips there have been two deaths. (Death #1)

On “normal” bicycles, we’d expect to see 20 deaths in that many trips. In cars, we’d expect to see 9 deaths in that many trips. Instead, two. (As a sanity check on those rates, Canadian statistics are similar.)

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 »