Jan 2, 2022

My Year In Cities, 2021

Like two years ago, but unlike last year when I never left my home, here is the list of cities I visited during 2021, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Dec 31, 2021

A Closed and Common Lisp

I just recently finished up Advent of Code for 2021, and, like last year, I did it in a new-to-me language. This year's choice was Common Lisp. My total previous exposure to Lisp was a couple weeks writing Scheme in my Programming Languages class at university, so it was almost entirely a novel experience.

Writing Lisp is like entering an alternate timeline where computing in the 1960s took a significantly different path. Rather than ALGOL becoming the favored language and spreading the syntax of blocks, assignment statements, function calls, and the rest to languages from C to JavaScript to Rust to Python, instead the world is based on lists, S-expressions, and parentheses (oh, the parentheses!).

It reminds me of nothing so much as my brief foray into learning Japanese. The vast majority of non-English natural language that I was exposed to growing up was from the Indo-European family (particularly the western European ones), so when I was first started learning Japanese, it was eye-opening. Almost every aspect of the language was unfamiliar, and it gave me a new appreciation for the great diversity of humanity.

Overall, I was greatly pleased with my choice of Common Lisp. It's a very pleasant language to use, and it has some real high points. Below, I'll discuss a few specific areas that caught my eye.

For those who are curious, I used sbcl as my implementation and Emacs with SLIME as my editor.

Programming Paradigm

Starting out on this project, my impression of Lisps were that they were heavily slanted toward functional programming, though with more escape hatches than something like Haskell. This is a bit more true for Scheme than for Common Lisp, but mainly it's just wrong. While Common Lisp supports a functional programming style very well, it also happily supports a procedural style. Indeed, it marries the two wonderfully, letting you use the right tool for the job.

As a simple example, despite the origins of the name Lisp, it has arrays as a first class data structure, and they work just like in any other procedural language, so you can write efficient iterative code that would be difficult in a functional style just fine. Looping is also both well supported and entirely idiomatic from what I understand.

The great support for functional programming, though, does tend to mean that I wrote code in that way more often, which I see as a plus. I like functional programming, despite disliking many functional programming languages, and one of my main complaints with a lot of day-to-day workhorse languages is that they make it harder to write in a functional style than I'd like. Not so with Common Lisp.


First things first: yes, there are tons of parentheses; my record in this year's AoC was 14 closing parens in a row. And arithmetic without infix or suffix operators is a bit annoying. (+ (second start) (abs (- (* 2 (first start)) dest))) is just not as readable as start[1] + abs(2 * start[0] - dest).

But those are relatively minor — they don't really cause problems in practice. Much more significant is also Lisp's great innovation: everything is an S-expression.

Because everything is an S-expression, everything is structurally similar to everything else. Function definitions look like function calls; lambdas look like building lists; returning multiple values looks like a hash table lookup. Syntax highlighting helps to a certain extent, but for the most part the eye glazes over Lisp code and it all blurs together, which makes it harder to read and debug.

This is compounded by the fact that the same identifier can mean different things in different places. Common Lisp is a Lisp-2, meaning there are two different symbol namespaces — functions and values — which are used at different times. As well, you also have symbols, which are a type of value that's normally written 'symbolname but are sometimes written bare, like with the case macro.

I once lost half an hour debugging a nonsensical return value because I had an errant (list in my code, which added an additional level of list nesting that wasn't supposed to be there and discarded a secondary return value. That was very hard to find, because (list was also in my code legitimately in several places, both because I was constructing lists and because I was switching on the type of objects, and the typecase macro uses bare symbols. In a more ALGOL-like language that had separate syntaxes for constructing lists, switch statements, and function calls, the errant list would have been much more obvious.

Now, I don't know that this is necessarily the wrong choice. The fact that everything is S-expressions is also what makes Lisp special: you can write macros that manipulate code in the same way you manipulate data, and even though I never wrote one it's so obviously powerful just from using macros from the standard library that I'm willing to give it the benefit of the doubt. But it is a frustrating facet of the language.


Tooling, on the other hand, is the place I most thought to myself, "How have I never heard about this before?!?" It's incredible, and the principles aren't Lisp-specific in the slightest, so I have no idea why every language hasn't shamelessly stolen them.

Everything starts with the REPL, which (at least for sbcl) is useful but not extraordinary by any means. Most languages have a REPL, but using them to assist in writing software is usually annoying. Node's REPL makes it awkward to import modules or run async code. Python's REPL can't edit function definitions sensibly. And every REPL I've ever used makes it hard to get the code out and into a source file once it's working.

SLIME is the opposite. You write your code in your source file like normal, then there's a keybinding (Ctrl-C Ctrl-C by default) to send the current top-level form — which is usually a function definition — to the REPL environment for evaluation. You then swap to the REPL and call it to make sure it's doing what you need. And as a bonus, if something you do causes an error, sbcl's REPL drops you into the debugger rather than just dumping the error to the console.

This enables you to write code in the way that I think is ideal: edit source in your source file using the tools in your text editor, test what you've got at any time using the tools in the REPL and debugger. When you've got everything just how you want it, there's nothing more to do; the code is sitting in the source file it's supposed to be in.

I'm not sure I can do it justice here, but it's just so smooth. And the most frustrating thing to me is lots of modern languages could do this. Nothing prevents someone implementing this for Python or Node — they both can evaluate code coming from elsewhere, allow redefining functions, have structures that can easily let you determine what definition you're in, and everything else. And yet, nobody has as far as I know. It's deeply confusing.

Returning Multiple Values

A small feature I was surprised by is Common Lisp's method of returning multiple values. Famously, Lisp has lists, so you can of course return multiple values yourself by just returning a list. But Common Lisp also supports an explicit multiple value return form. The key difference is that if you directly use the value from a function that returns multiple values, you only get the first return value.

This makes the second and later return values optional in a way that is very convenient. For instance, the truncate function, which implements integer division, returns the remainder from the division as a second value. So (print (truncate 5 2)) will print 2, but hiding in the shadows is a 1 as a second return value in case it's needed.

This is cute, and at least as useful as the usual method. There are a lot of functions where this kind of thing shows up. For instance, the gethash function to get values from hash tables returns a true/false indicator as a second value for whether the value existed to allow you to distinguish between missing values and a value of nil stored in the hash table.


I don't know if the loop macro in Common Lisp is genius or madness. It's the idiomatic way to do iteration, but the syntax doesn't resemble Lisp in any way, the number of variations is as long as your arm, and you can mix and match every which way. All of these are valid loops:

And that's not even the half of it. One (intentionally overblown) example I found looks like this:

(loop for i from 1 to 100
      if (evenp i)
        minimize i into min-even and 
        maximize i into max-even and
        unless (zerop (mod i 4))
          sum i into even-not-fours-total
        and sum i into even-total
        minimize i into min-odd and
        maximize i into max-odd and
        when (zerop (mod i 5)) 
          sum i into fives-total
        and sum i into odd-total
      do (update-analysis min-even

Everything before the do there is part of the loop! And that do can be replaced with various alternative actions for the loop to take, like collect to collect values into a list or sum to sum then. In writing this section, I realized that many of the loops I wrote for AoC this year are suboptimal; I did something outside the loop that there's a purpose-built loop keyword to do.


The standard library in Lisp is quirky. Someone on Stack Overflow referred to it as a "no batteries included" language, and in a lot of respects, that's correct. There's no built-in function to split a string or flatten a nested list, which you can find in almost every language nowadays. But on the other hand, there are functions like 1+ (adds one to its argument), y-or-n-p (prompts the user to answer "y" or "n"), and short-site-name (returns the name of the machine's location).

However, there is Quicklisp, which is a CPAN-style system for loading libraries that works really well, and everything I needed had a well-regarded library available for it. So it's not like you need to implement everything yourself.

Overall, I'm a little disappointed. I think I align much more with Go's philosophy here: the language is better when it provides a really comprehensive standard library you know you can trust. Having to rely on third parties to provide core functionality (let alone highly sensitive libraries like crypto or networking) is a bit of a downer.


I can see why Lisp has its diehard partisans, it's a very nice language family with a lot of things to like in it, and Common Lisp seems like a rock solid Lisp. I'm actually surprised that it's not used more than it is. Even though the syntax is unusual, I didn't really have any problem picking it up, and what it gives you is pretty compelling. I'd recommend you give it a shot if you haven't, especially if you're already an Emacs user.

Honestly, the biggest thing holding me back from using it more is just that I don't know what I'd do with it. I don't write that much software from scratch these days. But I like Common Lisp enough that I expect my next personal project will use it.

Dec 28, 2020

A December with Julia

I first did Advent of Code last year, and I decided then that I wanted to use it to learn a new programming language each year. Last year it was Rust, this year it was Julia. Unlike last year, this year I managed to complete every puzzle on the day it was released, and in the process I think I got a pretty good introduction to Julia.

For the most part, Julia lives in the same basic category as Python: an expressive, dynamically typed, garbage-collected language for writing small programs. Julia in particular has a focus on numeric analysis and scientific programming, which is also a niche where Python is heavily used with libraries like SciPy and pandas.

The quick summary of my experience is that I really like Julia. It’s thoughtfully designed in ways that make writing programs quick and efficient, while seeming to be more maintainable than Python, though I still don’t think I’d advocate writing large programs in it. Like Python, it has an expansive standard library with lots of helpful tools, though Julia’s is geared more towards numeric computing (for example, there is an entire linear algebra library). That said, the limits on how deep you can get into a language just writing Advent of Code solutions are real, so this is just a first impression.

Rather than walk through the basics of the language, which you can easily find elsewhere, I thought I’d discuss the areas that I particularly liked or disliked, from the major to the trivial.

Like: Multiple dispatch

Julia is based heavily on multiple dispatch, which means that a given function name can have multiple implementations that differ in the type of its arguments, and the correct implementation is selected based on the parameters provided. Since Julia is also dynamically typed, that selection happens at runtime, though the compiler may use some tricks to narrow the possibilities ahead of time, I don’t know.

It turns out that this works out really beautifully. Among other things, despite Julia having type hierarchies, it seems like it discourages deep hierarchies and a lot of the debates about composition-versus-inheritance. I’ve gradually soured on the usefulness of complicated OO hierarchies, and one thing I enjoy about Go is the use of interfaces for making interchangeable parts instead of inheritance, and multiple dispatch seems like an even better way to go about that.

One awkward consequence, though, is that code completion becomes a lot less useful. Imagine you’re wanting to add an object to a container, and you remember that the function you need is called push!(), but you can’t remember which order the arguments go in. So you type out the function, and VS Code’s IntelliSense helpfully provides you with this info popup:

That indicator on the left shows you that there are 40 implementations of push!() available, and the first takes a Base.Nowhere (a type you can’t use) and a Core.Any (the root of the type hierarchy). That’s… not helpful. Some way to make the most relevant or indicative implementation show up first would go a long way here.

Like: Shared concept, shared name

One reason Julia’s use of multiple dispatch is so nice is the thoughtful way the standard library has been constructed. Shared implementations of an overall concept are all bundled under the same name, which makes code both more reusable and easier to write. This may be a case where my mathematical background biases me, but there are a lot of cases where what could be a very narrow interpretation of a name is avoided and instead an expansive one is instead, ultimately making the language more useful.

My best example of this is the max() function, whose behavior is familiar from most languages. Or at least, its behavior on numbers and strings is familiar. But one of the Advent of Code programs involved a Conway’s Game of Life in 3D (and later 4D), where the Julia type needed is CartesianIndex. What should max(CartesianIndex(3, 1, 2), CartesianIndex(2, 3, 1)) return? In Julia, it returns CartesianIndex(3, 3, 2).

This violates what could be a maxim in another language: max() should always return one of its arguments. However, following that would mean that it fails on partially-ordered types like CartesianIndex (though CartesianIndex is totally ordered by < in Julia, but whatever). With Julia’s implementation, though, it really provides a least upper bound on the arguments, which is more useful. It lets you write code like for i in min(a...):max(a...) to loop over all CartesianIndexes within the N-dimensional bounding box that contains all your points: exactly what you need for Game of Life in an infinite 3D space.

Like: Type assertions, not hints

In Python, you can decorate variables, function parameters, and so forth with types, but they don’t actually do anything. Static analyzers can use them to tell you when you’ve screwed up your typing, but at runtime they have no effect, and actually getting a static analyzer set up properly is a lot of trouble for a small program. Julia has similar functionality, but it actually enforces types at runtime: assigning to a variable annotated with a different type triggers an exception, including things like storing an item of the wrong type in an Array. This is way more useful than just hints and I found myself using types frequently to catch bugs early.

This is one of the features that makes it feel more maintainable than Python. Type assertions are useful, which means you’re much more likely to add them on their own merits, unlike in Python where they always feel like a chore to me.

Neutral: Crowded namespaces

The Base module, which is the module that contains most of the commonly used functions and is automatically imported into your module, is surprisingly crowded. It includes names like one, something, devnull, retry, functionloc, and code_lowered, among hundreds of others. I’m not really sure how I feel about this, but it’s surprising. I basically never had to import anything, which is convenient. I was also constantly worried about stomping on some name in the Base namespace, but the name resolution rules make it so that largely doesn’t become a problem.

Dislike: 1-based indexing and closed ranges

These two are related, but Julia uses both 1-based indexing for strings and arrays and closed range intervals, rather than the more typical 0-based indexing and half-open intervals. While this is sometimes a little more convenient for small problems, such as needing to translate “the ID starts at the fourth character of the line” into code, it makes more complicated operations quite annoying. In one chunk of code (which didn’t end up making the final version), I was using a regular array as a circular buffer, and I had to index it as (i - 1) % length(array) + 1, which is just ridiculous.

Julia does have the ability to specify that an array should use different indexing, but that doesn’t change the fact that intervals are still closed, and it also means your programs have a mixture of different indexing. This seems way more dangerous than just using the same (bad) indexing for everything, so unless you have some very dense code that makes much more sense with 0-based indexing, it doesn’t seem advisable.

Like: Appropriate use of magic

Julia has a few places where the authors have decided that a little sprinkling of syntactic sugar would make a common operation more straightforward, and I think basically all of them have merit in a language like this. The most magical is begin and end, which are normally keywords that introduce blocks and new scopes, but can additionally be used in array indexing operations to indicate the first and last valid index, so you can write a[begin:end-1] to get a collection without the last element. This must be tricky to parse (especially since begin and end can legitimately show up in expressions already), but it’s nice to have and makes the code using it pretty clean.

Like: High-quality REPL

This is just table stakes for a new language. Even C# has a reasonable REPL these days. Julia’s is quite good: nice presentation of values; good handling of multi-line operations like function definitions, especially in history; tolerable completion.

Dislike: Non-ASCII symbols as operators

It’s cute that you can write e ∈ a to check if e is an element of a, but I think it makes programs harder to write and the language harder to pick up for little benefit. It appears that all of the operators that do this also have functions with ASCII names to do the same thing (and the REPL allows typing the symbols using LaTeX syntax, also cute), but none of the documentation even mentions that, so you can only discover those if you go look in the reference manual for the operator’s definition.

Like: Immutability by default

Many things (most notably, structs) in Julia are immutable by default, and most functions that work on mutable objects return copies rather than modifying the original. There’s a convention that functions that modify their arguments are named with a !, so you have sort(), which produces a sorted copy of something, and sort!(), which sorts it in place. (And immutable types simply have implementations for sort() but not sort!()). This is great for maintainability in larger programs as well as safety under concurrency, and the convention calls out any modifications quite clearly.

Dislike: Documentation

Julia’s documentation is only okay. Some of the introductory material is really quite good, but it’s definitely aimed at scientists rather than software developers. For instance, the manual doesn’t appear to include the concept of a dictionary, and the “Noteworthy differences from other languages” section begins with comparisons to MATLAB. I wish they had a parallel track for software developers switching to Julia.

In addition, the reference manual leaves out a lot of details. For example, the entry for CartesianIndex doesn’t mention the max() behavior I liked above, nor does it mention that they’re totally ordered under < (apparently reverse lexicographically). The entry for max() similarly gives no indication it might be smarter than first assumed. StackOverflow or random blog posts appear to be the only places you can learn these things, which is a sad state of affairs.


Overall, I ended up with quite a good impression of the language. Once you get over a few hurdles like figuring out how to write a dictionary, I ended up having code that was as easy to write as Python but felt both cleaner and safer. Given that the language is so much younger, I suspect that the available libraries are probably a lot less mature for complicated topics like networking or crypto, but for the kinds of thing I typically want a small scripting language for, it really fits the bill for me. For the next little while, I’m going make an effort to reach for it first whenever I have a small problem to solve and see if it continues to impress or if I end up going back to Python.

Jun 14, 2020

20 Years of Programming

I'm not sure of the exact date, but 20 years ago, around now, I started my first professional programming job. It's weird to think about having done anything for 20 years. That's as long as all my schooling put together.

That first job was an intership at a 6-person startup in Petaluma where I worked on a web app written in ColdFusion and had to learn SQL from scratch. I commuted 2.5 hours each way, mostly by bus, during which I read a whole lot of books. I got paid a little over minimum wage, though I got a raise after a couple months.

The very first day, I took the bus going the wrong way and 5 minutes later I was on the Golden Gate Bridge heading into SF. I had to find a pay phone and call someone to pick me up.

In Petaluma, the city bus ran once an hour, and if the Golden Gate Transit bus was late getting to Petaluma, I walked 40ish minutes to work rather than wait for the next bus.

I only found out about the internship because my cousin worked there. I don't know how much that factored into me getting the job, probably at least some.

I learned a lot from that job. I learned that I was capable of keeping up with fulltime programmers. I learned that I could figure out new technologies by reading the manual and playing around. I learned a bit about how not to run a company.

Anyway, 20 years later and I'm still doing it. Despite lots of details being different, the actual writing of the code is pretty much the same as it was back then. The biggest thing that's changed is I've come to do (and value) a lot of things that aren't just writing code.

Jan 7, 2020

My Year In Cities, 2019

Like last year, here is the list of cities I visited during 2019, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Jan 1, 2019

My Year In Cities, 2018

Like last year, here is the list of cities I visited during 2018, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Mar 24, 2018

A Day in the Life of an American in London

As an American living in the UK, I often have people ask me how life here differs from in the US, and it's a hard question to answer. On the one hand, things are pretty much the same whether you're living in New York or London, but on the other hand, there are hundreds of tiny differences that can be confusing or annoying. So, I decided to pay attention one day and write down all the differences I could notice, no matter how small, over the course of one day (specifically, Monday, March 12, 2018). I've presented it in chronological order so you can get an idea of what it's like to live a day in London as an American.

06:25 - We wake to the sounds of Max humming the ABCs to himself. The ABC song doesn't rhyme properly here, because they say zed instead of zee for the last letter of the alphabet. As far as we can tell, there are a few local attempts to fix this—like shoehorning in extra syllables to end with "zed not zee"—but for the most part English children just sing the non-rhyming version.

06:30 - We go get Max out of bed. A child's bed is a cot in England, not a crib.

06:40 - I bring Max downstairs and give him some milk. The standard milk varieties in England are called skimmed, one percent, semi-skimmed, and whole instead of skim, one percent, low fat, and whole, though their percentage milkfat is the same.

06:45 - I read Max a book. The book uses "Mum" and "Mummy" instead of "Mom" and "Mommy", though I say it the American way because Pat prefers to be called "Mom". Today, I'm reading a book where that doesn't matter, but we have a couple books where "Mum" or "Mummy" are the end of a rhyming line, and so changing it is awkward.

07:00 - I head upstairs to take a shower, where a lot of things are different. The light switches are outside the bathroom. The brands of toothpaste and soap I bought in the US aren't sold here, so I use another brand. The shower head points directly down from the ceiling instead of at an angle. Heated towel racks are a common feature in English bathrooms, though ours don't work properly.

07:15 - Getting dressed. The English wear trousers instead of pants, though while the latter is instead used for underwear by the English, nobody gets confused when you refer to "pants" with an American accent.

In order to figure out what I need to wear, I check the weather, which is expressed in Celsius.

07:25 - Before I leave the house, I have to clean the cat box. Cat litter is almost universally non-clumping in England, whereas we prefer clumping litter, so we have to buy it from Amazon. Amusingly, the brand we like best is called AmericaLitter. After I clean the cat box, I wash my hands. Our usual brand of hand soap isn't available here, so we buy a different one.

07:30 - I say goodbye to Pat and Max, who are eating breakfast. We used to prefer Cheerios, but in the UK they're made by Nestle instead of General Mills and don't taste the same, so we don't buy them anymore.

On my way out the door, I take a bag of recycling with me. Recycling is pretty much the same, but you have to put it in clear plastic bags. The place in front of our house that has the plants (and, in our case, the shed with the recycling bin in it) is called the front garden rather than the front yard.

07:31 - A short walk from our house, I pass a place advertising MOT servicing, which is like a smog check.

07:32 - I cross the street via a zebra crossing rather than a crosswalk.

07:36 - I pass an off license, which is a store that has a license to sell alcohol for consumption off-premises. I also pass by a lot of restaurants, which are pretty much the same as in the US from the outside, but have a bit of a different mix: many more Indian and Mediterranean places, fewer Chinese and Thai.

07:50 - I pass through Camden Market, which is a huge tourist attraction. At this time of day, none of the shops are open except the ones that serve coffee, but by the afternoon the pavement (what Americans call the sidewalk) will be packed full of people. One shop that I pass is the American Candy Co., which I've never been into, but hung up in the window is a large amount of Arsenal merchandise.

07:55 - I pass by St Pancras Hospital, its sign emblazoned with the NHS logo. The National Health Service is one of the biggest changes: free, single-provider health care for everyone in the country. The fact that everyone gets world-quality care is revolutionary, and the lack of it in the US is an embarrassment.

08:00 - I pass under the tracks leading out of St Pancras railway station. Trains are a part of the national culture in England, for many people they're the primary mode of transport, including when going on holiday (rather than vacation).

08:10 - I pick up breakfast on the way to my desk. Among the things on my plate are streaky bacon, which is what Americans simply call bacon, and hash browns, which are like American hash browns that have been formed into triangular bricks before being fried.

08:15 - I arrived at my desk, where I'm greeted by a UK layout keyboard. It's largely the same as a US layout keyboard except for the symbols generated by Shift-number key combinations and the placement of a couple of the more unusual punctuation characters like |. I actually have my computer set to US layout, so when typing on my computer the output doesn't match what the keycaps say.

08:45 - I have a work neighbor that's newly arrived in the country, and we have a conversation about all the difficulties in moving here, chief among them opening a bank account. The most common form of bill payment in England, including for rent, is direct bank transfer. This causes some issues when moving here, because you can't open a bank account without proof of address, and it's hard to pay rent without a bank account.

09:00 - I go make tea using an electric kettle. Basically every home in the UK has an electric kettle, but they're very uncommon in the US. That's partly cultural and partly because the lower voltage in the US means they're not as quick to boil.

12:45 - I get lunch. Among the things available today are courgette, what Americans call zucchini, and serrano ham. In general, European cultural foodstuffs are a lot more common here, so seeing Spanish or Italian meats or cheeses is routine. On the other hand, it's rare to see some North American foods like tomatillos or Andouille.

13:00 - Clocks in the UK are more commonly set to 24-hour display than in the US, so several of the clocks around me now read 13:00.

13:50 - I read a tweet from our MP about saving women's refuges. I have to look it up, but they're what are called women's shelters in the US. Also, we're not allowed to vote in the UK, so we don't get any say in who our MP is.

16:40 - I take the Tube home. It's actually quite like the New York Subway or various other mass transit systems I've used, though the Tube of course has its own quirks. It has contactless payments, which are becoming more common in the US but haven't yet reached full-scale deployment in New York, and relatively small trains but very frequent service (indeed, the Victoria line has the second most-frequent service of any metro line in the world).

17:00 - I stop at the grocery store on the way home. I don't have much to get, as we're not cooking dinner tonight, but the aisles are filled with rocket (arugula), aubergine (eggplant), and the like. One thing I do have to get is a bottle of wine. The wine selection is definitely heavily tilted towards France and Italy and away from the United States compared to what you'd see in an American grocery store; there's more Chilean wine than there is Californian.

19:00 - It's time to put Max to bed. I put a fresh nappy (diaper) on him and read him a couple books. Today's books include Each Peach Pear Plum, which is an English cultural touchstone that I had never heard of before moving here, though I understand it's available in the US. Several of our British friends know it by heart, even in their 30s.

20:00 - Pat and I order delivery. In the US, where you'd say to stay or to go, the English say eat in or take away. Today we're having Indian. In the UK, when you order a curry or something else that's typically served over rice from an Indian restaurant, the rice isn't automatically included, unlike in the US. We've forgotten this a couple times and been duly delivered a tub of curry with no rice, though that doesn't happen today.

Obviously not every difference comes up every day (I didn't even mention pubs or The Great British Bake Off), but this is a pretty typical day for me, and I hope this gives people a better idea of what it's like living here.

Jan 8, 2018

My Year In Cities, 2017

Like last year, here is the list of cities I visited during 2017, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Jan 3, 2017

My Year In Cities, 2016

Like last year, here is the list of cities I visited during 2016, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Jan 9, 2016

My Year In Cities, 2015

Like last year, here is the list of cities I visited during 2015, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Feb 4, 2015

Finishing a Collection

A long-standing goal of mine since moving to New York has been to see a show in every Broadway theater (there are 40 in total). One of the very first things I put on this site was a page to track the shows I've seen and their theaters. When I first put it up, it probably had 10 or 12 shows, and now it has more than 140. As I write this, every theater but one has been visited, and that one will probably be done in the next couple weeks. It's been an interesting process.

At first, getting new theaters wasn't much of an achievement at all, as basically every show I went to caused a new theater to be added to the list. The first duplicate was on my seventh show, when I saw Spamalot at the Shubert Theatre for the second time. The first time I saw a second show in the same Broadway theater was my 24th show (counting off-Broadway and dance shows), when I saw The Drowsy Chaperone at the Marquis Theatre, having previously seen La Cage aux Folles there.

The pace eventually slowed, though. In late 2010 and early 2011, I went through a dedicated period, adding my 32nd through 35th theaters (the Broadway through the newly renamed Steven Sondheim) over 6 months. After another 6 months, I had two more, the Helen Hayes on September 30 and the New Amsterdam on November 4.

At that point, I hit a wall. I had three more theaters to visit, but all of them were problematic. The Minskoff Theatre was (and is) playing The Lion King, a show I saw twice in Los Angeles and didn't have much interest in seeing again, and there weren't any signs of it closing (nor are there now). In a similar boat was the Ambassador, which has been playing Chicago for nearly 20 years, a show I saw in San Francisco long ago. The Longacre, the third missing theater, was a different problem: it largely runs straight plays rather than musicals, which generally have comparatively short runs, so it was dark due to a transition between shows frequently, and the quality of the show at any given time was unpredictable. For more than three years I didn't add a new theater to the list.

Now, though, I'm finishing up. The Longacre was open, and it was playing You Can't Take It With You starring James Earl Jones, so that one got marked off on January 15. (It was excellent.) A week later, we bit the bullet and saw The Lion King to clear the Minskoff. Only the Ambassador and Chicago remain, a show I'm not heartbroken to have to see, though a bit ironic that my project will be completed by seeing a show named after New York's closest rival.

One of the benefits of a project like this is looking back through the list and remembering the shows and the things associated with them. A few fun tidbits from the collection:

I'm a bit sad to be finishing up, as having the project in progress was in some ways more interesting than having it completed, but I've got some more collections lined up to achieve. Obviously, I'll have to see a show in every West End theater (there are also about 40 of those), but I have some other ideas as well. Mostly, though, I'm relieved that I was able to finish the project before leaving New York.

Jan 5, 2015

New Year's Resolutions - 2015

When I was younger, I thought New Year's resolutions were unnecessary at best. After all, one can resolve to improve one's life at any point in the year, so why create a special time for it?

I've since come around on them, though. It's convenient to have a specific time to take stock and set goals because, practically speaking, if you don't schedule a time to do it you're unlikely to ever do so. It also provides a good evaluation period; one year is long enough to exhaust the initial burst of energy, and long enough to develop real habits, but short enough that you can probably remember most of it.

I made some resolutions last year that it's time to evaluate, and I've made some new ones for this coming year. First, last year's:

2014 - Exercise Every Day

My first resolution was to do some sort of exercise every day. This could be as simple as a few sit-ups, the only requirement was to do something physically exerting each and every day.

From January 1 to May 14, I only had a single unexcused skip, but the pattern fell apart after that. I skipped 6 days between May 15 and June 10, at which point my log ends. The improvement in capability over that time is pretty impressive, though. On January 1, I did 20 push-ups, which was as many as I could do at the time. On May 22, I did 3 sets of 40 push-ups each, which is harder than I would have guessed at the start.

I saw a lot of improvement over those few months, but I ended up just not having the motivation to keep going. Once I had proven that I could make myself do it, the fact that I didn't enjoy it one bit won out, so I let it go.

2014 - Run a 5k

For my second resolution, I wanted to run a 5k. Pat runs a lot, I figured I would try it out, and running is good exercise (one might be sensing a theme). I picked a distance because, in my experience, that's the only way to actually make any progress. Just saying to yourself, "I'm going to run as far as I can each day" is a recipe for not pushing yourself very hard and hitting a wall.

This was a success; I ran the NYRR Dash to the Finish Line 5k on November 1. In addition, I biked the 55 mile Discover Hudson Valley Ride on June 29, which wasn't part of the original plan but seems related.

I can't say this spurred me on to do much more running, though. I mostly concluded that running is pretty miserable; you move too slowly to see much scenery, you can't really have a conversation with anyone, and it's just really boring. Biking is much more my style, but it's also not as good exercise. I'm still searching for a good regular exercise method; soccer might be the best bet once the weather gets warm again.

2014 - Replace My Wardrobe

For my third resolution, I wanted to change my wardrobe. For the last decade or so, my standard outfit has been hiking boots, white socks, jeans, and a graphic t-shirt of some sort, which worked well for a long time, but I felt had gotten out of sync with my image of myself. As well, a lot of my clothing (my shirts in particular) was beginning to wear thin and needed replacing. Time for a wardrobe makeover.

This was also a success. As I type this, I'm wearing entirely clothing I didn't own at the beginning of 2015. I'm not wearing suits or cardigans regularly, but my jeans are new; my shirts are mostly solid color or patterned, higher quality, and include some long-sleeved and button-down options; and I have regular shoes instead of boots. The change of shoes isn't as convenient now that it's winter, I have to admit, but overall I think it's a change for the better.

For this year, here's the plan:

2015 - Read 30 Books

In 2014, despite reading a huge amount of shortform content, I only read a couple books. Partly this was due to getting halfway through Pride and Prejudice and not wanting to either pick it up again or admit that I wasn't going to, but all the same, I should read more books. 30 is a little more than one every two weeks, which is a reasonable pace. Pat and I are going to read books in bed at night instead of using electronic devices as part of this, which should be a nice improvement.

2015 - Blog Weekly

I have a bunch of thoughts I'd like to put down in writing, but I never make the time to do so. Writing things down and publishing them forces you both flesh them out more fully and subject them to criticisms, so it's a nice improvement from just having thoughts running around your head. This is the blog post for week number one, so 51 more to go.

These aren't huge changes so much as minor improvements. The year is shaping up to have plenty of huge life changes as it is, though, so that's probably for the best. Here's to 2015!

Jan 4, 2015

My Year In Cities, 2014

Like last year, here is the list of cities I visited during 2014, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Jan 1, 2014

My Year In Cities, 2013

Like last year, here is the list of cities I visited during 2013, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Jan 4, 2013

My Year In Cities, 2012

Like last year, here is the list of cities I visited during 2012, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Oct 9, 2012

Google Maps and Apple Maps comparison

When Apple Maps came out, there were a lot of anecdotes about its problems, but not a lot of systematic comparisons with Google Maps. The only one I know of is of town names in Ontario, Canada (Apple Maps, Google Maps), and that wasn't particularly relevant to me. First, I live in the United States, and there's a good possibility that Apple's data is better here because they're a US company (sorry, Canada). Second, and more importantly, I hardly ever search for town names, I almost always search for addresses or business names. The quality of Apple's address data is much more important to me than whether I can find Beeton, Ontario.

So, here's a comparison of both place names in New York State and addresses in New York City.

Disclosure: I'm a Google employee, but I don't work on Maps or anything related to it, and no Google resources or people were used for (or informed of) this project, aside from public APIs. This post does not represent the views of my employer, etc.


There's a big difference between what the Google Maps web API provides and what CLGeocoder under either iOS 5 or iOS 6 provides, and the Google Maps app on iOS 5 appears to match the web API.

The Google Maps web API is consistently great.

CLGeocoder under iOS 5 and iOS 6 differ significantly, with iOS 5 mostly being better, except in Queens.

There's more going on here than we think.


(Or just skip to the results.)

Originally, I ran all the tests using the iOS simulator and the CLGeocoder class, as the other comparisons have done. I also ran one of the tests on an iOS 5.1 device to ensure the simulator gave the same results as the device (and it did), so if you want to replicate these tests you don't need to pay the $100 to get an App Store developer account.

I then spot-checked some of the results on actual iOS 5 and iOS 6 devices using the Maps app. The iOS 6 results matched up with the Maps app (except that the Maps app gives you a "Did you mean?" in a lot of cases), but the iOS 5 CLGeocoder results didn't match up with the Maps app on iOS 5.

Suspecting that iOS 5's CLGeocoder implementation wasn't actually being used by the Maps app on iOS 5, I then ran one of the tests using the Google Maps web API. Indeed, the web API gave an entirely different set of results, one that matched closely with the Maps app on iOS 5, so I reran all the address tests with that as a third set of results (though I only got through about 90% of the New York State place names in the web API before I hit the 15,000 requests per day limit).

New York State places

I used this data set from the USGS that shows all the populated places in the United States along with their coordinates. I eliminated all the ones that didn't have a state code of NY, didn't have coordinate information, or whose name ended with "(historical)". I then geocoded strings of the form "$TOWNNAME, NY" and compared them to the expected coordinates. You could do this for any state, of course, but even after eliminating historical locations there were more than 180,000 populated places in the whole US, so I cut it down to just New York.

I chose 1km as the boundary for a correct location because most towns aren't much bigger than 2km across and the coordinates for a town are generally close to the center. To give an idea of how much margin that is, the correct location to geocode New York City to is City Hall, and 1km reaches down below Wall Street and up to SoHo, so most anywhere in financial district would count, but Battery Park would not. I picked the quite generous 100km for the "close" metric because that would at least mean you're in the right part of the state. For reference here, New York City to Buffalo is about 470km, and New York City to Albany is about 210km.

New York City addresses

I used this data set of all the "public facilities" in New York City. I figured this would give a good sample of the various address forms used in NYC, as well as a selection of data from all five boroughs. Since it includes a lot of government buildings, it probably oversamples the downtowns of each borough and undersamples the residential neighborhoods, but it does include schools, nursing facilities, soup kitchens, and other such things that are spread relatively evenly through the city. The only items I excluded from the list were facility types 1511-1541, which are all the different kinds of parks, because they include such addresses as "East River and Harlem River" (for Randall's Island Park) and "Greenwich Ave @ 7 Ave, NW side of intersection" (for one of the Greenstreets locations). I then geocoded strings of the form "$ADDRESS, $TOWNNAME, NY", where for $TOWNNAME I used "New York" for Manhattan and the borough name for the other boroughs. This is technically incorrect for Queens, because addresses in Queens use the city name they had before Queens became a part of New York City (e.g., "Flushing, NY" or "Astoria, NY"), but I assumed that "Queens, NY" would still work okay.

The biggest wrinkle with dealing with this data set was that the location coordinates were expressed in the New York-Long Island State Plane coordinate system, which is a coordinate system used by surveyors which treats a region as being flat (i.e., without the Earth's curvature). You can find additional information about the State Plane coordinate system on Wikipedia, and instructions on how to convert between it and latitude and longitude in this document from NOAA. Finding the instructions for how to do the conversion and then implementing it properly took a surprisingly long time.

I chose 200m as the boundary for a correct location because a central Manhattan avenue block is approximately 400m long, so that meant that if you gave up and placed a location in the middle of its block, it would count as correct. I chose 2km as the boundary for the "close" metric because that meant that it ended up approximately in the right neighborhood.


New York State places

Similar to the Ontario case, both iOS versions are pretty terrible at New York State places. They were within 1km of the correct location about as often as each other, and iOS 5 was slightly more frequently within 100km. As Marco Tabini observed, iOS 5 seems to prefer giving any result, even one that's horribly off, to giving no result, and that may have accounted for the additional "close" results (some of those random results just happened to be within 100km). The Google Maps web API didn't ever give a "no result" answer (in any test case).

The bad results may have more to do with the fact that place names in New York State are messy than with their mapping abilities, though. For instance, there's a village in New York near Lake Ontario named Hilton situated within the larger town of Parma. Searching for "Hilton, NY" in iOS 5 gives you the Hilton hotel in Midtown Manhattan, which is almost certainly more likely to be helpful. iOS 6 produces a pointer to the Hilton neighborhood of Maplewood, New Jersey, which isn't very good, but is still probably more likely than that you're actually looking for the village of Hilton.

Even more, the data set includes lots of items that are extremely difficult, if not downright impossible. For instance, there are entries for Adams (in Jefferson County), Adams Basin (Monroe County), Adams Corners (Putnam County), and Adams Cove (Jefferson again). There are two places named Ashland (one in Greene County, one in Cayuga), two named Bellevue, two named Bethel, etc. There are two Brooklyns in the data set, neither of which is the borough of New York City. This puts a pretty low ceiling on just how good any geocoder could be at answering this kind of query (and is yet another reason why I think this isn't a good basis for comparison).

The web API, though, does a reasonable job. As mentioned above, it only included about 90% of the place names, but even if you assume all 10% remaining were bad it would have gotten 68% right, much better than either iOS option.

New York City addresses

Addresses should be much easier to get right, and the consequences for getting them wrong are usually much higher. I divided the addresses by borough and ran them separately.

iOS 6 is really terrible in Manhattan, with more than 60% of addresses being either completely wrong or having no results at all. iOS 5 is much better, but a third of addresses still aren't quite right. Looking at a sample of what iOS 5 missed, mostly it sent the address to an equivalent address in another borough, which may be a result of it not fully trusting the "New York, NY" designation. The Google Maps web API does great.

iOS 6 does much better in the Bronx than it did in Manhattan, but still not as well as iOS 5. The web API is again the clear winner.

Here again, iOS 5 is a bit better than iOS 6, but not leaps and bounds better. The Google Maps API again does excellent.

Queens is where mapping apps go to die. If you've ever been to Queens, you know that the street system is crazy. This map of Maspeth can give you an idea of what mapping apps are up against. Compounding the ridiculous street scheme is the addressing, which uses hyphenated numbers (e.g. "104-35 44 Ave") that can be hard for software to handle.

iOS 6 does way better than iOS 5 here, with more than 50% of addresses correctly mapped to only 15% by iOS 5. They have similar numbers of totally incorrect addresses, though. This is also the first borough where iOS 6 has a negligible number of "no result" responses.

The web API is worse here than it is in the other boroughs, but it still puts out an impressive showing.

All three do really well in Staten Island, with iOS 6 coming out on top.

Known Issues

None of the requests were made with any context information. In practice, when using a mapping app, it knows where the viewport is currently located and often knows where the person is located, and that information is used to improve results. All of the geocoders would probably improve with that information.

The use of "Queens, NY" might have caused trouble for the iOS geocoders. Then again, it might just be because they can't handle Queens.


I feel safe in making the following conclusions:

Please contact me if you have questions or think I've made a mistake somewhere, either by e-mail or @flooey.

Jul 8, 2012

Two Weeks In Germany

Pat and I just got back from two weeks in Germany, and we had a fantastic time. We visited Heidelberg, Munich, Hamburg, and Berlin.

Heidelberg Altstadt from the Philosopher's Walk
We began in Heidelberg, a relatively small city with outsized stature due to the presence of the University of Heidelberg. Pat had been here for a few days at a conference when I arrived. We only had one real day here, which we spent at a festival along the river, then wandered down to the Altstadt to see the church and get dinner. Ordering dinner was our first real foray in trying to communicate in German, and it went pretty poorly, but we did eat dinner, so in that way it was a success.

The following morning, we took the train to Munich. Trains in Germany are a real pleasure to ride; they're clean, they're prompt, and they have a lot of details that make them easier to work with. For instance, when on the platform waiting for the train, there are diagrams of each train that arrive at that platform showing the type of each car (cafe, first class, second class) and its alignment on the platform. They also have platform assignments as part of the schedules, so you always know where your train is going to show up.

Munich, and Bavaria in general, is often what people think of when they think of stereotypical Germany. The city is filled with Biergartens, old buildings, and even the occasional man wearing lederhosen. (I tried to get Pat to consider a dirndl, but she refused.) We spent most of our time there just wandering around the city absorbing the atmosphere, stopping occasionally for food, beer, or a museum.

Speaking of beer, it's definitely the beverage of choice in Germany, and doubly so in Bavaria; as a result, it's cheap and universally available. Even Italian or Vietnamese restaurants had a lengthy list of high quality German beers to choose from. Happily, the beer is also excellent. The beer at Andechs, about an hour outside of the city, particularly stood out. The monks have been brewing beer for hundreds of years, and when we went the tables were filled with large groups of older Germans who were there for lunch on a weekday.

Pat and Adam at Neuschwanstein Castle
One of our favorite day trips from Munich was to Neuschwanstein Castle and its neighbor Hohenschwangau Castle. Neuschwanstein was built by Ludwig II, and is the perfect fairytale castle (among other things, it was the inspiration for the Disneyland castle). The entire area is incredibly picturesque, with the castle set against the wooded mountains above and the pastoral countryside below.

Leaving Munich, we got to take a sleeper train to Hamburg, which was a lot of fun, and when we arrived we met our host there, Sunny. Sunny was a wonderful lady who made us breakfast every day, including traditional local foods like sausage and tiny shrimp, and gave us plenty of suggestions about what to see. Unfortunately, I think we may have disappointed her, as she was very excited about the idea of us going out and partying, whereas we generally spent the evenings at home playing cards and reviewing the day's adventures.

Miniatur Wunderland in Hamburg
The best thing we saw in Hamburg was the world's largest model railway, Miniatur Wunderland. We spent an entire afternoon there, visiting miniature versions of the United States, Hamburg, Scandinavia, Switzerland, and more. They have a water feature with 33,000 liters of water, including tides, an outdoor concert with tens of thousands of individually-placed fans, and an airport with dozens of aircraft taking off, landing, and taxiing to and from gates. From fire departments that respond to car accidents on the street to a drive-in movie theater playing For The Birds, everything is modeled in astounding detail.

After only a couple days in Hamburg, we took an ICE train to Berlin. Arriving in Berlin, we immediately could tell that we were going to love it. The city has an energy that's similar to New York's, but with more dramatic 20th century history. The first day, we went to the Brandenburg Gate and toured the surrounding area, including the Holocaust Memorial. I was pleased to see that the US Embassy is right next to the Gate (in former East Germany).

Former site of the Berlin Wall
Berlin had way too much to do in the time we had, so we had to pick and choose. We spent much of a day at Checkpoint Charlie and the adjacent museum, Haus am Checkpoint Charlie, seeing the former separation from the German point of view. The museum is rather chaotic, but gives a great overview of the entire history of West Berlin and the wall, including escape attempts, uprisings, political posturing, and eventually reunification.

We also took day trips to Potsdam and, at the suggestion of Sunny from Hamburg, the town of Lübben in Spreewald. Both of these were fun ways to get out of the city. The former had more palaces than we could count, including the grand Schloss Sanssouci, and a really nice botanical garden, while the latter was a cozy little town on the river Spree, with woods that form part of an UNESCO Biosphere Reserve. Lübben also has a great city museum, which goes from archaeological artifacts from thousands of years ago up to the destruction from World War II and the later rebuilding.

We really enjoyed ourselves, but at the end we were glad to return home. The German culture is marvelous, though it has some room for improvement (for instance, there are basically no water fountains), and by the end of the trip my German had progressed to the point that I could easily manage in a restaurant or shop, though I certainly couldn't handle a conversation. The cats, though, missed us tremendously and were very happy for us to be back.

Feb 24, 2012

Getting Older

I finished My Life In France, which was truly delightful through to the end. My strong recommendation remains, and I continue to reflect on it. Among other things, I'm curious why it's had such an effect on me.

I think a large part of it is that I'm getting old enough that I can feel my options slipping away. There's an amusing David Mitchell's Soapbox episode that addresses this effect (a great show, you should watch it). I'm still young enough that very little is actually foreclosed at this point, but I'm getting old enough that I can see the forks in the road approaching.

On the other hand, I've been feeling like a true adult recently. I'm handling my increasing responsibilities at work reasonably well, then leaving them at work and spending my free time productively, whether that be relearning German, discussing politics or philosophy with Pat, or reading. I'm eliminating wasteful tasks and replacing them with things I simultaneously enjoy more and feel better about doing. And, in general, I feel good about who I am. (Apropos)

Feb 14, 2012

My Life In France

I've been reading My Life In France recently, and it's made me very reflective about the state of my own life.

Life for Julia and Paul is much the same as life for me, in many ways. They go to work during the day, they eat dinner at home or go out to restaurants, on the weekends they take advantage of the wonderful city they live in. They're a young couple in a major metropolis.

The details of how they spend their time are so very different, though, in ways that I envy. As a major example, they make time every week to write letters to Paul's brother. This was, of course, a necessity in the early '50s when even a telephone call would have been inappropriately expensive, but the idea of periodically reflecting on and sharing one's life experiences is quite a pleasant one. In theory, that's what blogs are for, so perhaps I'll start using mine again.

In thinking about how I could find time to do such a thing, my mind also rests on how I use my time as it is. Some of it is productive, but I spend a lot of time wasting time reading forgettable articles on the Internet or playing in virtual Skinner boxes. I know a lot of my peers have expressed similar concerns, and I expect it's a theme I'll return to in the future, but the book is making me resolve to be more mindful in how I spend my time.

In addition, the book is wonderful. Julia's descriptions of her adventures are so filled with excitement and wonder that it's a joy to read. I highly recommend it.

Jan 4, 2012

My Year In Cities, 2011

Like last year, here is the list of cities I visited during 2011, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Nov 8, 2011

Is A Humanities Degree Worth It?

Yesterday I encountered a couple articles that questioned the value of going to college for a non-STEM (science, technology, engineering or mathematics) degree, both on a personal and societal level. Ignorning the societal questions, my girlfriend and I were curious about whether the claim that humanities or social science degrees aren't valuable from a personal perspective was borne out in the data.

The one article that provided actual jobs data did so for 25-year-olds, which we felt was a particularly poor choice. If you graduate with a theatre or dance degree, for instance, at 25 there's a very real chance you're working a retail or food service job trying to make it in your chosen field, and that's precisely what you want to be doing. Wage data from that time in a person's life doesn't accurately reflect the value of their education, because they're likely actively ignoring higher-paying jobs because they lack the flexibility necessary to go to auditions and such. Similarly, those who chose to go to graduate school will skew the statistics by not really being in the workforce.

So, we decided to investigate the effect of educational field on income for people in their 40s, because we thought that would be a lot more representative of the long-term value of a college education. All the data comes from the American Community Survey, the Census' annual survey of data about Americans. A lot of people don't realize the actual original data points are available (under the name Public Use Microdata Sample), so you don't have to use the Census' pre-designed tables, you can develop whatever you want. A little Python scripting later and we had our data.

Discipline Level of education Population Average income
NoneBelow high school5434718$18090
High school diploma25516044$33617
Art and Music Education Bachelor's27864$37539
Professional or Doctorate3711$70742
Visual and Performing Arts Bachelor's8635$38013
Professional or Doctorate1033$74062
Humanities Bachelor's8780$43333
Professional or Doctorate2280$99010
Psychology Bachelor's257599$46728
Professional or Doctorate73793$102719
French, German, Latin, and Other Common Foreign Language Studies Bachelor's37437$47966
Professional or Doctorate11750$99453
Social Science or History Teacher Education Bachelor's13468$50386
Professional or Doctorate2006$102029
English Language and Literature Bachelor's200549$52416
Professional or Doctorate58149$111871
Drama and Theater Arts Bachelor's28539$56420
Professional or Doctorate3996$83334
Journalism Bachelor's91561$60368
Professional or Doctorate9400$86307
Communications Bachelor's247397$62189
Professional or Doctorate14476$111432
History Bachelor's115891$62315
Professional or Doctorate54204$137564
Forestry Bachelor's10254$62604
Professional or Doctorate1046$133358
Physics Bachelor's21442$72082
Professional or Doctorate28437$122621
Accounting Bachelor's466360$74335
Professional or Doctorate32492$125672
Mathematics Bachelor's77258$75037
Professional or Doctorate19521$121534
Molecular Biology Bachelor's2497$79029
Professional or Doctorate4384$175559
Computer Science Bachelor's235530$84217
Professional or Doctorate11220$120176
Chemical Engineering Bachelor's38051$89511
Professional or Doctorate12439$145061

The first rows show the data for people without at least a bachelor's degree, broken out into those that have a high school diploma (or equivalent) and those that don't. After that are rows by discipline of bachelor's degree, sorted in ascending order of income for people who didn't go on to an advanced degree. We picked a sampling of fields we thought would be representative, but there are more than 150 fields in the data set (see field FOD1P), so let me know if you're interested in something in particular.

We were surprised to find that, in a few cases, there is only a small benefit to getting a bachelor's. On average, the holder of a 4-year degree in Art and Music Education only earns $3900 more than someone without a 4-year degree, which is something, but not a lot compared to the many tens of thousands of dollars that the degree cost to obtain.

However, there are relatively few fields that are like that. Even stereotypically underutilized degrees like History, English, or Communications increase earnings by more than 50% by the time you're in your 40s, though as expected, a STEM degree tends to be more valuable than a non-STEM degree.

Jan 1, 2011

My Year In Cities, 2010

Like last year, here is the list of cities I visited during 2010, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Dec 31, 2009

My Year In Cities, 2009

Like last year, here is the list of cities I visited during 2009, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

Nov 21, 2009

Yahoo Pipes

Yahoo Pipes is a really awesome product that a lot of people don't know about, and I feel like Yahoo hasn't really done a lot with. It's basically a node-based data editor, but it can fetch source data from places on the Internet, which means you can have pipes with dynamic output. And then, you can subscribe to the results of those pipes or request them via JSON, which gives you a huge amount of flexibility.

I was spurred to write this because Jason Kottke was recently upset that the New York Times had put Errol Morris' blog items, which used to be on their own, into a new thing called Opinionator. This is a great simple use-case for Pipes, since you can fetch data from an RSS feed. Here's the final result:

Pipes looks at the RSS feed and sees that there's a dc:creator tag in it, so we can use that to filter with. It knows the input is RSS items, so you can filter those on an item-by-item basis and it will retain just the items that match. It's really easy to understand exactly what it's doing and build your own pipes. The only problem is sometimes finding the operations you're looking for, since there are a lot of them.

Go ahead and check it out in action. The New York Times Opinionator feed only has 10 items in it, and there are several authors, so this might not have any results at any given time if you go to look at it, but you can clone it and play with the source yourself. I've also noticed that Pipes has been a little flaky when playing with it this morning, so apologies if it doesn't work.

Sep 5, 2009

Discovery in Florida

Last week Monday, in the earliest hours of the morning, my girlfriend and I touched down in Orlando, Florida. We immediately picked up the rental car and drove out to Cocoa Beach, situated along the Atlantic coast, where we were planning on staying for the week. Then we slept. We were in Florida to see the launch of Space Shuttle Discovery on STS-128, which we expected would be pretty cool.

Discovery was supposed to launch at 1:36 AM Tuesday morning. We spent most of Tuesday gathering supplies, looking at exhibits at Kennedy Space Center, and waiting around in lines to get on buses. Despite an 80% favorable outlook, though, bad weather scrubbed the launch about 10 minutes before liftoff. Apparently the Shuttle doesn't respond well to lightning. As an aside, though, we learned that Apollo 12 was struck by lightning twice shortly after liftoff, but the systems in those days were sufficiently simple that it didn't cause major problems.

The next night, we made the same preparations and set out. When we arrived at Kennedy, we learned that the launch had been scrubbed due to a valve problem. The 8-inch liquid hydrogen fill and drain valve hadn't registered as closed when they tried to close it, which obviously was a huge problem. The absolute earliest they could attempt to launch again was 48 hours from then, but they weren't even making any suggestions about scheduling another attempt until they got a chance to look closely at the valve and its associated sensor (which they suspected of being the real source of the problem). They wanted to get it resolved quickly, though: their last chance to launch was Sunday night. If they were still on the ground at that point, the launch window closed and the next opportunity was more than a month later in October.

Disappointed, we headed back to the hotel. Our flight home was Thursday morning, and the next possible launch attempt was just after midnight on Friday morning. What were we going to do, we asked ourselves. Do we eat the cost of the flight and stick around until who knows when? Or head home and risk missing the single event we came to see? We decided to wait and see what they said on Wednesday about the valve. After all, the airline said we could cancel our flight up until an hour before it left, and the valve problem might have been bad enough that they had to delay until October, when we could return.

We went back to Kennedy on Wednesday and took the bus out to the Apollo/Saturn V Center and International Space Station Center, all the while keeping an eye on the Kennedy Space Center Twitter feed. In the early afternoon, they announced that they would indeed make another attempt early Friday morning, so we decided to cancel our tickets and stay. After all, there were four launch opportunities that weekend, so the odds seemed pretty good.

Thursday we spent doing very little, but it didn't pass entirely uneventfully. The mission managers decided they wanted more time to come up with contingency plans in case the valve acted up again, so they pushed the next attempt back another 24 hours to just before midnight on Friday. Just three launch attempts left before the August opportunity was gone.

Friday we decided to do something fun, so we rode out to Orlando to see Epcot at Walt Disney World. We had a great time, and my girlfriend was quite surprised as how much entertainment there is for adults as well as kids. We got a late start leaving Cocoa Beach, though, so all too soon it was time to get back in the car and make yet another trip to Kennedy.

Getting out of the park, back to the car, and out of the parking lot took longer than we anticipated, though. We were a little worried about getting to Kennedy on time, as they block off the roadways several hours before launch attempts to keep people from driving in to see the launch and putting themselves in harm's way. We had a vehicle placard that was supposed to get us past the roadblocks, but we hadn't ever tested it, and it was up to the security guys whether they wanted to honor it anyway. If we were sufficiently late, we'd be out of luck.

Of course, as we got on the freeway, we noticed that we were down to about a quarter of a tank of gas. My memory was that we were at a little under half a tank when we left Cocoa Beach, though, so it didn't seem like it would be a problem. We'd have to get gas shortly before or after the launch, but no big deal. About halfway between Orlando and Kennedy, though, the gas light goes on. In most of the US, that wouldn't be that big a deal, but the stretch of road between Orlando and the coast is basically all fields and wilderness. My girlfriend got rather worried. I told her it'd be fine, and hoped it would be. It wasn't like we could do anything about it, so we had to just keep on driving.

It was at this point that my iPhone saved the day. By finding a gas station? Not really. We did use it to find one, but the closest gas station turned out to be along the road we had to take anyway, so we would have stopped there regardless. No, what it did was give us peace of mind that we weren't going to run out of gas and miss the launch. And boy was that nice at that particular time. Late to where you're going and low on gas, just the knowledge that it's only 3 miles until one of your problems is solved is quite relaxing.

Flush with gas, we breeze onto Kennedy without a barricade in sight and find ourselves at the Visitor Center for the fourth time in five days. As before, we wait around in lines for a while and then board the buses. The crowd had really thinned out from Monday night's attempt, we presumed because they couldn't cancel flights and add vacation days quite as freely as we fortunately could. The weather forecast was only 60% favorable, but the attempt would go forward.

The buses for a launch take you out to the viewing area several hours early. On both the previous attempt and this one, we had gotten on the second or third bus to leave, so we got a prime spot right on the front edge of the seating area. Once you're there, though, there's basically nothing to do. There's a PA system that broadcasts NASA's coverage of the launch attempt, including some snippets from the radio traffic, but the launch timeline has large portions of built-in buffer space in case anything goes wrong, so when nothing has gone wrong there's a lot of just sitting. We got periodic updates on the weather, which were promising, but otherwise you're left to whatever distraction you brought with you. (Professor Layton, in my case.)

The final major decision point in a launch seems to be at about eleven minutes before liftoff, when they decide whether or not to restart the countdown, which has been holding at T-9:00 for about an hour. All the major groups on the launch team have to give a go/no-go signal when polled. When this time came around, a hush came over the crowd as everyone listened for the signals, especially trying to catch when weather went by. All "go". When they finished the poll, all the spectators started cheering.

The final minutes of the countdown flew by, with the NASA commentators describing all the steps the launch controllers and computers were taking as they happened. Final checks of computers and flight control systems, pressurization of suits. And at 11:59:37 PM, the countdown reached zero.

I was born after the advent of the Shuttle program, almost a decade after the last moon landing. I was three years old at the time of the Challenger disaster. Human spaceflight has just been a fact of life for me, along with air travel, radio, television, electricity, and all manner of other technological achievements.

Spending a week immersed in the process of spaceflight, culminating in the launch of one of the most powerful rockets ever built, gives you a new perspective on matters. Spaceflight is neither easy nor routine; it's actually incredibly complicated. Human beings strap themselves onto a rocket that releases more power than a nuclear weapon and then spend days, weeks, or even months at a time in an environment that is completely unlivable for all life as we know it.

Watching the incredible blast from the rocket engines light up the launch area like daylight, with a plume that was painful to look at, I couldn't help but think to myself how amazing it was that I was watching a man-made vehicle rocketing seven people into space. Literally into outer space, hundreds of miles above the surface of the Earth, where there's no water and basically no air and alternately intense solar radiation and freezing night. A place where you see fifteen sunrises a day. Where you can look down and see entire continents laid out before you, not on a map, but really there, with your naked eye.

It's amazing the kinds of things that the human race has managed to achieve, and maybe even more amazing to think that we do it often enough that it doesn't even make the news most of the time. Ho hum. Another group of people just went to space.

Aug 18, 2009

Building Fences and Doing Things

A week ago last Saturday, I helped my family build a fence.

Picture of a fence

The design is a fairly straightforward one, with the nice feature of giving each property an equal share of the nice side of the fence. I think it turned out pretty well, due in no small part to my dad's do-it-yourself skill. I didn't come here to write about the fence, though.

What I really noticed while helping out with the fence was that I was seriously enjoying myself. The simple act of measuring, cutting, and assembling a bunch of wood was easily one of the best parts of my trip. And I think that that's all due to the pleasure that comes from achieving something meaningful.

One of the facts about my life, and the lives of many people in the industrialized world, is that I probably won't ever go hungry or homeless. In my current job, I'm sufficiently well-situated that I probably wouldn't get fired even if I put in half the effort that I currently do — I wouldn't get promoted, but I wouldn't be out of a job, and I could easily survive for the rest of my life on my current pay. In basically all ways, I could achieve very little of importance and still manage to live a long and healthy life. What this all amounts to is that there aren't any external pressures on me to go out and do anything.

When I'm at home, I usually spend most of my time either chatting with my roommates, playing videogames, or reading things on the Internet. All of these things are enjoyable in the short term, but none of them are really doing something. At the end of the day, I've got just as much under my belt as I did when I woke up in the morning.

So, I plan to start really doing things in my free time, though I haven't decided just what yet. I'm considering learning the drums. I could brush up on my German or Japanese. But whatever I end up doing, I want to be able to look back at my day, my week, or my year, and be proud of what I've achieved.

Aug 3, 2009

Constrictor By E-mail

Prompted by Andy Ihnatko's glowing review of Posterous, particularly where he mentioned that being able to post by e-mail made him far more likely to actually make posts, I figured I'd give that a shot. After all, my blog is just a collection of text files, so it's trivial to turn e-mails into blog posts. We'll see if it actually encourages me to write more, hopefully it will.

Feb 17, 2009

Second-largest Cities

Mark Dominus posted an article today about states' second-largest cities and their relationship to the largest city. For cities he used Metropolitan Statistical Areas, though, which I felt made the results a little weird. In particular, many MSAs, especially those for large cities in the small eastern states, cross state lines, and it seemed weird to me to count those as belonging to a single state.

Because of that, I re-ran the analysis using the Census Bureau data for incorporated places instead. The table of results is below; I've left in the Census markers for what kind of entity is being considered. In particular, "balance" means that the named entity includes some smaller incorporated places inside it and those are being excluded from the population (ie, the population listed is the larger entity minus the smaller entities).

Under this definition, New York does in fact have the largest ratio between the largest and second-largest cities. Illinois, which previously occupied that spot, has dropped to second place; its previously-second-largest city of Peoria has been replaced with Aurora, which is near Chicago and thus was counted as part of it in the original analysis. Rhode Island, rather than having one city and thus no quotient, now has multiple cities and gets to have a quotient fairly close to the middle of 2.03. Hawaii, however, does not have any incorporated cities, and the only place included in the list is the City and County of Honolulu (as a Census-designated Place), so there is still an item with no quotient. As Mark did, I've placed it at the top and bottom of the list.

I haven't really looked at much of the rest of the list, but it shuffled quite a bit. Pennsylvania, for instance, is now close to the top instead of being buried in the middle; it appears that about a quarter of Philidelphia's MSA population is within Philly, whereas only 13% of Pittsburgh's is in the city proper.

Here's the full set of data:

State Largest city and
its Population
Second-largest city
and its population
Hawaii Honolulu (CDP) 375,571
New York New York (city) 8,274,527 Buffalo (city) 272,632 30.35
Illinois Chicago (city) 2,836,658 Aurora (city) 170,855 16.60
Maryland Baltimore (city) 637,455 Frederick (city) 59,220 10.76
Alaska Anchorage (municipality) 279,671 Fairbanks (city) 34,540 8.10
New Mexico Albuquerque (city) 518,271 Las Cruces (city) 89,722 5.78
Michigan Detroit (city) 916,952 Grand Rapids (city) 193,627 4.74
Pennsylvania Philadelphia (city) 1,449,634 Pittsburgh (city) 311,218 4.66
Oregon Portland (city) 550,396 Salem (city) 151,913 3.62
Massachusetts Boston (city) 599,351 Worcester (city) 173,966 3.45
Indiana Indianapolis (city, balance) 795,458 Fort Wayne (city) 251,247 3.17
California Los Angeles (city) 3,834,340 San Diego (city) 1,266,731 3.03
Washington Seattle (city) 594,210 Spokane (city) 200,975 2.96
Arizona Phoenix (city) 1,552,259 Tucson (city) 525,529 2.95
Georgia Atlanta (city) 519,145 Augusta-Richmond County (consolidated government, balance) 192,142 2.70
Mississippi Jackson (city) 175,710 Gulfport (city) 66,271 2.65
Wisconsin Milwaukee (city) 602,191 Madison (city) 228,775 2.63
Idaho Boise City (city) 202,832 Nampa (city) 79,249 2.56
South Dakota Sioux Falls (city) 151,505 Rapid City (city) 63,997 2.37
Nevada Las Vegas (city) 558,880 Henderson (city) 249,386 2.24
Arkansas Little Rock (city) 187,452 Fort Smith (city) 84,375 2.22
Vermont Burlington (city) 38,531 South Burlington (city) 17,445 2.21
Kansas Wichita (city) 361,420 Overland Park (city) 169,403 2.13
Delaware Wilmington (city) 72,868 Dover (city) 35,811 2.03
Rhode Island Providence (city) 172,459 Warwick (city) 85,097 2.03
Kentucky Louisville/Jefferson County (metro government, balance) 557,789 Lexington-Fayette (urban county) 279,044 1.00
Florida Jacksonville (city) 805,605 Miami (city) 409,719 1.97
Virginia Virginia Beach (city) 434,743 Norfolk (city) 235,747 1.84
North Carolina Charlotte (city) 671,588 Raleigh (city) 375,806 1.79
Maine Portland (city) 62,825 Lewiston (city) 35,234 1.78
Ohio Columbus (city) 747,755 Cleveland (city) 438,042 1.71
Nebraska Omaha (city) 424,482 Lincoln (city) 248,744 1.71
Texas Houston (city) 2,208,180 San Antonio (city) 1,328,984 1.66
Colorado Denver (city) 588,349 Colorado Springs (city) 376,427 1.56
Iowa Des Moines (city) 196,998 Cedar Rapids (city) 126,396 1.56
North Dakota Fargo (city) 92,660 Bismarck (city) 59,503 1.56
Montana Billings (city) 101,876 Missoula (city) 67,165 1.52
Utah Salt Lake City (city) 180,651 West Valley City (city) 122,374 1.48
Oklahoma Oklahoma City (city) 547,274 Tulsa (city) 384,037 1.43
Minnesota Minneapolis (city) 377,392 St. Paul (city) 277,251 1.36
Missouri Kansas City (city) 450,375 St. Louis (city) 350,759 1.28
New Hampshire Manchester (city) 108,874 Nashua (city) 86,837 1.25
New Jersey Newark (city) 280,135 Jersey City (city) 242,389 1.16
Tennessee Memphis (city) 674,028 Nashville-Davidson (metropolitan government, balance) 590,807 1.14
South Carolina Columbia (city) 124,818 Charleston (city) 110,015 1.13
Alabama Birmingham (city) 229,800 Montgomery (city) 204,086 1.13
Connecticut Bridgeport (city) 136,695 Hartford (city) 124,563 1.10
Louisiana New Orleans (city) 239,124 Baton Rouge (city) 227,071 1.05
Wyoming Cheyenne (city) 55,641 Casper (city) 53,003 1.05
West Virginia Charleston (city) 50,478 Huntington (city) 48,982 1.03
Hawaii Honolulu (CDP) 375,571

Jan 20, 2009

Obama's Inauguration Speech

I thought the inauguration was pretty interesting. I don't think that it'll go down as one of the great speeches of history, but it was good. It started off pretty slow, with a fair amount of rhetoric that didn't seem to tie together very much, but it picked up toward the middle. I was also struck by a few specific moments.

When listing religious affiliations, Obama listed Christians, Muslims, Jews, and Hindus, paused for a moment as if he were done, and then said, "and non-believers". This surprised quite a few people it seemed (and was the only line that triggered a sizeable cheer in my office). Having the President recognize the existence of atheists is almost unheard of, and really gives me confidence that he actually does believe in supporting everyone, despite the fact that inequality towards atheists still seems to be politically acceptable.

Obama also invoked science explicitly, saying that the administration will "restore science to its rightful place", and later counted "curiosity" among the values our nation's success depends on. I can't agree more that the eminence of the United States is due far more to its significant advancements in science and technology than on its particular accidents of religious history (as other administrations have seemed to feel), and that scientific capability is one of the finest products of a free society and one of the first to be diminished when our freedom is curtailed. Restoring the nation's freedom to pursue truth is an investment in our prosperity that will pay off for decades.

And while the speech is unlikely to be invoked during future inaugurations, I think there were two lines that had potency that will last beyond today, both having to do with foreign policy: his admonition to nations that blame their ills on the West that they should "know that your people will judge you on what you can build, not what you destroy" and his mention to oppressive regimes that "we will extend a hand if you are willing to unclench your fist". These are the kinds of lines that I love, and can have a lasting effect on the world.

The ending, I thought, was lackluster. Most of Obama's speeches have a strong arc with a flourish at the end, bringing everything together, but this one stayed steady throughout, covering one topic after another. That makes sense, given its purpose, but it made it less of an experience.

Altogether, though, a solid start to what will hopefully be an inspiring administration.

Dec 29, 2008

My Year In Cities, 2008

Following Jason Kottke's example, here is the list of cities I visited during 2008, in chronological order.

One or more nights were spent at each. Cities marked with an * were visited multiple times on non-consecutive days.

The vast majority of my traveling was done early in the year and in spurts; the trips to Chicago, London, and Rhode Island had no weekend at home in between, as did the trips to Acapulco and Oakland.

Dec 11, 2008

New Cars on the C line

The introduction of the R160s is finally making its presence felt in my commute. While none of the lines I regularly ride are getting any of the new cars, the C used to run entirely R38s, which are being retired. So, starting this week, I've been riding entirely on R40Ms and R42s (I can't tell them apart), presumably relocated from the N, Q, W, and other lines that are getting the new 160s.

Interestingly, it seems like they haven't quite gotten all their ducks in a row yet. The C has historically always run 8-car trains, but this week I've definitely run on at least one 10-car train and one 6-car train. I expect it will return to 8-car trains eventually, though (the C is a bit crowded at rush hour, but not painfully so).

Dec 7, 2008

Constrictor Available

I've worked on Constrictor enough that I feel confident in allowing other people to be exposed to it. Some of the details might not yet be in their final form, but I think it's in pretty good shape right now. You can check out the Constrictor area of my site to get documentation, which still a bit sparse, or a pointer to the code.

If anyone starts using Constrictor, I'd be interested in hearing about your experiences or any suggestions you have.

Oct 28, 2008


This site used to be hosted with Drupal, which is a very capable and high-powered content management system. However, I had always felt that it was a bit more complicated than I needed; I didn't actually know how large portions of it worked, and it had lots of features I had no interest in using but added to the complexity even if turned off.

So, after hearing about it from Mark Dominus' blog, I decided to look at blosxom. It turns out that it's pretty much exactly what I want: a blogging tool that's dead simple but very capable and extensible by plugins (I love plugins). However, it's written in Perl, which I didn't want to have to deal with. There was a port of it to Python, which would be my language of choice, but looking at the documentation, it's a lot more complicated than the original (the distribution has 72 files!).

So, long story short, I wrote my own direct port of blosxom to Python. I'm calling it constrictor, since the whole purpose is to constrict the feature set. I've always been a fan of simple, sharp tools, and having worked with this intimately for a couple weeks this fits the bill pretty well. The plugin architecture is largely the same as blosxom's as well, and as a result I've already got three constrictor plugins going: one for allowing raw python in the interpolation, one to disable posts in a particular directory from being displayed in the date-based listings, and one to massage my posts to add paragraph tags and such. Porting blosxom plugins is pretty direct as well, so I expect to have more shortly.

I'll be futzing with the layout and things for a while, but overall I think things are good to go.

Feb 5, 2008

London, Day 1, Addendum

I forgot to mention that on Sunday afternoon I also headed over to Buckingham Palace while I was waiting for a room to be made available at my hotel. Perhaps 100 yards away from the palace is the Canadian War Memorial.

In my view, the Canadian War Memorial is right beside the Vietnam Veterans Memorial as the most potent war memorial I've ever seen. But where the Vietnam Memorial provides an overall impression of solemness, and possibly sadness or regret, the Canadian War Memorial evokes a profound sense of gratitude. It's a water cascade over a granite diamond that has images of maple leaves embedded into it, and the memorial is surrounded by maple trees. In autumn, the leaves from the trees fall onto the memorial and mix with the carvings. It's just stunning.

Image courtesy flickr user OwenBlacker
Picture of Canadian War Memorial, London

If you're ever in London, do yourself a favor and pop over to Green Park, right by Buckingham Palace. The palace is rather nice to look at as well.

Feb 4, 2008

London, Day 1

I have arrived in London, where I'll be working for two weeks. So far, everything is going well.

Immigration was ridiculously fast. I mean, literally, I walked into the room and up to an available desk. The immigration officer did the usual routine of complete non-interest except when I mentioned I worked for Google, to which I got a "Oh, mhmm."

The hotel I'm staying in is really nice. Probably nicer than I deserve. The mirror in the bathroom has a section of fogproof glass. I can see the top of Big Ben's tower and the parliament building from the window.

It's also creepy. The minibar is computer controlled. If you remove anything from its spot, it bills your room. When I arrived, I opened up the minibar hoping that it had space to be used as a fridge (it doesn't). About 15 minutes later, a room service guy arrived with a can of Red Bull and put it in the minibar, and he implied that they had noticed that I had opened the minibar but hadn't taken anything out, so they wanted to restock the can in case I wanted it.

I spent last night wandering about the Square Mile, which is also creepy after dark (5:30) on a weekend. Nothing is open, including museums and things, and you can walk for blocks without seeing anyone. I originally went out to go see The Monument, but it's closed for renovations for 18 months, so I decided to just wander about. Guildhall is really impressive, though, even at night when you can't go inside. In fact, the whole city has this really cool feel from being a mixture of old medieval architecture and beautiful modern stuff. Walking along a long slim overstreet walkway and looking over to see a ruined section of the London Wall is awesome. I unfortunately don't have any pictures, as it was dark and my only photographic device is my phone, but trust me, it's great.

Also, 140 London Wall is perhaps the greatest address ever.

Cars driving on the opposite side of the road are kind of unsettling, too. I didn't realize to what extent I have subconscious feelings about what direction I have to watch out for cars, but when you're walking along the left side of the road and a car whips by from behind you, it's quite surprising.

The London office is quite a lot like New York. My major impression is that it's smaller and has better junk food.

So, it appears that my impression of London so far this time is impressive, yet creepy. More tales as the trip progresses.

Dec 30, 2007

Vacation musings

As I sit here in my parents' house on the last night before I fly back to New York, gazing into the thick fog that's settled over the neighborhood, I feel compelled to take stock of my life. The last week has been a really great time, and it's going to be tough to leave, though I know I have to. Knowing how hard it is on my mom doesn't help either.

Overall, I feel like my life in New York is pretty good. Looking at it from the outside, it certainly looks awesome: I live in a great place, I work at one of the most desired places to work, and so forth. But for the most part, I feel unfulfilled, and I can't quantify exactly why. Part of it is that work isn't that interesting to me; I work on interesting projects, but the complete disconnect from the customer dampens my enthusiasm dramatically. I don't feel like that's it, though. Hopefully I can find what I need to change to feel better.

In other news, there are some exciting developments on this side of the country.

My parents have a new cat, and she's absolutely adorable. Her name is Gina, and she's quite small, roughly 2/3 the size of what I think of as a normal cat. She's got plenty of spunk, though, as she'll happily climb up onto my (six foot high) bed or chase a wine bottle cork around the house.

There's a new Catholic cathedral going up in Oakland right on Lake Merritt, and it's pretty impressive. It looks to be about eight stories tall, judging by the neighboring buildings, and is faced with glass panels in a elegant curve shape with a angled indent. Andrew Sherman has been keeping a log of its construction with a large helping of pictures.

Speaking of Lake Merritt, they're finally doing planning and construction for the southern end improvements, most notably: redesigning 12th Street and Lakeshore, adding more park space, and removing the horrible tunnels that go under the expressway. The design looks really good, though there are concerns about the number of trees being removed (both there and elsewhere), and I'm not convinced that the new restaurant that's being put where the boathouse used to be will be worth anything. There've previously been restaurants on the Lake and all of them have gone out of business. I wouldn't mind living in a high-rise apartment overlooking the lake someday, though.

Also, SCO was delisted in the last couple days, though not as a result of low share price (which it was already under advisement from NASDAQ about), but due to filing for bankruptcy.

Nov 14, 2007

No More DC Power in NYC

New York City has had direct current electrical service since 1882, but that ended today with the disconnecting of 10 E. 40th Street, the last DC customer in the city. Plenty of systems still use DC, most notably the subway, but ConEd has gradually moved the responsibility for AC/DC conversion to the customers, allowing ConEd to stop delivering DC power off the grid.

Aug 29, 2007

What does this mean to you?

Picture of sattelite and truck

Aug 13, 2007

Impression From A Weekend

New Haven consists largely of parking lots and medical emergencies.

Aug 5, 2007

Deriving Importance From Maps

The God Plays Dice blog that I've been reading recently had an interesting entry on trying to derive the importance of intersections from a map of a city. The core observation is that a good first approximation of importance of an intersection is the number of roads leading into and out of it.

Manhattan has some qualities that make this interesting to ponder. Primarily, the city was allowed to evolve naturally until 1811, when the Commissioner's Plan set forth the layout from 14th Street to the north side of Harlem, and the most important locations in Manhattan (depending on your point of view) are split between the Financial District, which is unplanned, and Midtown, which is planned.

In the planned section, the given approximation works out well. The plan included one major irregularity: Broadway, which cuts across diagonally from about 77th Street to 10th Street. As a result, the grid section includes 6 intersections that have 6 roads leading into and out of them instead of four:

All of these are major intersections, and certainly rank highly among the most important intersections in the City.

Below 14th Street, though, the theory breaks down heavily. The West Village in particular has streets going all different directions and includes many intersections of 6 roads, some of as many as 8. However, none of those intersections are particularly important to the city as a whole (though some have local importance). Partly this is because Greenwich Village is built on land that is unsuitable for large buildings and partly it is because of the history of the area (which was once a literal village for people who didn't want to live in the bustling metropolis that was lower Manhattan).

Perhaps the core of the matter, though, is that the importance of an intersection is proportionate to the importance of the streets that intersect there. Intersections with more streets thus stand a better chance of being important simply because there are more streets that might contribute some importance. In that manner, we could find important intersections by trying to find the important streets. Ideas for what features one might look for to determine that could include unusual streets (such as Broadway), streets which are further apart from similar streets (such as the Avenues), streets that carry two-way traffic (as these tend to be larger than one-way streets), and streets on the edges of major parks.

Isabel also includes a side note about subways and why she feels that Boston has a thorough subway system while Philadelphia doesn't. She compares Manhattan to Philadelphia in that the system is a grid, so there aren't "obvious" places to put subway stops, but that isn't actually true for Manhattan. The Commissioner's Plan designated fifteen Streets (14th, 23rd, 34th, 42nd, etc) to be wider than normal, and many carry two-way traffic nowadays (which is very unusual in Manhattan, even the Avenues are largely one-way). Because they're regularly placed and main thoroughfares, these became the obvious places for subway stops when the system came along. That's why there are 4 separate stops on 125th Street, but no stops on any of 117th-124th or 126th-134th.