Ars Technica: A biologist reviews textbook from ID camp
...[Explore Evolution] appears to have been intelligently designed to be the sort of supplemental text that's appropriate under the Louisiana legislation...
 Emphasis added... heh.
No comments

The Uncertain Future

For the past few years, at least since I've entered college, I've always told myself that my dream job is to do research and teach at the university level. The exact topic of what I would research has changed over the years - such as strong artificial intelligence, or evolutionary computation - but for the most part it has remained within computer science. This summer though, when I started contemplating the coming year and the decisions I have to make, I started feeling a little less sure.

My first worry is whether I'm smart enough for a career in research. I know I'm smart in general (please... there's not point in arguing this :D), but I don't know if it's enough to be on the leading edge of human knowledge. I think there's also more to it than simply being smart; there is some creative genius involved, and I'm not sure I have it. I know I may very well be romanticizing about scientists, or else believe (or at least want) myself to be the next Newton or Darwin, and yet these fears lurk at the back of my mind.

The second thing is, even if I decide to go on with research, I'm not entirely sure what I want to do research in. Well, that's not entirely true. It's more the case that the topic I'm interested in is not strictly within computer science. There are certainly parts of it where computers play their part, but the idea is more abstract. One problem with such an idea is that I lack the additional background to complete grasp the other aspects of it. While I'm not that afraid of having things to learn, it does mean I can't exactly go to grad school in those areas.

Together with the above, I've increasingly come to view computers as a tool, and it seems silly to study the tool and not use it. The analogy I use is that studying computer science is like learning how to make a hammer, but not actually using the hammer to make anything.

All these things, I think, stem from my have really having been challenged before. Because I've always managed to take things in stride, when faced with the immense decision of deciding the rest of my life, I'm a little hesitant to act. In other words, I'm not ready to face the real world (given, of course, that if I do go into research I won't be facing the real real world...)

The alternative to research, for me, is teaching. Having done CTY this summer, and finding it to be everything I thought it would be and more, makes the decision a harder one to make. If I cannot make it as a professor (for reasons above), I would rather choose teaching than research. I don't, however, know what level I'll want to teach at. CTY was for middle school students, but I know for a fact that the students will be very different outside of CTY. In fact, I almost consider the kids at CTY to be high school level.

If I were a teacher, I would still tinker with computers. Nothing can change that. But if I do, I would like to know more, and therefore go into a bit of research... I'm a little torn over this.

In the end, I'll probably go with research for a university. It's not that it's hard, but that I don't know myself as well as I perhaps should.
No comments


  • 1987 - Yosemite. Apparently I've been there - just after I was conceived.
  • 1989 - New Zealand. I don't remember this at all, except that we visited a fire truck museum - which I learned from a photograph.
  • 1991 - Florida, D.C., Toronto. The only thing I remember about this trip was that my brother bought me a Donald Duck animation flip book because I was asleep. I remember sitting on the side of a road flicking through it.
  • 1992 - Kyushu and Tokyo, Japan. I don't remember anything about this at all.
  • 1993 - England, France, Switzerland. I don't remember this either, except at on a snowy peak in Switzerland I threw a snowball and it in my brother in the face. I think he swallowed some of it.
  • 1994 - Yellowstone National Park. I have a vague recollection of a log cabin, and walking along wooden pathways above geysers. That's about it though.
  • 1995 - Malaysia. We were at a Club Med resort. I think I still have a hand painted T-shirt somewhere.
  • 1996 - Vancouver, Columbia Icefield, Alaska. We stayed at my uncle's for a while, before driving up for a tour of the glaciers. We also visited Seattle at some point, where I bawled my eyes out because I wasn't woken up to see salmon swimming up-river, despite the fact that there wasn't enough water anyway. Then we took a cruise up to Alaska, and had day tour to a glacial lake by sea plane. That was also the first time I wrote journals (although I stopped after the trip and didn't start again until 2002).
  • 1997 - Indonesia, Singapore. My only memory of this is sitting in a van going through rural roads lined with banana trees.
  • 1999 - Germany, Austria. My most prominent memory of this trip was a stay at a countryside house for a night, where I slept on the top floor underneath a sky light. There was a waterfall near by, and we had breakfast at the owner's house.
  • 2000 - England. My brother and I went to a summer camp near Cambridge first, before my parents picked us up and we visited the Lake District. Oddly enough, I remember the camp more than our family trip.
  • 2001 - Australia. Another summer camp, near Brisbane, before we drove up to Cannes. Same thing with my memories.
  • 2002 - Christchurch, New Zealand. The first time I flew in a plane by myself.
  • 2003 - San Francisco, Sacramento. Really more of a college tour of that area. My brother and I stayed a a family friend's, then flew back by ourselves.
  • 2004 - U.S.. All over the place, a 3 weeks college tour. Not sure I want to do that again... although, we did visit Grand Canyon at the end, which was fun.
  • 2006 - France, Spain. First in Paris, then TGV down to Nice, and driving along the coast (and up into Avignon) before going down to Barcelona.
  • 2007 - England, Scotland. Another university tour, for my brother this time. Started in London and drove up to Edinburgh. We then hiked the length of the Caledonian Canal in Scotland, which includes Loch Ness. No sea monsters though.
And this doesn't include travel for school trips, tournaments, or other short trips.
No comments

Batch Quick Adding in Google Calendar

I decided to switch to Google Calendar recently, despite my painfully written HTML/JavaScript calendar I had before. One thing that was a pain for me to do was to import the birthdays I have saved into Google Calendar. Since my previous calendar is home-brewed, I didn't use anything like the iCal format, or even CSV. Instead, the format looks something like this:
<li>N|198712200000|2400|-|1|A|Justin Li's Birthday</li>
The scheme is actually rather ingenious, if I may say so myself. The first letter declares what it is (either an event, a note, or a task). The following string of numbers is the date and time when the event starts. Following that is the ending date and time, the date it stops repeating (if it repeats), and then a code for how it repeats. The 'A' is a color tag, and finally we have what the event is. If I want to, I could also put down the venue as well as a longer description, but here it's not necessary.

It would seem that this format is close to the CSV format needed by Google, except for one thing: I'm not sure how to specify recurrence. For a birthday it would clearly repeat every year on the same day, which I specified in my calendar with the dash (for a never ending repetition) and the '1' (for repeating every single year). I have no idea what Google's CSV format requires for recurrance.

Instead, I was rather taken by the Quick Add feature. It definitely understands commands like this:
Justin Li's Birthday on 1987-12-20 every year
For humans there is the slight problem of how it could be 1987 every year, but the meaning is nonetheless clear. I could easily change the text entries to Quick Add format:
cat entries | sed 's/^[^0-9]*\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*|\([^|]*\)$/\4 on \1-\2-\3 every year/'
That should do it. For those interested in Bash scripting, I'm using sed to do a regular expression (regex) substitution. I picked out the year, month, date, and the event name, and reorganized them into the format above.

That was the easy part. The hard part was looking for a way to use quick add multiple times (almost) simultaneously, so I could enter all the birthdays at the same time. A quick Google search returned this onfocus article. At first it looks promising, but then I realized it's simply converting to CSV, which doesn't help me much.

Digging further I found Elias Torres's Google Calendar Quick Add Firefox extension. Sounds great! I would still have to copy each line into the textbox, but that's a start... if the extension was for Firefox 3, that is. I have unfortunately not yet learned to write Firefox extensions, and therefore gave this up and kept looking.

Then I remembered Ubiquity, the snazzy Firefox extesion that aims to "[connect] the Web with language in an attempt to find new user interfaces that could make it possible for everyone to do common Web tasks more quickly and easily." Interested readers can go to the Mozilla Labs blog post for a detailed description, a video demo, and more.

The feature I was most interested in was the add-to-calendar function in Ubiquity, which, well, adds an event to Google Calendar. It does take advantage of the Quick Add function, but a quick look at the source code for that function, and testing it out, reveals that it dumps the recurrence information, which is what I wanted most. The script adds events in two parts: first, it lets Google parse what you wrote, then it tells Google to add it. The URL for the parser for the above command is:
As you can see, the plain English event description is just tagged on the back. Google will spit something like this back out:
while(1); [['_SpawnQuickAddEvent', 'Justin Li's Birthday', '', '', '19801220', '19801221', [], '', null, null, [], 'RRULE:FREQ=YEARLY;INTERVAL=1']]
A quick glances reveals it to be JavaScript code. Ubiquity than takes this and forms anther query, which I won't go into. Suffice to say it doesn't use the RRULE part of the data, which means it disregards the recurrence. It does however use the following URL:
What I need to do now is to figure out what the parameter name is for the recurrence rule. After looking online with no results (which surprises me; usually things like this, especially for a Google service, are well discussed and documented), I added a few fake events through the actual Google Calendar site, and watched the Net traffic through Firebug. That quickly revealed the parameter to be recur, which lead to the final URL for batch Quick Adding:;INTERVAL=1&dates=19871220/19871221&text=Justin Li's Birthday

Breaking it down:
  • action=CREATE tells Google to add the event to its database
  • secid=... is the session security id, which can be found in the browser's cookies
  • output=js tells Google what to show after it's done. You can also use output=xml to get a webpage back
  • recur=RRULE... is how the event will repeat, which the Google parser gave us
  • dates=.../... gives the beginning and end dates for your event
  • text=Justin... is the title of the event.
And that's it! I added close to 200 birthdays to my calendar in no time (using some more regex trickery and heavily abusing "Open Link in New Tab"). I have no doubt this will come in useful again sometime.

Of course, I spent over 2 hours figuring all this out. But that's part of the fun.


A lot of things happened during CTY... but first I want to say that I am blown away by the place. The "experience here is just so powerful that we as teachers can't help but feel excited about this whole thing." That was something that I wrote in my personal journal. And, apparently, I'm not the only person who feels this way:
  • From
    we sat around small tables sharing ice cream, like we shared dinner, like we shared our laughter, and marveled at how, after only a week, it seemed like we had all known each other for years.

  • From
    But what I remember about it, rather than what I see in retrospect, has nothing to do with social mobility. It wasn't about what would come after education. It was the sheer joy and amazement at being around kids my own age who were not only not hostile to the desire to read and learn and think, but who shared it themselves. I didn't leave CTY thinking that continuing to go to places like that would earn me money someday; I left knowing that I'd been happier there than I'd ever been around kids my own age, and that it was possible for "smart kid" to mean something social other than "kid to get beaten up." (It wasn't an awful school system; really. I didn't get badly beaten up or get anything broken or turn into a Columbine Kid. But it was pretty consistently unpleasant.) There was geekiness as well as nerdiness to be had-- I played my first D&D at CTY-- but sharing cultural or recreational tastes wasn't as important as, well, the sharing a taste for spending one's summer learning algebra.
I wish, for more than one reason, that I was back there.
No comments

Google Stuff

Google has been pretty busy this week:
  • Google Chrome Beta was released. I've played with it a bit, but without mouse gestures I just couldn't commit to it. Ars Technica has a review, which is better than anything I can write. My one thought for the browser, which I haven't yet seen voiced, is the connection between Google and Microsoft, and Chrome and MSN Explorer.
  • Picasa got a face detector, and I tagged all the faces it could find. It was a nice distraction from whatever I was doing. The most amusing thing, however, is shown in the following picture:

I therefore conclude that Google's face recognition software is really quite good :D
No comments