Programming: approachable problem solving -- accessible experimentation, intuitive and understandable expression through abstraction, an entrance to contribution, collaboration as part of a community -- opening a whole world of elegant solutions.
2014-Present Image Processing for Scanned Photo Extraction -
This will be a program that automatically extracts, rotates, etc. scanned sheets of multiple photos separated by whitespace. I.e., if you put 5 photos on a scanner, this program will save out those 5 photos from one PDF page.
2016 CPU Scheduler -
I created a Python discrete event simulation of a CPU scheduler for an Operating Systems class. It compares a variety of multilevel queue configurations using different algorithms such as first-come first-served, shortest process next, highest response ratio next, and round robin and then plots the wait time, response time, turnaround time, and throughput for these different configurations for CPUs containing different numbers of cores.
2016 Inverted Pendulum -
We tried 4th order, 6th order, and 8th order state space models for controlling the inverted pendulum at Walla Walla University. The output of our controller was a motor voltage converted to PWM, and the inputs were the cart position and pendulum angle. We determined our 8th order system was not observable nor controllable and the 4th order performed better than the 6th order when balancing a single pendulum, so we primarily used the 4th order system. We used LQR control from Octave and also implemented a Kalman-like unbiased FIR filter but were unsuccessful in getting the UFIR filter to work. Also, on the side I worked through how to rewrite a PID controller in terms of state space.
2016 Predicting Next Word with a Bayesian Network -
Using a discrete Bayesian network of n nodes, use up to n-1 previous words of a sentence to find the probability of what the next word may be. The network is trained on Project Gutenburg text documents of public domain books. This is kind of going for the autocomplete idea, but instead of operating as you type, it slowly computes (for like 13 seconds) when you finish a word. In other words, this is a proof-of-concept and not something actually useful.
2016 Simple Calculator Compiler Frontend with Spirit and LLVM -
We wrote a compiler frontend that could take in simple programs consisting of +, -, *, and / with parenthesis, assignment statements, and multiple lines separated by semicolons. For the parser we used Boost Spirit, and then we generated an intermediate representation using LLVM for our compiler output. This is not particularly useful as is except for learning more about how compilers work.
2015-2016 Machine Learning for a Thermal Soaring UAV -
This project was to develop improvements to thermal soaring algorithms for a UAV glider. I compared Bayesian parameter estimation and Gaussian process regression (GPR) to predict what a thermal's vertical velocity profile looks like, ending up choosing to use GPR in simulation. I also researched Bayesian networks, which could offer a great improvement, taking into account more than just vertical velocity, but this has been left for future work. Another team member implemented the centroid method for determining where a thermal is and another higher-level decision making with reinforcement learning and dynamic programming. Our parts have been developed separately and haven't yet been integrated.
2015 DHCP Spoofing Prevention -
Rather than setting up our own network in the real world, we decided to make our testing more repeatable by creating a virtual network with Mininet. My portion of the project focused on DHCP spoofing. I prevented the attack with ebtables on a switch blocking DHCP packets from non-whitelisted MACs. This required that I setup Linux per-process filesystem mounts for virtual computers in Mininet.
2014 GigaPlayer Plugin for LMMS -
I wanted to use the amazing Maestro Concert Grand available on Linux Sampler's website in LMMS, but LMMS didn't support .gig files. I added a plugin for this using libgig to load and extract the audio data from the .gig files support. It supports multiple bit depths and sample rates and a subset of Linux Sampler's features, the ones I found most immediately useful. It may end up in LMMS 1.2 or 2.0.
2013 Sprouts, a game - Github
For third quarter Intro to Programming class, we continued the yearly project of developing Conway's Game of Sprouts. We developed a potentially-useful base for future years to build upon and provided a functional GUI and very, very basic AI.
2012-2014 Image Processing for Bubble-form Grading -
You upload a PDF of scanned scantron forms to a website served from CppCMS, the software extracts the images from the PDF using PoDoFo, analyzes each image finding what bubbles were filled in while showing a progress bar on the website, and then lets you download the results as a CSV file.
2011-2014 Bell System - Documentation
We built a computer-controlled bell system for my school, which currently uses a Raspberry Pi computer. There is a website providing easy modification of the bell schedules remotely, and a C++ daemon that watches the config file ringing the bell at the correct times. It currently uses a USB-to-Serial converter, but it will eventually use the GPIO on the Raspberry Pi to operate the triac.
2011-2014 Management of Unsupported Packages -
I use Arch Linux, which has this thing called the Arch User Repository (AUR) where users can upload build scripts to share with others. To make people's lives easier, there are a ton of "AUR helpers." The few that I have tried out seemed a little bit big, so I decided to write my own in Bash. I tried to do it in as little code as possible. Since then, it grew. Now I use it since I haven't found any other that's designed around batch installation.
2011 Leet Speak Translator - Github
A long time ago I became interested in artificial intelligence. I created this XMPP chat bot in C# using some AIML library. When I switched to Linux, I redid a lot of it to work in Mono. It still ran, but it really wasn't all that great, so I decided to start coding Garot Bot 2.0 in Python. Unfortunately, this project kind of died due to the extreme difficulty and my lack of time. However, for part of this project, I did write the most robust multi-threaded Leet-to-English translator I've ever seen. I put it on Github so you can play with it if you like. It looks at the probability of word usage to determine what a message might be.
2007-2013 Pathfinder Bible Achivement Quiz Website -
This provided an online resource where users could contribute questions for specific chapters of the Bible that they and others were quizzed over and where users could also take computer-generated fill-in-the-blank quizzes. Data was stored in a MySQL database, and the website used AJAX to communicate with a PHP RPC.
May be of use to some.