About
Software developer living in Montreal. Mostly using Node.js, Javascript these days, but I do have a wide varierty of interests ranging from games, mobile dev, to under-the-hood security reversing.
You can find my CV here or learn more about me on Linkedin, Github, Twitter, Stackoverflow.
Technical Blog Posts
- 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)
Games I've made
-
Uchu.io (2021)
Online multiplayer ship constructor and battle using Pixi.js on client and Node.js on backend
-
Junon.io (2020)
Multiplayer Space Colony Survival. Played by over 480,000 users, average session duration of 30 minutes.
-
Supercutebattle (2018)
Multiplayer-platformer prototype inspired from mario battle mode. Built in two weeks using pixi.js, and basic tilemap based physics on server.
-
Neo Walljump (2018)
A two-day Toronto GlobalJam 2018 game inspired from super metroid where the objective is to have the highest consecutive wall jump.
Apps I've built
-
Nanapx (2018)
A React.js + Express web app using Stripe for payments. Basically, a marketplace for people to find and rent photographers. A chance for me to experiment with react, and some of its libraries such as react-router, formik, and played around with react native a little bit.
-
Bard (2016)
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.
-
ViewInspect (2015)
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
-
Riversub.cc (2013)
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.