Coursework and Projects
Listed below are the upper level software classes I've taken at the University of Michigan. Due to the University's Honor Code, I can't publicly share any code (excluding SI 339, since it isn't under the Engineering Honor Code). If you have further questions about any projects listed, feel free to email me and connect on LinkedIn with the links at the bottom!
EECS 494 - Computer Game Design and Development
Design, development, and application of digital games. Topics include: game engines, design patterns, shaders and graphics programming, agile development methods, iterative game/ experience design, project management and resource allocation, virtual reality, classic games, multidisciplinary relationships, product exhibition, and portfolio construction. Students work in teams to develop and exhibit new games.
Sidekick
Play as the sidekick and solve puzzles to assist the not-so-mighty hero on his quest to save the city of Sidetopia in this futuristic puzzle-adventure game!
Technology Used
Sidekick uses Unity and C#.
Contributions
- Player Movement
- Push/Pull Blocks
- Ramps
- Environmental Asses
- Boss Level Reskins
- Level 3 Design and Construction
- Level 4 Design and Construction
- Level 8 Design and Construction
- Level 12 Initial Design and Construction
- Play Testing
- Bug Fixes
Download the game here!
Beast of The Sea
This is an original game focused on the novel idea of being a pirate at sea. Inspired by Davy Jones and the Flying Dutchman from hit series Pirates of the Caribbean, the player controls the magic ship, the Beast of The Sea to defend their gold from pillaging pirates.
The player is able to realistically sail around, go underwater like the iconic Dutchman, and most importantly, FIRE THE CANNONS!
Technology Used
Beast of The Sea uses Unity and C#.
Contributions
This was a solo project, so I was responsible for every aspect of the game. This includes but is not limited to:
- Programming player movement
- Programming enemy movement
- Programming gold pillaging
- Utilizing EventBus architecture to update the UI
- Implementing the 'Open Fire!' action
- Implementing the 'Go Down' and 'Rise Up' actions
- Programming bounceback and rising collisions to prevent softlocks
- Programming cannonball detection and sinking mechanics for enemies
- Creating a level template
- Designing levels 1-6
- Creating and designing the menu
- Adding background music
- Adding sound effects
- Importing free assets
- Importing free audio
- Importing free-for-personal-use font
Play the game here!
The Legend of Zelda
This is a replica of the 1986 game "The Legend of Zelda" focusing on the first dungeon level. It also comes with a custom level featuring a new mechanic, which can be accessed by pressing "4." Controls include the arrow keys or WASD to move, X to use the sword, Z to use the secondary attack, and spacebar to shuffle between secondary weapons. 1 can also be pressed to turn on godmode. A great introduction to C# and Unity.
Contributions
While this game was a team effort, my partner and I each had our own responsibilities. Mine included but were not limited to:
- Programming the enemy movement
- Implementing the sword and bow
- Implementing the collectibles and programming the enemies to drop them upon death
- Photoshopping existing sprites
- Adding sound effects
- Creating most animations
- Designing the custom pod and broken pod sprites
- Helping design the custom level
- Contributed to play testing and bug fixing
- Overseeing outside play testing and gathering feedback
Play the game here!
EECS 492 - Introduction to Artificial Intelligence
Introduction to the core concepts of AI, organized around building computational agents. Emphasizes the application of AI techniques. Topics include search, logic, knowledge representation, reasoning, planning, decision making under the uncertainty, and machine learning.
EECS 485 Web Systems
Concepts surrounding web systems, applications, and internet scale distributed systems. Topics covered include client/server protocols, security, information retrieval and search engines, scalable data processing, and fault tolerant systems. The course has substantial projects involving development of web applications and web systems.
Search Engine
Constructed a fully working search engine for Wikipedia pages using Python. Used a MapReduce model within a simulated version of Hadoop (Madoop) to calculate tf-idf values, which were combined with PageRank scores for each query to produce an effective ordering. Used a back-end server to query tf-idf values and combine them with pagerank scores, and a front-end server to display the GUI and any search results in order.
Simulating a Distributed System
Created a multi-threaded Python program that would simulate a MapReduce program. Simulated a manager that would listen for worker messages and send task assignments over TCP, and keep track of alive workers with heartbeats sent over UDP.
Insta485
Created an Instagram clone, dubbed "Insta 485," which went through the following versions:
- V1 - Utilized a python script to read JSON input and display it on static pages using Jinja.
- V2 - Now a server-side dynamic website, Insta485 could use SQLite3 and Flask REST APIs to display templated pages filled in with different data from the database. With a live AWS EC3 instance, Insta485 could be used my multiple users at the same time.
- V3 - Now a client-side dynamic website, Insta485 utilized Javascript and React to bypass the need for a Jinja template. It still utilized SQLite3 and Flask REST APIs for a back-end, and could once again allow for a multiple users via a live AWS EC3 instance.
EECS 445 - Machine Learning
Theory and implementation of state-of-the-art machine learning algorithms for large-scale real-world applications. Topics include supervised learning (regression, classification, kernel methods, neural networks, and regularization) and unsupervised learning (clustering, density estimation, and dimensionality reduction). For each topic, mathematical principles, key algorithmic ideas, and implementation will be highlighted.
Image Processing with Neural Networks
Constructed a Convolutional Neural Network (CNN) and a Deep Neural Network (DNN) to identify dog breeds from images. Used supervised learning to train the networks and the Pytorch library to construct the models. Utilized the Grad-CAM algorithm and AUROC scores to evaluate models, and experimented with transfer learning and data augmentation to train a model that balances bias and variances.
Predicting Reddit Post Emotions with SVMs
Constructed an SVM using the scikit-learn framework to classify whether a given Reddit post was "positive" or "negative" in sentiment. Used feature extraction techniques to convert posts into supervised learning training data. Utilized AUROC scores for hyperparameter selection and kernel selection (linear kernel vs quadratic kernel). Utilized squared hinge loss to optimize model on balanced and imbalanced datasets. Utilized one-vs-all methodology to implement a multi-class classifier using binary classifiers.
EECS 388 - Introduction to Cybersecurity
This course introduces the principles and practices of computer security as applied to software, host systems, and networks. It covers the foundations of building, using, and managing secure systems. Topics include standard cryptographic functions and protocols, threats and defenses for real-world systems, incident responses, and computer forensics. There will be homework exercises, programming projects, and a final exam.
Digital Forensics
Performed a dead analysis and a live analysis on a dummy computer to collect evidence to put forth a case on a hypothetical individual being guilty or innocent of cyber crimes. Techniques used ranged from SQL injection attacks on a dummy site to a man-in-the-middle attack using an RSA key found via steganography. The "chase" lead to a hidden geocache with travel plans to flee the country, a .onion site of a secret group on the dark web, and even a top-secret Belarussian website.
Application Security
Used assembly code to run malicious code via a target dummy program. Attacks started with simple buffer overflows and increased in difficulty with more defenses, such as data execution prevention (DEP) and address-space layout randomization (ASLR), requiring increasingly complex attacks such as NOP ramps and ROP (Return Oriented Programming) Chains. The project eventually became just a binary file, requiring the use of Ghidra to reverse engineer it into C code.
Network Security
Attacked a dummy network to investigate a cyber attack, starting with finding a suspcious IP using Wireshark. This led to using John the Ripper on Rockyou.txt to find a username with an unsecure password, then using Python to get said user's certificate and eventually crack the Time-based One Time Password (TOTP) to get access to the website and investigate it for evidence of cyber attacks.
Web Security
Attacked a dummy site using a variety of attacks against increasing levels of defense.
SQL Injection
Utilized to log in as any user in the back-end. Performed against no defense, escaping single quotes (replaced with two single quotes), and a SHA-256 hash applied to the password.
Cross-Site Scripting - XSS
Utilized to steal a user's username and most recent search on the site. Performed against no defense, removing "script", removing numerous html tags (script, img, body, style, etc.), and removing some punctuation.
Cross-Site Request Forgery CSRF
Utilized to log a victim onto the dummy site on an attacker's credentials when the user loaded an HTML file. This would allow the potential attacker to monitor the victim's activity on the site. Performed against no defense and token validation via cookie.
Cryptography
Conducted a length extension attack to demonstrate the importance of using a MAC with hashing functions. Generated a hash collision on SHA-1 to show it's not a secure hashing function anymore. Conducted a padding oracle attack to decrypt messages encrypted via Cipher-Block Chaining (CBC). Utilized Bliechenbacher's Attack to construct a forged RSA signature that could be used to conduct unauthorized bank transactions through a dummy bank.
EECS 376 - Foundations of Computer Science
An introduction to theory of computation. Models of computation: finite state machines, Turing machines. Decidable and undecidable problems. Polynomial time computability and paradigms of algorithm design. Computational complexity emphasizing NP-hardness. Coping with intractability. Exploiting intractability: cryptography.
EECS 370 - Introduction to Computer Organization
Basic concepts of computer organization and hardware. Instructions executed by a processor and how to use these instructions in simple assembly-language programs. Stored-program concept. Data-path and control for multiple implementations of a processor. Performance evaluation, pipelining, caches, virtual memory, input/output.
SI 339 - Web Design, Development, and Accessibility
This course provides a hands-on approach to learning responsive, accessible front-end programming for Web Design. Topics covered include HTML5, CSS3 (including Bootstrap framework), JavaScript, and the POUR design principles of accessible design.
EECS 281 - Data Structures and Algorithms
Introduction to the algorithm analysis and O-notation; Fundamental data structures including lists, stacks, queues, priority queues, hash tables, binary trees, search trees, balanced, trees, and graphs; searching and sorting algorithms; recursive algorithms; basic graph algorithms; introduction to greedy algorithms and divide and conquer strategy. Several programming assignments.
Spaceship Escape
Graph search and route tracing using breadth first search (BFS) and depth first search (DFS) in a 2d maze with a spaceship theme.
Zombie Tower Defense
Using priority queues and implementing templated containers, inheritance and interface programming, and streaming algorithms with zombie defense theme.
Database Query Language
Working with hash tables, managing and creating larger data structures through composition to implement an efficient database query language.
A Day at the Zoo
Implementing optimization algorithms (eg. Traveling Salesperson and Knapsack) to create a program capable of designing the most efficient path to visit every animal given a certain Zoo layout.
EECS 280 - Programming and Introductory Data Structures
Algorithm development and effective programming, top-down analysis, structured programming, testing, and program correctness. Program language syntax and static and runtime semantics. Scope, procedure instantiation, recursion, abstract data types, and parameter passing methods. Structured data types, pointers, linked data structures, stacks, queues, arrays, records, and trees.
Stats
Created a program that could take in a large amount of numbers and calculate statistics for said numbers.
Images
Created a program that would take an image as input and translate and transform it given certain input parameters.
Euchre
Used Object-Oriented Programming (OOP) to simulate a game of Euchre that could be played with other players or against a simple AI.
Web API
Implemented a simple web API using queues.
AI
Created a program to take training data and organize it into a binary search tree to be used to train an AI to predict the subject of dicsussion posts.
EECS 203 - Discrete Math
Introduction to the mathematical foundations of computer science. Topics covered include: prepositional and predicate logic, set theory, function and relations, growth of functions and asymptotic notation, introduction to algorithms, elementary combinatorics, and graph theory, and discrete probability theory.
Awards
James B. Angell Scholar
Students who achieve an “A” record (all grades of A+, A, or A-) for two or more consecutive terms are recognized as James B. Angell Scholars. The student must have taken a minimum of 14 credit hours each term, including at least 12 credits elected on a graded (A-E) basis. Recipients of this award are recognized during Honors Convocation according to the number of consecutive terms they have earned the Angell Scholar designation.
Dean's List
A student needs a minimum of 12 graded credits (not including pass/fail credits, I grades, or Y grades) and a 3.5 GPA term average or better for the fall or winter term.
University Honors
The University Honors designation is awarded to students who earned a 3.5 grade point average or higher during a term. The student must have taken a minimum of 14 credit hours during the term, including at least 12 credits elected on a graded (A-E) basis. Students who achieve University Honors designation for both the winter 2022 term and fall 2022 term will be recognized as a group by the Dean of their school or college during the Honors Convocation. Seniors who achieve University Honors for at least one of these two terms are recognized at Honors Convocation.
William J. Branstrom Freshman Prize
First-term freshmen who rank in the upper five percent of their class within their school or college are awarded the William J. Branstrom Freshman Prize. The student must have taken at least 14 graded (A-E) credits during the fall 2022 term to be eligible for this award. Advanced placement credit does not disqualify a student for consideration of this award. Recipients of this award are recognized during Honors Convocation.
Transcript
Download my transcript here!