< Home < Projects
This section gives specific examples of non-research projects I've worked on (to see the projects made specifically for research, go here. This page might include projects I've worked on for classes, but there are several I've done only for fun (but only the best/most representative of these are shown).
| Title | Date | Type | Status |
|---|---|---|---|
| Arch Linux Personal Computer | January 2024 to current | Fun | In progress |
| Computer Security: Image-based Ransomware through Buffer Overflows and Steganography | August 2023 to December 2023 | School | Complete |
| Empirical Analysis: Study of Life-like Cellular Automata | August 2023 to December 2023 | School | Complete |
| Algorithms: Review of Classical Verification of Quantum Computations in Linear Time | August 2023 to December 2023 | School | Complete |
| Deep Learning: Creating a Programming Language from Neural Turing Machines | January 2023 to May 2023 | School | Complete |
| Parallel Processing: Polyhedral Compilation | January 2023 to May 2023 | School | Complete |
| Undergraduate Thesis: Syntax as a Tool of Thought | January 2022 to December 2022 | School | Complete |
Arch Linux Personal Computer
Status: in progress (when is this ever not in progress?)
Timeline: January 2024 to current
There's an adage that "Linux is free if you don't value your time", and unfortunately, this is even more so with Arch Linux. The amount of work this operating system requires would suprise most people, and you might take some things for granted unless you've worked in an environment with much less support compared to Windows (e.g., NVIDIA pushed an update one time that caused Arch systems to stall when their lids are closed). Although, working in Arch Linux is much more enjoyable from a programming and customization perspective; the "everything is a file" design means linking disjoint processes and devices together is very simple, and the open-source nature of the operating system means I can (in principle) control everything that goes on in my computer. It's fun!
Computer Security: Image-based Randomware through Buffer Overflows and Steganography
Status: complete (report)
Timeline: August 2023 to December 2023
Professor: Dr. Kirill Morozov
This was a fun project where we had to create a ransomware (in a virtual environment) that encrypted files with a hidden private key and then decrypt those files at a later date. I wanted to do something weirder than a standard privilege escalation or something, so I made my own image-viewing application with a buffer overflow vulnerability in it. It would read images as "ppm" files, and would use an unbounded "strcpy" operation that would create and execute an arbitrary executable file if the attacker hid binary code within the pixels of an image. It's based off of a real attack done against the Korean version of a 2003 Windows operating system! Alongside this, I also wanted to manually implement RSA encryption, which involved creating my own prime-number generator in C without any external libraries.
Specific contributions
- Demonstrated how a malicious image input to a vulnerable image-viewing application might lead to encryption of arbitrary files on a host computer.
- Showed how the same infected program might unencrypt its files once a different modified image is sent by the attacker after the ransom is payed.
- Re-implemented the Miller-Rabin primality test and RSA encryption/decryption in C without any external libraries.
- Showed how executable files could be encoded within an image with least significant bit encoding without being visually perceptible as noise to a human observer.
Empirical Analysis: Study of Life-like Cellular Automata
Status: complete (report)
Timeline: August 2023 to December 2023
Professor: Dr. Sayed Shah
This project only required we use empirical analysis techniques on some dataset. I was (and still am!) really interested in cellular automata at the time, so I used the "state of the grid at each timestep" as a synthetic dataset and performed various statistical analysis methods to show how different life-like cellular automata variants might change their grid in different ways. I liked all the graphs I made! I secretly want to do more projects involving statistical analysis so that I can create and interpret new graphs.
Specific contributions
- Created a cellular-automata simulator in C that's parallelizable and able to save step-by-step statistics with minimal latency.
- Implemented 11 cellular autoamta variants including Life (B3S23), HighLife (B36S23), and Seeds (B2S).
- Analyzed each simulation step with five functions including Count, Area, and Density.
- Created a collection of (very) visually-appealing graphs to demonstrate how cellular automata change over time to characterize traits like chaos and stability.
Algorithms: Review of Classical Verification of Quantum Computations in Linear Time
Status: complete (report)
Timeline: August 2023 to December 2023
Professor: Dr. Yuan Li
I had an ulterior motive while completing this project: we were meant to do a thorough review of an article from FOCS, but I wanted to additionally learn more about quantum computing. I chose one of the only quantum papers at this conference, which is not a very good introduction to the topic! I read a few other books at the same time to help piece things together--including Quantum Physics: What Everyone Needs to Know by Michael G. Raymer (whom I attended a seminar of in 2023!)--and this presentation became both an introduction of quantum physics to the layman audience and a paper review like it was supposed to be in the first place.
Specific contributions
- Gave a complete introduction to the realm of quantum physics throughout history, including the Bohr v. Einstein debates and Shrodinger's equation.
- Showed how quantum systems might give more security through observations that change the state of the quantum object without being copied.
- Summarized the paper, which was really about how we could offload quantum computing work to a computing system while maintaining security and ensure the computing system is actually using quantum computers instead of simulating it.
Deep Learning: Creating a Programming Language from Neural Turing Machines
Status: complete (report)
Timeline: January 2023 to May 2023
Professor: Dr. Heng Fan
This project wanted us to implement a deep-learning system on a new dataset or task. Around the same time I was interested in programming language design and the concept of domain-specific languages (especially esolangs), and wondered if it was possible to create a programming language that would be capable of learning algorithms built from individual discrete instructions, where a human supplies the target inputs/outputs to the algorithm and the model learns which instructions to activate in which order to make that algorithm. The algorithm-learner turned out to be more complicated of a task than I could do in a semester (and it's something transformers have already accomplished, in either case), so I pivoted to making a programming language instead: the user passes in a list of instructions as plaintext, and the model executes each by passing each through a list of sub-models (with each trained to implement an individual instruction). The langauge works, but is very limited in types of programs it's able to accomplish.
Specific contributions
- Trained one Neural Turing Machine for each instruction in a predefined instruction-set. Neural Turing Machines are able to generalize significantly better for inputs of longer lengths compared to other types of recurrent networks like LSTMs.
- Created a language-parser that turns a string in plaintext into a list of softmaxed coefficients.
- Implemented a REPR used as an interface to the language.
Parallel Processing: Polyhedral Compilation
Status: complete (report)
Timeline: January 2023 to May 2023
Professor: Dr. Song Fu
The polyhedral approach to compilation is a technique where a loop in a program is transformed into an equivalent representation that reduces the value dependencies between loop iterations. It visualizes array accesses as a function dependent on an affine iterator value, and uses the polyhedral method to skew, translate, or shift the affine polyhedra to make the dependencies a different shape with respect to iterator. This project creates my own polyhedral optimizer with the help of different polyhedra-specific libraries like OpenScop, Clan, and CLooG. Although, I didn't realize at the time that this takes a good background in math to understand how to do it! Specifically, loops require the calculation of a special matrix through a linear-equation solver, which is difficult to compute without knowing what the "Farkas lemma" was (which I didn't...). My solution was to randomize this matrix, compiling the resulting program, and running a collection of tests to ensure the final program was still semantically correct. This means the compiler has the possibility of generating programs that don't match what the programmer intended (so it should not be used in the real-world), but it does generate programs that are significantly faster in certain cases!
Specific contributions
- Used the OpenScop, Clan, and CLooG libraries in C to create a polyhedral program optimizer.
- Extracted valid optimizable code from target programs, pipes it through the compiler, and replaces the original code with the optimized code.
- Created a random optimizer that repeatedly attempts random program variants until the highest-performing version is found within a given time period.
Undergraduate Thesis: Syntax as a Tool of Thought
Status: complete (report)
Timeline: January 2022 to December 2022
Advisor: Dr. Barrett Bryant
This was my final requirement for completing my Bachelor's degree. I started it with Dr. Barrett Bryant in his class on compilers as a step in graduating with Honor's, and it led into an entire thesis in the following semester. It's composed of two parts: first, an analysis on programming languages and their ability to solve domain-specific problems; and second, the introduction of a new programming language created by me which demonstrates flexibility in syntactical design as to accommodate different kinds of domain-specific problems. The thesis is submitted alongside a compiler (lexical, syntactical, and semantic analysis) and an interpreter for the language, both written in standard Python. The language is designed around allowing the user to create their own syntactic constructs, with things like for-loops and if-statements not being defined in the language by default. The user can create functions that utilize a bytecode to implement these important constructs and any more the programmer might need. The end result of this is that very diverse problems can be elegantly represented in the language in the format they naturally relate to; I demonstrate this by creating a program that looks nearly identical to SQL, which the programmer implemented as a result of defining a significant portion of the SQL syntax from within the new language.
Specific contributions
- Created a programming language that demonstrates an extremely flexible design, allowing it to accommodate to many different kinds of domain-specific problems.
- Implemented a compiler (lexical, syntax, and semantic analysis) that turns a source file into a bytecode representation, which can be executed with an additional interpreter.
- Created representative examples of this programming language simplifying the source code required to solve complex problems that do not translate well from their original domain-specific representations.
- Learned how the research process works by reading papers and forming an argument, eventually culminating in a polished report.