Programming Projects

I have finally decided what programming projects to work on. Some for me, some educational, and some are even practical. I discarded a lot because of the time they would take. I just want them to be fun and part-time projects: hobbies. Not something I would end up obsessing about and spending 18 hours a day working on forever and ever.

This is just a quick, high-level overview of my projects.

Family website

This is a somewhat simple and long-term project to keep me busy.

I have a lot done already, but it needs a ton of polishing, especially the interface. Basically, it is a Facebook-like website that is very private. What I have right now is a message board, video and photo galleries, recipe book, address book, a few games I wrote, and little things like local weather. They all interact together very well. Pulling something out of the photo albums and putting it in a post, for example, is trivial to do. It has two distinct page layouts, with one that haves about 15 different themes and the other had around 10. That was surprisingly trivial to do. The best part is that new features require no extra work for the layouts and themes to display correctly. It makes me wonder why more websites don’t do that. Being able to change the layout and feel of a site makes it more enjoyable to use.

What it needs is a Messenger-like program for text and video chats with clients for Android and iPhone.

It wouldn’t just be for my family. I could make it available for all sorts of groups that could use something like this and is private, with no spyware and no ads. It is cheap and easy to deploy. A VPS under $10 would more than handle a decent-sized group of active users.

I don’t know about selling it. If I did, I would feel obligated to be very responsive with support and bug fixes, so it could turn into a full-time job with only 2 or 3 clients. That would violate the part-time goals of my projects.

I wrote this mainly using Ruby on Rails with things like image and video manipulation using C++ library wrapped in Ruby. Some of this project could benefit greatly from an environment that is better at concurrency, something like Elixir. Mainly the image, video, games, and chat functions. They work okay in Rails. So I could pull those parts out of the Rails application. I have been toying with separating every module into microservices. I am not sure if that would add too much complexity for little gain. It is something to play with.

Educational

This would be a moderate challenge and a long-term project. I am not a fan of those “boot camp” learn programming sites. People using these sites to learn how to program for the fun of it and as a hobby is great. It is horrifying that some companies actually hire “graduates” of these programs. Professional software development, as it implies, is a professional endeavor that requires depth and breadth of practical and theoretical knowledge. My education software will be geared toward the formal student to assist in learning. It will be useful for people learning on their own also, which is a good thing. Demystifying computers, networking and software is a good thing all around. Lowering the entry requirements to drive down wages results in the mess that is the software industry today.

I have some work done from my master’s project and a domain-specific language (DSL) I helped work on to assist students in learning concurrency concepts. The latter will be completely rewritten as a more flexible DSL with a graphical interface to visualize the basics of what is going on in hardware.

My master’s project will be the base of this project. It does need a much better interface and plugin system. Those are the two more important parts to nail down.

Ideally, it would be useful for students to run and go through the simulations. If it can’t do at least that, it is a failure. It should also be easy enough for students to contribute to. Something like this would be a good undergrad project that many CS departments, including the one I graduated from, require their students to do as part of the graduation requirements. If I can get it working well, I can present it to the professors I know and go from there.

I think it should be a web-based system, more or less. That would simplify the issue of running it on multiple platforms. That annoys me as HTML is crap, and I am not a super great web interface designer. The fun part would be the backend modules that could be written in many different languages. Perhaps Kotlin as the core language would be good. It depends on if web servers for the JVM have improved from the dumpster fire, filled with headache-inducing XML garbage, that it was the last time I looked. Ruby/Elixir/C, as well as Kotlin, could cover most of the module languages. As it always will be, the Java language would be banned unless there is a solid library that already exists that is needed.

What I am thinking is to get a useful prototype of a working data structure and algorithm modules. Once that is done, building out networking, including security-based modules should be enough to determine if there is a viable plugin system. If not, that should be enough to tinker with it until it is useful and easy to use. Other modules could include those to help with mathematics. Discrete mathematics topics are the most important to computer science. Topics such as automata and concurrency would also be added.

It would be a giant monolithic interface that is still clean and simple, at least ideally. The back-end systems would be discrete microservices. The entire system should be able to run on a lower-end server as well as on a desktop.

This is difficult to adequately describe in a small blurb, as it progresses I may write more detailed papers.

Practical

Exercise Tracker

This is super simple and pretty short-term. Yes, there are lots of exercise trackers, but some are too little and some too much. Some seem so complex to set up that I could just write this faster.

I can make the perfect solution for myself. The bonus is that no one else gets access to what I upload.

This could be a simple Rails, Flask, or Sinatra web app. I can add what I need now and expand as my exercise routine evolves. Things like track mileage, time, how many reps, or how much time spent. I could track what yoga videos I do each day.

This probably has little value outside my use case, but maybe it could be useful to make public.

Day planner and reminder with lists

This is a simple, and short-term project.

Yes, there are many available planners, but they are often so generic they become inflexible or complex. Like exercise trackers, they are also information sponges that they use to make money.

This is exactly what it sounds like. Track appointments, to-do lists, and also reminders. I will fertilize my roses and forget to do it the next month. Sending out reminders and automatically placing them on a specific day’s to-do list is super convenient.

Whatever language I use for the exercise tracker, I can use it here. I could also put them in the same web application since I probably wouldn’t make it available.

Neither of these projects has to be web-based. A desktop and mobile application that embeds sqlite and optionally backs up to wherever they want it to. That would make it useful to others and is easier to guarantee privacy.

First, I have to make them useful for me and go from there.

Programming tools manager

This is a challenging project that would be long-term. This one has the highest potential of failure.

Needing multiple versions of the same language is a common problem. It seems that people are resigned to either using the distro-supplied versions - which is problematic and should never be done for your projects. Or, just install them from the source and managing them manually. Annoying but pretty simple. I used to do this for Ruby and had a script to swap out soft links in /home/me/bin.

Sure, if you only use one language and one version at a time, you likely haven’t had this problem. For polyglots, it can be an annoying issue.

Distro maintainers and developers are almost always at odds with what they need. The goal here is to simplify it for maintainers and allow developers to easily install anything they need without disturbing the distro system. It would run at both the root and user levels.

Far too often, I see questions about what to do if the repos in their distro don’t have the tools needed. The most obvious answer is to compile from source, but somehow that seems daunting to beginners and even non-beginners.

This project aims to automate that and remove system dependencies in a walled-off development environment that won’t care that the distro has outdated libraries, and will not conflict with the distro that really does need those outdated libraries.

Distribution supplies libraries and languages are for the system, not the programmer. They can be used but are often out of date, and upgrading to what you need will often break the OS.

It would be cross-distro and cross-platform and maybe get it to work on Windows. Windows 10 is such a horror show and a poor development environment if you are working outside of .NET. It has improved with the Windows subsystem for Linux, so it might be useful there. I don’t own a mac, never have owned one, and don’t have the desire to. Mac is a Unix, so it should be a trivial task to get it to work, in theory. I don’t know enough about it to say with any certainty.

I think ignoring rpm and deb and just store source code and have the program compile it is the way to go. To be determined. The annoying thing would be to keep the repositories up to date. I am sure once the process is automated, it should be okay. It will store everything in /opt or optionally in a programmers /home directory, including third-party and native libraries.

I am not sure about the path to take, maybe source code compilation, because dependencies will also be walled off in /opt so it will not matter if the system has the correct libraries. Perhaps it should be an option to do that or use the system libraries, or both? If the distro-supplied library will work, why waste disk space? I like this project idea because it is practical and will offer challenges my other projects do not.

This is mainly intended for development use, but if a server runs multiple projects. I can’t see many downsides to this.

There is asdf, which is nice, but I want to go much further.

OpenSUSE already has the frameworks for distro agnostic installation. I could probably leverage that.

That it doesn’t seem to have been done before, that I can find, makes me think it will be fiendishly complicated, but if I can make it work, it will be worth it.

Alternatively, it could blow up spectacularly. It could also end up not being as useful as I am hoping it will be. That is also fun and a great learning experience.

Discarded project ideas

I doubt I will get this far, but maybe I will get to these projects.

I could create a Linux distro like Kali that is not based on Debian. I dislike Debian immensely and have yet to find a Debian derivative that is not endlessly annoying and clunky. Kali is a distro designed to facilitate security testing and forensics. It is basically Debian with a ton of tools to do just that. My master’s project could be useful here. That is the biggest reason I might not do it. It is a massive undertaking. I did maybe 5% of the complete project for my masters, and that took 18 months! But it is on my “possibly-think-about-doing list.”

I didn’t need a full distro to complete my master’s project, but even by itself, it is too much. I want a simple project where I don’t ever feel the need to spend more than 20 hours a week banging on it.

A game system like Roblox. Better graphics, more powerful third-party programmer interface, easier development environment. I am not great at graphics and am an awful artist. My artwork roughly resembles that of a blind monkey after a three-day bender. Way too much for me, but I wish I could do this.

An object-oriented, mostly compile-time, and natively compiled language and ecosystem that actually gets objects correct. It is rarer than you think. The idea here is to leverage the core idea of OO to create a solid concurrent language that integrates well with Unix and Linux. Basically, Ruby meets Erlang and falls in love, and has a well-behaved kid. No, that is not Elixir. Although, the processes in Erlang and Elixir are exactly what I want to accomplish to get a clean OO system.

Getting a language to the point it is widely used, is mostly luck. Quality is rarely a critical factor in widespread acceptance. Regardless if it becomes well-used or not, programming languages quickly become 3 full-time jobs. If I do this, it will be more proof of concept and a research paper instead of trying to get it adopted. Getting the ideas adopted would be a more valuable contribution than yet another language.

A programmable multi-domain fuzzer application and API. This is a security testing tool that I might actually do once I finish my short-term projects and get a foothold in the others or abandon one of them.

High-level libraries that wrap low-level libraries. For instance, a wrapper around libpcap in Ruby that has a 1-1 interface with pcap. On top of that, a library that makes it easier to use the pcap library with less coding. Lots of abstractions here. That way it is useful for learning about networking via raw packets and is also useful in using it in development without having to come up with fully-featured abstractions. Like the fuzzer, this may be a future project, although it might fit nicely inside my educational project.

In the same vein, mathematics libraries for Ruby that wrap low-level high-performance libraries, like linear algebra and various statistical libraries. Again, this is a possibility for the future. I still would like to expand my weak linear algebra skills.

I may post updates on these projects as I go, especially if I come across an interesting problem that I solved in a way I think is good. Since spring came early this year, these are a lower priority but hopefully will progress somewhat until I have more time starting in the fall. The exercise and organizer are priorities, the rest as I feel like it.

These are just projects to keep me busy and feel useful while I run out the clock.

I worked extremely hard to acquire a lot of knowledge in this field. It would be a shame if it went to complete waste.

They are all in private code repositories on Bitbucket. If they work out, and I want to share them, I will move them to a public bucket and maybe on GitHub also. I am not a fan of that company. They will not be posted under my real name. Maybe, I will get a “doing business as” name. Perhaps Vilanye. It is not perfect privacy, we’ll see. I have no desire to have my name known at all. Well, no more than it is already, which is very little.

I go to great pains to stay anonymous everywhere online. Why? I am not sure. I guess I am just unreasonably private. The things that I stress out about…