These are a some of the fun projects I have worked on recently or in the past.
I have coded applications and games, built a robot, written music, and designed sounds.
Current / Recent Projects
Low-cost CI (Continuous Integration) setup with Gitea, BuildBot, and Github-style Actions -
Using my DevOps skills, I have built a low-cost git repo and CI setup for my personal projects.
The cost is $6 per month plus the on-demand hardware fees associated with running the builds, which is quite low for these capabilities, especially the ability to have full control over the setup.
In a more recent experiment, I am using a Raspberry Pi to run CI jobs within Docker containers.
Personal producivity / data management tools with Django / React / Material UI -
I have built some note-taking, todo list, and notecard productivity tools using a few web technologies and packaged it in a Docker container.
Lightweight MP3 audio streaming service -
I have built an MP3 audio streaming backend service using Flask and Mutagen.
It shapes the bandwidth to allow audio playback to buffer ahead, but not download too much data if the user is skipping around within the audio track or jumping to other tracks.
I used wavesurfer.js to display the waveform and play back the audio.
MIDI file manipulation scripts -
Wrote a few scripts leveraging the 'py_midicsv' Python library to automate changes to MIDI files including humanization (randomizing timing and velocity of notes to make them sound less perfect) and stripping unwanted messages from channels.
Older Projects
django-single-table-db-storage -
This Python library helps Python developers add improved file storage capabilities to their Django projects.
Django developers may find this package to be most helpful for use in their test and prototype environments.
This package may also be useful in launching small-scale projects/environments quickly without needing additional infrastructure setup.
When you are ready to deploy to production at scale, you can simply swap the implementation to an S3-compatible store. You can find alternatives here.
2D platformer - game engine, game, music, and (unfortunately) art -
I've been working on a 2D platformer with my kids as time allows.
My kids are in charge of the project, providing me with high-level directions of what they want and concept art on paper.
I code up the features and create some some artwork (art is not my specialty).
I am composing the musical soundtrack and have designed a few of the sound effects.
It's a real blast to work on, but I haven't had much time to work on it recently.
The project is written in C++ 11 using the SDL 2 and the Box2D physics library. The project runs on desktop and the web currently and should be portable to other platforms in the future. For the web version, I compile the C++ to Javascript using Emscripten.
mutation testing tools -
I am fascinated with mutation testing, a software testing technique.
I have built some testing tools that run on the command line focused on "universal" testing and Python-specific testing.
So far, my tools are mostly focused on the code removal transformation.
Once I add some more features and make it more robust, I would like to release it as open source.
My essay about the tool and the mutation testing concept:
Universal Mutation Testing Tool for Code (2020) - Explains what the tool does and also provides an explanation of mutation testing. Audience: people who know some about software development, but might not know about automated testing (i.e., unit tests).
Example usage of the tool:
test output example - after running the command `mutation-test my_software.py` against an example input project.
temporython -
A command line utility that helps developers hack out one-off Python text processing scripts quickly by generating helpful boilerplate code.
sb3_extractor -
command line tool that extracts the sprite data out of Scratch SB3 files and and dumps well-named asset files.
This tool may be useful for people who want to extract their art assets out of Scratch and import them into another system.
Ninja Tag -
A mini-game that I wrote back in college. It's a 3D third person game of tag with ninjas. Ninjas run around the Pantheon and you must catch them. Opponents are controlled by an AI with pathfinding abilities.
AIE - code editor with Python macros/plugins -
Back in the day there wasn't a cross-platform, GUI-based, lightweight text editor that I was happy with (VS Code fills this role).
I liked the Scintilla code editor widget, but not so much the SciTE application.
So I started to build my own text editor around the Scintila widget, and modeled a lot of its features after Crimson Editor.
It worked on Windows, Linux, and Mac OS X.
AIE last worked on Python 2 with wxWidgets (formerly wxWindows). Some of the UI was designed with Boa Constructor.
3D Scanner Robot -
Built 3D Scanner Robot and wrote software that moves the robot around an object and then builds a 3D mesh of the object.
The Robot has a rotating base, 3 other joints, and an infared distance-measuring sensor.
In the screenshots below, the green lines represent the current pose of the robot, and the red line connected to it represents the current distance reading of the infared beam.
The red dots are the measured points on the object being scanned.
The red dots are then connected together in a mesh (the red lines) to show the shape of the object being scanned.
The program allows for the 3D mesh to be exported to a file, which can then imported into a 3D modeling program like Blender.
3D graphics rendering application -
Reads in input for a scene in 3D and output the 2D rendering of it.
I wrote this program mostly from scratch, just using the SDL libray, and implemting all of the 3D math myself. Here are a few screenshots demonstrating its capabilities:
awebshell library - a Python 2 library for quickly accessing web pages with short command line interface-style commands.
osgSDL MSVS Examples -
Contributed (working) MS Visual Studio examples included in osgSDL library (http://osgsdl.sourceforge.net/), a library that allows Open Scene Graph applications to be driven by SDL timing and events.
I found this library useful in developing 3D games, but I am not sure it is as useful as it once was because the Open Scene Graph input API appears to have improved since the last time I used it.