Tuesday, December 28, 2010

Google Shared Spaces: How We Made It

In my last post, I talked about why we made Google Shared Spaces. Now I want to talk about how we made it, as I think it may surprise a few folks. Much of the press about Shared Spaces claims that it is built off "Wave technology", when in fact, the only piece of Wave technology that Shared Spaces utilizes is the Javascript Wave Gadgets API. Since what we set out to make was really pretty simple, we decided to start from scratch and use a combination of open-source frameworks and publicly available APIs.

We use Python App Engine as the hosting platform, and Django 1.0 for the templates & request handling. We embed the gadgets in the pages using the iGoogle Gadget Renderer (a deployed version of the open-source Shindig server), the gadgets communicate with the page using the Wave Gadgets JavaScript API (now open-sourced), and the page communicates with the server using the Channel API (App Engine's approach to COMET). For AJAX processing and UI features, We use the Google-hosted jQuery. For authentication, we use the Twitter API, Yahoo API, and Google Buzz API. For the comments and ratings in the gadgets gallery, we use Disqus threads.

By starting from scratch while reusing the relevant technologies out there, we were able to build the first version pretty quickly (within a few weeks), and we're also able to iterate quickly now (new releases every couple days). While the open-sourced codebase for Wave is around 250,000 lines of code, the codebase for Shared Spaces is now about 5,000. Wave is a complex technology encompassing multiple algorithms, backends, and interfaces, while Shared Spaces is a user-facing app that uses just one small part of that technology and is developed by a small team. If you pick the right tools for the right job, you can do a lot with a little. :)

Google Shared Spaces: Why We Made It

Last week, just in time for the holidays, we released a Google Labs project called Google Shared Spaces. "We" is actually just a few people working in our 20% time: Douwe Osinga - former Wave API tech lead, Jon Tirsen - former Wave contacts tech lead, Vadim Gerasimov - former Gadgets API engineer, and myself - former Wave API developer advocate. As you can see, we all came from the Wave team, where we saw firsthand the ways that users used Wave and the ways that developers used the Wave APIs. Wave was a lot of things to many people, and there are a lot of directions that you could take the ideas in it. After Wave was cancelled by Google, a small team has been working on open-sourcing it for the past 5 months, so developers can start building off the Wave technology stack, as a whole or as bits & pieces, to take it in the direction of their vision.

The four of us were personally interested in seeing what we could make with just the gadgets part of the stack. The Wave Gadgets API is a simple but powerful API -- it combines the open-source gadgets API with a basic JavaScript API for modifying a shared state (hash map) & retrieving participants information. With just a shared hash map, developers were able to make an astonishing array of gadgets - multi-player games, collaborative diagramming apps, date-picking utilities, even a Flash-like animation tool. In fact, developers made gadgets that were basically full-featured webapps, and they would take up the entirety of the Wave interface when you were using them. Developers weren't using Wave for its conversational abilities at that point -- they were just using it for the collaborative space that it enabled. Some of the developers even added a chat feature to their gadget, as users didn't want to have to scroll down past the gadget to converse with the other participants.

The Diagram Editor gadget:

When we saw this happening while Wave was still an ongoing project, we thought of various ways we could improve the Wave UI for these app experiences: full-screen modes, split scrollbars, chat mode. But with Wave cancelled, we thought about how we could start from scratch to create an experience that centered around these collaborative gadgets. At the same time, we wanted to experiment with other aspects of the Wave experience, like the sharing & permissions model. And thus, Shared Spaces was born.

Shared Spaces is entirely centered on the gadgets. The landing page is a list of featured gadgets, and each of them offers a button to "Create a space". Once you click that, you're prompted to login with either your Google, Yahoo!, or Twitter account. (We didn't see any reason to limit authentication to just Google, particularly since people might want to use Shared Spaces to collaborative with communities outside their Google sphere). You're then taken to a "space" with a list of participants (just you, to start), the selected gadget, a chat area, and a bunch of share buttons. Once you share the URL with other folks, whether via email, IM, or microblogging, you'll see the other participants show up in the list, and all of you can collaborate on the gadget together - whether that's a game of Sudoku, an RSVP gadget, or a drawing board. Much of the experience is similar to the Etherpad experience, where you can create a collaborative pad with one click, chat on the side, and share that pad by URL; I sometimes think of it as "Etherpad for gadgets."

The Yes/No/Maybe gadget:

We've launched Shared Spaces with what we deemed the minimal features necessary because this is very much an experiment; we want to see how users use this, what they want out of it, and what direction it may go in. Perhaps it will become a full product, or perhaps it will be integrated into existing Google products. And hey, maybe it will inspire non-Google companies to use similar technology in their products. The web is increasingly about collaboration, and I think it is always a good thing to experiment in how all of us can make collaboration easier. :)

Sunday, December 26, 2010

The Costa Rica Surf Camp Experience

I was born in California, but after an unfortunate decision from my dad, I ended up growing up in the cold confines of Syracuse, New York. I huddled for warmth in the glow of our many computers and eventually became a computer geek like my dad, but I often wondered what I would have become had I grown up in southern California instead -- and because it just looks so awesome in the movies, I always imagined myself as a surfer chick. I'm pretty happy as a computer geek these days, but I like to keep my options open, so I figured I should eventually take the first step to surfer chickdom: learning to surf.

Even though I've lived in California multiple times in my life, and lived in the surf kingdom of Sydney for the last two years, I somehow have never managed to get my ass on a surfboard. At one point, I figured it was just one of those things that I swore I'd always try and never actually do. (You gotta have a few of those). But in November, I serendipitously discovered that my colleague had the same wish -- and the same amount of vacation days -- and within a matter of weeks, we had arranged a weeklong trip to the Green Iguana Surf Camp in Costa Rica. We were deciding between Mexico, Australia, and Costa Rica, but eventually picked the latter because a friend recommended it, and because I've been to Costa Rica twice before & have something of a massive crush on that country. (Plus, I miss speaking Spanish - it's a beautiful language and there aren't many opportunities to practice it in Sydney).

We arrived in the surf camp in Costa Rica on December 12 and left on December 20th, and we had an amazing time in that week. We of course spent several hours each day learning to surf -- practicing the basics of the "pop-and-hop" -- and washing off in the local waterfalls after (they're as common as pubs are in Sydney). But we also spent a lot of time just enjoying the local culture, like:

  • The food: We'd usually start our meals with an appetizer of "patacones" (triple fried smashed plaintains) & guacomole, then continue on with a "casado" (rice, beans, and a protein) or a full fried red snapper. After surfing, we'd visit a street stand & pick up a ceviche -- raw fish that cooks itself from the acids in a cup of lemon juice. On "Tuna Tuesday" at the local pub, we had seared tuna in wasabi sauce, and it was the most delicious tuna that I've ever tasted - it melted in my mouth. Apparently Tuesday was the day they received the fresh tuna, and they wanted to sell it while it was fresh. It sure was! For snacks throughout the day, we'd walk up to our favorite fruit shop and have them cut up a pineapple (with sprinkled salt on it!) or a mango.

  • The wildlife: We saw lizards everywhere we went, including the largish "Ctenosaurs" which enjoy sunning themselves on hotel & restaurant roofs (and have an awesome dinosaur-sounding name). We also visited the local reptile park, Reptilandia, and wandered around it drinking Rum & Cokes from a can & marveling in a rather tipsy way at the rather large reptiles ("OMG ANACONDA!"). Thankfully, we didn't actually see much sealife during the surfing lessons, besides the crabs scuttling to-and-from all the holes in the beach. I was happy to imagine that I was surfing in a scary-animal-free zone. :) During one visit to a fruit stand, we found ourself feeding all our banana to a very adorable but aggressive Pizote (he showed us both his claws & his puppy dog face). On our last day there, we went horseback riding on a beach, and listened to the local birds calling in the trees (there's one that makes a sound like laughter, and it basically sounded like he was laughing at us the whole time.. as if I wasn't already lacking in confidence).

  • The nightlife: I was surprised to discover that our little town of Playa Dominical actually had a pretty thriving nightlife. Our first outing was to a Karaoke night, where the locals sang love ballad after love ballad (I say "love", but in fact most of the lyrics of the songs were much more about jealousy and rage), and we sang American classics, like "Total Eclipse of the Heart" and "I want to hold your hand". Our next outing was "Ladies Night," and the club was absolutely packed. The DJ, who we'd happened to befriend on our first day, played a mix of reggae, hiphop, house, reggaeton, and salsa. I loved dancing to that blend of genres, and I even had fun when a local led me in a salsa dance (I don't usually do partner dancing). We went out a few more times after that, and it was always a really fun atmosphere.
  • And most importantly...

  • The people: Before we embarked on this experience, we thought it would mostly just be us two, and that we'd do a lot of solitary reflection and all that deep stuff. But pretty much as soon as we arrived there, we met the crew that would occupy our days going forwards: our fellow surf campers - about 7 people our age and a family with highly entertaining 8-yr-old & 3 yr-old-boys, our surf instructors - 6 guys from ages 15 to 55, plus the family that runs the camp. We had a lot of fun learning to surf & experiencing the local culture with that crew, but in addition to them, we also met many friendly locals -- like the boy that cut up our fruit every day or the taxi driver that snacked with us after our horseback ride.

In short, I loved every minute of the surf camp experience, even the ones where I was battling the saltwater in my eyes & trying desperately to catch a wave, and I'm so thankful to the people of Playa Dominical that made it a warm & welcoming place.

And, oh, yeah, I found out that I'm not that great of a surfer. Back to geeking I go! :)

Sunday, December 5, 2010

Reuseable HTML & CSS Teaching Materials

When I decided to bring GDI to Australia and kickstart it with an HTML & CSS mini-course, I had a side goal: create reusable teaching materials. There are a huge number of online resources to help you learn web development, but there are few bundled sets of resources that can be used together to actually teach a topic to a class of students. (Or, atleast, few that I could find). I set out to make materials that I could CC-license and share with potential teachers, so that they could focus on customizing and delivering the materials instead of preparing them from scratch (which takes a surprising amount of time).

Since delivering the materials a few months back, I have cleaned them up and theyre now online here, at a nice friendly URL:
http://www.teaching-materials.org/htmlcss/

To see what's there, you can click through the various lesson links. To actually get started re-using the material yourself, you can download the linked zip file, or if you want an easy way to host it online for your class, you can even download the website files from github and deploy them to App Engine or your own server.

If you do end up delivering the course (or some version of it), I would love to hear about it. We need more HTML & CSS teaching in the world!

Friday, November 26, 2010

DIY: Bleaching Dark Brown Hair

As many people know, I am a fan of coloring my hair. It's a form of self expression and all that good stuff. Since my hair is naturally a thick dark brown (shh, don't tell my colleagues, they think I have no natural hair color), I have to bleach it before dying it most colors (except black). I like to DIY things, so here is how I bleach my own hair.

First, when it comes to bleaching, I do not use one of those kits with pretty people on the front. The kits are handy because they come with all the supplies you need and very specific instructions, but I find that they are not very strong - even the ones that purport to be the strongest.

Instead, I start with bleach powder and 40 volume creme developer. The "volume" refers to the strength of the developer, and "40 volume" is the strongest that you'll find. I currently use L'Oreal's Creme Developer and Quick Blue Powder Bleach. At the suggestion of a local hairdresser, I also mix in a packet of L'Oreal Super Blue Creme Oil Lightener.

I then put on cheap latex gloves and mix 1 part powder with 2 parts developer in a tupperware container (which I only use for bleaching!). If you don't mix enough, no worries, you can easily mix more later.

Then I rub the mix over my hair, starting at the ends. Instructions always have you do the roots last, and as it turns out, that's because the chemicals process faster when they're close to the head, because your head is so warm and heats them up.

When I think that I've got everything covered (don't forget the back of your head!), I cover my head in a piece of aluminum foil and watch TV for 30-60 minutes. I'm used to the slight burning sensation of bleach so I tend to let it stay on for longer, but if it bothers you, you can rinse it out after just 30 minutes.

After I rinse and dry it, I check out how white it became, and if I missed any spots. If I do find spots that are quite brown, then I may wait for it to dry and re-bleach.

If there are no brown spots but it is still a bit yellow and I am trying to dye it blue or go for the blonde/white look, then I wait for it to dry and then put a purple toner on it. A purple toner is basically a light purple hair dye that counters the natural yellow hues in human hair. I currently use Wella Color Charm Liquid Hair Toner.


If I care about maintaining the whiteness of the color, then I sometimes invest in toning shampoo, which is basically like shampoo with a little purple hair dye in it. I currently use Clairol Shimmer Lights.

I also occasionally use an ultra moisturizing conditioner, whenever my hair starts to feel particularly dry and over processed. My current favorite is L'Oreal Mega Moisture.


And that's it... happy bleaching!

Tuesday, November 9, 2010

GirlDevelopIt Sydney: Round 1, A Success!

As I posted in August, GirlDevelopIt is an initiative to increase the number of women in tech through low-cost programming workshops. It was created in New York and is thriving there (on their 27th class now!), and I wanted to try bringing it here to Sydney, Australia.


Our tireless TAs
We started here with the basics, a 5-lesson course on HTML & CSS, with the hope of expanding to more topics if there was enough interest. We ended up filling the room with 40 eager female students from varied backgrounds - like marketing, travel, advertising, and photography - plus 6 super talented teaching assistants of various expertise - like SEO, startups, and standards. At the end of the course, students put together their own personal website to show what they'd learnt, and it was awesome seeing the unique webpages that each of them put together.

All in all, I would call this experiment a success, and I'm excited to see the momentum continue. We have an upcoming lecture with 30 RSVPs, we have a new offer of sponsorship (thanks to ThoughtWorks), and more importantly, we have 60 members in our meetup group who are all ready and willing to become women developers.

So, if you're keen and looking to help, here's a wishlist for things that would be awesome:

  • We could use spare laptops for the workshops, if you have any old ones lying around. They typically just need a web browser like Chrome and a text editor like Notepad++.
  • We would love for a hosting company to provide students in the courses with FTP accounts and a teeny amount of disk space. We used my server for the last round, but we couldn't do more than 8 simultaneous logins on mine, so it was not ideal.
  • We can currently get 10 free books from O'Reilly for each course, but if we had a sponsor (like a bookstore) that would provide free books for every student (~40), that would be just amazing.
  • We would love to have GDI branded t-shirts to give to the students, to help them feel proud of their involvement and to spread the message.

We can always use more women students and teachers, of course, so join the group if you're keen to get involved. Onwards and upwards. :)

Thanks to Kate Carruthers for the embedded photo.

Monday, November 1, 2010

"No Boys Allowed"...And Why I Like It

We just wrapped up our first Girl Develop It course in Sydney tonight. When I was first planning the course, I had males ask if they could be students and TAs, and after some consideration, I said no to them.

Part of me wanted to prove that we could pull it off with an all female ensemble. We ended up enrolling 40 female students, bringing us to full room capacity (daisy-chained power cords, ftw!), and enlisting the help of 6 highly skilled female teaching assistants, from web standards wizards to JS experts. I thus concluded that lack of "womanpower" was clearly not an issue.

The other part of me wanted to see if we could indeed have a better learning environment by having it be all female, as we suggest is the case on the Girl Develop It website. I was the teacher in this course, so I can only give my perspective from the front of the room. But, I have to say, I liked it. I am a straight woman, so when I am giving talks to the mostly all-male crowds at most tech events, I sense a small part of me is trying to impress a small part of them ("that way"). It's not something I'm very conscious of, as I'm usually fairly empassioned by the ideas my talk, but it is there nonetheless. When I am speaking to a group of all females, I am motivated only by the desire to educate them and not by any hidden desires. I played the part of the teacher in this course, but at the same time, I am also a student in an Afro-Brazilian dance class which is largely female. Similar to my reasoning for enjoying the absence of boys in the web dev course, I find that I enjoy the dance classes more when it is just us girls. I can shake my hips without worrying subconciously about impressing the boys in the class and having my performance affected by subsequent nervousness.

On a related note, it's nice to be in an environment where we can talk girl stuff and bring up "risque" topics without worrying about making boys feel awkward or wondering if they'll misinterpret our language. In dance class, we often make up rhymes about our "boobs", "hips", and "asses", and they help us learn the move... but it always feels a bit odd to teach them to boys too. That sort of thing doesn't happen as often in the web development course situation (well, maybe during the after-drinks :), but it's nice to have that kind of environment just-in-case.

Finally, it's cool to meet local women. I have to admit that I'm not that great at making friends with girls (I grew up more around males), so I typically only make them when I'm forced to. Being in an entirely female room definitely helps as a forcing function. :) I met a bunch of awesome girls during this course and the dance class who I probably wouldnt've met otherwise, and I'm looking forward to seeing more of them.

I know there are people who may argue that it is sexist to not allow boys into the classes, but I think that if you are going to go the "no boys" route, you should go all the way or you risk losing some of the benefits completely. This doesn't mean that I think every thing should be all girls - I will be actively encouraging the GDI students to come to mixed meetups, workshops, and user groups. It just means that I do see benefits to single-gender groups in some situations, atleast from my own personal perspective.