strictures and structures

if only we stopped trying to be happy, we could have a pretty good time

Rent: a positive review, with reservations

Much about “Rent” is timeless. The artistic struggle, the poverty, the need to carpe that diem–they are all classic. And there are some damn good songs. I have taken to howling “aoouuuuut toniiiight” when I’m riding my bike at 2AM.

And yet, “Rent” feels oddly dated to me.The rent is too damn high, but where are the battles between YIMBYs and NIMBYs? And where are the bigots? How are the LGBT folks living such unmolested lives? Especially now that Trump is president. For all its grittiness, “Rent” has aged into something positively innocent.


All the Light We Cannot See: a bad review

I really did not like this book.

Here is a quote, describing one of the two protagonists:

“He made such a faint presence. It was like being in the room with a feather.”

I am in a room with a feather right now. I forgot about it completely, until I saw it while sitting in my chair, thinking of other things. Then I thought, “I should throw this away. Are feathers compostable?”

The book is full of sentences like this. The most objectionable one is probably, “a calm peaceful place, insulated by fields, enwombed by hedges.” Enwombed. It makes you wonder if the author, Anthony Doerr, has ever had sex with a woman.

Doerr cannot be accused of possessing a tin ear. I would describe his voice as, “Hemingway on molly.” It’s not bad, and sometimes it gets pretty good, but the effect of the relentless simple, everyday words, and endless lists of subclauses crosses from rhythmic to soporific. It strikes me as lazy, but trying too hard.

I’d insult the plot too, but there isn’t one.

At some level, Doerr is a hack. A successful hack, a sensitive hack even, but nevertheless, proof that China Mieville, that giant of scifi and fantasy, was right when he called literary fiction a genre like any other.

my San Francisco to Seattle packing list

So, I just rode from SF to Seattle (about a thousand miles) during the month of September, alone. This is my packing list, just in case anyone’s interested in doing a similar journey. It’s sort of roughly divided into three sections.

bike tools
bike shoes (SPD-SL with a recessed area so you can still walk around easily)
spare spokes (I found these weren’t really necessary, but I’ve been accused of overconfidence before.)
SPD-SL pedals
portable pump (Get the kind with a PSI gauge, and where the head is attached to the rest of the pump by a tube.)
handlebar bag
rear panniers
tire irons
fresh new patch kit
tire boot
spare tube
water bottles (I had enough bottles to carry 3.5L total.)
cable for U-lock

rear and front lights (It gets foggy along the coast.)

bug spray
camp towel (REI makes these microfiber towels that pack up really small.)
sleeping bag (Make sure you get a sleeping bag with the correct temperature rating. Most bags come with a rating, but that rating probably applies only to men. E.g. if a bag has a rating of 45, it will be comfortable for a man in 45 degree weather, but a woman will probably feel cold. Add about ten degrees to a bag’s rating. So the 45 degree bag will only be comfortable in 55 degree weather for a woman. If you do more research, some companies will provide ratings by gender for their bags.)
sleeping pad
sleeping pad patch kit
spare tent stake
dry bag for food
bear bag rope
camp suds

SmartWool baselayer
down jacket
down vest
rain jacket
rain pants
non-bike shoes
2 pairs of bike shorts
2 shirts for biking
fleece-lined leggings
2 pairs of merino wool socks
merino shorts
pain meds
skin meds
world’s tiniest first aid kit
pepper spray
chapstick with sunscreen
wooden massager that I got at a job fair once
cellphone battery backup
dry bags
binder clips
straps with buckles

There are a couple more items I left off, but this mostly covers it. The only extraneous item I had that I did not truly need was the bear bag rope. Most state parks have food lockers, and I verified with the Oregon state park agency that bears are not really a problem.

All told, this weighed about 28 pounds. There’s very little I would change about this packing list, if I were to do this particular ride again.

I have mild regrets about trying too hard to minimize the weight of all that I carried. If you can shave off ten pounds, go for it, but a sleeping pad that weighs an extra pound, but is ten times as comfortable as an ultralight solution, is obviously better. You may as well err on the side of carrying too much. Unless you’re doing a very remote ride, which SF to Seattle is not, you’ll have plenty of opportunities to mail home excess gear.

Notice that there is no stove. I probably could’ve just barely had the space and weight for one, but I did okay just eating tortillas, beef jerky, dark chocolate, multivitamins, and blocks of cheese.

I hope you find this list useful!

the neoair xlite: a bad review

So bad, complete sentences are not warranted.

Pros: Packs light.

Cons: Sleeps like you’re on the floor of a bouncy castle ruled by a medieval two year old.

I have to use complete sentences to tell the story of what I did the first two nights I tried to sleep with this pad. The first night, I was staying at a friend’s house. The guest mattress was saggy, so I decided that it would be an excellent trial of the Neoair Xlite if I moved to the floor and slept on the pad. Bad news. I could not tolerate the Xlite and ended up sleeping directly on the floor instead.

Night the second, I was finally camping with the same friend. Perhaps the floor was unusually hard, or was radiating strange floor-particles through the pad, I reasoned. I deployed the pad again and it was still so uncomfortable, I ended up sleeping on the tent floor. That’s right, the Neoair Xlite was so uncomfortable that sleeping on rocky ground beat it.

This was the same night that the Neoair was torn by a rock.

When I went to REI to return it, every employee I talked to said that the Neoair sucked. Heh. If you’re looking for an ultralight sleeping pad, I’m not sure that the Neoair is actually the most uncomfortable out of the lot, but ultralight pads as a class might not be worthwhile if you value comfort.

finally, I have conquered a seventeen year old phobia

All this time, I’ve been fretting–what if a crazed maniac showed up and said, “Draw me a naked woman in twenty minutes, or I WILL DROWN YOU IN A BATHTUB FULL OF NUTELLA. WHICH I KNOW YOU DON’T LIKE.” What if? What if??

No more what ifs, now. Come at me, crazed maniac. I am ready now.


The big shadow in the upper left is my hand, holding the cell phone camera.

I actually don’t know if this would satisfy the nutella killer that haunts my nights, because the left knee is actually rather horrible, the torso needs more attention, the left shoulder’s shadow is too dark and is poorly defined, and as usual, I didn’t do anything for the face, but it satisfies *me*, and that girl, she can be a tough cookie sometimes.

I had a revelation about drawing the body, which is that it is convex at all the rigid bits, and concave at all the non-rigid bits. (Rather, Walter Stanchfield, Michael Mattesi, and several other artists have told me before, and even demonstrated it a million times, but it never sank in until a few months ago.) The best example of that in this drawing is the bend in the torso in between the pelvis and the rib cage. I just never had the time to apply this thought, even during twenty minute poses, until last night.

a terribly hacktastic implementation of Conway’s Game of Life

I had to take a Ruby training course as part of my job recently. The instructor asked us to write Conway’s Game of Life without any conditional statements–so no “if”, no “unless”, no ternary statements, etc.

Once upon a time I would have thought she was on crack and a mean vicious lady and refused to play along, but I’ve grown up a little bit, and to my surprise, I was the only one in the class to come up with a solution.

This isn’t the full implementation, but the core of the game is calculating the state a cell will be in on the next tick. Here it is:

  The general gist is that you iterate through all the neighbors, gather the liveness states
  of each of them, and convert the array of liveness states to a string. E.g. the array of 
  states [true, false, true] would end up becoming "true_true_false" (since we sort the array).

  Ruby has the ability to pass the name of a function to a method called "send." This is useful
  if your method calls are so dynamic you have no idea what you're going to be calling, as 
  we are in this case. So we write one method for each condition: one live neighbor, two live 
  neighbors, three, etc. Using the set of states, we generate the correct method to invoke without
  ever having to resort to the use of conditional statements.

  The cases, taken from
    Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
    Any live cell with more than three live neighbours dies, as if by overcrowding.
    Any live cell with two or three live neighbours lives on to the next generation.
    Any dead cell with exactly three live neighbours becomes a live cell.

  The one case I haven't handled is the case where two dead cells is not brought back to life, 
  but you could handle it using the strategy I've outlined.

def true_true_false_false_false_false_false_false(board, cell)
  board[cell] = true

def true_false_false_false_false_false_false_false(board, cell)
  board[cell] = false

# The overcrowding case.
def true_true_true_true_false_false_false_false(board, cell)
  board[cell] = false

# I won't write all of them because that's boring.

def check_neighbor_status(board, cell)
  neighbors = []
  neighbors += [-1, 0, 1].map { |x| [cell[0] + x, cell[1] + 1] }
  neighbors += [-1, 0, 1].map { |x| [cell[0] + x, cell[1] - 1] }
  neighbors << [cell[0] - 1, cell[1]]
  neighbors << [cell[0] + 1, cell[1]]
  # produces something like: 
  #   ['alive', 'alive', 'dead'...] { |n| board[n].to_s }.sort.reverse.join("_")

board = {}

board[[1,1]] = false
board[[0,1]] = false
board[[0,0]] = false
board[[2,0]] = false
board[[0,2]] = true
board[[1,0]] = false
board[[1,2]] = false
board[[2,2]] = false
board[[2,1]] = true

puts "Starting value of cell: #{board[[1,1]].inspect}"
# Generating the method name by checking the state of the neighbors.
method = check_neighbor_status(board, [1, 1])
# Using Ruby's metaprogramming abilities to invoke this method.
send(method.to_sym, board, [1, 1])

# Et voila, the state changed!
puts board[[1,1]].inspect

I was talking to a fellow dancer at an alternative blues event, of all places, and he pointed out that using a hash where the strings were the keys and the methods were values would have worked. Excellent point. The key insight is that you can use hashing to approximate conditional behavior.

Mainly, I’m posting this because did I mention I was the only person to get the solution, out of a room of about twenty professional computery types, and one of those people was my superhumanly competent coworker Lisa and I even surprised the instructor, and I *cannot* stop gloating?

I only look like a bad person, because I speak the truth. If you were me, you wouldn’t be able to stop gloating either.

on biking

It’s lonely on the 1. I wish I could say it’s beautiful, and I was counting on its beauty to cheer me up, but the clouds hanging over the sea are like so much blue dryer lint, and the sea itself has the dull gleam of crumpled foil in a trash can. The wind is blowing me back, a strong wind the likes of which I have not seen for five years. I remember Mike Munk telling me five years ago that he’d rather ride up a hill than fight the wind any day, because you can at least see what you’re riding against. I have to agree.

I’m tired, and I have no one to talk to but myself, so this is how I pass the time. I invent as many ways as I can to describe the pain of pedaling seventy miles.

  • The air feels like broken glass in my lungs.
  • The air feels like dry hay in my lungs.
  • My bones are turning into milk.
  • My bones are turning into chalk.
  • My lower back hurts so much that it feels like a crab is trying to pinch it free from my spine.
  • I am so hungry that it feels like I’ve swallowed a bobcat.
  • I am so hungry it feels like two stones scraping against each other.
  • I am so hungry I can feel my stomach digesting itself.
  • My eyes are drying out like peeled grapes.
  • I feel like tissue paper disintegrating in water.

I’ve done this to myself before. Not as often as the people I regard as being truly hardcore cyclists, but often enough. This is absurd because I don’t like cycling. My two favorite hobbies in all the world are reading really stupid books, and social dance. If a demon showed up and forced me to give up a hobby or he’d kill a litter of kittens, I would give up cycling first, no question. I’d even keep perfume collecting over cycling, and I haven’t bought a new scent in years.

So why am I here?

For the aftermath. For the victory. For the knowledge that when put to the test, I do not fail.

This is a fundamentally childish impulse, but childish in the best sense of the word–in the sense that the young have a need to learn, and explore, and grow, to discover themselves and the world, that someone more settled might not have. [1] The older and more experienced you are, the weaker your drive is to discover things–because you know them already.

So this is why I am here.

Because, ultimately, I want to find my limits. And I haven’t yet.


the virtues of overachieving

I don’t like people. I never have, and I never will, but even so, I’m forced to admit that I’ve met a remarkable number who are interesting, even amazing. It’s almost disgusting how you can take a bag of awards, accomplishments, skills, and hobbies, pick out a few at random, and bam! You’ve just made another Stanford student. Blue-haired product designer who welds things and does ballet? Bam, she exists, I have met her. A Googler who writes trophy-winning AIs in his spare time? Bam, he exists too. I know a lot of partnered dancers who excel at dance and some other esoteric field, mostly because that’s my hobby, dance, but I’ve met a harpist who does wushu. There are plenty of other combos out there.

I was hanging out with two of those annoyingly accomplished Stanford students a few years ago, and since they were old enough to be thinking about leaving the warm cocoon of Stanford’s campus, talk turned to the job market. They were mechanical engineers, not programmers, so their job security was somewhat uncertain. I said, tentatively, “Well, what about not doing engineering?” Andy they replied in nigh unison, “I couldn’t bear the thought of wasting my education.”

This story, mundane as it is, haunts me. Why? I’ll be the first to admit that Stanford is too expensive for the kind of useless, traditional liberal arts education that I value so highly. If you buy it, you have to use it.

What bothers me, I think, and I don’t believe my friends meant to imply this at all, of course, but what bothers me is that it seemed like another outbreak of a strong sentiment that it’s not enough to just be a good person. To live well, to do no harm, to help others–lauded, but hardly prioritized, and never given the same status as “achieving one’s potential,” whatever that means.

Though I must admit, I am lazy. I am a Type B, all the way. Meeting ambitious, accomplished people tires me out. The pressure to achieve, to be interesting, to be unique, suffocates me sometimes. It all seems so draining, and it is so, so very unnecessary. We don’t live in a kind or just world, and living up to one’s potential as a decent citizen of the world will do a lot more good than being a champion fencer who built a bipedal robot for his PhD thesis.

William Carlos Williams update #3

This is just to say

I have eaten
the pluots
that were

screw it

are my

I will

Dad pronounces judgment

Dad: You don’t have a truly scientific personality, Jane. You’re my daughter, and I’ve seen how you behave. You really like petting cats and dogs. If you were a real scientist, you would want to dissect them instead.