Portfolio
The following is a sampling of some of the software projects I have created (or contributed to).
Ruby on Rails projects
-
Catering Event Manager
This is a partially-built commercial rails application for caterers who want an easy way to manage and track all of their events, provide quotes to customers, etc. I worked on this in my spare time for fun, but never got it to a point where I felt comfortable releasing it. I learned a valuable lesson about how to prioritize what's actually important to get a viable app deployed and in the wild instead of getting everything perfect.
My contributions
- Full-stack development
- Behaviour-driven design using Cucumber and rSpec
source (private repo; send me an email and I can grant access on a case-by-case basis.)
-
Fitagotchi
Fitagotchi is a mashup of the 90's toy phenomenon Tamagotchi with your Fitbit activity tracker. Instead of keeping a little critter alive-and-well by clicking some buttons, you keep it alive using your calories on your Fitbit. You can also challenge friends to three-day battles to see who can burn the most calories; for which you will be rewarding with an animated fight scene when finished. Won first prize for final project at Lighthouse Labs Web Development Boot-camp.
My contributions
- Full-stack development
- Rails back-end/API
- React front-end
- Involved in everything from planning to design, architecture, and development
-
Catering Manager (Orlando's Catering)
Rails application to manage menus, and generate and send quotes for a small catering company.
My contributions
- Back-end development using Rails 5
- HTML, CSS and Javascript development
- Behaviour-driven development with Cucumber/rSpec
- DevOps/deployment/maintenance
source (private repo; send me an email and I can grant access on a case-by-case basis.)
Ruby on Rails contributions
-
GitLab - merge request !29718
GitLab is an open-source dev-ops toolchain for developers. In this contribution I added a requested feature that adds a preference to allow maintainers to create subgroups, instead of having to ask the owner of the group to create the subgroup, giving developers the option to be more agile.
-
GitLab - merge request !25942
My first contribution to GitLab! Simply a matter of deleting some unnecessary lines and updating the unit tests. I wanted to get a flavour for installing GDK and stepping through the workflow of squashing bugs and adding features.
-
GitLab - merge request !29511
I fixed an issue where, when pushing a repository to a new and default branch, the commit messages would not get processed for issue references, which was stopping some users of competitive products from switching to GitLab.
Ruby projects
-
Hack assembler
In this project for the Coursera Nand2Tetris course, I write an assembler, which takes a given program in Hack assembly, and converts it to Hack machine code. Machine code is the combination of raw binary bits that a processor can take as instructions for a program. It is exceptionally tedious to read or write a program in machine code, as you must encode and decode 0's and 1's and exactly where they need to go to execute the instruction you want. Assembly is has a one-to-one correlation to machine code (each line of assembly is one instruction), but it is symbolic and therefore much easier to read and write for us mere mortals. However, the computer needs instructions sent to it in machine code, so the assembler does the work of converting assembly language to machine code.
My contributions
- Wrote a Ruby implementation of the Hack assembler
- 100% grade
-
VM Translator
A VM Translator is a program that translates programs written in a VM language into programs written in an assembly language. VM languages provide a level of abstraction above assembly languages. So, whereas assembly languages are a symbolic representation of the instructions being sent to the CPU, VM languages allow the programmer to think more abstractly; usually (and in this case), that abstraction is a stack machine. The commands allow the programmer to push data onto and pop data off of a virtual stack, instead of having to deal with memory directly. This level of abstraction is still not feasible to write large programs in. So why have the VM layer at all? VMs afford a level of flexibility that would otherwise not be possible. As an example, JRuby and Java can both be compiled into JVM, which can in turn be tranlated to work on multiple different architectures/CPUs. Instead of needing one compiler per language per architecture, you need only one compiler per language, and then one VM translator per architecture. So if there are 10 languages and five architechtures, without a VM intermediary you would need 50 compilers (5 × 10); with a VM language you would need only 10 compilers and five VM translators (5 + 10).
My contributions
- Wrote a Ruby implementation of the VM translator
- 100% grade
-
Jack Compiler
A compiler takes some code in a high-level language and converts it into code in a lower-level language. In this case, it converts code in Jack to code in the VM language discussed above. This process is broken down into two broad steps: syntax analysis and code generation. Syntax analysis involves turning the high-level code into a stream of tokens and parsing that stream into a tree structure using the grammatical rules defined by the high-level language. Code generation uses the semantic meaning derived from the syntax analysis and generates code with the same meaning, but in the lower-level language.
My contributions
- Wrote a Ruby implementation of the compiler
- 100% grade
Other projects
-
JackDoku (Sudoku game built in Jack language)
In the Nand2Tetris course we build a computer from the bottom up, from a simple NAND gate, to a computer architechture, to machine code, a virtual machine, a programming language, an operating system, and the culmination is an object-oriented application of our choosing. For this project I chose to build a simple Sudoku game. The code is anything but simple though. While the OS does provide some libraries for manipulating the screen, the libraries limit you to writing 16×16 pixel sprites at pre-determined locations on the screen. Using this library would have meant using just a little over half the height of the screen; the game would have looked small and awkward. In order to make my sudoku grid take up as much of the screen as possible, I had to engineer a way to write an arbitrarily-sized sprite starting at any given pixel on the screen. This was a challenging task, but it was gratifying to not only figure out the details of the solution, but to also wrap those details in a layer of abstraction that made it easy to use in my game.
My contributions
- Wrote the game from nothing
- Wrote a low-level library to write any sprite to any location on the screen
- Used binary math, logical operators and bit-shifting to manipulate graphics on the screen