What The Fish?: C#, Python, Azure - August 2017, Ongoing
What The Fish? is an app for your phone where you can take a picture of a fish you've caught, it'll identify it for you, and tell you what the regulations are on it, so that you know whether you can keep it, or have to throw it back. It makes it vastly easier for a fisher to identify their fish and know the laws and regulations, which helps both the fisher and the ecosystem they're participating in.
ProgrammingThis is a huge project that involves copious amounts of app development, machine learning, and serverside (API and database) development. The app uses the Xamarin.Forms framework. The machine learning models are developed using TensorFlow, and inference (when the user uses the app) is performed via TensorFlow on Android and CoreML on iOS. The serverside API and database are hosted on Microsoft Azure, using several of its services. The biggest technical challenge so far has been to make sure that the machine learning models used for the image identification can be used without Internet access or cell service. The most popular way to apply machine learning is to host the models on a cloud server, and call to that over the Internet. In this case, the user often will not have good cell service available (they're out in the middle of nowhere, fishing!), so WTFish? is designed to work without Internet access in the moment. To do this, I had to develop a software library called LocalML, which has been open sourced to allow other developers to quickly apply machine learning in Xamarin.Forms apps without Internet access.
Entrepreneurship and Business DevelopmentI also took an entrepreneurship class at my high school (Keefe Tech), where I wrote a detailed business plan for What The Fish? that will allow the app to pay off its own expenses. I developed a unique business model where users purchase "modules", which are designed to identify fish in a specific region (for example, you might buy a "Cape Cod saltwater fishing" module). This business model allows the user to pay only for the parts of the app that they use, while also helping directly pay off the costs of expanding to new regions and new types of fishing. This class was developed by the Network For Teaching Entrepreneurship (NFTE), and I participated in their business plan competitions at the end of it. For these competitions, I created a presentation and pitched my business to a panel of judges. I was able to achieve 1st place in the New England competitions and went to the National competition, where I advanced to the semifinalist round. This class and these competitions taught me an immense amount about entrepreneurship, business development, and presentation skills, and introduced me to dozens of industry professionals and other motivated students who all have some fantastic ideas and plans!
This Website: HTML5/CSS3, PHP/MySQL - May 2017, Ongoing
When I wanted to make a personal website, I decided to write it myself versus using Wordpress/Blogger/etc because I figured it would be more customizable, and a good learning experience. At the time of writing I have created a unique design for the webpages themselves, as well as adding a login system that allows me to access the blog posting system that I have also added.
Spewspeak: C# - Summer 2016 to Early Winter 2017
Spewspeak is a project that stems from Reddit's /r/iamverysmart subreddit. The program uses Natural Language Processing and Machine Learning techniques to replace words in a paragraph with more complicated synonyms, designed as a joke to make the writer sound "smarter".
This project took a very long time to develop. For a detailed recount of my process of development, take a look at the individual project page, linked in this section. This program is written in C# with the .NET Framework, and uses the Windows Presentation Foundation (WPF) for its GUI. I made use of a few 3rd party libraries: SharpNL, for general Natural Language Processing functions; WordNet.NET, for access to the WordNet database; and NHunspell, for synonym generation. I also wrote a couple libraries for use in Spewspeak: FolderIntegrityVerifier, used to make sure that all of the files used by Spewspeak are available at startup; and WordRatingLibrary, used to rate the "complexity" of different synonyms.
MatrixTools: C# - Late Winter 2016, Ongoing
When working through Professor Andrew Ng's Machine Learning course, I decided to build a library that implemented matrices and vectors so I could more easily work with them in C#, my language of choice. This idea became MatrixTools. This is an ongoing project, as I add features/optimize its algorithms every now and then.
MatrixTools is written in C# with the .NET Framework, and does not make use of any external libraries. It provides an implementation of matrices and vectors as classes, which are based on multidimensional and single dimensional arrays of doubles (double precision floating point values) respectively.
It provides simple ways to perform operations such as matrix, vector, and scalar multiplication, addition, exponentiation, etc. In addition, it provides methods for calculating the determinant and inverse of a given matrix cleanly and quickly. It also provides methods for building these objects from other, existing objects, among other things. I have written unit tests for almost every element of the library, as well as a few simple implementations of machine learning algorithms to show how to work with the library in practice.
MathToWords: C# - June 2017
This is a relatively small project that implements a few algorithms (including the shunting yard algorithm) to take a mathematical expression and convert it into a form that is unambiguous when spoken out loud. It is mostly intended as a toy, but could be useful to some, and I had fun designing an elegant and extensible architecture for the code.
This project is written in C# with the .NET Framework, and uses no external libraries. At a basic level, it works by first converting a given infix expression (eg "2 + 3") to the Reverse Polish Notation format using the Shunting Yard Algorithm. It then uses an algorithm to work through each token in the RPN format and convert that to its English word form. For numbers, it calls another algorithm to convert the number into English words. Then, when that is done, it outputs the result.