Splash picture next

Aperture Performance Problems

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 sit and wait for Aperture to do “stuff.” I began to think I needed a 7200 RPM disk drive instead of my 5400 RPM drive just to use Aperture.

(more…)


23rd Annual Tri For Fun #2

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.

Split Distance (mi) Time (h:mm:ss.ms) Pace
Swim 0.227 7:15 29:10 min/mi
Swim to Bike Transition 1:39
Bike 11 31:04 21.24mph
Bike to Run Transition 1:17
Run 3.1 25:04 8.16 min/mi
Overall 1:06:20

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

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 down to the transition area. Luckily, my shorts this year didn’t have a giant hole in them. Which allowed me more time and less stress. My goals for the day were to finish the swim in 40 minutes, the bike in 2 hours and the run in 1 1/2 hours. I figured that since I hadn’t done very much swimming, I’d be slow, my bike would probably be faster than 2 hours because of all the practice I’d had, but that I wouldn’t be able to run the whole time and have to walk a majority of the race. I was hoping for under 4 hours. Because the guys go first in the race, my start was a good hour before Amy and Margo started. So I was just dreading the possibility that I’d see them on the run.

With wetsuit and swim gear on, I was ready for the race to start. The swim ended up being a lot more choppy than any other lake swim I’d done. It took me back to my days doing the Santa Barbara and Carpinteria Triathlons. The best reason I could figure for the extra chop during the swim was the huge increase in number of boats and ferries in the lake this year. The swim seemed to last forever, and a lot more people passed me than I remember in the previous races. However, I pressed on at a pretty steady pace. Getting to the finish was one of the best feelings ever. I checked my watch and saw a time of 30 minutes 10 seconds. That totally surprised me and pumped me up a bit.

My T1 split was probably pretty slow, but I got on the bike and started up the hill, at about the same pace as everyone around me. Once at the top, I was even able to continue at a similar pace to people around me. I just kept trying to stay near the couple of guys in front of me, passing or gaining ground on the flats / downhills and losing ground on the uphill segments. Because of the massive hydrating I’d done on Saturday and that morning, I had to stop and pee at the second aid station. Once I got to the turn around point, I realized that my bike was actually going pretty well. I was somewhere in the mid 40 minutes for the bike. On the ride back, I kept looking for Amy and Margo, expecting to see them flying along, but never saw them. The bike ended up finishing in 1 hour 33 minutes, which meant, that if I had a 50 – 55 minute run, I’d finish in under 3 hours. And I still felt good.

The run started hard and slow, but I got into a rhythm. The possibility of finishing sub 3 hour was become a greater and greater motivation for me, forcing me to push on. I felt like I had to walk a lot more than last year and it seemed hotter on the run. Finally, at the top of all the hills, I checked my watch. 2:55 with just a run down Lynch Hill and 1km to go. I started to sprint down Lynch Hill as fast as I could, passing a bunch of people, watching the time get ever closer to 3 hours. My mistake was to not leave anything for the flat section right before the finish, which is so much longer than I remember. All I knew was that I hadn’t broken 3 hours. I finished in 3 hours 1 minute and 5 seconds and then almost puked all over the volunteers.

Split Distance Time (min) Pace Rank (overall) Previous Wildflower
Swim 1.5 km 30:10 32:11 min/mi 808 29:52
T1 3:47 4:33
Bike 40km 1:33:48 15.8 mph 1010 1:43:48
T2 2:08 2:59
Run 10km 51:12 8:14 min/mi 557 53:00
Overall 3:01:05 697 3:14:12

[Official Results Here - Bib 5630]

Obviously, I did better than my goal. Though I figured that Amy and Margo were killing the course. I couldn’t look up their splits while they were racing, and had no idea where they were. So I had to just sit and wait. I first saw Margo, who, depending on her start time, finished in just over 3 hours (in front of me) or 3 hours 5 minutes. I turned out the latter was her start time. Margo finished in 3 hours 5 minutes 13 seconds. Meaning that not only had I destroyed my goal, I had also beat Amy and Margo, with tons less training. Amy finished in 3 hours 22 minutes 59 seconds. They both did awesome in their first Olympic races after I introduced them to the sport last August.

The free post race massage was so worth it and was pure amazing. However, my biggest regret is not getting a massage the following day though. Every Olympic I do from now on, a post-race massage is going to be included. As long as I’m not doing some other international trip just before next year’s race, I really want to attempt the long course.


DD-WRT and an Airport Express

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.


Photos From Venezuela

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.

Enjoy!


Chavez Country

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

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.

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 more time than just the 45 hours we were all together those days.

Some things I learned:

  • Weddings in Spanish aren’t as easy to understand as I thought initially.
  • “Merengue is with couples and Reggaeton is sexy”
  • My Spanish skills get better with alcohol and the English skills of others similarly increase with alcohol.
  • Arepas are delicious any time of the day, for breakfast, for lunch, after a great wedding reception, or while walking around like a zombie in an airport at 5 in the morning.
  • Apparently I can dance Salsa (or the Venezuelans were being nice and just wanted me off the dance floor)

In all, a great first part of my trip. New food, new people, new places and hanging out with my first and second family. Estoy chevere (or, in Peru, cheverenge).


GCalendar Reminders

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

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 the test 5 times to help to average the test results.

I used dsh to start the test simultaneously on all the clients, timing how long it took the dsh process to start and finish executing. This was the amount of time it took to execute (5 repeats) * (9 client boxes) * (20, 30 or 40 client processes / box) * (10,000 requests) = X total requests. I then graphed the results below.

Graphing Requests / Second With Redis and PRedis

Graphing Requests / Second With Redis and PRedis

This ended up showing that with 9 clients, going up to 4 servers was the point of diminishing returns. Adding the fifth server (with that client box count) did not increase throughput, but rather, the throughput went down. The reason for this is most likely a combination of network interface contention on each client and higher overhead from consistent hashing. So with 9 clients, I found that the sweet spot, with my setup, was 4 servers. By adding more clients, along with more servers, the throughput would increase, instead of the decrease I was starting to see.


22nd Annual Tri For Fun #3

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.

Split Distance (mi) Time (h:mm:ss.ms) Pace
Swim 0.227 6:35 29:00 min/mi
Swim to Bike Transition 1:59
Bike 11 30:33 21.6mph
Bike to Run Transition 1:35
Run 3.1 22:47 7:21 min/mi
Overall 1:06:28

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.


Pictures From Alviso

This past Sunday, a buddy and I met up to head out on a photo shoot. I’ve had a goal of trying to take more pictures and also to think more about the pictures I’m taking, and going on a trip with the explicit goal of taking pictures is exactly what I need to do. We did this once before at the Arastradero Open Space in Palo Alto.

So Wenzhe and I met up and drove to a place he had visited before, Alviso, CA. Alviso is on the South edge of the San Francisco Bay, situated between Moffett and Milpitas. There are a number of older buildings, some train tracks and promised to hold some interesting subjects near sunset. I ended up taking quite a few shots (180+ in total) and narrowed it down to 31 pictures that I found interesting. One of my goals this trip was to think about different ways that a scene could be cropped once the picture was taken. So I’d take a picture thinking that it might work one way, but a subset of the frame could work with a different crop. So I tried experimenting with that in mind a bit.

Check out the pictures and let me know your thoughts.


     older »