I'm a software engineer with many years of backend experience and 3 years of cybersecurity experience from sunny San Diego, CA. The San Francisco bay area was my home from 2012 to 2022, and I currently live in New York City. Outside of software, I enjoy playing music, dancing, learning and practicing languages, taking siestas, drinking tea, playing video games, traveling, taking and editing photos, trying new food, and using the Oxford comma.
Feel free to shoot me a message about any of my projects!
This rails web app, affectionally called Jortal, is a simple central repository for project submissions to the Jacobs Institute for Design Innovation at UC Berkeley.
SecureMe is a simple native Android app targeted at versions 2.2+ (practically 100% of all Android versions in use) that automagically helps users improve security settings on their Android devices. SecureMe checks devices for common security settings like securing a lock screen with a password, PIN, or pattern lock; enabling encryption; and other security-related configurations. Instead of users having to look up how to secure their devices, SecureMe tells users at a quick glance which security settings they have configured well (either manually or by default) and which settings they should take a look at to keep their data safe.
bwReport is an internal command-line interface tool for quick, simple, and precise bandwidth usage analysis. It is useful for gathering network usage statistics over both Ethernet and RADIUS Accounting (RFC 2866) Wi-Fi sessions (hosts behind NAT).
You're looking at it! My personal website uses Twitter Bootstrap to deliver a responsive, clean experience.
This was my first foray into electrocardiogram signals, so I had a few project goals:
Ephemeral emotional states
I wanted to see if I could reproduce a finding by Teo Kah Ming (Department of Mechanical Engineering, National University of Singapore) of multiple P-wave ECG activity following shock, i.e., sudden emotional disturbance. I subjected myself to videos that would present loud, screaming zombie at times unknown to me. The first few trials yielded unsatisfactory data, as electrical signals from my muscle movements created significant noise and interference with the ECG data. This was a result of the relatively crude nature of the NeuLog ECG sensor, the natural physiological response of muscle tension or movement to shock, and the self-experimental nature of this exploration. By the time I was finally able to acquire a clean signal, I likely already developed a desensitized response to the shock, despite the intermittency of the shocks. From this clean signal, I could not perceive any significant irregularity with any component of the PQRST wave complex, but there was an interesting elevation of total voltage between the final resting ECG and the initial resting ECG. However, this likely has no implications and is presumably an artifact of the nature of collecting data with the Neulog sensor.
Sustained emotional states
I briefly experimented with longer periods of data collection, this time while listening to the sad pieces of the Les Misérables film soundtrack. For both I Dreamed a Dream and On My Own, there were a few peculiar segments of the respective ECGs that nicely correlated to key segments of the respective pieces, but again this may be due to noisy interference from muscular electrical signals in response to my emotional states.
Insights
It was interesting to experiment with the NeuLog ECG sensor. It is very sensitive, yet it is simply clipped onto one's wrists and forearm (or knee), leading to noisy interference with the slightest muscle micromovements. Many other factors affected this exploration, including test subject health and variability (I only collected data from myself; next steps would be to collect the same data from others), and reproducibility of both ephemeral and sustained emotional states. Many thanks to Professor John Chuang and Andy Brooks of the UC Berkeley School of Information for providing guidance throughout the course.
Native iOS app that captures facial expressions and outputs a corresponding emoji.
Implementation of a shell, with support for basic built-ins, $PATH resolution, input/output resolution, signal handling and terminal control, and background processing.
Implementation of an HTTP file and proxy server, with support for directory index resolution, directory listing, and multiple requests per proxy connection.
Intuitive native Android app that instantly converts an input age to various corresponding animal years.
Uses D3.js to visualize campaign contribution data from the FEC.
Implements symmetric hash join for distributed asynchronous programming using Apache Spark.
Implements user-defined function result caching using disk-based hash partitioning and in-memory UDF caching to dramatically reduce performance bottlenecks in a general distributed data processing framework.
Efficiently captures the contents of large ebooks in a structured form suitable for analysis via a database or statistical package using streaming and out-of-core divide-and-conquer algorithms.
Classifies images of handwritten digits and predicts machine-readable digits using the k-nearest neighbors machine learning algorithm.
Takes overlapping DNA subsequences and assembles the respective full DNA sequence using shotgun sequencing.
Generates the input to STP, a SAT solver, which in turn solves a Sudoku puzzle respective to given input.
Bears Transport Protocol (BTP) provides in-order, reliable delivery of UDP datagrams in the face of packet loss, delay, corruption, duplication, and re-ordering, using fast retransmit and selective acknowledgments to optimize performance.
Simulates a network of distance-vector routers. Each router is an instance of a single DV router class and must correctly forward packets throughout the network of router instances in the face of new links, broken links, routing loops, and no central routing authority.
Simulates a network firewall on given input and output interfaces. Performs packet capture, analysis, and forwarding based on specified firewall rules. Covers TCP/UDP, DNS, ICMP, HTTP. Modular and extensible to other protocols.
A secure metadata extraction tool for PNG and JPEG-Exif images written in C. Extracts data from PNGs and JPEGs in a safe and secure manner to neutralize image data attack vectors. Safely handles malicious input injected into a PNG/JPEG by an attacker.
Sends packets to hosts making DNS requests on the same local area network in order to impersonate a DNS server and launch DNS spoofing attacks. When successful, redirects unsuspecting users to desired destination.
Answers the question: given a word, what other words are statistically associated with it? Given a target word, we can find words in a body of text that are closely related to it by ranking each unique word in a document by its co-occurrence rate with the target word.
Parses instructions in the MIPS ISA to simulate a processor operating on the MIPS instruction set. Sample instructions include bit shifting, reading/writing in memory, arithmetic operations, conditional statements, instruction execution logic jumps, and system calls.
Performs optimized 2D convolution on images, using kernels to achieve image filter effects such as sharpening, blurring, inverting, and more. Specific optimization techniques include SSE batch processing, register and cache blocking, loop unrolling, matrix padding, and OpenMP multi-threading and parallel processing.
Simulates a 16-bit processor in Logisim, complete with a specified ISA including arithmetic operations, writing/reading to/from registers and memory, and instruction logic such as jumping and branching.
Simulates an ocean containing sharks and fish, which are created and destroyed according to a given set of rules, similar to Conway's Game of Life. Uses run-length encoding to compress the ocean representation.
Network is a 2-player game on an 8-by-8 board. A player can win by connecting six or more chips orthogonally or diagonally from the player's edge of the board to the opposite edge of the board. Players can play against simple artficial intelligence logic that uses alpha-beta pruning and the minimax algorithm to determine optimal moves.
This final project combines a variety of data structures and algorithms to implement a well-encapsulated abstract data type to represent a weighted undirected graph. The second part of the project implements the greedy Kruskal's algorithm to find a minimum spanning tree.
Hog is a text-based dice game. Among several gameplay rules, the game implements (and allows easy extension of) several different strategies to achieve victory using probability and other heuristics.
Data visualization project that collects public geotagged tweets, assigns a sentiment to each tweet based on its content, geographically aggregates tweets, and colors each US state according to its aggregate tweet sentiment.
Ants vs. SomeBees is a tower defense game inspired by the popular PopCap Games's Plants vs. Zombies. The project is an exercise in and focuses on code modularity and reusability.
Scheme interpreter interprets a subset of the Scheme programming language, naturally focusing on the power of recursion and functional languages.
As the final project of the course, we designed an EEG complete wth its own power source on Multisim and printed custom PCBs. We tested the EEG on none other than our very own Professor Michel Maharbiz (with the necessary safety precautions). In essence, the EEG can detect electrical impulses the brain fires when moving one's eyeballs up/down and to each side.
This project, written solely in MATLAB, is similar to the popular Shazam music identification service to identify music based on acoustic fingerprinting and frequency analysis.