Pulled pork to vegan in four months

August 18th, 2008

Back in February I made pulled pork for our Super Bowl party. It was a defining moment as an omnivore, the culmination of 30+ years of meat eating. Four months later (mid June) I made the switch, cold turkey, to straight up vegan.

I don’t miss meat, I don’t miss eggs, I don’t miss dairy. As long as I go to places that have several tasty, vegan options I’m quite happy. You really can’t go wrong with Thai (which I love) and Lisa and I have been able to find a few really great vegetarian/vegan spots. I’ve been going strong for more than two months now and I’ve never once had an urge or a craving to give in to.

My mom asked me the other day how my “vegan diet” was going. I don’t think she understands that it’s not a diet, it’s a way of life. It’s not just about what you eat, it’s about everything you buy and use. Lisa and I have been going room by room, switching everything we own to vegan. Just today I got my first two pair of vegan shoes: the Simple Shoes ecoS-Hemp and the Sno Tire-Hemp.

Of course, just because I don’t consider it a “vegan diet” doesn’t mean I haven’t lost weight. I’m down almost ten pounds since mid-May, almost 2/3’s of which is body fat.

Eat your own dogfood

July 2nd, 2008

Now we know why Laura is doing so well on the growth charts. - by booleansplitIf you’re developing a web service of any kind, eat your own dogfood. Build something using your web service. In fact, build many things using your web service. Do it early and often before you release your web service to the public. Find out what sucks about your web service, what’s broken and what’s simply downright inconvenient about your web service and then fix it. If you find you want to murder someone while using your own web service, imagine what your consumers will think of it.

All too often I find myself running into web services that are inconvenient to use from a developer standpoint. Often it’s because the people implementing the web service build whatever’s convenient for them. Spend some time building applications using your web service, make a list of the things that were harder than they should have been and then go fix them. Your users will thank you.

Photo by booleansplit

Yahoo! Address Book Web Service released (finally)

June 4th, 2008

When we first released the Yahoo! Mail Web Service, many people asked me if they could get access to the Yahoo! Address Book through it. I’m happy to say that today you can finally access the Yahoo! Address Book via web service.

This has been a really long time coming and I think it’s great that the Yahoo! Mail Web Service finally has the complimentary service it’s been crying out for. Also, it’ll be nice when certain, nameless social networking applications stop asking me for my username and password to import my Yahoo! Address Book.

Customer service starts with the customer

May 9th, 2008

On Thursday I received a very strange phone call on my work line. Caller ID indicated only that the call had been transfered to my desk from elsewhere within the company. In the past, this has almost always been the calling card of recruiters. They find my profile on LinkedIn but don’t have my phone number. They know I work at Yahoo!, however, so they call the receptionist and ask to be transfered to me.

This time was different, however. I answered the phone, “This is Ryan.” Booming from the other end of the line I heard, “RYAN” in a strong southern accent. What followed could only be described as 5 minutes of nonstop railing against Yahoo! Customer Care. This gentleman had lost the password to his Yahoo! Mail account and over the course of the last week felt he was being given the runaround by our support technicians, going as far as to say that they had been “rude and hateful” towards him.

Working on his last nerve, he somehow found out about Yahoo!’s “postmaster Ryan K”. I’m nearly certain he’s referring to Ryan Knight, the “Ryan K” who took over the Yahoo! Mail blog after I hung up my evangelism cape. He managed to find the number for the Yahoo! Sunnyvale office and asked the receptionist to connect him to “Ryan K”. There’s more than one, so I can only guess that the receptionist rolled the dice and transferred him to me. Fortunately, he found a sympathetic ear.

After listening to him throw the customer care group under the bus for 5 straight minutes, we finally got to the part of the phone call where he would let me participate in the conversation. I asked some questions to collect as much information as possible. I tried to explain some of what might have happened during his dealings with customer care. He explained how important his email account was and how frustrating dealing with our customer care group was. He wasn’t happy and he wanted to make sure I was keenly aware of that fact.

After about 10 minutes on the phone with him, however, something happened. He came to know that I understood his frustrations and that I was equally disappointed with the experience he had been going through. In that instant, the phone conversation immediately lightened up. We each cracked a few jokes, shared a couple of laughs, established some common ground. Over the course of the next 5 minutes I collected a little more information and told him that I’d work my backchannels to get him the help he needed. It was the full 180. He started the phone call with spite and venom and he finished the call hopeful that we’d have this situation resolved for him. He was appreciative and, dare I say it, a bit happier.

Whether you’re dealing with 250 users or 250 million users, you can’t service your customers without talking to them. I mean really talking to them, not handling them with a phone in one hand and a script in the other. Talk to them, get to know them, understand why they’re upset and then make it all better.

Activator: Pimp my buddy list

May 1st, 2008

Neal’s Web 2.0 video is up on YDN now. This is his YOS talk and includes a sneak peek of my new project, Activator, at about 30:20 into the video.

True to it’s name, Activator is here to activate your social graph. It’s meant to help out with “cold starting” social networks. Many times when you first arrive at a social network, you have no friends and no clear means of how to find your existing friends. Activator’s charter is to find those people for you and surface them so you can quickly and easily add them. I’m still trying to figure out what’s the best way to write openly about Activator without getting myself into trouble. For now, check out Neal’s video and you’ll see a quick screenshot of what Activator may look like when released.

My new Yahoo! project

April 24th, 2008

Well, I guess now that Ari and Neal have totally totally let the cat out of the bag about YOS, I finally get to talk a little more openly about my new project: Activator. There’s a short paragraph in that article that mentions Activator:

The activator engine handles the combining of different relationship groupings, such as the Yahoo Mail e-mail address book, Yahoo Messenger contacts, Flickr friends, Yahoo 360, and Yahoo Mash, Sample said. Yahoo will be careful to protect user privacy and won’t apply the information without user consent, he added.

That’s not a great description of Activator, kind of leaves you wondering what the hell it actually does. As soon as I figure out how much I can talk about it I’ll post more. In any case, when you hear them talk about Activator you can think of me.

Code coverage != code quality

April 20th, 2008

My current project has a new requirement that in order to be feature complete we must reach 80% code coverage with our unit tests. At first, this seems like a good idea. You want to ensure code quality. Unit tests can help with that. So you figure you’ll come up with a way of measuring how much of your code is being tested. Soon, however, deadlines get tighter and actual features need to be finished. The code coverage is short of the required 80%. So you take the following code:

   if(unreachable) {
      doTheUnreachable();
   }

   int codeCoverageRequired = 80;
   cout < < "Feature complete requires " << codeCoverageRequired << "% code coverage" << endl;

This code has 4 executable lines of code, only 3 of which are being executed. You're only at 75% code coverage. So you make the following change:

   if(unreachable) {
      doTheUnreachable();
   }

   int codeCoverageRequired = 80;
   cout < < "Feature complete requires ";
   cout << codeCoverageRequired;
   cout << " % code coverage";
   cout << endl;

This code has 7 lines of executable code, 6 of which are being executed. Now you're at 86% code coverage. You've boosted your code coverage numbers by 10% simply by adjusting some lines of code. The quality is no better, but your code coverage is higher.

You can also play games by under-reporting the total lines of code in your project. As it turns out, this is easier than you might think. The code coverage tool we're using (gcov) appears to have an issue with not reporting the lines of code in files that don't get tested at all.

By gaming the system you're able to give management the warm, fuzzy feeling that the code quality is high when, in truth, the opposite may true. Even a high code coverage number without gaming the system doesn't necessarily mean that the code quality is high. Take the following, for example:

   size_t function( void *ptr, size_t size, size_t nmemb, void *stream) {
      ((string*)stream).append(ptr, size * nmemb);
      return size * nmemb;
   }

   string requestUrl(string url) {
      static string buffer;

      CURL* ch = curl_easy_init();
      curl_easy_setopt(ch, CURLOPT_URL, "http://unclehulka.com/ryan/blog/");
      curl_easy_setopt(ch, CURLOPT_WRITEDATA, &buffer);
      curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writehandle);
      curl_easy_perform(ch);
      curl_easy_cleanup(ch);

      return buffer;
   }

If you call requestUrl() from your unit test, you’ll end up with 100% code coverage, however this code is as buggy as it gets (see the ’static string’ declaration).

The lesson is if you want to ensure code quality, use something that actually measures code quality.

Krav Maga – Day 7

March 27th, 2008

Yeah, okay…totally lagging in posting this. Day 7 was this past Saturday (3/23). We started out slow with our warmups. Running around, touching shoulders, dropping and doing pushups and situps. We eventually partnered up. I joined up with a well-tattooed guy about my height but, perhaps, a little bigger than me. We did a bunch of 1-2 punching combinations with the heavy pads. The best part about my partner is that he barked. Not literally, but the noise he made as he exhaled with every punch sounded just like a dog. At one point, Lisa looked around wondering who let the dog in the gym. Then she realized the dog was beating the living hell out of my blocking pad.

We eventually got back to knees. This time I partnered up with another Ryan. The name was the only thing we had in common, he was a head taller than me and much, much stronger. When we did knees he was either throwing me 3 feet backwards or 1 foot in the air. That being said, it was more enjoyable than the last guy who did a number on my jaw. We focused a lot on the knees that involve a hold. In the first, you grab your partner by the tricep and shoulder and then ram your knee into them. In the second, you lock your hands behind their neck, pull them in towards you and throw your knee into their face/chin/chest.

The conditioning is getting a little better. I’ve been doing some conditioning on the side. Using a deck of cards, I turn cards face up one-by-one. Every red card is pushups, every black card is squats. Aces and number cards are 1-9, face cards are 10 and jokers are wild…20 pushups or squats. This past Monday I got through 30 cards in 30 minutes, finishing 95 pushups and 120 squats. Doesn’t sound like a lot for 30 minutes, but it’ll get your attention. I can’t take credit for this hellish workout. Credit for that goes to Matt Furey’s book, Combat Conditioning.

Speaking of books, our school carries Complete Krav Maga, which features pictures of one of my instructors (Kirian). I’m going to pick up a copy soonish.

Krav Maga – Day 6

March 19th, 2008

I skipped Krav Maga on Saturday last week (trying to give my thumbs more time to heal up) so this past Monday was day 6. I’m a little behind in posting this, so hopefully I remember everything.

As usual, Jesse worked us over pretty good from the start. I have to say, my conditioning is improving. I still get tired and it’s still difficult to keep my hands up through long drills. But it’s getting easier. I’m no longer doubled over gasping for air during drills. That’s really the strongest measure of what three weeks of classes has done for me. Technique is great and all, but I need to get back in shape.

We did a lot of punching and kicking combinations as a warm up. Eventually, Jesse turned us loose doing hammer punches. Imagine you’re hanging a picture on the wall and you’re putting up the nail. Clench your fist like you’re holding a hammer and hammer the nail into the wall. Now take the hammer out of your hand and replace the wall with your partner, holding the heavy bag. Generate power from the legs and twist the trunk, transferring power to the shoulders and drive the bottom of your fist into the bag as hard as possible. When done right, your partner will wonder if you’re about to stop their heart with these blows (I was getting concerned when my partner was wailing on me). We started out with just the right and progressed to left-right combinations. Periodically Jesse would signal for us to go “all out”, hammering with the left and the right in rapid succession, as hard and as fast as we could. It’s a pretty devastating blow. Imagine leading with a kick or knee to the groin to double your opponent over and then driving a hammer fist into the back of their neck. Yeah, brutal.

We also did some work on getting out of side headlocks. Imagine someone comes up to you from the side and wraps their arm around your head and neck from the side. They pull you to one side, knocking you off balance and torquing your neck in the process. The counter is to go with it. If the attacker comes from your left and pulls you that direction, pivot on the ball of your left foot, swinging the right foot in the direction the attacker is pulling you. When your right foot lands, you should be perpendicular to your opponent and as close to them as possible. The free right hand swings downwards and then up, into their groin. Strike at least once, preferably two or three times. As this is happening, the left hand goes up, eventually coming between your head and your opponent’s head. With the left hand, you smash the bridge of the nose with your palm and grab the chin with your fingers. Pull back, causing the head to tilt backwards. At this point, your opponent is wide open for a range of different attacks. Punch the face or throat. Better yet, bust out that powerful hammer punch you just learned.

It’s great fun. I was paired up with Nate, a level 2 student that I’ve worked with before. He’s big and not afraid to smack me around a bit (other people seem to think you’re made of glass at times) and he’s really good at telling me everything I’m doing wrong. After a few minutes I was getting the hang of it, but then class was over (pitty).

My thumbs are still pretty torn up, but are getting better. I managed to get out of this class without any new injuries, although one of my partners managed to poke me in the eye pretty well during one of the drills. No biggie, I made sure to put a little extra mustard on the hammer punches to return the favor. ;)

In other Krav Maga news, we were given handbooks by the school. Among other things, it details what we’ll learn at each level. Let’s just say that the first item on the list for the green belt curriculum (level 3) is head-butting. Just 10 months to go.

Krav Maga – Day 5

March 10th, 2008

Before you ask…yes, I plan to blog every day of Krav Maga.

After the class on Saturday, I was looking forward to a slightly more tame Monday class. Jesse, the Monday instructor (and Saturday assistant), usually spends more of his class going over technique. That means things slow down a bit giving you more time to catch your breath. Today however…he had some surprises for us.

Things started out pretty normal. Some running (with ~16 people in a crowded room, running becomes interesting) along with pushups and mountain climbers to get the blood moving. After that we partnered up. I was teamed up with the 14 year old in the room, not his lucky day. If he was lucky he weighted around 130 pounds…roughly 100 pounds less than me. We started out with one person on all fours. They then piked up so they were on their hands and toes with their butt up in the air. The other partner then military crawled underneath them to the other side. One there, the partner on the ground dropped low, allowing the other partner to jump over them back to the starting position. The person on the ground goes back into the piked position and we start over. At one point, the instructor blew his whistle and we went either all under (back and forth) or all over (back and forth). It was insane, I’ve got the carpet burns on my knees to prove it.

When that was over, one partner again got on all fours. The other partner then sits on their shoulders, hooking their feet around the other partner’s knees on the ground. The partner on top leans back and sits back up…kind of like doing a situp. This is where the weight discrepancy came into play. I started on top, leaned back and the kid’s arms buckled and I flattened him like a pancake. Fortunately I caught myself with my arms and managed not to pop his skull. Not wanting a lawsuit, they found me a larger partner.

When that was done we went back to punching and kicking drills, this time moving around the classroom to get used to throwing punches while on the move. Usually we stand in one place and throw them, so this was a nice change of pace. These punching and kicking drills still kill me. My arms get tired and it becomes difficult to keep the hands up, which is essential in any combative confrontation (protect your head at all costs).

We wrapped up with more choking. I pitty the fool who tries to choke me from the front. He’s in for a rude surprise, roshambo style.

I feel like my conditioning is improving. I won’t say it’s good, because it’s not. I’m still the fat guy huffing and puffing (sometimes wheezing) with his hands on his knees. But I’m huffing and puffing a little less and I’m going on three weeks without missing a day. I dare say I’ve even dropped a little bit of fat over the past week, according to the scale anyway.