Software developer from Toronto. I enjoy security, mobile dev, under-the-hood type work, or just working on cool products.
- Jul 15, 2017 H1702 CTF: Reversing iOS and Android Writeup
- Apr 17, 2016 Plaid CTF 2016: Butterfly Writeup (pwn 150)
- Jan 24, 2015 Fixing my VPN redirect problem on Mac OSX
- Nov 03, 2014 Easier way to Source Locate DOM elements
- Jul 26, 2014 Understanding Timeouts in Ruby (MRI)
HTML5 Multiplayer game using Node.js, Socket.io, Protocol Buffers, and Phaser game engine. This is my first gamedev project. The physics and collision is mostly done on the server-side. It uses client-side entity interpolation for player movement and projectiles to compensate for lag.
Native iOS and Android app for mixing people's words to create funny mashups. They both depend on a Node.js based EC2 pipeline that cuts videos into word segmented mp4 videos using speech-to-text, and the segments would then later on be re-assembled on the mobile clients. LRU cache is used on the clients to minimize bandwidth. The Swift app uses AVFoundation to stitch video segments natively, while the Android uses Exoplayer to display the merge preview (which is faster than ffmpeg on android), and uses a AWS Lambda function to do the final merge if needed.
This is a developer tool that makes it easier to get familiar with new codebases. It embeds the source file location (whether its server/client rendered) of a DOM element in the data-attribute, which allows to quickly determine which part of code is responsible for rendering a particular UI element. A variety of methods is used depending on the templating library used - monkey patching compiler/parser, intercepting DOM insertion APIs and looking at callstack, stubbing out non-html entities and then using HTML parser to determine and add file:line information of each node
Crowdsourced subtitling platform via youtube, niconico (ニコニコ動画), vimeo and naver. It has a built-in hybrid SPA-based subtitle editor using Backbone.js, jQuery, with Ruby on Rails on the backend. Also wrote Chrome extensions in order to integrate with 3rd party video players.