Tuesday, February 28, 2012

Google Alumni Panel

Today I went to my first public speaking event of the year. I was a panelist at the Google Alumni Networking Night. It was a very low-key event, no preparation, just needed to answer some questions while sitting on a high stool in front of the audience. But I was still nervous. Not when I was speaking, but when the other panelists spoke, because I had no idea where to look! I tried looking at the audience, but that felt awkward, since nobody looked back. I decided to look at the speaker as well, and that seemed fine.

As usual I needed to get a ride home, so on our way back I told my new friends about my nervousness. They said, "Don't worry, no one was looking at you! We were all looking at the speaker." So true. Next time when I am on a panel, I'll look at the speaker too.

My (somewhat arbitrary) goal of the year was 5 lightning talks and 3 full-length lectures. Panels were not included, but I'm going to chalk it up as a lightning talk. When I set up the goal I thought it would be easier to sign up for lightning talks, because they tend to be more causal. As of now I have 4 full-length lectures lined up, but no lightning talks yet. We'll see how it goes as the year progresses.

Monday, February 27, 2012

iOS programming first impressions

I learned iOS programming for the BeMyApp Hackathon, and finally got a chance to experience Objective-C first hand. With just two days I only managed to learn one particular way to do a task, so some clumsiness are mine. Nonetheless I'd like to jot down my first impressions.

Square brackets

Before the hackathon, the only thing I knew about Objective-C was that there are a lot of square brackets. That's the syntax for passing messages. I didn't have time to learn the difference between function calls and message passing, and I need to look into that. But otherwise I don't really see why people make such a big fuss out of it. Yes, it's clumsy. But conceptually it doesn't seem too complex. For me, I keep forgetting how to define a function with parameters, so I had to refer to the existing functions. But I'm sure I'll get used to the syntax in no time.

Specifying UI components

When I picked up Android, the visual UI design tool was still in its infancy, and not very usable. As a result I always specify my UI via XML. In iOS, however, I had to use the visual tool. There is a list of UI components on the side bar, and I drag and drop them onto the screen designer. I like that there are helper lines to match up elements horizontally and vertically. But then I had to add 5 buttons, and I wanted to space them evenly. That was no obvious way to do it. I went into the source, but everything has absolute co-ordinates, unlike Android, where I can specify the relative positions and use margin to space them out. Since it was just for the demo, I placed the buttons roughly where they should be, and moved on.

Linking UI components with code

Next I needed to hook up the buttons so they do something when you click on them. The basic idea is the same in iOS and Android: you define a click handler, and link the button to it. In Android, you can do the linking in two ways: specify the onClick function in XML by name or assign an ID to your button in XML, and do the association in Java code.

In iOS I only learned one way:

  1. Define a function in the ViewController class with the signature (IBAction)foo:(id)sender;
  2. Open the graphic editor for the xib file.
  3. Right-click and drag the button to the icon of the ViewController.
  4. All the IBAction functions will be displayed. Choose the one you want.

I'm not familiar with the right-click and drag gesture, so this feels a bit clumsy. But it's not a big deal.

Project files

The biggest pain point is actually the project files. Like any sensible team we use source control to share code. But it wasn't clear which project files need to be checked in. And when we add a new class the project files change in some opaque way. I spent so much time helping team members deal with git merges that it was getting a bit tedious.

Device deployment

This is even more tedious than git merges. We have to collect UUIDs from all the devices of our team members, create a list, embed that in the build, etc etc. Android is much simpler - just distribute the apk file. The flip side is that you cannot control who gets to install your Android beta binary, so each platform has its own annoyance.


A lot of people complain that iOS programming is really difficult. So far I don't feel that way. If you have only done Ruby on Rails or javascript, it can take a while to get used to memory management. Things are a bit more verbose, the UI is specified in a quirky way, but nothing too bad. Maybe I'll start screaming once I get really deep into it, but so far so good :)

BeMyApp Hackathon

Once again I'm participating in a hackathon. This time it's BeMyApp Mobile App Olympics. I have always wanted to build something with server push technology, so I thought it will be great to do it at a hackathon.


I signed up as a Developer without thinking, since that's who I am. But when I arrived on Friday night, I was told that I could not work on my idea, because I did not sign up as an Idea Generator. I was so disappointed that I told myself I would just go home after listening to the other pitches.

Around 30 people came up and pitched their app idea. Afterwards, the Developers and Designers vote for their favorites by giving the Idea Generator their poker chips. The top 5 ideas would be developed during the hackathon.

One of the finalists was my friend Judy, who proposed a music learning app for the iPad. I actually liked the idea quite a bit, so I asked Judy if I could join her team, even if I had no iOS programming experience. She enthusiastically said, "Of course!"


We came back Saturday morning, ready to build our app. First thing first: name and logo. The working name was PlayPitch, and we liked it. "P" is a nice letter since we could make it look like a note.

We also came up with a mascot: the lion conductor. He was christened "Gustav Mauler".

There were quite a few developers, and we quickly divided into sub-teams: Elvin and I on the frontend music sheet rendering, Peterson and Bosco on the backend pitch detection. Peterson has written an iOS app before, but the rest of us never wrote any iOS code. We all learned it on the job, and were making rapid progress.

By the end of Saturday night we had basic pitch detection going, and the UI reacted to good and bad notes as mocked with buttons.

We gave a quick demo to show everyone our progress:


Sunday morning we linked up the pitch detection with notes rendering, and it was beautiful. We continued to refine the pitch detection, improve the UI, and work on the final presentation.

By 5pm we had a very nice demo going:

Final presentation started at 7pm. We gave a live demo with the pan flute and the keyboard, and the audience loved it.

One of the judges, Ben Parr, got so excited that he came up to try the keyboard.

The technology is super cool, but we also have an awesome business model to go with it. BeMyApp paired each team up with a mentor, and ours, Ivan Dwyer, works with Alfred Music Publishing to bring sheet music to the iPad. They already have an app that displays sheet music as PDF, and would be the perfect partner for PlayPitch.

PlayPitch would be a freemium app. The base app is free, with a few free songs. Users can buy more music with in-app purchase. Sounds familiar? Monkey Write is freemium as well. In fact there are a lot of parallels between PlayPitch and Monkey Write:

PlayPitch Monkey Write
Teaches music reading Teaches Chinese writing
Grades you on each note Grades you on each stroke
Wrong note makes lion unhappy Wrong stroke makes monkey unhappy
Revenue by song purchase Revenue by workbook purchase

After all four teams presented, the judges deliberated for a long while, and finally announced the winner. And... we won! We would be competing against winners from BeMyApp Dallas, New York, Berlin, London and Paris. Please vote for us!

Vote for PlayPitch

Tuesday, February 21, 2012

Webcam for mobile app demos

Demoing an mobile app to a large audience is always a challenge. Most venues don't have a device projector set up, so you are left with static screenshots or canned videos. You can pass the device around after the presentation, but people may or may not end up checking out the coolest features of your app.

After going to a few hackathons, I thought it would be nice to have a portable webcam mount. That way I can show the live video feed on my screen, hook up my laptop to a projector, and do my demos that way. I shared the idea with my husband, who nonchalantly said, "Sure, we can make that".

As luck would have it, my husband works at a video-conferencing startup, so he has tested a lot of webcams. He recommended the Logitech B910, which takes very nice HD video. This webcam also happens to have a folding clip, making it perfect to hang over a ruler.

We went to OSH to get the materials: a thin piece of metal, a metal rod as the stand, and a few wing screws for securing the parts.

We also needed a clipboard as the base, which we procured at Office Max. The great thing about the clipboard is that I can just place my tablet on top, and the weight of the tablet will balance the stand and the webcam.

Next he went to work in his workshop in the garage. He attached a scrap piece of plastic to the metal strip, drilled a hole to hold the metal rod, and made a base for mounting on the clipboard.

Meanwhile I looked into the software for capturing the live video feed from the webcam. Photo Booth almost worked straight out of the box, except one very annoying detail - the image is flipped! I spent hours and hours pouring over the internet looking for a way to unflip the image. I tried editing the Effect.qtz file to no effect. I searched for alternative software, but did not find any that has a large preview with an acceptable frame rate. There was so much cursing that I decided I needed to take a break.

Tonight I searched some more, and finally found the solution: put Flip.qtz in Library/Compositions. I opened Photo Booth, chose the Flip effect, and finally, a straight pass-through preview from my camera!

With that, I hooked up the projector and tried the whole setup.

Laptop and mount connected to the projector

Projected screen

Pretending to demo

Here is a closer view of the mount:

The best part is that I can take it apart, so it's super easy to carry around. I'm definitely taking this to my next hackathon!

Thursday, February 16, 2012

Public speaking update

My new year resolution for 2012 is to be a public speaker. Things are going really well - no actual speaking has happened yet, but four of my proposals are already accepted!

My first acceptance was from AnDevCon:

I wanted to speak at this conference because Android is my bread-and-butter, and it is local in Burlingame, so no need to worry about travel costs. My acceptance email indicated that they will pay me a travel stipend. Travel stipend? Hey, that means even if the conference is not local, I will still be able to attend!

As a result I started writing proposals to conferences everywhere. There is a few months lag between proposal and acceptance, so it is a bit like growing tulips - you put the bulb in the ground, forget about it, and one fine spring morning you are pleasantly surprised by the little bit of green that sprouted off the soil.

This is my conference sprouting week. Around 10 days ago Corey Leigh Latislaw posted a message to Systers asking for proposals for Philly ETE, and I jumped right on. There was no formal acceptance date, but we finalized the talk description in the past few days:

As I was arranging the travel details for Philly ETE, I got an email from WindyCityGo saying that they've accepted my proposal!

WindyCityGo is in Chicago, just a few days before Philly ETE, so it would be silly to fly all the way back to San Francisco between the two conferences. I asked the folks at Philly ETE if they can route me through Chicago, and they graciously agreed.

Just as I was getting all excited about flying to Chicago and Philadelphia as a speaker, I got an email from DMC yesterday morning, acceptance again! And you know what "D" in "DMC" stands for? Dutch! I couldn't believe that they were going to fly me to Amsterdam, so I doubled check with the organizer. They assured me that they have screened all the speakers in the selection process, so they know where we live.

Burlingame, Chicago, Philadelphia, Amsterdam! This is so very very exciting. There is one minor detail - now I actually have to write all these talks. Plus get on stage and present. But I think I'll manage :-)

Tuesday, February 14, 2012

Women 2.0 PITCH Conference 2012

Today I attended the Women 2.0 PITCH event. Even before I arrived I knew the event was popular, for the traffic at the 101 Shoreline exit was horrendous!

Shaherose opened with introductory remarks on the history of Women 2.0, the purpose of PITCH, and how the day would go. Then we went into the first keynote speech by Caterina Fake.

Caterina shared with us her thoughts on keeping technology humane, how we need to preserve and treasure individuality. One thing that really struck a chord with me a quote from the Amish:

"Is this technology pulling us together or driving us apart?" That's what the Amish ask when they decide if they should adopt a particular technology, and we should be constantly reminding ourselves of the purpose of technology as well.

Next keynote was by Robin Chase, founder of Zipcar and buzzcar. She told a really compelling story of building Zipcar, how they went with the absolute minimum product, and then less. I really liked the early key hand-off technology - the car key was hidden under a pillow in her back porch!

The main event of the day was the pitches, and there were nine of them. My favorites were by Prosperity and Tiny Review.

LeAnne from Prosperity was full of energy. I really enjoyed her presentation. Some say that her coaching approach is not scalable, but if she can develop common course material for all her couches and set a high hiring bar, it should be possible to train a fleet of coaches.

Melissa from Tiny Review really honed her speech. I did not even realize she was not looking at her screen until one of the judges pointed it out. Impressive! But what made her presentation so powerful was the stories. She did a really good job picking examples to really showcase the strengths of her app.

There were quite a few sessions in the afternoon. I, however, regretted that I went to all of them. Don't get me wrong, they were all excellent. But I go to conferences to meet cool people, and sitting in back-to-back sessions was not the best way to engage with other conference attendees. In other conferences, after I was inspired by a particular speaker, I usually walk up to the stage and have a quick chat after the talk. This time, however, they quickly retired to backstage. So I was disappointed that I did not get to talk to the speakers, and I did not talk to as many fellow attendees as I'd like.

This reminds me of what my mother used to say to my brother when he was a kid, "just because there is food on the table does not mean you have to eat it." Just because there are sessions on the program does not mean I have to sit in them! Next time I will make a point to leave some time for mingling with others.

As I talked out of the auditorium, I was greeted by rows of napkins:

One of them looks really familiar:

Yup, that's my application napkin, back when I just figured out the grading algorithm, before I found my graphic designer. It seemed so long ago!

Saturday, February 11, 2012

Monkey Write at SF Chinese New Year celebrations

8 days ago, on February 3, AT&T emailed me and asked me if I would be interested in demoing Monkey Write at the Chinese Lunar New Year Festival in San Francisco this weekend. I said yes immediately since it was such a great venue to showcase the app.

There was only one slight problem - my app wasn't ready for the public at that point. But I was very very close, so I set to work, staying up until the wee hours to get it done. I finished on Thursday, with two days of breathing room to test workbook downloading from Android Market. As they say, there is nothing like a tight deadline to increase your productivity!

This morning I work up early to drive up to SF Chinatown, since they wanted to do a video shoot at the event, and that would be difficult when the street got jammed with people. I met up with Jeremy, the videographer/sound technician/director/producer for the video. We first did a few sequences of me demoing the app, and then changed to interview format so I could describe my experience at the AT&T hackathon, where the app got started.

See what I was wearing? When I mentioned that I would be demoing at SF Chinatown, one of my friends suggested that I made some T-shirts to wear. With a cute monkey like that, it took me no time to decide it was a good idea. I will be attending quite a few events in the coming weeks, and I bet the T-shirt will make a great conversation starter.

In preparation for the event, I mentioned to AT&T that I planned to make some fliers with the name of my app, for people to take home and download it at their leisure. Turns out everything distributed from the AT&T booth had to be approved, so it would be hard for me to hand out fliers. No fliers then, I thought, not a big deal. But then they gave me a really nice surprise: AT&T was handing out orange envelopes anyway, and they added Monkey Write to the note inside!

They were literally giving out thousands of these orange envelopes!

Here is a closeup of the note. Look, Monkey Write and Angry Birds are mentioned in the same sentence!

After the interview, I set up a few demo phones and tablets with Monkey Write. At 10:30am the booth was ready for the public, and I started to show Monkey Write to people. Most of them were actually Chinese, so I ended up speaking Cantonese 80% of the time. And most of them already knew how to write Chinese, which made the demo a little bit awkward:

"This is a game where you can learn to write Chinese. Try it." I said in Cantonese.
[Chinese lady quickly completes all the characters]
"Is that it? Where do I get my prize?" she asked, also in Cantonese.

Fortunately a few Chinese children were also checking out the devices at the booth, and they started playing with the app. Some of them go to Chinese school on Sundays, so the Introduction workbook was too easy. When that happened, I opened the Numbers workbook, and asked them to write character for ten-thousand, stroke numbers off, and off they go, trying to get the perfect score. It was actually quite a lot of fun watching them enjoying the app. Too bad I was too busy demoing, and didn't take any photos of the kids. But Jeremy the videographer captured it all on video, and I am really looking forward to the final cut!

Thursday, February 9, 2012

Monkey Write launched!

Monkey Write is now on Android Market!

It all started at the AT&T Mobile Hackathon. I walked in as a hackathon newbie, and walked out with an awesome tablet, a stack of gift cards, an XBox 360 with Kinect, and a business idea! I have been working on Monkey Write full-time since then, and it has been tons of fun.

There were so many milestones: segment the character data, figure out how to grade strokes, work with a graphic designer, bring it in front of users for feedback, iterate, iterate, iterate.

I am very proud of Monkey Write, but this is just the beginning. I have gathered a lot of great feature ideas during user studies, so keep an eye on the updates! You can subscribe to the newsletter, or follow @monkeywrite on Twitter.

Here is a short url to get Monkey Write from Android Market: http://bit.ly/mowran

Download it, show it to your friends, write a review. Thank you for your support!