In Hoedown!, players are measured for different qualities using physical sensors. These measurements determine a character class for the player, which is presented to them in the form of a character sheet printed on a BERG Little Printer. Players then find other players from each of the seven character classes, with whom they complete small shared tasks.
My current non-technical project is to learn to unicycle, which I'm doing with the Toronto Unicyclists. It makes a great complement to the sedentary, cerebral nature of my day job - nothing better than kinesthetic skill development to unwind after a long day spent coding!
So far, I've been making decent progress; I can remain balanced during regular riding, and have just started to get the hang of freemounting (i.e. mounting the unicycle without using a wall or other static object to keep balance.)
I presented at the Meeting of the Minds 2013 conference as part of a workshop on Chaos in Urbanism. At its root, this workshop was a study in contradictions: on the governance/policy level, how do you manage chaos generated by accelerating change?
My talk was about the idea of interactive governance, a form of leadership that places primary importance on near-immediate, continuous, and two-way communication with external entities. Digital natives take these qualities for granted, yet the same qualities remain partially or totally absent from our interactions with governments and other large, bureaucratic organizations. There's a cultural dissonance here, and it's not going away anytime soon.
You can listen to and/or read the talk here.
ponder has much the same goal as datafist: to enable all self-trackers to get more value from their personal data, regardless of experience with statistics or programming. It is currently in development; this CV will be updated with a link when it goes live.
ponder uses Spring MVC as the web application framework, Thrift for communication with the API syncing service, d3 for visualizations, jQuery and bootstrap for UI. By far the largest challenge has been working with third-party APIs, which have quite divergent opinions on how to deal with time, data formatting, pagination, etc.
This project draws heavily on ethnographic research and visual/interaction design from the team at Intel Labs. I've slowly come to accept that, even in software engineering, many of the hardest problems are not engineering problems - and so it is with this project. Without the dedicated work of Dawn Nafus, Pete Denman, Lama Nachman, and several others, this project would not exist.
The ramblelust blog chronicles the travels of Valkyrie Savage and myself through Australia, Singapore, Vietnam, Cambodia, Malaysia, and Korea during the summer of 2013. We also have photos from the trip.
This trip was less structured than our massive bike trip, but no less fascinating. We ate all the food, couchsurfed as much as we could, rode a ramshackle 125cc scooter motorbike around Vietnam, hiked halfway around the Jeju Olle in Korea, completed a few quests from expedition!, got our PADI Open Water Diver certifications, and sweltered in the muggy heat. (We did a lot of sweltering, let me tell you.)
expedition! is a quest-based learning game, where the quests are knowledge-gathering tasks at specific locations. Valkyrie Savage and I built a functioning prototype, which is currently in invite-only mode. Some examples of quests from our early players:
Through local culinary school Kitchen on Fire, I help run cooking classes for groups of 10-25 people. This includes preparing ingredients and demonstration recipes, setting up stations, aiding students during class, and cleaning up the kitchen afterwards.
As an exchange of services, it's not half-bad. I get to meet interesting people, eat tasty food, and refine my culinary knowledge at no personal financial cost. In exchange, Kitchen on Fire keeps its costs low, and is able to devote more of its spare resources to nutritional outreach programs for low-income families.
datafist is an in-browser toolkit for visually exploring your personal data. Similar to Max or PureData, datafist offers a visual programming interface built around a toolkit of simple, composable operations. As you play around with these operations, the result is simultaneously visualized. The goal was to create a simple open-source tool to help all self-trackers get more out of their personal data, regardless of experience with programming or statistics.
I wrote a series of blog posts discussing several of my self-tracking experiments. Most of these are accompanied by code snippets and visualizations explaining my approaches to making sense of the underlying data, all of which is available on github. The blog itself is based off the excellent Octopress engine.
I've since added a couple of posts to this blog, but most of my blogging activity here was confined to the end of 2012. It served me very well as a soapbox for my thoughts on personal data, especially in the post-Facebook time vacuum before I shifted my attention to more intensive engineering projects.
I prepared and delivered an 8-minute Ignite Plus talk on my experiences dealing with panic attacks through self-tracking.
I spent several early mornings at the San Francisco Zen Center's Green Gulch Farm, baking muffins for the Sunday lectures. You have to wake up early to work in a bakery. Like 4:30 am early.
I worked with Valkyrie Savage to design, build, and program Arduino-based electronics for her wedding dress. Using two XBee modules, an Arduino Fio, and an Arduino Lilypad with the XBee breakout board, we constructed a proximity sensor based on RSSI pin signal strength between the two modules. This sensor was used to illuminate a series of LEDs on her dress, providing a visual indication of our mutual proximity.
The code for this project is available on Github.
After spending a year with the Search Infrastructure team, I switched gears and moved to the Core Photos team. This horizontal role switching is highly encouraged at Facebook.
I took a failing face detection/recognition system and rebuilt it for scalability, achieving 99.9% reliability and a tagging boost of 2%. I then worked with Lubomir Bourdev to build easily reusable detection/recognition components, making it easier to drive further improvements to our tag suggestion systems.
The bulk of my time with Core Photos was spent driving a major initiative to migrate all photos-related data into TAO. TAO provides access to our social graph data via a simple API that abstracts away Memcache/MySQL.
The migration required extensive planning, frequent communication both within and across teams, and broad knowledge of Facebook's codebase. When I joined Core Photos, several people had previously tried and failed to gain traction on this project. By the time I left, we had successfully migrated all photo tags and had a clear plan for completing the rest of the migration.
You can click on any tag to filter my life experiences. My CV also comes equipped with a print stylesheet that is integrated with the tag system, so you can even print a customized version to suit your needs.
To top it all off, the code is open-sourced on Github.
Having completed our crazy bike trip, Valkyrie Savage and I wanted a further test of our athletic prowess. We trained for six months with three to six hours of running per week. It paid off; we completed the Little Grand Canyon Marathon at 6000 feet elevation in just under six hours.
I completed the Competent Communication manual and earned second place in the District Table Topics Contest. I also served as VP of Membership for Facebook's Toastmasters chapter, Move Fast and Say Things.
XHPy is a Python port of Facebook's XHP. It installs an import hook that dynamically rewrites code as it is imported. The parser uses Pratt top-down operator precedence, and is composed of a series of generators that stream the output of tokenize.
As a bootcamper,
cut down on expensive
I then joined the Search Infrastructure team and built search for Facebook Groups, the first fulltext search product to use our distributed graph search system. This was a full-stack project; I was responsible for everything from indexing to realtime updates to frontend development. After rollout, I maintained this product by managing a weekly push process, building dashboards, and working with teammates to resolve operational issues. I also improved search quality, using detailed query log analysis to prioritize fixes to the indexing process and UI.
After that, I worked more closely with the Search Infrastructure team on improving our core graph search system. I automated index builds, making the process of pushing our 50 TB index quicker and more reliable. As part of the oncall rotation, I periodically managed that push process end-to-end. I instrumented our system to report a breakdown of CPU/network usage, allowing us to precisely target our optimizations at specific common queries and high-volume callers.
Before the trip, I also put together a proof-of-concept handlebar cam, using ffmpeg to compile videos from still frames. This setup was unfortunately impractical for our trip, but I'm hoping to iterate on it for future trips.
I participated in a unique open-source projects course offered in collaboration with several universities worldwide. In partnership with Mozilla, I worked to improve vCard support in Thunderbird.
I worked on the Site Integrity team, which prevents spam and fraud in real-time across all Facebook products. I developed an unsupervised learning system to detect spam across billions of user messages per day. This work resulted in a patent on the underlying classification and user feedback mechanisms.
I also optimized our generalized spam classification framework, reducing CPU load by 15% after identifying performance issues with gprof.
For a hackathon, I ported rQRCode to a C++ Thrift service and helped build out a demo product for social graph actions via QR codes. Three years later, this Thrift service is now being incorporated into Facebook's Japan-specific QR offerings.
I wrote a raytracer with randomized supersampling, Phong lighting, and support for implicit surfaces. For my final project, I wrote a procedural content generation engine to render interactive natural landscapes with fractal trees, rocks based on Catmull-Clark subdivision, and multiple-frequency Perlin noise textures.
You can see some screenshots from these projects on my old blog.
CBC Radio 3 runs New Music Canada, a database for Canadian artists. Music uploaded there is freely available, and can be listened to through the player on that site.
Using Firebug and Wireshark, I reverse-engineered this player to get at the underlying audio file URLs. I then built a Python-based scraper for retrieving those URLs and populating metadata. With this scraper, I downloaded their entire selection of Funk and Electro. Finally, I loaded this collection into Quod Libet, using its automatic rating and rating-weighted shuffle plugins to discover my favorite content.
I helped to organize weekly gym meets for traceurs in the Ottawa region.
For this internship, I worked with the award-winning PORTAGE statistical machine translation system. I designed and built a module to cluster similar phrases, then scaled it to handle corpora with tens of millions of phrase pairs. I also implemented Xu-Zens-Ney bilingual sentence segmentation, reducing translation model training time by over 80%.
I wrote In Silico, meeting the NaNoWriMo goal of 50 000 words in one month. In Silico envisions a near-future world with ubiquitous implantable computing devices. To stave off societal collapse due to widespread video game addiction, a shadowy consortium of government officials and industry leaders constructs the perfect antidote: a game whose purpose is to maintain public order.
cross-domain communication techniques to implement client-side batching for
ad block requests. This was in the dark days before
reasonable adoption, so it
involved a good deal of hackery with
<script /> tags.
I also wrote a Google Spreadsheets widget for generating heightmaps as part of an internal Google Docs hackathon.
This was my first time down to the Bay Area, so I deliberately spent a week in San Francisco before starting my internship. I met a variety of curious characters in that week. The most curious was a blond-haired drunk who had spent the last few months roving between music festivals. He pulled out a newspaper, wrote "Everyone Lies" on it in thick gold marker, and offered me a half-cupful of vodka. The second most curious was a spindly hacker type who spent his evenings blasting original Pure Data compositions in the hostel common room.
I knew I'd come to the right place.
My work with Idée was diverse. I developed a toolkit for evaluating high-dimensional Approximate Nearest Neighbor algorithms. I then worked with a designer to build and release Idée Labs, a Pylons-based web application featuring visual search across millions of images. I also collected feedback on the PHP-based internal operator interface, implementing requested fixes and improvements.
I learned Python in a day, then used it to build database migration scripts. My next Python project after that used Amazon APIs to scrape millions of book covers, allowing us to identify thousands of infringing uses of client images in those covers.
For the last couple of weeks, I researched methods for matching images against user sketches, implementing a prototype algorithm based on curve extraction and Hausdorff distance.
Outstanding students are invited to provide paid tutoring services for freshman and sophomore Mathematics courses through the Mathematics Tutorial Centre. I tutored hundreds of students over four years in Linear Algebra, Calculus, and Combinatorics.
I worked with several other co-op students to double automation coverage of manual testing procedures. As part of this, I helped develop an XPCOM extension bridge between Mozilla Firefox and IBM Rational Robot.
STEP educates the public about sustainable technologies by raising funds towards renewable energy projects on the University of Waterloo campus. More information on their existing projects can be found here.
I organized on-campus talks by leading experts in renewable energy and sustainable design, developed administration tools for the STEP website, and helped promote STEP at community events.
I achieved a 90% major average and a 89% minor average in Combinatorics and Optimization while gaining two years of work experience through the University of Waterloo's co-operative program. In recognition of my outstanding academic record, I made the Dean's Honours List for the Class of 2010.
Since NJC didn't offer a Computer Science course, I taught myself all required material for the 2005 Computer Science AB. I received the highest possible score on this examination.
Even though this wasn't accepted by the University of Waterloo as credit equivalent, it gave me a powerful headstart in their freshman year courses.
I travelled to Beiuș, Romania where I helped to finish construction on two homes during a one-week build.
For the first house, I operated the circular saw. The foreman would request lengths to cut, I would measure and cut them. After a while, he started coming back with these pieces, telling me that they were too short. I cut them again - and soon he was back again with the same complaint.
A couple of iterations later, I suspected something was amiss. As it turns out, our rulers were not quite identical. Since there were no more rulers, I instead corrected for the difference. There were no more complaints.
For my Graduation Project at the University of Toronto Schools, I recorded and produced a full-length CD of original electronic music. While learning to use MIDI sequencers and multitrack compositional software, I also led recording workshops for younger students. Aside from the musical composition, I designed the insert and disc art and sourced short-run production houses.
I was obsessed with recording technology, and I'm eternally grateful to John Fautley for enabling this obsession. If I ever quit software to become a successful recording artist, I'll have him to thank.