Portfolio
A selection of my creative output so far.
Machine Learning Books 2018–current
Written together with Audrey Tam and Chris LaPollo, Machine Learning by Tutorials is aimed at people who are already familiar with iOS development but who want to get started with machine learning.
The Core ML Survival Guide started as an appendix in the other book but it grew too big and didn’t really fit in thematically, so I decided to publish this myself as a separate book. It is a book of tips and tricks for developers who are running into problems getting their models to work with Core ML.
The iOS Apprentice 2011–2016
Four epic-length tutorials for beginners that show how to build complete apps from scratch. I wrote this book because other beginner iOS books focus too much on the details and not on the big picture — I wanted to show readers how everything fits together inside a real app. Published by raywenderlich.com.
Swift Algorithm Club 2016
An open source repository with implementations of popular algorithms and data structures in Swift, including detailed explanations of how they work. The focus of this project is on clarity and readability of the code, and explanations that are light on math but heavy on examples. Now part of raywenderlich.com.
Mahjong Cards 2014–current
The classic game of mahjong solitaire but with a simple twist: it’s played with a regular deck of playing cards instead of Chinese tiles.
Work on this game started in 2011 and it took me ages to finish — it’s a lot more technically complicated than it looks! This is the first game I released with the intention of making money from it.
Available for iPad since 2014 and for macOS since 2015. YouTube video
iOS by Tutorials Books 2011–2014
I contributed several chapters to the books iOS 5 by Tutorials, iOS 6 by Tutorials, iOS 7 by Tutorials, and iOS Games by Tutorials. My chapters covered topics such as ARC, Storyboards, Modern Objective-C, Auto Layout, State Restoration, Transitioning to iOS 7, and juicing up your games with special effects.
Tutorials for RayWenderlich.com 2011–2015
I’m one of the original members of Ray’s tutorial team. Some of my more popular tutorials:
- How to Make a Game Like Candy Crush with Swift (YouTube video)
- Trigonometry for Game Programming
- My App Crashed, Now What?
- Apple Push Notification Services Tutorial for iOS
- How To Make a Simple Playing Card Game with Multiplayer and Bluetooth
Reverse Chord Finder 2009–2015
Lots of musicians do not have formal training but teach themselves to play by ear. Nothing wrong with that, but if you’re playing with other musicians you do need to speak the right language. That’s why I created Reverse Chord Finder, the app that tells you the names of the chords you are playing.
Initially, I released two separate versions, one for piano and one for guitar:
The app proved quite popular, so I rewrote it from scratch to be better. Version 2 handles both keyboard and string instruments, and even music notation.
It’s a great app but I did not have the time to keep working on it, so in 2015 I sold it to Ghostdust, creators of SongSheet and other music apps.
Ultimate Countdown 2008
For fun, I wanted to see if I could make a game from scratch in a single day. It ended up taking 12 hours from idea to App Store submission. This free iPhone game has been downloaded over 250 thousand times.
Fnurgletoe 2008
I was totally unaware of what an iPhone was until a friend showed me his brand new iPhone 3G. And when he told me you could make your own apps for it, I was sold. That weekend I borrowed his MacBook and ported this Java game I wrote a few years earlier to the iPhone. We put Fnurgletoe on the store and became instant millionaires made pizza money.
Other iOS Software 2008–current
Galaxy Apocalypse (2013) - My first entry for 1 Game a Month, made with Cocos2D (YouTube video).
Simon Sings (2009) - Like the classic game Simon Says but using musical notes instead of flashing lights. You’re supposed to sing or hum the right notes in the right order.
Open Source - A lot of the code I write ends up as open source. My favorites are TransparentJPEG, which allows you fake transparency for JPEG images, and SKTEffects for adding juicy effects to Sprite Kit games. View my GitHub page
Piano Clues 2007–2014
After having played the piano for a few years, I set up a website to explain the basics of music and chord theory. It started out as a popular series of articles on how to record digital piano on your computer and grew from there. The website paid for itself using Google AdSense. Passed it on to a new maintainer in 2014.
Piano World Recital Website 2007
Every three months the members of the Piano World Adult Beginners Forum participate in an online recital. To take a lot of work out of the hands of the organizers, I made a web-based tool that accepts the submissions and processes the mp3 files. Thanks to this software, the recital has been going strong for nearly a decade now with over 2,000 submissions.
Red Dot Forever 2006
I wanted an extremely simple program to record music from my digital piano and save it into a MIDI file. The app has no advanced editing features, but nothing beats its simplicity. Free software for Windows.
Other Windows Software 2001–2006
Wildcard Select - a shell extension for Windows Explorer that lets you select files based on a wildcard pattern. I also wrote a Code Project article explaining how this works.
PianoSynth - a VST plug-in that emulates the sound of a piano.
13 Letters - a simple word game. Originally intended as a commercial game but I didn’t release it because it was not fun enough. Written in C++ with SDL.
Screenwriting 2004–2005
I felt like doing something else and decided to try my hand at writing movie scripts. After a few horrible first drafts, I realized that fiction isn’t my medium. But hey, you don’t know until you try it.
Out of this experiment came Protomov, a tool for prototyping movies that applies the practice of “pre-visualization”, which is often done for complex action scenes, to the planning of the entire movie. Using these prototypes turns movie making into an agile process consisting of a series of quick iterations. I still think it’s a good idea but the app never got beyond the design stage.
OpenBeOS / Haiku 2002–2004
After BeOS went to software heaven, a group of volunteers decided to remake all of BeOS as open source. I joined them in 2002 as team lead for the Midi Kit. I reverse engineered the workings of the Midi Kit and created rc
, the resource compiler that is extensively used during the build process of Haiku.
Compare and Merge 2002–2004
File and folder diff utility for Windows. At this point I am self-employed and making a living selling Compare and Merge as shareware. In 2004 I sold the rights to another indie developer, who is still offering the app for sale to this day. Written in C++ for the Win32 API.
Punk Rock 1994–2005
My friend plays guitar and we start writing songs together. I learn bass guitar. This is the time of Bad Religion and Pennywise, so we play punk rock, drums courtesy of a Technics keyboard and MIDI. We record four albums on a cheap PC with Cool Edit Pro and improvised equipment. Listen on SoundCloud
Needle 2001
Needle is command-line tool for Linux that quickly lets you find files. It’s similar to locate
and updatedb
but it also searches through the contents of the files, not just their filenames. It uses BeeGram, a cross-platform toolkit for building search engines that I wrote at my day job.
Fingertips 1999
A visual scripting tool for BeOS. It started out as a clone of a dataflow language for Windows that I had read about in a magazine. BeOS had many built-in scripting features — for example, you could ask an app for a list of all its windows by sending standard messages — and I had intended Fingertips to be a user-friendly shell for making such scripts. Written in C++, not released.
Tracker Grep 1998
An add-on for the BeOS Tracker that lets you easily search through text files. My first released app for BeOS, written in C++. It was only a simple utility, but well liked among BeOS users.
Other BeOS Software 1998–2003
A few other small BeOS utilities:
WebWatch - an unofficial port of Swatch’s Internet Time utility
Selective - a Tracker add-on that lets you select files based on a wildcard pattern
Hustler - a simple audio player that runs inside the Deskbar
BASIC1 1997
I had always been in awe of the people who created programming languages such as AMOS and Blitz 2. Being able to make your own language seemed like magic to me. During an internship, I stumbled upon Jack Crenshaw’s Let’s Build a Compiler series and realized that I might be able to pull off a language of my own.
That language became a version of BASIC for BeOS, inspired by Blitz Basic and written in C. It never was finished, but I had a lot of fun playing with it! Over the years, I’ve experimented with many other programming language ideas.
Zero Gravity 1997
Made in the winter of ’96-’97, this is the Amiga game I’m most proud of. It’s a fast-paced 3D game for the Amiga 1200, written in 100% assembly. It is my farewell to coding for this amazing machine. YouTube video
Overdose 1996
Puzzle game for Amiga, written in Blitz 2. My first shareware app, it made a grand total of $0. YouTube video
Evil Insects 1994
The first software I ever released to the public is this game for the Amiga 1200. I spent most of my summer vacation creating it, and I remember how hard it was to truly finish a project. Written in Blitz 2. YouTube video
Other Amiga Games 1992–1997
These are my teenage years. I start many games that go unfinished, first in AMOS, then in Blitz 2, and finally in 68K assembly language. Gladiator is one of the games that did get finished, but not released. YouTube video
Videos of other games from this era: Boing, BombRoller
Artwork for some of these games, all drawn by hand in Deluxe Paint:
Cartoons 1990–1993
For the highschool newspaper, I draw a monthly comic strip making fun of my teachers.
It begins… 1985
My dad brings home a Commodore 64 and I teach myself programming using any books and magazines I can get my hands on. After lots of trial and error, I manage to write a few simple games in BASIC.