PETERZHANG

Hello there.

I'm a front-end developer passionate about cutting-edge technologies and impacting everyday lives. It's nice to meet you!

Trip Report: Virgin Atlantic Upper Class LAX – LHR

I still remember the last time I flew on Virgin Atlantic. About ten years ago, on the third long-haul flight ever in my life, I learned about this crazy Richard Branson guy on my way from Hong Kong to Sydney. I was in awe of everything – the crazy colors, the incredibly hip and cool flight attendants, a PTV that actually works (again, this was 2007)…

I’ve looked for opportunities to re-experience that Branson magic again, but I couldn’t find myself an excuse to bring myself to London. That is, until this Summer 2017, where I got to spend 2 weeks in Europe with my family.

This epic journey begins with one of the best business class experiences I’ve ever been on…

Virgin Atlantic flight VS142
– Route: LAX – LHR
– Aircraft: Boeing 787-900
– Seat: 1A (Upper Class)
– Departure: 6:30pm, July 9, 2017
– Arrival: 12:25pm, July 10, 2017
– Flight time: 9h 55m

LAX Check-in and the Clubhouse

I’ve heard a lot of good things about the Virgin Atlantic Clubhouse – the airline’s promotional video for the Upper Class is one of the few business class promo videos out there that extensively features the clubhouse.

In light of that, I decided to get to the airport early to make sure I enjoy the lounge to the fullest. I budgeted for 4 hours to spend at the lounge, but, nothing ever happens your way when it comes to LA traffic. My journey from Hollywood to LAX ended up taking more than an hour and half because of unannounced road closures on La Cienega.

A rather underwhelming collection of check-in counters.
A rather underwhelming collection of check-in counters.

I still ended up in LAX with plenty of time. Check-in agents look like they’re just getting ready, and nobody in line yet. I’ve never been to T2 before, which is shared with Delta, but I was expecting that Virgin would spend a little more effort in pimping out the check-in decor. After all, in comparison Virgin America goes all out in their half of T3 (before the Alaska merger) and in SFO T2. Instead, there was no mood lighting to be seen, and the screens behind the check in desks are the standard LAX boilerplate with a Virgin Atlantic logo slapped on. The boilerplate LAX blue color (or is it Delta’s?) has a sharp contrast to Virgin’s red, but in a pretty bad way.

The check-in agent in the Upper Class line (queue?) was a very courteous, older Asian gentleman. He saw my Hong Kong passport and started talking about politics in Hong Kong and relationship with the UK. I was a little caught by surprise – was not expecting this kind of talk at an airport check-in counter at all. I am usually more than happy to talk about HK politics, but my mind was set on visiting the Clubhouse. I hastily replied a little, and he sent me on my way to security with directions to the Clubhouse.

I soon realized, his directions of “walk up the stairs on the right” were actually quite necessary. The Clubhouse was located on the mezzanine above the terminal concourse, but there were not many signage to be found past security. Arriving at the clubhouse, an agent checked my boarding pass against a list of Upper Class passengers and welcomed me in.

The lounge had a color scheme of white and gold – not the red and purple I was expecting (like the one Virgin America Loft at LAX) – and my first impression was very much “wow”. It is minimalistic and simple, elegant but yet “young” at the same time.

Going with a lighter color palette, I feel, fits very well with the Southern California vibe, and I give Virgin mad kudos for recognizing the local culture. The colorful chairs in the lounge were an amazing finish to the decor – unique and quirky, posh but without pretentiousness. Overall, the lounge made me feel very comfortable.

The whole lounge is filled with natural light, albeit doesn’t offer too much to look at in an empty section of the tarmac. While it is not big, it does offer plenty of seats in an open lounge area. In addition, there is also a dedicated dining area with proper dinner setting for those that prefer a more formal dining experience.

As soon as I took a seat, a waiter came and introduced himself as “Marcus”. He explained the menu to me, and asked if I wanted “still or sparkling water”. It’s been a long time since I’ve been to Europe, so I initially thought it was just a quirky thing that the lounge does. I soon found out that this is a common thing for European restaurants to do, and that got me even more impressed – they really put in the work in making sure guests from everywhere feel at home.

The menu was long, and every single item looked appetizing. I wanted to try literally everything. Good thing I have at least 2.5 hours here.

So I decided to start with a “Sunset” cold-pressed juice. The menu’s first page advertised Virgin’s unique partnership with this local juice place, so I thought it would be a good starter. I also ordered some BBQ ribs and miso salmon, per Marcus’s suggestion.

The food didn’t take long to arrive, and both the ribs and salmon perfect tapas portion size. Which meant, for guests that are hungry like me, I could try out many different things; for others, they’re a perfect appetizer to just relax with.

And oh my gosh, they were simply amazing. The ribs were very well seasoned and tender, and the salmon was fresh and cooked to perfection. The juice was certainly refreshing and enjoyable, but nothing about it particularly stood out.

I couldn’t stop there. I found Marcus again and followed up with an order for more food. I was scared of being judged for a little bit, but Marcus was nothing but polite taking my order. My second order soon came in: potted salmon and lemon posset. Along with it, I also got a cocktail that comes in two parts: some rum-based cocktail and a beer along with it. (I can’t believe I didn’t take a picture of the Cocktails menu. There were so many cool things on it)

The second round appetizer round and the dessert were just as impressive. The potted salmon was very unique and incredibly fresh, and the lemon posset was just a great way to finish the whole meal with. 

Time actually flew pretty fast in the lounge. Before I knew it, an agent announced on the PA that my flight will begin boarding soon, adding “the gate for this flight is actually fairly close to the lounge,” and that we can take our time in heading to the gate. I really appreciated the personal touch.

I started heading towards the gate, where a crowd of passengers had already started lining (queueing?) up. The Upper Class sign was a tad bit hard to find in midst of the crowd as there were no clear separation of boarding groups. Everybody kind of weirdly merged right before the boarding agent.

Boarding and Welcome

The 787-9 is waiting for us at Gate 26, which is conveniently right next to the staircase to the lounge. What is slightly frustrating, however, was that there is also no good spots to get a good picture of the plane (and this actually seems to be the theme of my entire Europe journey).

I was welcomed by a myriad of purple lights as I walked towards and into the plane. The interior mood lighting is set to a combination of purple and blood orange. I find it to be a little bit more professional than the Virgin America cabin, which goes all out in pretending the cabin to be a nightclub with straight purple.

Seats in the Upper Class cabin is organized in a 1-1-1 fashion, with a rather classy looking leather barrier separating the A and the D row, so the A seats feel fairly private. A menu (“Hello there”) and an amenity kit was waiting for me on the ottoman. Inside the menu was an breakfast order form insert, which I was supposed to fill out before I go to sleep.

A flight attendant walked by and offered me a glass of a departure drink. Nothing could beat Cathay Delight, my favorite departure drink, but I’d happily take a glass of champagne. I find that alcohol really helps me sleep in flights.

Boarding was efficient – before I got too comfortable in my seat, the captain came on the PA and announced that we are on our way to London.

As the plane left the jetbridge and onto the runway, the safety video started playing from the screens. Since the monitors had to be stowed during taxing, it actually took some effort to watch it. Nevertheless, it was actually interesting enough to capture my attention. I love discovering the different strategies that airlines use to try to stand out and show off personality – Virgin America has that really catchy tune (Tonight, we’re gonna fly / ‘cause we’re gonna live it up in the sky), British Airways has that British humor, and Air New Zealand brings a whole scene from Lord of the Rings… Some might say they’re overly cheesy, but hey, they’re successfully getting me to pay attention, so there’s that.

Virgin Atlantic chooses to bring a bit of everything – a cowboy explaining seatbelts, a superhero pointing out emergency exits, and a secret agent talking about oxygen masks. If there was a rating system for safety videos, I’d probably give this a solid 8.

Amenities

The amenity kit is rather lacking. The bag itself is a leather-made Herschel-branded pencil-bag looking pouch that seemed a tad bit too big for the contents that was inside. Inside was a Rituals branded stick of lotion and chap stick , an eye mask, some earplugs… nothing out of ordinary. 

While preparing for take-off, I overheard this conversation from the seat behind me.

FA: Would you like a sleepsuit, sir?
Passenger: (in an American accent) a what?
FA: A pajama set?
P: Ah, sure, yes please.

And I’m really glad I overheard it, because the uncultured me probably would not have understood what a “sleepsuit” is either. When the FA did finally come to my seat and offered it, I of course am “familiar” with the lingo already, and gladly accepted it.

The “suit” is really nothing to write home about, though – it was really just a t-shirt and a pair of thin sweatpants. Still, Virgin Atlantic is one of the few airlines that gives out pajamas in Business Class, and I appreciate it. Along with the pajama was a small taster-size bottle of “sleep oil”, similar to what is usually found on a Westin hotel bedside, which supposed helps with the sleep onboard. Didn’t end up using it on the flight, but I gladly took it home.

After takeoff, flight attendants distributed a pair of noise-cancelling headphones. They were unbranded and can’t be compared to the QC25’s that some other airlines give out, but I certainly can’t complain about them – they did their job fine.

Seat and Inflight Entertainment System

I was a little worried about the seat coming in. The 1-1-1 herringbone layout meant that there is a little less storage space than reverse herringbones found in many other Business Class cabins. However, somewhat to my surprise, the seat is sufficiently wide and it doesn’t feel nearly as cramped as it looked like on pictures. The seat itself is in a high-quality elegant leather cover, and provided ample lumbar support. It was quite a comfortable seat.

As expected, the one major downside of the herringbone layout is the lack of storage, although I think it was evident they recognize this problem and try to find creative solutions for it. To the left of the seat they managed to fit a small tray table and a small pouch that is maybe slightly smaller than a typical setback pocket in a coach seat.

Both the IFE screen and the tray table are hidden very well in the left wall panel. It might be a little awkward to get the screen out from the stowed position, especially when the dining table is out – but it does become very flexible in positioning and angle adjustment once fully extended. The tray table is even more magical. At the push of a button, a compartment hidden in the left wall pops out, revealing a slot where the tray table slides out from.

The IFE system contained a decent selection of movies and TV shows to choose from, laid out in a stylish interface. (That is to say, the inner front-end software engineer in me approves of the design) Movies and TV shows are laid out in a neat carousel that was smooth to navigate, and it was very easy to discover shows.

What’s more interesting, perhaps, is the built-in rating system. The system showed me, for example, that “98% like [Hidden Figures]” when I was browsing through it. I was doubting the accuracy of this number until after I finished watching the movie, and the system asked me if I’d give the movie a thumbs up. To be fair, I have no idea if the data is actually accurate, but it at least looks like a useful feature to have. Too many times have I been stuck in mid-air not sure which movie to waste 2 hours on because I couldn’t access Rotten Tomatoes. This at least solves part of the problem.

In addition to the touchscreen main monitor, there is also a wired controller attached to the seat for slightly easier access. It can also double as a flight map while the main monitor is off or playing a movie. I find it particularly useful when waking up in the middle of a night to check where we are and how much more sleep can I get without missing breakfast.

Food

It is a surprise to me that I still had room to eat after smothering myself with the Clubhouse food just an hour before, but I couldn’t turn food down.

Soon after take off, a round of chips (or crisps?) were passed out. A flight attendant then came up and introduced to me as “Drew, or D”, asked for my first drink order, and described tonight’s menu. The order of service made it felt like a sit-down restaurant.

I asked for a Moscow Mule, and chose “Melon and prosciutto” for an appetizer and “Asian braised short ribs” for the main course. Honestly, the short ribs wouldn’t have been my first choice, but nothing else on the menu sounded much better.

Service was excellent throughout. D perhaps saw that I was not too well-versed in alcohol pairings, so he recommended a Rose for me to go with the short ribs.

A drink cart comes around with a bread plate, some utensils and a tablecloth. And let’s not forget the iconic airplane-shaped salt and pepper shaker. I love the pattern on the tablecloth – it adds a personality but does not lose the elegance. A choice of sparkling and still water was offered, and it was constantly refilled. Shortly after, the appetizer was served, along with a basket of warm bread for me to choose from. I picked a “pumpernickel round”.

The appetizer was unmemorable. It was rather plain as an appetizer, and I wasn’t at all impressed by it. There wasn’t anything inherently wrong about the dish per se, but I wish I had chosen something else.

The flight attendants kept a close eye on me throughout the whole service and promptly brought out the main course right as I completed the appetizer.

I was getting excited for the main course until I took my first bite – it was way too salty. It was a shame because I thought that everything else about it was perfect – the texture of the beef was excellent, and the garlic mashed potatoes was a good accompaniment. Unfortunately the hoisin sauce on the ribs were quite heavy and completely drowned out the rest of the dish. (Although, I’ve learned from my week’s worth of experience in London that British cuisine is typically saltier than American cuisine – so that might be why.)

D saw that I had finished the main course, and a round of desserts, or “pudding” I should say, was offered after the main course. Between the choices of “lemon pudding” and “flourless chocolate cake” I went for the former.

There must have been some kerfuffle when the actual dessert was served – it was quite chocolate-y looking. I thought it was just an interesting rendition of “lemon pudding” at first, but D came out shortly after and apologized for the mistake. I was surprised, but was actually quite pleased with the end results regardless.

Overall, I think the dining experience is about on-par with my expectations. I like that the only “assembly line” feeling part of the service was when the drink cart was initially brought out and my table was being set up. The flight attendants kept on a close eye on everybody throughout, plates were brought out directly from the galley just like in a restaurant, and I never had to wait long for the next course of dinner. The entire service took about two hours, and the personal touches made me feel very comfortable. I’d have to take off points for the saltiness, but honestly, I was quite satisfied from the Clubhouse still and I wasn’t gonna complain too loudly.

Bed

After finishing Hidden Figures, I flagged down a flight attendant for help in converting my seat into a bed. She flipped the seat in the other direction, and grabbed a mattress pad, a duvet and a full-size pillow from behind the seat. I also filled out a “Wakey Wakey” card, letting the flight attendants know my breakfast preferences, and asked them to wake me up in the morning.

As a regular-sized Asian dude at 5’10, I found the bed to be perfect in size. Echoing the same comments I had about the seat, the bed actually felt wider than it looked, even wider than the Reverse Herringbone seats from Cathay Pacific. Travel bloggers usually complain about footwell space – it’s nice that in this configuration, footwell crampedness is a non-issue. I wouldn’t have minded either way, but I guess a taller person would appreciate it. However, the same complaint remains – there was little storage for the random things I had – phone, camera, Switch, and others.

The bedding was perfect. The full-size pillow was fluffy and comfortable much like what is usually found in a hotel, and the duvet is thick and warm. I found the mattress pad, which a lot of travel bloggers tend to rave about, rather mediocre; that is to say, I don’t think I found it impact the quality of my sleep that much.

I was able to get a comfortable 5 hour sleep. That is, until the flight attendants started preparing breakfast. Sitting in 1A meant that it was the easiest to be woken up from the sound of utensils moving and what not. Honestly, I was pretty annoyed; but on the bright side, that gave me some time to explore the cabin.

Cabin and In-flight Bar

One highlight of the unique Virgin Atlantic cabin is the in-flight bar that is located behind row 9 of the center aisle. There are a couple seats that are directly adjacent to the bar – rows 10 and 11 I believe. When I woke up at around 3 hours left of the flight, or 2am LAX time, there were nobody there. (Although curiously, there was a Macbook just sitting on the table)

The bar was fully stocked with snacks, wine, and champagne. I wonder if this would be a more popular spot on daytime flights. If I was a little bit more awake, I guess I wouldn’t mind chilling on one of the bar stools for a while instead of being stuck to my seat.

Directly behind the bar was a giant touch-screen monitor that has a rotating flight map, as well as an interactive guide of the destination. Super cool feature, but I have to be skeptical of how much use it actually gets used.

The galley behind the Upper Class cabin was unstaffed, but was stocked with additional small snacks and a fridge with drinks, and I hear Premium Economy passengers are allowed access as well. They aren’t necessarily presented in the neatest way, nor is the selection the most extensive, though. I think I’m a tad bit spoiled by the Asian carriers that offer hot appetizer dishes mid-flight.

Breakfast

The rest of the passengers were woken up by a bright red wake-up light with an hour and a half left of the flight. While I was looking for the next show to watch. D came by, set up my table and served all the breakfast items I ordered at once.

I really appreciated the presentation. There table wasn’t covered by a full tablecloth, but instead had a small, cute piece of decorative cloth in the center.

Food items were served on separate plates instead of one big tray, on which there were some fruits, scrambled eggs, sausage bacon, and a croissant, as per what I requested on my breakfast card. I was most impressed by the croissant. It didn’t look great, but it was surprisingly crispy and buttery. If there was anything to complain, I find the portion size was a little bit smaller than expected.

Overall, breakfast service was efficient. The breakfast order card system loses a bit of a personal touch in the service, but it did allow for maximized sleep time.

Landing and Arrival Lounge

As we get close to London, cabin lightning got much less intense, reminding me that the real world is not a night club.

Right as I finished breakfast, the in-flight map showed that we were about 45 minutes away from arriving in London. Flight attendants handed out shiny bright pink Fast Track immigration passes right before the smooth and uneventful landing.

After about 10 minutes of taxing in LHR’s massive tarmac, we reach our gate at T3. I forget which gate it was, but wow was it a long walk to the immigration area.

Hello there, good to be here.

Or perhaps I just remembered the walk was long because I was counting down every second I have to enjoy the “Revivals” arrival lounge, which closes at 12:30pm. (I guess Virgin didn’t think passengers arriving in the afternoon need to “revive” after their flights) With a touchdown time of 11:30am, I was cutting it close.

Not a very welcoming door, to be frank

Thankfully with the Fast Track card, I was able to get through immigration pretty effortlessly, and found the lounge with 30 minutes to spare. The host checked my boarding pass and welcomed me in, but noted that I might not have enough time to both take a shower and enjoy breakfast. Despite my plan to head straight to my hotel after arriving, I chose to use the shower.

The lounge itself is not terribly big, and has less snazzy decors than the Clubhouse. There is a Still plenty of red to go around in midst of the neutral tones though. There are maybe 4, 5 guests in total in the whole lounge. Needless to say, there were plenty of showers available.

The shower rooms were very clean, albeit not too big in size. Each came fully equipped with a full set of toiletries. After a shower, I realized I still have about 10 minutes before the closing time of the lounge. I smelled some British baked beans in the air and I couldn’t resist asking if it’s possible to sit down and get a quick bite.

A waitress (perhaps the sole waitress) in the dining area took my order, and also offered a mango smoothie to get me started without asking. That was a really nice touch.

The English Breakfast came out shortly after in its full glory. Nothing terribly unique or impressive like the menu in the Clubhouse, but I really can’t think of a nicer way to finish a long flight than this.

Final Thoughts

If I could sum up my first Virgin Atlantic Upper Class experience in one sentence, it’d probably be something like “Richard Branson take my money please.” Virgin Atlantic understands its target audience well, and caters specifically to those who were looking for something different than a traditional flight experience. The entire experience exudes a strong personality – one I’d describe as quirky, but not cheesy. If anything, I really applaud Virgin for having the guts to do things differently, and not just doing “things other airlines do”.

While many travel bloggers are quick to criticize the tightness of the hardware product, I would argue that it doesn’t quite deserve all the hate that it can get. Where it does feel short, Virgin Atlantic has surely compensated for it with attentive service in a beautifully decorated atmosphere.

I’m not quite ready to call it my favorite Business Class experience ever, as I still have a soft spot for Cathay Pacific with its “hometown advantage” and Japan Airlines with their Japanese hospitality and amazing on-board food. That said, looking at the competition of trans-atlantic flights, Virgin Atlantic has hands-down won my heart as my preferred method of traveling across the Pond. 

  • Seat: 7 / 10
  • Bed: 10 / 10
  • Food: 6 / 10
  • Service: 8 / 10
  • IFE: 10 / 10
  • Lounge: 10 / 10
  • Overall: 9 / 10

Appendix: Making the Award Redemption

I began searching for award flights back in December 2016, as soon as my family decided to take an extended summer vacation, I began searching for award flights. Although SEA-LHR on VS was already announced and set to start in March 2017, it didn’t seem like there were any availability for that yet. No big deal – I’m fine with taking a placement flight to LAX or SFO.

I first started searching with Virgin America Elevate points. I’ve been eyeing on this redemption for a long time – back when I decided to transfer 80,000 American Express Membership Rewards points to 50,000 Elevate points for the complimentary Gold membership, this was the redemption I had my eyes on. (The transfer-for-Gold deal turned out to be even better than I had thought, since the Alaska-Virgin acquisition extended the membership for free for another year. But that’s a story for another time.) If I remembered correctly, the reward for a round trip ticket from any west coast city to London goes for 50,000 points + $1100 in fees. The fees are indeed quite hefty, but at a round-trip price of $4500, the redemption still comes to about 6.8cpp. Really not bad at all.

So I started by calling the dedicated Elevate Gold reservations hotline, but the usually-excellent agents only transferred me to a dedicated partner awards agent. Unfortunately, though, the agent was not able to find any availability in Upper Class at all around the dates I wanted for either LAX or SFO. The agent offered some Premium Economy availability, but I wasn’t going to give up yet.

I then looked at Delta.com to see if I could use some Delta points. I had just enough for a one-way flight on Virgin Atlantic, most of them from when I had my Gold Delta Skymiles American Express card. Availability was a lot more open outbound than inbound, and I ended up choosing a Sunday night flight out from LAX, for 70,000 Skymiles and $5 in fees. Choosing to go one-way on the outbound flight means that I won’t get to enjoy the Upper Class check-in experience at LHR, but I think I’ll live – ex-LHR redemptions go a lot higher in fees because of dumb UK rules; not sure if that check-in experience is worth $200 more in fees.

Little did I know, this was one of the last chances to get this redemption at such a good value (~3.5cpp). A few months after making the reservation, Delta would raise the price to 90,000 – 105,000 points for the same redemption. On one hand the devaluation does hurt the redemption quite a bit; on the other hand, even with the price hike, I’m not sure if there are any other trips I’d save my Skypesos for.

Trip Report: SEA-SJC, First Class on Delta CRJ-700

Lately, I’ve gotten myself into reading a lot of “trip reports”. I love traveling, but I don’t (yet?) have the ability to do so much. Well-written trip reports out there really have an ability to make a reader feel like they’re part of the experience. I vaguely remember trying to write one for my trip to San Francisco a few years ago. I’ve only taken maybe 2 long-haul flights in my life before then, and I was so excited to capture that experience and to share it with others. But alas, I left it somewhere in a draft folder that I can’t seem to find anymore, and never published it.

My work as a software engineer has me going from Seattle (where I’m based in) to the Bay Area quite often. Normally, I would have been taking advantage of the Elevate Gold status that I got from transferring points from my AmEx cards, and fly SEA-SFO in Virgin America (and I’ll be constantly comparing this trip with my previous trips on Virgin in this post). However, seeing that SPG was running a promotion with the Crossover Rewards program (where you can earn SPG points for flying with Delta) and offering 500 extra SPG points for trips with Delta, I was very tempted to give Delta a try. I love the purple mood lighting and all, but getting on a tiny regional jet could be interesting, too.

And so I decided to take the the flight DL 4766, which leaves Seattle at 4:15pm and arrives at San Jose at 6:24pm. In my opinion, the timing works a little bit better compared to VX 755, leaving SEA at 5:10pm and arriving at SFO at 7:10pm. The traffic is so much worse an hour later in the day in Seattle, and not being able to get to dinner at a reasonable time in the Bay Area is also a problem.

IMG_20160211_144852

I arrived at the airport about an hour before. SEA, being one of my favorite airports in the States, was fairly empty. After getting through security, I started heading towards the Centurion Studio. My flight was leaving from gate B7, which is across the corridor from the Studio. I guess I could have checked out the Delta Sky Club, but that’s all the way in the satellite S building, and I decided that it’s probably not worth it.

I’ve been to only a few lounges in my life; and while this isn’t anywhere as luxurious like the Cathay Pacific Pier in Hong Kong, the Studio still makes a great place to relax and wait for a flight. The staff is friendly, and the snacks selection is… adequate. Really there isn’t much more I would be asking for before a regional flight.

Pre-departure

I started to head for the gate 30 minutes before the departure time. The boarding process began promptly and I started making my way onto this tiny regional jet.

IMG_20160211_154650

As a lone traveler onboard this 1-2 configuration first class cabin, I took seat 1A, one of the 3 single seats. Even as one of the first passengers to board, I had troubles finding a space in the overhead bins to put my duffle bag and backpack. Fortunately, the flight attendant offered to put my bag in one of the closets. There was a small bottle of water placed on every seat before we boarded, which is a nice touch.

The plane is an aged one – there’s no denying. The lack of in-flight entertainment is a little bit annoying, though I shouldn’t be complaining for such a short flight (That said, last time I flew to the Bay Area I was able to rewatch almost half of of Silicon Valley season 2 – what a great way to pass the time). The seat itself feels very wide – perhaps wider than Virgin’s first class product, but the legroom is a little limited for a first class seat. My legs could rest comfortably, but there was no room to stretch them out.

IMG_20160211_173739

Shortly after all the first class passengers boarded, the attendant started offering welcome drinks. “Anything to drink?” Without any greetings like a “good evening”, or even a “hello”, she went straight to the important questions. “Um… ginger ale please,” I replied. I didn’t have a chance to confirm that she acknowledged my request before she already turned her back repeating the same questions to the passengers near me. Maybe she’s just swamped with pre-departure processes, or maybe the much-more-frequent business flyers on this route prefer the no-BS attitude. Meh, I thought.

Service & Food

The flight took off on time, and the in-flight services began promptly. The flight attendant started walking down the aisle asking for beverage choices, and whether you’d like a chicken wrap for dinner or not. Took me by a little surprise – I didn’t think a 4pm departure on a short flight would warrant a full meal. (Virgin America, if I recall correctly, doesn’t offer meal service on this route) “I’ll take it”, I answered, “with a Diet Coke please.”

Shortly after taking everybody’s orders, she started serving drinks, and brought me a tray with the chicken wrap. Along with the chicken wrap was a few celery and carrot sticks with a small bowl of hummus. Sadly, there isn’t an oven equipped on this tiny jet; otherwise, I’d have preferred a hot meal. (To be fair, neither does American offer a hot meal on a flight like this even when flying a 737).

My first impression was: what a beautiful tray it is! The plate is placed neatly on top (alongside with way too many advertisement for the catering company, but I can overlook that), and it has a premium-but-not-over-the-top feel to it. I really do appreciate the design. The wrap was surprisingly good, I have to say; I was half-expecting a dry and plain sandwich wrap, but it turned out to be fairly juicy and flavorful. I’ll take this over American’s half-effort chicken salad any day.

Service was overall attentive, with the attendant offering to refill drinks constantly. The attendant does seem to be in a better mood after the takeoff, and was a little more friendly to the passengers. I guess the earlier perceived rudeness was in fact just due to a busy pre-departure schedule.

We landed in SJC on time. The skies were clear (a welcome sight coming from Seattle in the winter); even from several thousand feet in the air, you can almost spot where all the tech giants’ campuses are.

Final thoughts

The tiny jet turned out to be a pleasure to fly in. The 1-2 configuration can be a tough contender to Virgin’s superior First Class seat, and having a hearty meal just might be able to put Delta on top.

(Wow, this trip report took almost a year and a half to finish. I intend to be have a much quicker turnaround with my future trip reports, I promise!)

Getting ready for Europe!

I started planning this trip since January, and I can’t wait to finally depart. In just a few weeks, I get to join my sister in celebrating her graduation from Leicester University. My entire family will be in Europe as well to attend her graduation ceremony, as well as doing some sightseeing in nearby European countries. It’s gonna be great.

Not to take anything away from Rebecca’s amazing achievement (really, no words can describe how proud I am for her), another reason for my excitement is that this marks the first trip I’m taking with the miles I got almost solely from a hobby called “churning”. Yup, after 2 years of collecting credit cards (and points/miles), I’m finally reaping the fruits. All long-distance flights in this trip are redeemed with points; I’ve considered spending points on the European regional flights, too, but it didn’t make too much sense since actual ticket prices in Europe are so low.

An Average of 4.63 cpp

While people generally have different ideas of what a “good” redemption looks like, I’ve always thought that any redemptions below 3 cents per point (cpp) are not worth it. The idea behind is that, the churning hobby fuels experiences that I otherwise would not consider shelling out real money for. Redeeming points for things with lower cpp value means the opportunity cost – not being able to try out experiences that can’t be bought with cash – is a lot higher.

Here is a list of my redemptions for this trip. Actual ticket prices are found by using Google Flights, selecting the cheapest ticket on the same airline around the time range (checking both one-way and round trip prices, dividing appropriately).

  • Virgin Atlantic LAX – LHR in J: 70,000 Delta miles; actual $2400, ~3.42 cpp
  • Singapore Airlines FRA – JFK in J: 68,000 Singapore KrisFlyer miles + $310 fees; actual $3000, ~3.96 cpp
  • Cathay Pacific JFK – YVR in F: 40,000 AsiaMiles; actual $3200, ~7.97 cpp
  • Delta YVR – SEA in Y: 5,000 Delta Miles; actual $200, ~4 cpp

The highlight here is probably the Cathay Pacific flight. At 7.97 cpp, It’s truly one of Cathay Pacific’s little known sweet spots. Only other routes that guarantee their famous international First Class product are long-haul and costs at least 100,000 Asia Miles (e.g., LAX – HKG).

Many Firsts

I’m also looking forward to many first experiences on this trip. Other than the SEA – LAX and YVR – SEA connection flights, I’ve never taken any airline-class combo like the ones I’m about to take before. In addition, I’ll get to ride an intercity train from Stockholm to Gothenburg that is managed by MTR, the company behind Hong Kong’s subway system. How awesome is that?!

With my new toy, a Sony a6500, we’ll be sure to take lots of pictures to document my journey!

Securing data and communication with RSA across Android app and Python server

I took my Algorithms class in USC with Prof. Leonard Adleman. Unsurprisingly, one of the biggest topics that we focused on in that class was RSA encryption. “Generate a pair of keys – you can encrypt by taking this exponent and mod that, decrypt by taking that exponent and mod this.” It all sounded too simple.

A few semesters later, I find myself needing to use a public-key encryption scheme. I’m trying to implement Spotify support for the playlist app I’ve been working on, QCast, for which we need to ask the user to input their Spotify credentials. Since a Spotify account involves some really sensitive details, and we might want to store the credentials locally on device (so that we can offer to automatically login for user), we thought we’d be a little smarter than just having plaintext username and passwords around. Vinnie argues: “https is enough!”; I’d generally agree for communication (though a quick Google search seems to suggest otherwise), but definitely not for storage.

In fact, for that matter, not just any encryption – it has to be asymmetric so that even if the key to encrypt is public and known to everyone, the encrypted data cannot be decrypted.

So I thought I’d implement RSA, thinking it can’t be that hard… right? What, import RSA, RSA.encrypt(key, message)? Hah, so I naively thought. Turns out, there are different ways of generating the keys, different ways of encrypting and decrypting. For the cherry on top, Java and Python use different ways of naming and setting up things. As a result, even though the final solutions that we have isn’t too complicated, we wasted a ton of time researching for the right way to do things. I hope to save ourselves and other people the troubles for doing all the research again in the future with a short guide.

Goal

  • Generate a pair of RSA keys
  • Encrypt using the public key in Android with the javax.crypto package (though it can be easily adapted to any Java project).
  • Decrypt using the private key in Python with PyCrypto*.

* M2Crypto is the hip alternative, but is not supported by Google App Engine.

Generating Keys

To generate, we use openssl, a widely-used security library.

First, let’s generate a private key.

This command will do the trick, outputting the generated key to the file private_key.pem. 2048 is the length of the key generated; the length is actually very important – turns out, you cannot encrypt a string that is longer than the size of the key.

From this private key, we can generate a public key.

This command takes in the private key from the file private_key.pem, generates a public key (with the -pubout flag) using the format der, and writes it to the file public_key.der. We encode the public key in der format and not pem format, because Java likes the base64-decoded version of the key (that’s pretty much the only difference, anyway – a good StackOverflow answer here on the different key formats).

Python, on the other hand is much more robust and can support the pem encoding just fine.

In your Android app, create a folder named raw inside [modulename]/src/main/res/, and put the public key there. It’s okay if the public key is “leaked” (hence the name public) – the encrypted data cannot be decrypted with the public key. In your python app, I would create a folder called ‘resources’ in root and put the private key there.

Encrypting Messages in Java

(Special thanks to David for his help in this part)

Before we start encrypting, we first need to read from the public key file, and generate a usable PublicKey object.

(The comment above X509EncodedKeySpec ... highlights my frustration – it is rather hard to get a clear answer to the different formats and encodings of keys, and I had to settle with a lot of trial and error.)

So now that we have the key ready to be used, we can set up the “encryption engine” and feed the key to it.

This part seems more straight froward (except with the weird syntax that Cipher uses). One line, in particular, deserves a little more attention, though.

Cipher.getInstance("RSA") – There are actually multiple ways of using RSA, including different kind of “padding” – it works kind of like a salt in a hash. This StackExchange post really helped me understand this concept:

The operation at the core of RSA is a modular exponentiation: given input m, compute m^e modulo n. Although in general this is a one-way permutation of integers modulo n, it does not fulfill all the characteristics needed for generic asymmetric encryption:

  • If e is small and m is small, then m^e could be smaller than n, at which point the modular exponentiation is no longer modular, and can be reverted efficiently.
  • The operation is deterministic, which allows for exhaustive search on the message: the attacker encrypts possible messages until a match is found with the actual encrypted message.
  • The modular exponentiation is malleable: given the “encryption” of m1 and m2, a simple multiplication yields the encryption of m1m2. This is akin to homomorphic encryption, which can be a good property, or not, depending on the context.

For these reasons, the integer m which is subject to RSA must not be the data to encrypt alone, but should be the result of a transform which ensures that m is “not small”, contains some random bytes, and deters malleability.

So while getInstance("RSA") can compute the RSA encryption, the string parameter can actually be overloaded with different options.

  1. Encryption algorithm to use – in our case, RSA.
  2. “Transformation mode” – doesn’t seem to have an effect on RSA encryption, so we’ll just set that to NONE. (I’d love to be corrected)
  3. Padding standard. Some brief research tells me that the one should be used these days seems to be OAEP Padding, with some hash function (usually SHA or MD5, by default SHA1) and mask generation function (by default MGF1).

Therefore, you might want to replace that string parameter with "RSA/NONE/OAEPWithSHA1AndMGF1Padding". (Why they decide to have parameters to be this really baffles me.)

The base64-encoded string is then stored in the variable encrypted, ready to be sent to the server for decryption.

Decrypting Messages in Python

Over on the server-side, we need to do something similar. Namely, read from the key file, set it up with the correct padding configuration, and decrypt. Fortunately, the code to do this is a lot simpler on Python.

First, make sure your dependencies are set correctly. In app.yaml of your Google App Engine project, make sure you specify you want to use the pycrypto project that is included with Google App Engine: (or, (sudo) pip install pycrypto for other projects)

Setting up in Python is actually extremely easy. All the modules we need come from the Cipher package.

PKCS_OAEP.new actually takes in multiple parameters; but since we decided to use the default OAEP settings (SHA1 and MGF1), nothing needs to be set explicitly. However, if you do change it, you might find this reference guide useful. For example, to use with the Java configuration of "RSA/NONE/OAEPWithSHA-512AndMGF1Padding", you would want to change to PKCS1_OAEP.new(rsakey, SHA512).

Similarly, if you decide not to use OAEP Padding, then PKCS1_OAEP.new(rsakey) is completely unnecessary. Just use what RSA.importKey returns and that’ll do the trick.

Afterwards, we can decrypt very easily:

Ta da! The decrypted string is now in the decrypted variable.

Limitations

As mentioned above, the amount of data we can use with RSA depends on the length of the key that we chose. If we generated our private key with length 2048 bits, the message cannot be more than 256 bytes, minus padding size.

The most common solutions I’ve found for encrypting long strings is a hybrid solution, combining both a symmetric encryption scheme (like AES) and RSA:

  1. Generate symmetric key, K
  2. Encrypt data with K
  3. Encrypt K, which we can guarantee length for, with RSA using the public key
  4. Send encrypted data, and the encrypted key to server
  5. Server decrypts the encrypted key with RSA using the private key, getting original K
  6. Decrypt with AES using K

Conclusion

The motivation for writing was that there didn’t seem to be a simple guide for cryptography beginners who want to implement some security in their app without having to dive into jargons that are way too complicated. I hope this guide served that purpose.

Please help me correct anything incorrectly explained in the post – I’m no expert and would definitely love to learn more.

(We are taking QCast to iOS too, so there might just be a post with encryption in iOS soon. )

The new Peetahzee.com

I liked my old Peetahzee’s Blog quite a lot. It was my first major web design project, and it took quite a few iterations to get it looking right. It looked good, well, in 2008 standards at least. Just to give some context – border-radius wasn’t yet a thing back then.

I gave it a facelift in 2011 – call it v1.5 if you will – when I entered college and realized that portfolio websites matter to recruiters. Peetahzee.com was no longer just a personal blog anymore, but more so a professional representation of me as a developer. I put some CSS tricks on (oh how I loved inset box-shadow), got a new portfolio site going, and hoped that it would last for a few more years.

Much blue. So color. Very roundedcorners. Wow.

Much blue. So color. Very roundedcorners. Wow.

But of course, in this industry, hardly anything ever lasts for more than a couple of years. I soon got jealous of all my friends’ fancy personal sites and thought, hey, I can do better with my own site. I was very happy with myself when I redesigned my new resume – it’s clean, has a very “refreshing” look, and (I believe) helps people focus on the right things through graphics and typography. I wonder what it would look on a website.

Based on that, there are a couple of things I wanted to do differently:

  • Less blue. It’s still my favorite color, but it seems that when the entire page is blue, it is quite distracting
  • Dominant “featured image” – an image to sum up the contents of the post
  • Focus of the page is on the content. Sidebar is much less important
  • Some place for a one-liner about myself
  • Always-on nav bar
  • Responsive design
  • Some sort of scrolling magic

Ah, about the scrolling magic – I didn’t want to just be like everybody else who gets a full-screen-image-parallax-thingy-majingy on there and call it a day. I thought about what I want the visitor to see on the instant they first visit the page, and what they’d want to see after spending some time. One obvious example would be my face. It can really help the visitor identify that it’s my blog, but it can also get in the way of the contents of the blog afterwards.

The entire redesign took me about two weeks from mockup to final implementation, and I’m quite pleased with the results. As a bonus, under this new design, I feel like I can have more flexibility when designing individual pages in the future (for example, the portfolio page.) I have some plans for that and can’t wait to get started on that.

Any comments or suggestions? I would love some feedback!

Openness: what I enjoyed most in Google

(Just got back from Hong Kong, and extremely jetlagged. Why am I up at 4 in the morning…)

As I step back onto the school grounds in a blazing 90`F LA weather, I couldn’t help but to think back that awesome summer I’ve had. The 10-week internship at Google flew by like a blink. I’ve made some great friends, met some amazing people in the company, and walked away learning a lot of new things I wouldn’t even have heard about otherwise.

It’s also time now to think about internships again. Lately, I’ve been picking up on reading in blogposts, articles, and journals about work experience at different companies. I seem to have found a trend in all these posts: innovation. This word appears everywhere. Don’t get me wrong – it’s an amazing vision and mission to have, one that I often share and enjoy working for; but when everybody has it on their profile pages, what makes them different?

In a lot of ways Google’s innovations exceed far beyond what others can even imagine: grand technologies like Google Glass and self-driving cars, and tiny details like empowering blind users through improving accessibility in their apps. But these weren’t what made me fall in love with working there; no, what did was the openness in its culture and empowerment of their employees – it’s an innovation in the workplace.

How so? Take this for an example. As a mere intern, I had access to almost the entire codebase of Google from every single project. Compare that to what I heard from my host, who has worked in Microsoft as a PM intern without any code access – not even those in his own project, this is pretty darn cool. With access to a codebase this big, there is no lack of resources for learning how to use certain technologies. I cannot think of a better way of encouraging Googlers to go outside their safety zones and learn from others.

Every Friday, employees and interns enjoy a very special treat from Sergey and Larry themselves in a company-wide all-hands meeting called TGIF. They’d present about a product Google has been working on, and then take questions from the audience – any question. When I was interning, there were questions ranging from “How is Larry doing?” (with regards to his illness) to “Why did we buy Meebo?” And with that, you can surely expect somebody from the exec team is going to give you a detailed and thorough answer, as if presenting the entire exec meeting to you. What’s more awesome is that the mic is even open for interns, and a lot of us have surely taken advantage of this opportunity. This has created an environment of trust, one that ensures employees of the most honest feedback from management and room for creativity.

This is extremely hard for any business to pull off. The amount of effort it requires the leadership team to be this open is extraordinary. But the effort isn’t unnoticed, as it has built an extremely unique and impressive culture all around the company. Undoubtedly, this, is what I enjoyed most in my time at Google.

(Disclaimer: I’m only speaking about what I’ve seen and heard during my internship, and in no way do I represent any of the companies mentioned here.)

Engineer fun.

“Here’s my algorithm. I check the page three times in an interval, and if I still giggle after the third time, then I’ll buy that shirt.” Laura, one of the engineers on the AdWords Front End team, was describing how she makes decisions on whether to buy a shirt on shirt.woot.com at the dinner table. My first reaction: wow, how much nerdier can everyday actions get?

“Did you have that algorithm tested?” Laughter follows.

Each day just seems to be filled with surprises like this, reminding me that I’m not the only one nerding out. It’s hilarious and somehow, weird, in a really enjoyable kind of way.

And not just that, we all have the weirdest obsessions. Laura and Luisa, my host, are insanely addicted to Triple Town. They’d send me a gift every a couple hours or so, inevitably dragging me into the game. (I swear it’s not my fault.)

Jeremy, another engineer here, is obsessed with a board game called Set. Laura brought it up during a picnic off-site just last week. The objective of the game was to  find a set of 3 cards matching or completely dismatching a set of attributes – pattern, color, number of shapes and texture. Laura and Jeremy went crazy on it. While us interns were still trying to learn the game, slowly trying to pick up the pace of the others, they’d be able to call out sets only moments after new cards are drawn. Heck, Jeremy even wrote his own web app allowing players to play this game online – he was telling us about it while bragging out how he knows random facts like “there are on average 2.7 sets in any 12 cards.”

All this happened with a conversation about how we can use Cobalt-60 to clean off sausages so that we can grill them in space for hotdogs. And how we are going to answer the Homeland Security’s questions when they find out what we’re trying to do: “But… but… but… all I wanted to do is to clean my sausage!”

And all of them, of course, love Star Wars. When they found out that I, along with 3 other interns, have never seen any of the Star Wars movie, they almost fainted. I think they’re now planning a Star Wars night, fully utilizing Google’s giant screens everywhere. Oh that’s going to be fun.

One week in Google: “our lives are good!”

My roommates and I came back home today to find our apartment completely clean. The bi-weekly maids had our beds made, dirty dishes washed, tables and desks completely organized, with fresh towels on bathroom rack. After half an hour of Super Smash Bros on GameCube and two scoops of cookies and cream ice-cream, Dhruv exclaims, “Man, our lives are so good!”

Last Sunday. 2 in the morning. After a 20 hour journey, I’ve returned to Norcal, a place where I seem to be more familiar than any other in the States. This time, however, for a purpose not even close to any other visits before. To put it in cliche (cause there just doesn’t seem to be any other way), I’m stepping in an unfamiliar chapter of life. Some might even say, I’m finally an adult! (Though, others would argue, Peter can never be one.)

Hello, Google!

(more…)

A blink later…

Some day not too long ago, I just arrived in LA and was enjoying my very first meal in LA from Carls Jr. It was a box of 10 chicken strips, and for the me that had just came out of the 3-hour U.S. Customs line at LAX, it was delicious. I was still like a little boy arriving at a new city, awed by almost everything I saw.

Four months later, I am back at the same hotel room. Funny how things worked out, actually. I came with such enthusiasm, and such hope for the new live I’m going to have. But all of them seemed to have died off already.

“The Golden Age Fallacy”: the idea of how we often think about “those good ol’ times…”, when in reality they were not that good as we remembered. Aren’t our minds interesting, that we only remember things that are “good”? But even so, I’d like to refuse to think that they’re all just an illusion. I miss home a little too much, perhaps.