When I see a number like "183" the first thing I see is a "1". If I'm looking very quickly, perhaps scanning a column of numbers, that might be all I see, and I'll approximate this number as "100" when "200" would be closer. Yes, truncation isn't the same thing as rounding, but wouldn't things be a lot easier if it were? Let's make it be that way.

To interpret a number today, you multiply each column by the size it represents and add them up:

number | 100s | 10s | 1s | sum |
---|---|---|---|---|

100 | 1 | 0 | 0 | 1*100 + 0*10 + 0*1 |

120 | 1 | 2 | 0 | 1*100 + 2*10 + 0*1 |

121 | 1 | 2 | 1 | 1*100 + 2*10 + 1*1 |

129 | 1 | 2 | 9 | 1*100 + 2*10 + 9*1 |

125 | 1 | 2 | 5 | 1*100 + 2*10 + 5*1 |

With this new system, we still do this, but in each column our available options range from -5 to 4 instead of 0 to 9.

number | 100s | 10s | 1s | sum |
---|---|---|---|---|

100 | 1 | 0 | 0 | 1*100 + 0*10 + 0*1 |

120 | 1 | 2 | 0 | 1*100 + 2*10 + 0*1 |

121 | 1 | 2 | 1 | 1*100 + 2*10 + 1*1 |

129 | 1 | 3 | -1 | 1*100 + 3*10 + ^{-}1*1 |

125 | 1 | 3 | -5 | 1*100 + 3*10 + ^{-}5*1 |

Here are a few more examples:

old notation | new notation |
---|---|

0 | 0 |

4 | 4 |

7 | 1^{-}3 |

579 | 1^{-}4^{-}2^{-}1 |

432 | 432 |

1999 | 200^{-}1 |

And here's a program to calculate these:

def to_new_notation(x): digits = [] carry = False for digit in reversed([ int(x) for x in str(x)]): if carry: digit += 1 carry = False if digit >= 5: digit -= 10 carry = True digits.append(digit) if carry: digits.append(1) digits.reverse() return digits

**Update 2016-05-25:** Truncation isn't actually rounding in this
system unless you allow both 5 and ^{-}5 as digits. Thanks to
Marius for pointing
this out.

When Lily was about six months old I posted about blocking out the light in our room so that she would keep a later schedule. In that post I talked about taping up tinfoil, but the problem with this is that there's no way to let in natural light if you want to. This isn't a problem for me: I like to have the bedroom just be a sleeping space, but Julia likes to use the bedroom to work, read, and hang out, and having only artificial light isn't very nice. So we needed to switch to a removable system.

The tricky part with this is that if you really want it to work you need the kid not to be able to tell that it's getting light outside at all, with day and night being equally dark. So it's not enough to just hang regular blackout curtains, because they'll still get their day/night visual cues and wake up earlier and earlier as the sun comes up earlier. What we found worked well was to have one blackout curtain attached to the inside of the window frame with velcro, and then another one hanging over the front.

For the first curtain, run hook-side velcro around the inside of the frame, attaching it with small screws:

At last year's big EA conference, Tyler Alterman gave a talk on
"succeeding at EA Global" (video). He opened with an
argument that people should be open to changing their minds about what
they should be doing. He described two worlds, a "Gaussiana" where
outcomes are approximately Gaussian,
and a "Paretonia" where they follow a Pareto
distribution. Citing Toby Ord's arguments in *The Moral Imperative
Towards Cost-Effectiveness* (pdf)
that a Pareto distribution is closer to what we see [1], and noting
that in a Pareto distribution the top outcomes are much much greater
than average outcomes, he argued people should be giving a lot of
thought to whether they could be working on something higher impact.

He showed two graphs to illustrate this:

These two graphs *are* how people commonly visualize these two
distributions, but they're not equivalent graphs.
more...

This site is now available over HTTPS, with certificates from Let's Encrypt: https://www.jefftk.com.

The certificates only last for three months, and I don't have automated renewal set up, so the https site might go down briefly every so often for the cert being out-of-date if I forget to renew. Once I sort this out I can redirect the http site to https, but I'm wary of doing it before then.

The `letsencrypt-auto` command I'm using is:
more...

Shortly after buying our house, we decided to split an awkwardly shaped 3rd-floor bedroom into a smaller bedroom and a bathroom:

current | proposed |

It took a little longer than we expected, and there were some surprises along the way, but it's done now!

(*This image is rotated from the previous ones, sorry!*)

In general, the plan was that I would do as much of the work as possible, by myself or with friends. In Massachusetts I can't do electrical or plumbing work, so I was going to hire people to do these, but there's a lot of other work that goes into making a bathroom! That division is mostly what we ended up with, but with the working time being my free weekends it ended up taking a lot longer than we initially expected.

Here's a rough timeline: more...

Work | ||

Band | Free Raisins | |

Code | ngx_pagespeed | |

Code | Bus Predictions | |

Code | MultiTouch MIDI | |

Code | Apartment Price Map | |

Dance | Davis Contra | |

Dance | BIDA Contra |