SF Cable Car Route Llamas, Alpacas and Mutants Fall Colors Mardi Himal Trail Golden Gate Zabriskie Point Prayer Flags Sunset Chinchero at Sunset Annapurna South in the Early Morning Fish Market Cementerio de Trenes de Uyuni Night Cats Sunset From Moro Rock Very rare deserted street Half Dome at Sunset Machhapuchhre Sunset from Marshall Beach, SF Grafitti The Danube at Night Annapurna South Under the Stars Mardi Himal Trail Rolling Fog Prepping to FIght Boudhanath Stupa Sheepherders and Annapurna South Cumhuriyet Anıtı Phewa Boats Alamo Square Bluebird Skies Stars Over Annapurna South White Mountains Sunset Fog Rolling In Half Dome at Sunset Vocano Scarred Mountains The Golden Gate at Night Old Man in Siding Twilight Fog Market Flags Bodie Eastern Sierras Under Shadow Snow and Shadows Temple Statue Marin Headlands Sand Dunes Hong Kong from the Peak Bay Area Sunrise Yosemite Fall Leaves Monument Valley Green River Canyons at Sunrise The Blue Mosque Buildings and a Bridge Cropped Crosswalk Headfirst Pisac Hillside The Buttermilks Rooster Fights at Forest Camp Resting Zabriskie Point Photographers Annapurna South

How 29 Hours in Singapore Turned into 53 Hours

September 25, 2010 —

Last Monday morning, I left San Francisco at 1am local time, for the start of a month long trip to Singapore, Bali and Bangkok, with Singapore and Bangkok both being stop-overs in my itinerary. My flight originally stopped in Singapore on the way to Bali, and, seeing how I'm a huge fan of Singapore and all the food there, I got the reservations agent to extend the stay.

Above the SF Clouds Above the SF Clouds

I took Singapore Airlines flight 1 from SFO to Hong Kong to Singapore. Even though this time I wasn't in business class on Singapore Airlines, I was still completely comfortable and slept almost 8 hours on the flight. Definitely my favorite airline ever.

Chicken Rice Chicken Rice

I arrived in Singapore at 11:30am on Tuesday and left at 5pm on Wednesday, making my stay a somewhat short 29 hours. Enough time to eat at least 6 meals, with plenty of room for ice cream and snow ice snacks along the way. After clearing immigration extremely fast, I hopped on the MRT a measly 30 minutes after landing, at noon, to head to Chinatown where I ate my first dish at the Maxwell Food Center: Chicken Rice at Tian Tian. That place is bomb. I'll eat there any day for any meal.

Strawberry Singaporean Snow Ice Strawberry Singaporean Snow Ice

After lunch, I searched around for a place recommended to ...

read more

Aperture Performance Problems

August 25, 2010 —

I'm a heavy user of Apple's Aperture. I enjoy taking photos and then use Aperture to organize and do basic touch-ups for those photos. Earlier this year, Apple released version 3.0, which had numerous enhancements (my favorite is localized adjustments) and compelled me to upgrade. Since that date, I've almost been extremely close to regretting my decision every time I opened the application. Version 3.0 added a bunch of new features, but something has been killing the performance on my brand new 15" MacBook Pro. When I have the latest hardware with 4 gigs of RAM, I shouldn't have to wait 10+ seconds to enter full screen mode or to view the next photo. There was absolutely no reason for this other than the updates to Aperture. The subsequent version updates (up to the recent 3.0.3 update) did nothing to alleviate my wait-times, they only squashed bugs I ran into.

Lately, I've been using Aperture more than ever because several recent trips I've gone on have left me with a ton of pictures to go organize. If it wasn't for the fact that I've got 8+ years of photos and associated metadata, I would have jumped ship months ago. I've tried all of Aperture's First Aid options (accessed by holding Option-Command when opening the app): rebuilding permissions (this shouldn't cause performance issues, but hey, I was desperate), repairing the database and finally resorting the the rebuild database option. I felt like the speed increased slightly after repairing the database and was optimistic that my problems were solved. Yet, I still had issues. I've been convinced that this has been a disk related as my memory and CPU are never loaded very heavily when I ...

read more

23rd Annual Tri For Fun #2

August 20, 2010 —

This post is pretty late, but I figured it is still good to post for record keeping. Back in July, I did the Tri For Fun just to get back in the grove. This was my first Tri since Wildflower, yet I had barely preped for the race at all. I think I rode my bike twice in the week before the race. Pretty much a poor showing on my part.

I'm pretty familiar with the course, having done it a number of times.

SplitDistance (mi)Time (h:mm:ss.ms)Pace
Swim0.2277:1529:10 min/mi
Swim to Bike Transition1:39
Bike to Run Transition1:17
Run3.125:048.16 min/mi

Not the blowout improvement I was hoping for (I only improved by 8 seconds off last year's time), but improvement none-the-less. I think I stayed up way too late the night before and was super tired during the run. I just sort of lost energy and couldn't finish strong in the run, which shows as it was one of my slowest run performances yet. Serves me right for sorting pictures late into the night.

Wildflower 2010

July 24, 2010 —

Despite this being a bit late, I still wanted to recap my 2010 Wildflower experience.

This year, I elected to begin my training with some high altitude training in South America. So instead of doing a bunch of preparatory triathlons leading up to Wildflower, I went on a month-long trip to Venezuela, Peru, Bolivia and Chile. After I got back, I had 3 weeks to get ready. I pretty much started immediately by riding my bike to work every day. The 10 mile (each way) commute definitely allowed me to get comfortable on the bike and to keep a record (via My Tracks) which allowed me to strive for specific time and speed marks.

I did a little bit of running here and there, and a little bit of swimming. But for the most part, I went to CrossFit and rode my bike. Finally, and I think the most important part of the training was the motivation to try to beat my sister and friend Margo. However, with so little prep time and after a 6 mile practice run with Amy where I almost cramped up, I relegated myself to third place out of them.

As with last year, we went down Saturday morning and got to watch the long course athletes finishing on the bike. There were four of us that went down: Margo, Amy, Mike and myself. Margo's roommates came down later in the day. Once cars were allowed to enter the campground again, we drove down, found a spot to camp and proceeded to check out the starting line and the festival area. The evening was uneventful with a great dinner and sitting around the BBQ grill for some warmth before heading to sleep.

I woke up early, ate, and then Amy, Margo and I went ...

read more

DD-WRT and an Airport Express

June 22, 2010 —

I've got a several year old Linksys WRT54GL wireless router that I use for my home network. Ever since I've had the router, I've been running DD-WRT on it, which is great. The new firmware is super stable, has a great number of additional features I use constantly (DDNS, static DNS leases), but I have had a lot of trouble recently trying to get my Airport Express to connect to the network. For security, I use WPA2 Personal encryption on my network. Now, I'm not tyring to set up a WDS network, which, from the documentation, is a mixed bag to get working. So, after lots of fiddling, and lots of resetting of the Airport Express, I finally got it to work. Here is what I did.

I'm running DD-WRT v24-sp1 on my Linksys WRT54GL v1.1 with an Airport Express running the latest 6.3 firmware. On the WRT54GL, I set the wireless security mode to WPA2 Personal and the WPA Algorithm set to TKIP. On the Airport Express, I told it to join my existing network with wireless security of WPA/WPA2 Personal. Doing all this, and I can now stream music to my stereo.

I'm sure someone else will find this information useful.


I ended up still having problems, and so I switched to Tomato, instead of DD-WRT, and since then, the router has been really stable and the Airport Express connects perfectly.

Photos From Venezuela

June 01, 2010 —

Whale Vertebrae Whale Vertebrae

I have finally gotten around to posting more pictures from Venezuela. I posted them to Flickr in my Venezuelan set. There is also a slideshow on Flickr and the photos are also on my site.


Chavez Country

March 31, 2010 —

I am now halfway through my tour of part of South America.

Cayo Muerto Cayo Muerto

The trip started off in Venezuela (more pictures from Venezuela here) where I was immediately introduced to my second family, the Hurtados. About 90 minutes after landing in Caracas, I had seen a dead body, saw Ines for the first time in almost 7 years, met her father, mother and other sister, about 30 (at least!) other members of her extended family, and though I tried really hard to remember their names, I forgot most of them. And then I got my first glass of wine in South America which was soon replaced with a cuba libre. Shortly after, some of Ines' friends taught me how to call Chavez a son of a bitch in Spanish, which was a new Spanish expression for me.

A Giant Man of War A Giant Man of War

I then proceeded to spend the next 3 days enjoying solitude and sunshine in the small beach town of Chichirivichi, reading, appropriately, 100 Years of Solitude. I also spent time recovering from the bad sunburns I received after my first contact with the sun in quite a while. I also got to see a great big jelly fish, which was awesome, and yet scary.

A long drive later and I was back in Caracas combing the city for Arepas (which are really good), wedding cheese, wedding pastries and views of the city. Thursday and Friday with my mom, sister and the Hurtados went fast, but seemed to cover much ...

read more

GCalendar Reminders

January 17, 2010 —

Google recently added the ability to create a birthday calendar. However, Google didn't give one the ability to send reminders for the events on that calendar. This is the same thing that Apple has done for years with their Address Book and iCal integration. And I hate missing someone's birthday when I don't happen to look at my calendar that day.

I saw this as an opportunity for improvement. I also saw this an opportunity to learn about Google App Engine. So I wrote a python application that lets you schedule email reminders for the Contacts Birthday Calendar. In addition, you can select a specific hour in a specific time-zone to send the reminders at as well. The application use's the Google App Engine user authentication and the Google Data AuthSub permission request API to get upcoming events for display and email reminders.

This gave me some good experience with Google App Engine's scheduled tasks and Task Queues, as well as a chance to hone up on my Python. Without further ado, I present GCalendar Reminders. Feel free to use it to send yourself emails using the security of Google App Engine.

Benchmarking Redis and PRedis

January 15, 2010 —

At work, I recently was tasked with looking into some NoSQL solutions for upcoming projects. For various reasons, I focused on the open source Redis project. Redis looks to be adding new features quickly and seemed to be a great potential solution.

I then started looking into PHP clients as our current environment is mostly PHP. We require that the client support consistent hashing, and, from a quick search, a couple turned up. PRedis seemed to offer the most potential, and after some quick tests, also seemed to offer the greatest performance. So I set up a more elaborate benchmark of the the client and server package.

My test setup involved using 5 servers with between 2 and 5 enabled at a time on the clients (ie. I disabled up to 3 of the servers in the client configurations). For performance, I configured the servers to never write to disk, though periodically syncing to disk should not cause too much of a performance loss. In fact performance was most greatly affected by forcing an fsync after every write. I then had 9 other client boxes running the same code base, with all 9 enabled for each test.

Each client would start a master PHP process that forked 20, 30 or 40 child processes to simulate greater and greater load. Each forked PHP process then did 10,000 SETs on random keys with 4 byte payloads (early tests showed that payload size didn't drastically affect the results). I was using the PHP 4.2.6 branch of the PRedis client, and had optimized it a bit so that it did fewer counts of the consistent hash array. I made the optimizations based on some results after profiling the code. I then had the master PHP process on each box repeat ...

read more

22nd Annual Tri For Fun #3

September 19, 2009 —

This post is pretty late, but I figured it is still good to post for record keeping. In June, I did the Tri For Fun #1 and it was the first triathlon for a couple of my friends. Well, I must have some great powers of persuasion, because I convinced two more people to start and complete their first tri. After at least two years, my sister Amy Streeter decided to do the great introductory course. In addition, Amy's friend Margo Fahey also signed up for her first tri.

Starting the race, my goal was to finish in an hour or less. Looking at the last race, I thought that a 9 minute improvement was reasonable, despite the fact I spent a significant portion of the month between races in the Caribbean. I'd say my biggest weakness was still my cycling performance, though I was able to improve.

SplitDistance (mi)Time (h:mm:ss.ms)Pace
Swim0.2276:3529:00 min/mi
Swim to Bike Transition1:59
Bike to Run Transition1:35
Run3.122:477:21 min/mi

Not the blowout improvement I was hoping for, but improvement none-the-less. Plus I beat Amy, Margot and Joe :) I am definitely looking forward to the next tri I'm doing.